What actually happens when a portfast configured port receives a BPDU actually depends on the configuration.
In simple STP (IEEE802.1D), a portfast port will be reset back to a normal port participating in STP if BDPUs arrive on the port. If a physical L2 loop is created on such a port, it will result in a temporary L2 loop until STP reconverges. This is why you will see this warning when configuring portfast (notice the word “temporary”:
%Warning: portfast should only be enabled on ports connected to a single host. Connecting hubs, concentrators, switches, bridges, etc... to this interface when portfast is enabled, can cause temporary bridging loops. Use with CAUTION
In simple STP (IEEE802.1D), if loopguard is enabled, a portfast port will be put into an inconsistent state until BDPUs stop arriving on the port
When configured with BPDU Guard, the port will actually go into err-disabled state if it receives a BPDU.
Even a temprorary loop is undesirable, so always make sure to configure additional safeguards to avoid any such situation.
Port fast can indeed be enabled on trunks. It is not best practice to do so, but there are some situations where it is necessary. You can find out more about this at the following link:
Keep in mind that portfast does not mean that the port no longer takes part in STP. It does. It can send BPDUs and it can respond to BPDUs that are recieved. How it reacts to received BPDUs depends on the configuration as described above.
I hope this has been helpful!