summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-12-24 20:56:24 +0000
committerDouglas Gregor <dgregor@apple.com>2009-12-24 20:56:24 +0000
commit33636e66c7a7744b044117d904fb08e0abcc6bb2 (patch)
treea794b0c65c48f3ad274b5a643af0ddd1dbea13e5 /clang/lib/Sema
parent1749083e2ef69b62de1486465d6336f82a5d86c5 (diff)
downloadbcm5719-llvm-33636e66c7a7744b044117d904fb08e0abcc6bb2.tar.gz
bcm5719-llvm-33636e66c7a7744b044117d904fb08e0abcc6bb2.zip
Egregious, disgusting workaround for PR5866. We need to rework how we
keep track of friends within templates, which will provide a real for PR5866. For now, this makes sure we don't do something entirely stupid with friends of specializations. llvm-svn: 92143
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp3
-rw-r--r--clang/lib/Sema/SemaTemplateInstantiateDecl.cpp7
2 files changed, 8 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 2e4ee63ebdb..b70b0dccb75 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -5380,6 +5380,9 @@ Sema::ActOnFriendFunctionDecl(Scope *S,
FrD->setAccess(AS_public);
CurContext->addDecl(FrD);
+ if (D.getName().getKind() == UnqualifiedId::IK_TemplateId)
+ FrD->setSpecialization(true);
+
return DeclPtrTy::make(ND);
}
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index 18a73250a52..1ec91bd55ec 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -401,7 +401,10 @@ Decl *TemplateDeclInstantiator::VisitFriendDecl(FriendDecl *D) {
// Hack to make this work almost well pending a rewrite.
if (ND->getDeclContext()->isRecord())
NewND = SemaRef.FindInstantiatedDecl(ND, TemplateArgs);
- else
+ else if (D->wasSpecialization()) {
+ // Totally egregious hack to work around PR5866
+ return 0;
+ } else
NewND = Visit(ND);
if (!NewND) return 0;
@@ -687,7 +690,7 @@ Decl *TemplateDeclInstantiator::VisitCXXRecordDecl(CXXRecordDecl *D) {
/// 1) instantiating function templates
/// 2) substituting friend declarations
/// FIXME: preserve function definitions in case #2
- Decl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D,
+Decl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D,
TemplateParameterList *TemplateParams) {
// Check whether there is already a function template specialization for
// this declaration.
OpenPOWER on IntegriCloud