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:
parent
db1792ee33
commit
140806fa55
@ -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>
|
||||
|
||||
PR c++/42083
|
||||
|
@ -958,6 +958,23 @@ cp_genericize (tree fndecl)
|
||||
DECL_BY_REFERENCE (t) = 1;
|
||||
TREE_ADDRESSABLE (t) = 0;
|
||||
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. */
|
||||
|
@ -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>
|
||||
|
||||
PR c++/42083
|
||||
|
25
gcc/testsuite/g++.dg/guality/pr46815.C
Normal file
25
gcc/testsuite/g++.dg/guality/pr46815.C
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user