c-decl.c (duplicate_decls): CLear DECL_STRUCT_FUNCTION before releasing symbol.
authorJan Hubicka <hubicka@ucw.cz>
Wed, 2 Jul 2014 15:23:56 +0000 (17:23 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 2 Jul 2014 15:23:56 +0000 (15:23 +0000)
* c-decl.c (duplicate_decls): CLear DECL_STRUCT_FUNCTION before
releasing symbol.

* gcc.c-torture/compile/section.c: New testcase.

Co-Authored-By: Chen Gang <gang.chen.5i5j@gmail.com>
From-SVN: r212234

gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/section.c [new file with mode: 0644]

index 1c19362..68abca4 100644 (file)
@@ -1,3 +1,9 @@
+2014-07-02  Jan Hubicka  <hubicka@ucw.cz>
+           Chen Gang <gang.chen.5i5j@gmail.com>
+
+       * c-decl.c (duplicate_decls): CLear DECL_STRUCT_FUNCTION before
+       releasing symbol.
+
 2014-07-01  Marek Polacek  <polacek@redhat.com>
 
        * c-typeck.c (convert_for_assignment): Pass OPT_Wint_conversion
index 7c37edf..3dec90b 100644 (file)
@@ -2575,7 +2575,14 @@ duplicate_decls (tree newdecl, tree olddecl)
 
   merge_decls (newdecl, olddecl, newtype, oldtype);
 
-  /* The NEWDECL will no longer be needed.  */
+  /* The NEWDECL will no longer be needed.
+
+     Before releasing the node, be sure to remove function from symbol
+     table that might have been inserted there to record comdat group.
+     Be sure to however do not free DECL_STRUCT_FUNCTION because this
+     structure is shared in between NEWDECL and OLDECL.  */
+  if (TREE_CODE (newdecl) == FUNCTION_DECL)
+    DECL_STRUCT_FUNCTION (newdecl) = NULL;
   if (TREE_CODE (newdecl) == FUNCTION_DECL
       || TREE_CODE (newdecl) == VAR_DECL)
     {
index 1195959..2868983 100644 (file)
@@ -1,3 +1,8 @@
+2014-07-02  Jan Hubicka  <hubicka@ucw.cz>
+           Chen Gang <gang.chen.5i5j@gmail.com>
+
+       * gcc.c-torture/compile/section.c: New testcase.
 2014-07-02  Christian Bruel  <christian.bruel@st.com>
 
        PR target/29349
diff --git a/gcc/testsuite/gcc.c-torture/compile/section.c b/gcc/testsuite/gcc.c-torture/compile/section.c
new file mode 100644 (file)
index 0000000..1e8d094
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+
+/* { dg-require-effective-target named_sections } */
+extern int __attribute__ ((__section__(".init.text"))) elv_register(void)
+{
+ return 0;
+}
+extern typeof(elv_register) elv_register;