diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-12-24 20:56:24 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-12-24 20:56:24 +0000 |
| commit | 33636e66c7a7744b044117d904fb08e0abcc6bb2 (patch) | |
| tree | a794b0c65c48f3ad274b5a643af0ddd1dbea13e5 /clang/lib/Sema | |
| parent | 1749083e2ef69b62de1486465d6336f82a5d86c5 (diff) | |
| download | bcm5719-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.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 7 |
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. |

