================ @@ -9242,3 +9242,15 @@ Declares that a function potentially allocates heap memory, and prevents any pot of ``nonallocating`` by the compiler. }]; } + +def ValueTypeDocs : Documentation { + let Category = DocCatDecl; + let Content = [{ +The ``value_type`` attribute can be used to mark user-defined types as 'value +types'. When objects of value types are passed value to functions, the objects +are always considered to be formally copied into a new object. This means the +argument itself must be the only value referencing the passed object. This ---------------- jyknight wrote:
NRVO copy-elision can enable a function which returns by value to stash the address of the returned value. Or, C++ constructors can do the same. Then, copy-elision on the call can result in the callee receiving a object whose address is escaped, despite it receiving it "passed by value". E.g. in the following example, `&a == global` in the body of `foo`. ``` struct NonTrivial { NonTrivial(); }; NonTrivial *global; NonTrivial frob() { NonTrivial result; global = &result; return result; } void foo(NonTrivial a); int main() { foo(frob()); } ``` But, I don't think this new attribute is viable; the intent expressed by the PR message is to use it in libc++ to mark stdlib types. But, this cannot be a type property, because any code could do the above with any type. https://github.com/llvm/llvm-project/pull/95004 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits