Hello,this patch passes bootstrap+testsuite on x86_64-linux-gnu. As explained in the PR, it seems that the check for alignment is in the wrong direction (tree-nrv.c and ada have the reverse one).
2013-05-18 Marc Glisse <marc.gli...@inria.fr> PR c++/57175 gcc/cp/ * typeck.c (check_return_expr): Reverse the alignment comparison. gcc/testsuite/ * g++.dg/pr57175.C: New testcase. -- Marc Glisse
Index: testsuite/g++.dg/pr57175.C =================================================================== --- testsuite/g++.dg/pr57175.C (revision 0) +++ testsuite/g++.dg/pr57175.C (revision 0) @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c++11" } */ + +extern "C" void do_not_remove (); + +struct A +{ + A () { } + A (A const&) { do_not_remove (); } +}; + +A +f () +{ + alignas (2 * alignof (A)) A x; + return x; +} + +/* { dg-final { scan-assembler "do_not_remove" } } */ Property changes on: testsuite/g++.dg/pr57175.C ___________________________________________________________________ Added: svn:eol-style + native Added: svn:keywords + Author Date Id Revision URL Index: cp/typeck.c =================================================================== --- cp/typeck.c (revision 199049) +++ cp/typeck.c (working copy) @@ -8362,21 +8362,21 @@ check_return_expr (tree retval, bool *no See finish_function and finalize_nrv for the rest of this optimization. */ named_return_value_okay_p = (retval != NULL_TREE /* Must be a local, automatic variable. */ && VAR_P (retval) && DECL_CONTEXT (retval) == current_function_decl && ! TREE_STATIC (retval) && ! DECL_ANON_UNION_VAR_P (retval) - && (DECL_ALIGN (retval) >= DECL_ALIGN (result)) + && (DECL_ALIGN (retval) <= DECL_ALIGN (result)) /* The cv-unqualified type of the returned value must be the same as the cv-unqualified return type of the function. */ && same_type_p ((TYPE_MAIN_VARIANT (TREE_TYPE (retval))), (TYPE_MAIN_VARIANT (functype))) /* And the returned value must be non-volatile. */ && ! TYPE_VOLATILE (TREE_TYPE (retval))); if (fn_returns_value_p && flag_elide_constructors) {