Skeletal support for friend class templates.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81801 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index 0adf3e8..9e49778 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -4009,12 +4009,35 @@
}
Sema::DeclPtrTy Sema::ActOnFriendTypeDecl(Scope *S,
- const DeclSpec &DS) {
+ const DeclSpec &DS,
+ bool IsTemplate) {
SourceLocation Loc = DS.getSourceRange().getBegin();
assert(DS.isFriendSpecified());
assert(DS.getStorageClassSpec() == DeclSpec::SCS_unspecified);
+ // Handle friend templates specially.
+ if (IsTemplate) {
+ Decl *D;
+ switch (DS.getTypeSpecType()) {
+ default:
+ // FIXME: implement this
+ assert(false && "unelaborated type templates are currently unimplemented!");
+ case DeclSpec::TST_class:
+ case DeclSpec::TST_union:
+ case DeclSpec::TST_struct:
+ D = (Decl*) DS.getTypeRep();
+ }
+
+ ClassTemplateDecl *Temp = cast<ClassTemplateDecl>(D);
+ FriendDecl *FD = FriendDecl::Create(Context, CurContext, Loc, Temp,
+ DS.getFriendSpecLoc());
+ FD->setAccess(AS_public);
+ CurContext->addDecl(FD);
+
+ return DeclPtrTy::make(FD);
+ }
+
// Try to convert the decl specifier to a type.
bool invalid = false;
QualType T = ConvertDeclSpecToType(DS, Loc, invalid);