From: Jason Merrill Date: Fri, 4 Dec 2009 00:26:35 +0000 (-0500) Subject: re PR middle-end/41611 (guard variable is emitted even when the guarded symbol isn't) X-Git-Tag: releases/gcc-4.5.0~1805 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d35311a213ec3974c2bf91311ebd1380ffd080d4;p=thirdparty%2Fgcc.git re PR middle-end/41611 (guard variable is emitted even when the guarded symbol isn't) PR c++/41611 * decl2.c (get_guard): Don't use the same comdat group as the decl. From-SVN: r154965 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index deb59030bd00..cdbd1c48a1f4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2009-12-03 Jason Merrill + PR c++/41611 + * decl2.c (get_guard): Don't use the same comdat group as the decl. + PR c++/42266 * cvt.c (convert_from_reference): Do nothing if TREE_TYPE is null. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 1cd2ded03a3f..faa3c9d45a96 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -2555,7 +2555,8 @@ get_guard (tree decl) TREE_STATIC (guard) = TREE_STATIC (decl); DECL_COMMON (guard) = DECL_COMMON (decl); DECL_COMDAT (guard) = DECL_COMDAT (decl); - DECL_COMDAT_GROUP (guard) = DECL_COMDAT_GROUP (decl); + if (DECL_ONE_ONLY (decl)) + make_decl_one_only (guard, cxx_comdat_group (guard)); if (TREE_PUBLIC (decl)) DECL_WEAK (guard) = DECL_WEAK (decl); DECL_VISIBILITY (guard) = DECL_VISIBILITY (decl); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ff7a355f451b..c68c0b64d4e9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2009-12-03 Jason Merrill + PR c++/41611 + * g++.dg/abi/guard2.C: New. + PR c++/42266 * g++.dg/cpp0x/variadic97.C: New. diff --git a/gcc/testsuite/g++.dg/abi/guard2.C b/gcc/testsuite/g++.dg/abi/guard2.C new file mode 100644 index 000000000000..09643e952285 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/guard2.C @@ -0,0 +1,16 @@ +// PR c++/41611 +// Test that the guard gets its own COMDAT group. +// { dg-final { scan-assembler "_ZGVZN1A1fEvE1i,comdat" { target i?86-*-* x86_64-*-* } } } + +struct A { + static int f() + { + static int &i = *new int(); + return i; + } +}; + +int main() +{ + return A::f(); +}