diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Parse/DeclSpec.cpp | 10 | ||||
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 7 |
2 files changed, 17 insertions, 0 deletions
diff --git a/lib/Parse/DeclSpec.cpp b/lib/Parse/DeclSpec.cpp index d742ef2ed0..e592deecd0 100644 --- a/lib/Parse/DeclSpec.cpp +++ b/lib/Parse/DeclSpec.cpp @@ -294,6 +294,16 @@ bool DeclSpec::SetFunctionSpecExplicit(SourceLocation Loc, const char *&PrevSpec return false; } +bool DeclSpec::SetFriendSpec(SourceLocation Loc, const char *&PrevSpec) { + if (Friend_specified) { + PrevSpec = "friend"; + return true; + } + + Friend_specified = true; + FriendLoc = Loc; + return false; +} /// Finish - This does final analysis of the declspec, rejecting things like /// "_Imaginary" (lacking an FP type). This returns a diagnostic to issue or diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 8b81c312d2..b3c2d8c555 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -597,6 +597,8 @@ bool Parser::ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS, /// [C99] 'inline' /// [C++] 'virtual' /// [C++] 'explicit' +/// 'friend': [C++ dcl.friend] + /// void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, TemplateParameterLists *TemplateParams, @@ -846,6 +848,11 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, isInvalid = DS.SetFunctionSpecExplicit(Loc, PrevSpec); break; + // friend + case tok::kw_friend: + isInvalid = DS.SetFriendSpec(Loc, PrevSpec); + break; + // type-specifier case tok::kw_short: isInvalid = DS.SetTypeSpecWidth(DeclSpec::TSW_short, Loc, PrevSpec); |