]> granicus.if.org Git - clang/commitdiff
Fix for PR5710: make sure to put function template specializations into the
authorEli Friedman <eli.friedman@gmail.com>
Tue, 8 Dec 2009 05:40:03 +0000 (05:40 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Tue, 8 Dec 2009 05:40:03 +0000 (05:40 +0000)
DeclContext, so they don't completely disappear from the AST.

I don't particularly like this fix, but I don't see any obviously better way
to deal with it, and I think it's pretty clearly an improvement; comments
welcome.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90835 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/DeclBase.cpp
lib/Sema/SemaDecl.cpp
test/CodeGenCXX/function-template-explicit-specialization.cpp [new file with mode: 0644]

index f276faf1beeb5bfb1354af63165e574bc4bfac74..c557e615e78b90d7e67893ea81a1f15252a40a1d 100644 (file)
@@ -741,6 +741,9 @@ void DeclContext::makeDeclVisibleInContext(NamedDecl *D, bool Recoverable) {
   // from being visible?
   if (isa<ClassTemplateSpecializationDecl>(D))
     return;
+  if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
+    if (FD->isFunctionTemplateSpecialization())
+      return;
 
   DeclContext *PrimaryContext = getPrimaryContext();
   if (PrimaryContext != this) {
index bb3f8694250de12c8eca8081920ce66ff830463a..472dc94bc5a54a940a995ed3dfe277aa19e1ef6a 100644 (file)
@@ -379,7 +379,9 @@ void Sema::PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext) {
   // scope.
   if ((isa<FunctionTemplateDecl>(D) &&
        cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->isOutOfLine()) ||
-      (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isOutOfLine()) ||
+      (isa<FunctionDecl>(D) &&
+       (cast<FunctionDecl>(D)->isFunctionTemplateSpecialization() ||
+        cast<FunctionDecl>(D)->isOutOfLine())) ||
       (isa<VarDecl>(D) && cast<VarDecl>(D)->isOutOfLine()))
     return;
 
@@ -2023,9 +2025,7 @@ Sema::HandleDeclarator(Scope *S, Declarator &D,
 
   // If this has an identifier and is not an invalid redeclaration or 
   // function template specialization, add it to the scope stack.
-  if (Name && !(Redeclaration && New->isInvalidDecl()) &&
-      !(isa<FunctionDecl>(New) && 
-        cast<FunctionDecl>(New)->isFunctionTemplateSpecialization()))
+  if (Name && !(Redeclaration && New->isInvalidDecl()))
     PushOnScopeChains(New, S);
 
   return DeclPtrTy::make(New);
diff --git a/test/CodeGenCXX/function-template-explicit-specialization.cpp b/test/CodeGenCXX/function-template-explicit-specialization.cpp
new file mode 100644 (file)
index 0000000..046bc32
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: clang-cc -emit-llvm %s -o - | FileCheck %s
+
+template<typename T> void a(T);
+template<> void a(int) {}
+
+// CHECK: define void @_Z1aIiEvT_
+
+namespace X {
+template<typename T> void b(T);
+template<> void b(int) {}
+}
+
+// CHECK: define void @_ZN1X1bIiEEvT_