http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57175
Bug #: 57175 Summary: NRVO and alignment Classification: Unclassified Product: gcc Version: 4.9.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: gli...@gcc.gnu.org Hello, in typeck.c (check_return_expr), before applying the NRV optimization, there is a check: DECL_ALIGN (retval) >= DECL_ALIGN (result) It seems to me that this check is backwards and should be <= instead (compare with tree_nrv in tree-nrv.c which seems correct). #include <iostream> struct A { A(){std::cerr<<"A()\n";} ~A(){std::cerr<<"~A()\n";} A(A&&){std::cerr<<"A(A&&)\n";} A(A const&){std::cerr<<"A(A const&)\n";} }; A f(){ alignas(32) A x; return x; } int main(){ f(); } If I understand NRVO properly, main reserves memory for the return value of f and passes f the address of that memory. f then decides to use that memory directly for x instead of allocating new memory that would have to be copied later. So the return memory needs to be at least as aligned as x, not the reverse (I think retval corresponds to x here). Current g++ does the elision on this code. If I change >= to <=, it inhibits the elision.