Pass by value semantics

With PRO, some types

Defining it this way would make some kinds of code impossible (literally) to write correctly. Which was exactly the case when PRO existed.

Take a look at this beautiful example. I doubt anyone will disagree with PRO being removed after seeing it.
In the example, the functions involved had no pointer arguments, and in fact, there’s not a single pointer to be seen, other than a discarded one (_ = &b), which happens after the function call. That user even explicitly created an unnecessary copy on the stack, even though the argument itself was passed by value and should be, semantically, copied. The copy explicitly eliminates aliasing.
PRO attacked anyways.
The compiler eliminated the explicit copy and passed a one-byte struct by reference, creating aliasing, even though semantically the user did everything to avoid aliasing.