We should be careful to not design around implementation details that could be easily changed. I'm not sure what behavior you're observing, but the contract of reserveCapacity is flexible.
Currently the canonical empty string is a small-string with size 0 and any attempt to reserve capacity less than what a small-string can store (<=15), or less than what a stored string's existing capacity is, is a nop. However, these early checks happen to not be
@inlinable, so it won't get constant folded. We can totally split the function into
@inlinable early checks followed by a call to a
@usableFromInline function, at the (perhaps inconsequential) cost of incorporating that particular pattern into the binary compatibility story.
edit: Omitted a word