From: H.J. Lu Date: Thu, 19 Feb 2009 15:22:28 +0000 (+0000) Subject: re PR c++/39188 (G++ doesn't handle static anonymous union right) X-Git-Tag: releases/gcc-4.4.0~492 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=68017cb410dc476560ef648be47189825fef365a;p=thirdparty%2Fgcc.git re PR c++/39188 (G++ doesn't handle static anonymous union right) gcc/ 2009-02-19 H.J. Lu PR c++/39188 * varasm.c (assemble_variable): Don't check DECL_NAME when globalizing a variable. gcc/cp/ 2009-02-19 H.J. Lu PR c++/39188 * cp-tree.h (maybe_commonize_var): New. * decl.c (maybe_commonize_var): Make it extern. * decl2.c (finish_anon_union): Call maybe_commonize_var. gcc/testsuite/ 2009-02-19 H.J. Lu PR c++/39188 * g++.dg/abi/pr39188-1a.C: New. * g++.dg/abi/pr39188-1b.C: Likewise. * g++.dg/abi/pr39188-1.h: Likewise. * g++.dg/abi/pr39188-2a.C: Likewise. * g++.dg/abi/pr39188-2b.C: Likewise. * g++.dg/abi/pr39188-2.h: Likewise. * g++.dg/abi/pr39188-3a.C: Likewise. * g++.dg/abi/pr39188-3b.C: Likewise. * g++.dg/abi/pr39188-3.h: Likewise. From-SVN: r144297 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index da214e8deea2..84315ee084f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-02-19 H.J. Lu + + PR c++/39188 + * varasm.c (assemble_variable): Don't check DECL_NAME when + globalizing a variable. + 2009-02-19 Joseph Myers PR c/38483 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 709453d91ff9..c766c7f8057b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2009-02-19 H.J. Lu + + PR c++/39188 + * cp-tree.h (maybe_commonize_var): New. + + * decl.c (maybe_commonize_var): Make it extern. + + * decl2.c (finish_anon_union): Call maybe_commonize_var. + 2009-02-18 H.J. Lu PR c++/39219 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index b23a3963d447..fa4017d4d049 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4360,6 +4360,7 @@ extern tree finish_function (int); extern tree start_method (cp_decl_specifier_seq *, const cp_declarator *, tree); extern tree finish_method (tree); extern void maybe_register_incomplete_var (tree); +extern void maybe_commonize_var (tree); extern void complete_vars (tree); extern void finish_stmt (void); extern void print_other_binding_stack (struct cp_binding_level *); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 8476959bff44..930f944e8a11 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -81,7 +81,6 @@ static tree lookup_and_check_tag (enum tag_types, tree, tag_scope, bool); static int walk_namespaces_r (tree, walk_namespaces_fn, void *); static void maybe_deduce_size_from_array_init (tree, tree); static void layout_var_decl (tree); -static void maybe_commonize_var (tree); static tree check_initializer (tree, tree, int, tree *); static void make_rtl_for_nonlocal_decl (tree, tree, const char *); static void save_function_data (tree); @@ -4536,7 +4535,7 @@ layout_var_decl (tree decl) we have a weak definition, we must endeavor to create only one instance of the variable at link-time. */ -static void +void maybe_commonize_var (tree decl) { /* Static data in a function with comdat linkage also has comdat diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 2cafc8377656..9d33bbf8bfd9 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1364,6 +1364,7 @@ finish_anon_union (tree anon_union_decl) { /* Use main_decl to set the mangled name. */ DECL_NAME (anon_union_decl) = DECL_NAME (main_decl); + maybe_commonize_var (anon_union_decl); mangle_decl (anon_union_decl); DECL_NAME (anon_union_decl) = NULL_TREE; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2a4bad1693ec..a84d1f667017 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2009-02-19 H.J. Lu + + PR c++/39188 + * g++.dg/abi/pr39188-1a.C: New. + * g++.dg/abi/pr39188-1b.C: Likewise. + * g++.dg/abi/pr39188-1.h: Likewise. + * g++.dg/abi/pr39188-2a.C: Likewise. + * g++.dg/abi/pr39188-2b.C: Likewise. + * g++.dg/abi/pr39188-2.h: Likewise. + * g++.dg/abi/pr39188-3a.C: Likewise. + * g++.dg/abi/pr39188-3b.C: Likewise. + * g++.dg/abi/pr39188-3.h: Likewise. + 2009-02-19 Joseph Myers PR c/38483 diff --git a/gcc/testsuite/g++.dg/abi/pr39188-1.h b/gcc/testsuite/g++.dg/abi/pr39188-1.h new file mode 100644 index 000000000000..ece67daae1e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-1.h @@ -0,0 +1,11 @@ +inline int +f (int x) +{ + static union + { + int i; + }; + int j = i; + i = x; + return j; +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-1a.C b/gcc/testsuite/g++.dg/abi/pr39188-1a.C new file mode 100644 index 000000000000..eb646696def9 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-1a.C @@ -0,0 +1,12 @@ +// PR c++/39188 +// { dg-do run } +// { dg-options "-O2" } +// { dg-additional-sources "pr39188-1b.C" } + +#include "pr39188-1.h" + +int +x (int i) +{ + return f (i); +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-1b.C b/gcc/testsuite/g++.dg/abi/pr39188-1b.C new file mode 100644 index 000000000000..71c992637876 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-1b.C @@ -0,0 +1,15 @@ +#include "pr39188-1.h" + +extern "C" void abort (); + +extern int x (int); + +int +main (void) +{ + if (x (1) != 0) + abort (); + if (f (1) != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-2.h b/gcc/testsuite/g++.dg/abi/pr39188-2.h new file mode 100644 index 000000000000..6ff5f49dbf36 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-2.h @@ -0,0 +1,12 @@ +template +T +f (T x) +{ + static union + { + T i; + }; + T j = i; + i = x; + return j; +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-2a.C b/gcc/testsuite/g++.dg/abi/pr39188-2a.C new file mode 100644 index 000000000000..071b585f4c04 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-2a.C @@ -0,0 +1,12 @@ +// PR c++/39188 +// { dg-do run } +// { dg-options "-O2" } +// { dg-additional-sources "pr39188-2b.C" } + +#include "pr39188-2.h" + +int +x (int i) +{ + return f (i); +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-2b.C b/gcc/testsuite/g++.dg/abi/pr39188-2b.C new file mode 100644 index 000000000000..f91367ba29d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-2b.C @@ -0,0 +1,15 @@ +#include "pr39188-2.h" + +extern "C" void abort (); + +extern int x (int); + +int +main (void) +{ + if (x (1) != 0) + abort (); + if (f (1) != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-3.h b/gcc/testsuite/g++.dg/abi/pr39188-3.h new file mode 100644 index 000000000000..e0c9f619c2ed --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-3.h @@ -0,0 +1,11 @@ +static int +f (int x) +{ + static union + { + int i; + }; + int j = i; + i = x; + return j; +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-3a.C b/gcc/testsuite/g++.dg/abi/pr39188-3a.C new file mode 100644 index 000000000000..5596d12419e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-3a.C @@ -0,0 +1,12 @@ +// PR c++/39188 +// { dg-do run } +// { dg-options "-O2" } +// { dg-additional-sources "pr39188-3b.C" } + +#include "pr39188-3.h" + +int +x (int i) +{ + return f (i); +} diff --git a/gcc/testsuite/g++.dg/abi/pr39188-3b.C b/gcc/testsuite/g++.dg/abi/pr39188-3b.C new file mode 100644 index 000000000000..84db157a71ab --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr39188-3b.C @@ -0,0 +1,15 @@ +#include "pr39188-3.h" + +extern "C" void abort (); + +extern int x (int); + +int +main (void) +{ + if (x (1) != 0) + abort (); + if (f (1) != 0) + abort (); + return 0; +} diff --git a/gcc/varasm.c b/gcc/varasm.c index 7fed3009b84a..49bbe06f8517 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -2161,7 +2161,6 @@ assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED, /* First make the assembler name(s) global if appropriate. */ sect = get_variable_section (decl, false); if (TREE_PUBLIC (decl) - && DECL_NAME (decl) && (sect->common.flags & SECTION_COMMON) == 0) globalize_decl (decl);