From: Jakub Jelinek Date: Thu, 7 Jul 2016 12:45:44 +0000 (+0200) Subject: backport: re PR c++/71528 (multiple extern reference declarations produce uninitializ... X-Git-Tag: releases/gcc-5.5.0~992 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e604e4e89670192f01deefa900a5eb11893d06b1;p=thirdparty%2Fgcc.git backport: re PR c++/71528 (multiple extern reference declarations produce uninitialized access) Backported from mainline 2016-06-14 Jakub Jelinek PR c++/71528 * decl.c (duplicate_decls): For DECL_INITIALIZED_P non-external olddecl vars, preserve their TREE_READONLY bit. * g++.dg/opt/pr71528.C: New test. From-SVN: r238098 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4529d1f77b7d..c735c821b354 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -3,6 +3,10 @@ Backported from mainline 2016-06-14 Jakub Jelinek + PR c++/71528 + * decl.c (duplicate_decls): For DECL_INITIALIZED_P non-external + olddecl vars, preserve their TREE_READONLY bit. + PR c++/71516 * decl.c (complete_vars): Handle gracefully type == error_mark_node. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index c1747d6ad866..ce0443ca4c05 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2023,6 +2023,14 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) if (VAR_P (newdecl)) { DECL_THIS_EXTERN (newdecl) |= DECL_THIS_EXTERN (olddecl); + /* For already initialized vars, TREE_READONLY could have been + cleared in cp_finish_decl, because the var needs runtime + initialization or destruction. Make sure not to set + TREE_READONLY on it again. */ + if (DECL_INITIALIZED_P (olddecl) + && !DECL_EXTERNAL (olddecl) + && !TREE_READONLY (olddecl)) + TREE_READONLY (newdecl) = 0; DECL_INITIALIZED_P (newdecl) |= DECL_INITIALIZED_P (olddecl); DECL_NONTRIVIALLY_INITIALIZED_P (newdecl) |= DECL_NONTRIVIALLY_INITIALIZED_P (olddecl); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 59bbf239b20b..ed6444ef157e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backported from mainline 2016-06-14 Jakub Jelinek + PR c++/71528 + * g++.dg/opt/pr71528.C: New test. + PR c++/71516 * g++.dg/init/pr71516.C: New test. diff --git a/gcc/testsuite/g++.dg/opt/pr71528.C b/gcc/testsuite/g++.dg/opt/pr71528.C new file mode 100644 index 000000000000..bfe062204726 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr71528.C @@ -0,0 +1,23 @@ +// PR c++/71528 +// { dg-do run } +// { dg-options "-O2" } + +extern int &x; +int y; + +int & +foo () +{ + return y; +} + +int &x = foo (); + +int +main () +{ + if (&x != &y) + __builtin_abort (); +} + +extern int &x;