diff options
author | John McCall <rjmccall@apple.com> | 2009-09-04 01:14:41 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2009-09-04 01:14:41 +0000 |
commit | f1bbbb49f06a7462476cd88166fccda5feb15cab (patch) | |
tree | 849b9006cad1a7c4dcd4cf03a4a7a5a96f15cc5e /lib/Parse/ParseDeclCXX.cpp | |
parent | 34374e6ce5710a91c478f69379220ff20c3e7f15 (diff) |
Correctly handle elaborated template ids. Still not handled properly for friends.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80977 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseDeclCXX.cpp')
-rw-r--r-- | lib/Parse/ParseDeclCXX.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index f50147c599..59359530e3 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -606,7 +606,7 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind, // to turn that template-id into a type. bool Owned = false; - if (TemplateId && TUK != Action::TUK_Reference && TUK != Action::TUK_Friend) { + if (TemplateId) { // Explicit specialization, class template partial specialization, // or explicit instantiation. ASTTemplateArgsPtr TemplateArgsPtr(Actions, @@ -629,6 +629,31 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind, TemplateId->getTemplateArgLocations(), TemplateId->RAngleLoc, Attr); + } else if (TUK == Action::TUK_Reference || TUK == Action::TUK_Friend) { + Action::TypeResult TypeResult = + Actions.ActOnTemplateIdType(TemplateTy::make(TemplateId->Template), + TemplateId->TemplateNameLoc, + TemplateId->LAngleLoc, + TemplateArgsPtr, + TemplateId->getTemplateArgLocations(), + TemplateId->RAngleLoc, + TagType, StartLoc); + + TemplateId->Destroy(); + + if (TypeResult.isInvalid()) { + DS.SetTypeSpecError(); + return; + } + + const char *PrevSpec = 0; + unsigned DiagID; + if (DS.SetTypeSpecType(DeclSpec::TST_typename, StartLoc, PrevSpec, + DiagID, TypeResult.get())) + Diag(StartLoc, DiagID) << PrevSpec; + + return; + } else { // This is an explicit specialization or a class template // partial specialization. |