From 2b8f9c8f36033b7ed3a2b89d61db7f1a3fdb0a42 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 25 Feb 2015 16:46:29 -0500 Subject: [PATCH] re PR c++/65209 (Broken code with global static variables, invalid pointer when freeing global variables) PR c++/65209 * decl2.c (constrain_visibility) [VISIBILITY_ANON]: Clear DECL_COMDAT. (constrain_visibility_for_template): Handle reference arguments. From-SVN: r220991 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/decl2.c | 8 ++++++-- gcc/testsuite/g++.dg/abi/anon4.C | 41 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/abi/anon4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fbebe8e..ebe84c6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2015-02-25 Jason Merrill + PR c++/65209 + * decl2.c (constrain_visibility) [VISIBILITY_ANON]: Clear + DECL_COMDAT. + (constrain_visibility_for_template): Handle reference arguments. + PR debug/58315 * decl.c (start_preparsed_function): Use create_artificial_label for cdtor_label. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index a7bc08f..a4a5ebf 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -2175,6 +2175,7 @@ constrain_visibility (tree decl, int visibility, bool tmpl) TREE_PUBLIC (decl) = 0; DECL_WEAK (decl) = 0; DECL_COMMON (decl) = 0; + DECL_COMDAT (decl) = false; if (TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == VAR_DECL) { @@ -2215,9 +2216,12 @@ constrain_visibility_for_template (tree decl, tree targs) tree arg = TREE_VEC_ELT (args, i-1); if (TYPE_P (arg)) vis = type_visibility (arg); - else if (TREE_TYPE (arg) && POINTER_TYPE_P (TREE_TYPE (arg))) + else { - STRIP_NOPS (arg); + if (REFERENCE_REF_P (arg)) + arg = TREE_OPERAND (arg, 0); + if (TREE_TYPE (arg)) + STRIP_NOPS (arg); if (TREE_CODE (arg) == ADDR_EXPR) arg = TREE_OPERAND (arg, 0); if (VAR_OR_FUNCTION_DECL_P (arg)) diff --git a/gcc/testsuite/g++.dg/abi/anon4.C b/gcc/testsuite/g++.dg/abi/anon4.C new file mode 100644 index 0000000..088ba99 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/anon4.C @@ -0,0 +1,41 @@ +// PR c++/65209 +// { dg-final { scan-assembler-not "comdat" } } + +// Everything involving the anonymous namespace bits should be private, not +// COMDAT. + +struct Bar +{ + static Bar *self(); + char pad[24]; +}; + +template +struct BarGlobalStatic +{ + Bar *operator()() { return holderFunction(); } +}; + +namespace { + namespace Q_QGS_s_self { + inline Bar *innerFunction() { + static struct Holder { + Bar value; + ~Holder() {} + } holder; + return &holder.value; + } + } +} +static BarGlobalStatic s_self; + +Bar *Bar::self() +{ + return s_self(); +} + +int main(int argc, char *argv[]) +{ + Bar* bar = Bar::self(); + return 0; +} -- 2.7.4