re PR c++/32992 (Incorrect code generated for anonymous union and return)
PR c++/32992 * typeck.c (check_return_expr): Don't NRV optimize vars in anonymous unions. * decl.c (finish_function): Comment fix. * g++.dg/opt/nrv14.C: New test. From-SVN: r127510
This commit is contained in:
parent
9bf5a5e86c
commit
59fe92745a
|
@ -1,3 +1,10 @@
|
|||
2007-08-15 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/32992
|
||||
* typeck.c (check_return_expr): Don't NRV optimize vars in
|
||||
anonymous unions.
|
||||
* decl.c (finish_function): Comment fix.
|
||||
|
||||
2007-08-15 Paolo Carlini <pcarlini@suse.de>
|
||||
|
||||
PR c++/33035
|
||||
|
|
|
@ -11569,7 +11569,7 @@ finish_function (int flags)
|
|||
gcc_assert (stmts_are_full_exprs_p ());
|
||||
|
||||
/* Set up the named return value optimization, if we can. Candidate
|
||||
variables are selected in check_return_value. */
|
||||
variables are selected in check_return_expr. */
|
||||
if (current_function_return_value)
|
||||
{
|
||||
tree r = current_function_return_value;
|
||||
|
|
|
@ -6703,6 +6703,7 @@ check_return_expr (tree retval, bool *no_warning)
|
|||
&& TREE_CODE (retval) == VAR_DECL
|
||||
&& DECL_CONTEXT (retval) == current_function_decl
|
||||
&& ! TREE_STATIC (retval)
|
||||
&& ! DECL_ANON_UNION_VAR_P (retval)
|
||||
&& (DECL_ALIGN (retval)
|
||||
>= DECL_ALIGN (DECL_RESULT (current_function_decl)))
|
||||
/* The cv-unqualified type of the returned value must be the
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2007-08-15 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/32992
|
||||
* g++.dg/opt/nrv14.C: New test.
|
||||
|
||||
2007-08-15 Paolo Carlini <pcarlini@suse.de>
|
||||
|
||||
PR c++/33035
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
// PR c++/32992
|
||||
// { dg-do run }
|
||||
// { dg-options "-O2" }
|
||||
|
||||
extern "C" void abort (void);
|
||||
|
||||
struct A
|
||||
{
|
||||
long int a1;
|
||||
long int a2;
|
||||
long int a3;
|
||||
};
|
||||
|
||||
struct B
|
||||
{
|
||||
long int f[3];
|
||||
operator A ()
|
||||
{
|
||||
union
|
||||
{
|
||||
long int t[3];
|
||||
A a;
|
||||
};
|
||||
for (int i = 0; i < 3; i++)
|
||||
t[i] = f[i];
|
||||
return a;
|
||||
}
|
||||
};
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
B b = { {1, 3, 5} };
|
||||
A a = b;
|
||||
|
||||
if (a.a1 != b.f[0] || a.a2 != b.f[1] || a.a3 != b.f[2])
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue