Making ABI-affecting changes to a base or member subobject affects ABI of the derived or composing object, yes. This is part of the C++ experience.
> If the mechanism is opt-out per type, then libc++ will opt out
> std::unique_ptr in the standard Library headers
Why would they opt-out?
To preserve (function argument passing) ABI.
> But a further criterion is rule-of-zero: classes that do not define special
> member functions (destroy, move, copy) should not need to do anything to
> gain the benefit of relocation. So those classes should not need to either
> opt in or opt out, but this should happen automatically.
See other email: does this include non-trivial rule-of-zero types?
Absolutely, yes.
This does mean that a non-trivial rule-of-zero class that is relocatable by memberwise move-and-destroy on its (non-trivial) members will need to be passed by move-and-destroy en bloc. That is, since it did not explicitly opt into relocation, it is implicitly opted out of ABI break (under the scheme I'm suggesting).
Then if the class type of a data member adds its own relocation operation, thereby opting into relocation, without opting out of the concomitant ABI break, that class is considered to have broken ABI for itself and for the rule-of-zero type, so the latter is then passed by relocation and optional callee-destroy, in an ABI break.
This is a relatively aggressive approach; a more conservative approach would be to only break ABI in the rule-of-zero case only when either necessary (if a member is immovable, relocatable, and not opted-out of ABI break) or when it carries a clear performance benefit (if the rule-of-zero type is trivially relocatable by virtue of its members, and small enough to be passed in registers), and to use the caller-destroy ABI in all other cases. This would be entirely by choice of the Itanium C++ ABI group; the language would make it clear that the implementation is permitted to use caller-destroy ABI for everything other than immovable relocatable types.
A type that is immovable, relocatable and opted out of ABI break becomes nonrelocatable as a function parameter; this is fine since it means that adding the (nonstandard) no-abi-break attribute has the effect of taking a well-formed program and making it ill-formed, which is an acceptable behavior for an attribute by Timur's ignorability rule.