[cfe-commits] r164931 - in /cfe/trunk: lib/Serialization/ASTReaderDecl.cpp test/Modules/Inputs/redecl-merge-left.h test/Modules/Inputs/redecl-merge-right.h test/Modules/redecl-merge.m

Axel Naumann Axel.Naumann at cern.ch
Mon Oct 1 02:18:01 PDT 2012


Author: axel
Date: Mon Oct  1 04:18:00 2012
New Revision: 164931

URL: http://llvm.org/viewvc/llvm-project?rev=164931&view=rev
Log:
Also merge template redeclarations.
Don't require specializations (of existing and read template) to be unique.

Modified:
    cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
    cfe/trunk/test/Modules/Inputs/redecl-merge-left.h
    cfe/trunk/test/Modules/Inputs/redecl-merge-right.h
    cfe/trunk/test/Modules/redecl-merge.m

Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=164931&r1=164930&r2=164931&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Mon Oct  1 04:18:00 2012
@@ -1312,10 +1312,12 @@
         D->setMemberSpecialization();
     }
   }
-     
+
   VisitTemplateDecl(D);
   D->IdentifierNamespace = Record[Idx++];
-  
+
+  mergeRedeclarable(D, Redecl);
+
   return Redecl;
 }
 
@@ -1402,9 +1404,9 @@
     if (D->isCanonicalDecl()) { // It's kept in the folding set.
       if (ClassTemplatePartialSpecializationDecl *Partial
                         = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
-       CanonPattern->getCommonPtr()->PartialSpecializations.InsertNode(Partial);
+  CanonPattern->getCommonPtr()->PartialSpecializations.GetOrInsertNode(Partial);
       } else {
-        CanonPattern->getCommonPtr()->Specializations.InsertNode(D);
+        CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
       }
     }
   }
@@ -1747,7 +1749,7 @@
     return (FuncX->getLinkage() == FuncY->getLinkage()) &&
       FuncX->getASTContext().hasSameType(FuncX->getType(), FuncY->getType());
   }
-  
+
   // Variables with the same type and linkage match.
   if (VarDecl *VarX = dyn_cast<VarDecl>(X)) {
     VarDecl *VarY = cast<VarDecl>(Y);
@@ -1760,7 +1762,11 @@
     NamespaceDecl *NamespaceY = cast<NamespaceDecl>(Y);
     return NamespaceX->isInline() == NamespaceY->isInline();
   }
-      
+
+  // Identical template names and kinds match.
+  if (isa<TemplateDecl>(X))
+    return true;
+
   // FIXME: Many other cases to implement.
   return false;
 }
@@ -2296,7 +2302,7 @@
   }
   MergedDeclsMap::iterator MergedPos = combineStoredMergedDecls(CanonDecl, ID);
   if (MergedPos != MergedDecls.end())
-    SearchDecls.append(MergedPos->second.begin(), MergedPos->second.end());  
+    SearchDecls.append(MergedPos->second.begin(), MergedPos->second.end());
   
   // Build up the list of redeclarations.
   RedeclChainVisitor Visitor(*this, SearchDecls, RedeclsDeserialized, CanonID);

Modified: cfe/trunk/test/Modules/Inputs/redecl-merge-left.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/redecl-merge-left.h?rev=164931&r1=164930&r2=164931&view=diff
==============================================================================
--- cfe/trunk/test/Modules/Inputs/redecl-merge-left.h (original)
+++ cfe/trunk/test/Modules/Inputs/redecl-merge-left.h Mon Oct  1 04:18:00 2012
@@ -88,6 +88,13 @@
 public:
   void push_back(int);
 };
+
+namespace N {
+template<typename T> class Set {
+public:
+  void insert(T);
+};
+}
 #endif
 
 // Make sure this doesn't introduce an ambiguity-creating 'id' at the

Modified: cfe/trunk/test/Modules/Inputs/redecl-merge-right.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/redecl-merge-right.h?rev=164931&r1=164930&r2=164931&view=diff
==============================================================================
--- cfe/trunk/test/Modules/Inputs/redecl-merge-right.h (original)
+++ cfe/trunk/test/Modules/Inputs/redecl-merge-right.h Mon Oct  1 04:18:00 2012
@@ -89,6 +89,13 @@
 public:
   void push_back(int);
 };
+
+namespace N {
+  template<typename T> class Set {
+  public:
+    void insert(T);
+  };
+}
 #endif
 
 int ONE;

Modified: cfe/trunk/test/Modules/redecl-merge.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/redecl-merge.m?rev=164931&r1=164930&r2=164931&view=diff
==============================================================================
--- cfe/trunk/test/Modules/redecl-merge.m (original)
+++ cfe/trunk/test/Modules/redecl-merge.m Mon Oct  1 04:18:00 2012
@@ -153,6 +153,9 @@
 
   List<bool> list_bool;
   list_bool.push_back(false);
+
+  N::Set<char> set_char;
+  set_char.insert('A');
 }
 #endif
 





More information about the cfe-commits mailing list