From: Tom de Vries Date: Tue, 23 Oct 2018 15:06:17 +0000 (+0000) Subject: backport "[c++] Fix DECL_BY_REFERENCE of clone parms" X-Git-Tag: releases/gcc-7.4.0~81 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=03a5b5013f5b9eb9794b5a41ecba267efb8a7259;p=thirdparty%2Fgcc.git backport "[c++] Fix DECL_BY_REFERENCE of clone parms" Consider test.C compiled at -O0 -g: ... class string { public: string (const char *p) { this->p = p ; } string (const string &s) { this->p = s.p; } private: const char *p; }; class foo { public: foo (string dir_hint) {} }; int main (void) { std::string s = "This is just a string"; foo bar(s); return 0; } ... When parsing foo::foo, the dir_hint parameter gets a DECL_ARG_TYPE of 'struct string & restrict'. Then during finish_struct, we call clone_constructors_and_destructors and create clones for foo::foo, and set the DECL_ARG_TYPE in the same way. Later on, during finish_function, cp_genericize is called for the original foo::foo, which sets the type of parm dir_hint to DECL_ARG_TYPE, and sets DECL_BY_REFERENCE of dir_hint to 1. After that, during maybe_clone_body update_cloned_parm is called with: ... (gdb) call debug_generic_expr (parm.typed.type) struct string & restrict (gdb) call debug_generic_expr (cloned_parm.typed.type) struct string ... The type of the cloned_parm is then set to the type of parm, but DECL_BY_REFERENCE is not set. When doing cp_genericize for the clone later on, TREE_ADDRESSABLE (TREE_TYPE ()) is no longer true for the updated type for the parm, so DECL_BY_REFERENCE is not set there either. The missing DECL_BY_REFERENCE on cloned_parm causes incorrect debug info to be generated. This patch fixes the problem by copying DECL_BY_REFERENCE in update_cloned_parm. Bootstrapped and reg-tested on x86_64. 2018-10-23 Tom de Vries backport from trunk: 2018-07-31 Tom de Vries PR debug/86687 * optimize.c (update_cloned_parm): Copy DECL_BY_REFERENCE. * g++.dg/guality/pr86687.C: New test. From-SVN: r265427 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1c0986bbe94e..854e0b59e75a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2018-10-23 Tom de Vries + + backport from trunk: + 2018-07-31 Tom de Vries + + PR debug/86687 + * optimize.c (update_cloned_parm): Copy DECL_BY_REFERENCE. + 2018-10-12 Jakub Jelinek Backported from mainline diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c index d646ef73803f..7cca01353609 100644 --- a/gcc/cp/optimize.c +++ b/gcc/cp/optimize.c @@ -46,6 +46,8 @@ update_cloned_parm (tree parm, tree cloned_parm, bool first) /* We may have taken its address. */ TREE_ADDRESSABLE (cloned_parm) = TREE_ADDRESSABLE (parm); + DECL_BY_REFERENCE (cloned_parm) = DECL_BY_REFERENCE (parm); + /* The definition might have different constness. */ TREE_READONLY (cloned_parm) = TREE_READONLY (parm); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cbec180e0083..f4d6475be6bc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2018-10-23 Tom de Vries + + backport from trunk: + 2018-07-31 Tom de Vries + + PR debug/86687 + * g++.dg/guality/pr86687.C: New test. + 2018-10-22 Eric Botcazou * gnat.dg/sso14.adb: New test. diff --git a/gcc/testsuite/g++.dg/guality/pr86687.C b/gcc/testsuite/g++.dg/guality/pr86687.C new file mode 100644 index 000000000000..b2cdaf8547b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/guality/pr86687.C @@ -0,0 +1,28 @@ +// PR debug/86687 +// { dg-do run } +// { dg-options "-g" } + +class string { +public: + string (int p) { this->p = p ; } + string (const string &s) { this->p = s.p; } + + int p; +}; + +class foo { +public: + foo (string dir_hint) { + p = dir_hint.p; // { dg-final { gdb-test 16 "dir_hint.p" 3 } } + } + + int p; +}; + +int +main (void) +{ + string s = 3; + foo bar(s); + return !(bar.p == 3); +}