Commit 59fe9274 by Jakub Jelinek Committed by Jakub Jelinek

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
parent 9bf5a5e8
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> 2007-08-15 Paolo Carlini <pcarlini@suse.de>
PR c++/33035 PR c++/33035
......
...@@ -11569,7 +11569,7 @@ finish_function (int flags) ...@@ -11569,7 +11569,7 @@ finish_function (int flags)
gcc_assert (stmts_are_full_exprs_p ()); gcc_assert (stmts_are_full_exprs_p ());
/* Set up the named return value optimization, if we can. Candidate /* 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) if (current_function_return_value)
{ {
tree r = current_function_return_value; tree r = current_function_return_value;
......
...@@ -6703,6 +6703,7 @@ check_return_expr (tree retval, bool *no_warning) ...@@ -6703,6 +6703,7 @@ check_return_expr (tree retval, bool *no_warning)
&& TREE_CODE (retval) == VAR_DECL && TREE_CODE (retval) == VAR_DECL
&& DECL_CONTEXT (retval) == current_function_decl && DECL_CONTEXT (retval) == current_function_decl
&& ! TREE_STATIC (retval) && ! TREE_STATIC (retval)
&& ! DECL_ANON_UNION_VAR_P (retval)
&& (DECL_ALIGN (retval) && (DECL_ALIGN (retval)
>= DECL_ALIGN (DECL_RESULT (current_function_decl))) >= DECL_ALIGN (DECL_RESULT (current_function_decl)))
/* The cv-unqualified type of the returned value must be the /* The cv-unqualified type of the returned value must be the
......
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> 2007-08-15 Paolo Carlini <pcarlini@suse.de>
PR c++/33035 PR c++/33035
// 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment