tree.c (free_lang_data_in_decl): Zero DECL_VINDEX if it's not an integer.
authorMichael Matz <matz@suse.de>
Sun, 3 Apr 2011 11:14:14 +0000 (11:14 +0000)
committerMichael Matz <matz@gcc.gnu.org>
Sun, 3 Apr 2011 11:14:14 +0000 (11:14 +0000)
* tree.c (free_lang_data_in_decl): Zero DECL_VINDEX if it's not
an integer.
* tree.h (tree_decl_non_common.vindex): Adjust comment.

From-SVN: r171904

gcc/ChangeLog
gcc/tree.c
gcc/tree.h

index a4b56f2400ca753d5a9ea87b486b77da45a19f55..4be06bf4a6b4502642205a6502b8d34060770103 100644 (file)
@@ -1,3 +1,9 @@
+2011-04-03  Michael Matz  <matz@suse.de>
+
+       * tree.c (free_lang_data_in_decl): Zero DECL_VINDEX if it's not
+       an integer.
+       * tree.h (tree_decl_non_common.vindex): Adjust comment.
+
 2011-04-03  Michael Matz  <matz@suse.de>
 
        * cgraphbuild.c (record_reference): Canonicalize constructor
index eec4a8b290580adfccc264a7b548e11aa1c56a5f..f1ac7a604ce6fb90dc418874b0d0a27dd986c51c 100644 (file)
@@ -4647,6 +4647,13 @@ free_lang_data_in_decl (tree decl)
          && RECORD_OR_UNION_TYPE_P
               (DECL_CONTEXT (DECL_ABSTRACT_ORIGIN (decl))))
        DECL_ABSTRACT_ORIGIN (decl) = NULL_TREE;
+
+      /* Sometimes the C++ frontend doesn't manage to transform a temporary
+         DECL_VINDEX referring to itself into a vtable slot number as it
+        should.  Happens with functions that are copied and then forgotten
+        about.  Just clear it, it won't matter anymore.  */
+      if (DECL_VINDEX (decl) && !host_integerp (DECL_VINDEX (decl), 0))
+       DECL_VINDEX (decl) = NULL_TREE;
     }
   else if (TREE_CODE (decl) == VAR_DECL)
     {
index b50336190f9128899607c01f3183165b2c962e72..053076f7f1c9b2880040590b4548c696cab33568 100644 (file)
@@ -3229,7 +3229,7 @@ struct GTY(())
   tree arguments;
   /* Almost all FE's use this.  */
   tree result;
-  /* C++ uses this in namespaces.  */
+  /* C++ uses this in namespaces and function_decls.  */
   tree vindex;
 };