OSDN Git Service

* decl.c (start_decl): Simplify specialization handling. Remove
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 2 Jun 2005 09:34:38 +0000 (09:34 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 2 Jun 2005 09:34:38 +0000 (09:34 +0000)
unneeded CLASSTYPE_TEMPLATE_INSTANTIATION check.
* mangle.c (discriminator_for_local_entity): Use VEC_index.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@100488 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/mangle.c

index 1314bcf..7524d5e 100644 (file)
@@ -1,5 +1,9 @@
 2005-06-02  Nathan Sidwell  <nathan@codesourcery.com>
 
+       * decl.c (start_decl): Simplify specialization handling. Remove
+       unneeded CLASSTYPE_TEMPLATE_INSTANTIATION check.
+       * mangle.c (discriminator_for_local_entity): Use VEC_index.
+
        PR c++/20350
        * decl.c (duplicate_decls): Copy all of DECL_USE_TEMPLATE.
 
index 83bd6fc..83c6719 100644 (file)
@@ -3716,22 +3716,22 @@ start_decl (const cp_declarator *declarator,
 
       /* cp_finish_decl sets DECL_EXTERNAL if DECL_IN_AGGR_P is set.  */
       DECL_IN_AGGR_P (decl) = 0;
-      if ((DECL_LANG_SPECIFIC (decl) && DECL_USE_TEMPLATE (decl))
-         || CLASSTYPE_TEMPLATE_INSTANTIATION (context))
-       {
-         /* Do not mark DECL as an explicit specialization if it was
-            not already marked as an instantiation; a declaration
-            should never be marked as a specialization unless we know
-            what template is being specialized.  */ 
-         if (DECL_LANG_SPECIFIC (decl) && DECL_USE_TEMPLATE (decl))
-           SET_DECL_TEMPLATE_SPECIALIZATION (decl);
+      /* Do not mark DECL as an explicit specialization if it was not
+        already marked as an instantiation; a declaration should
+        never be marked as a specialization unless we know what
+        template is being specialized.  */ 
+      if (DECL_LANG_SPECIFIC (decl) && DECL_USE_TEMPLATE (decl))
+       {
+         SET_DECL_TEMPLATE_SPECIALIZATION (decl);
+      
          /* [temp.expl.spec] An explicit specialization of a static data
             member of a template is a definition if the declaration
             includes an initializer; otherwise, it is a declaration.
-
+             
             We check for processing_specialization so this only applies
             to the new specialization syntax.  */
-         if (DECL_INITIAL (decl) == NULL_TREE && processing_specialization)
+         if (!DECL_INITIAL (decl)
+             && processing_specialization)
            DECL_EXTERNAL (decl) = 1;
        }
 
index a2fefd0..8c276b5 100644 (file)
@@ -1426,8 +1426,6 @@ write_special_name_destructor (const tree dtor)
 static int
 discriminator_for_local_entity (tree entity)
 {
-  tree *type;
-
   /* Assume this is the only local entity with this name.  */
   int discriminator = 0;
 
@@ -1435,12 +1433,19 @@ discriminator_for_local_entity (tree entity)
     discriminator = DECL_DISCRIMINATOR (entity);
   else if (TREE_CODE (entity) == TYPE_DECL)
     {
+      int ix;
+      
       /* Scan the list of local classes.  */
       entity = TREE_TYPE (entity);
-      for (type = VEC_address (tree, local_classes); *type != entity; ++type)
-        if (TYPE_IDENTIFIER (*type) == TYPE_IDENTIFIER (entity)
-            && TYPE_CONTEXT (*type) == TYPE_CONTEXT (entity))
-         ++discriminator;
+      for (ix = 0; ; ix++)
+       {
+         tree type = VEC_index (tree, local_classes, ix);
+         if (type == entity)
+           break;
+         if (TYPE_IDENTIFIER (type) == TYPE_IDENTIFIER (entity)
+             && TYPE_CONTEXT (type) == TYPE_CONTEXT (entity))
+           ++discriminator;
+       }
     }  
 
   return discriminator;