re PR debug/46815 (Invalid DW_AT_location for a retval instance of a class that has a virtual function)

PR debug/46815
	* cp-gimplify.c (cp_genericize): When changing RESULT_DECL
	into invisible reference, change also DECL_VALUE_EXPR of
	NRV optimized variable.

	* g++.dg/guality/pr46815.C: New test.

From-SVN: r167865
This commit is contained in:
Jakub Jelinek 2010-12-15 18:50:34 +01:00 committed by Jakub Jelinek
parent db1792ee33
commit 140806fa55
4 changed files with 54 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2010-12-15 Jakub Jelinek <jakub@redhat.com>
PR debug/46815
* cp-gimplify.c (cp_genericize): When changing RESULT_DECL
into invisible reference, change also DECL_VALUE_EXPR of
NRV optimized variable.
2010-12-15 Paolo Carlini <paolo.carlini@oracle.com> 2010-12-15 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/42083 PR c++/42083

View File

@ -958,6 +958,23 @@ cp_genericize (tree fndecl)
DECL_BY_REFERENCE (t) = 1; DECL_BY_REFERENCE (t) = 1;
TREE_ADDRESSABLE (t) = 0; TREE_ADDRESSABLE (t) = 0;
relayout_decl (t); relayout_decl (t);
if (DECL_NAME (t))
{
/* Adjust DECL_VALUE_EXPR of the original var. */
tree outer = outer_curly_brace_block (current_function_decl);
tree var;
if (outer)
for (var = BLOCK_VARS (outer); var; var = DECL_CHAIN (var))
if (DECL_NAME (t) == DECL_NAME (var)
&& DECL_HAS_VALUE_EXPR_P (var)
&& DECL_VALUE_EXPR (var) == t)
{
tree val = convert_from_reference (t);
SET_DECL_VALUE_EXPR (var, val);
break;
}
}
} }
/* If we're a clone, the body is already GIMPLE. */ /* If we're a clone, the body is already GIMPLE. */

View File

@ -1,3 +1,8 @@
2010-12-15 Jakub Jelinek <jakub@redhat.com>
PR debug/46815
* g++.dg/guality/pr46815.C: New test.
2010-12-15 Paolo Carlini <paolo.carlini@oracle.com> 2010-12-15 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/42083 PR c++/42083

View File

@ -0,0 +1,25 @@
// PR debug/46815
// { dg-do run }
// { dg-options "-g" }
// { dg-skip-if "" { *-*-* } { "*" } { "-O0" } }
struct S
{
int i;
S () { i = 42; }
virtual void foo (void) {}
};
S
bar ()
{
S s;
return s; // { dg-final { gdb-test 17 "s.i" "42" } }
}
int
main ()
{
S s = bar ();
return s.i - 42;
}