diff options
Diffstat (limited to 'lib/Parse/ParseDeclCXX.cpp')
-rw-r--r-- | lib/Parse/ParseDeclCXX.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index e1a97da9c2..c02f41a268 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -121,6 +121,8 @@ Decl *Parser::ParseNamespace(unsigned Context, CXX0XAttributeList Attr; if (getLang().CPlusPlus0x && isCXX0XAttributeSpecifier()) Attr = ParseCXX0XAttributes(); + if (getLang().Microsoft && Tok.is(tok::l_square)) + ParseMicrosoftAttributes(); ParseExternalDeclaration(Attr); } @@ -205,6 +207,8 @@ Decl *Parser::ParseLinkage(ParsingDeclSpec &DS, if (getLang().CPlusPlus0x && isCXX0XAttributeSpecifier()) { Attr = ParseCXX0XAttributes(); } + if (getLang().Microsoft && Tok.is(tok::l_square)) + ParseMicrosoftAttributes(); if (Tok.isNot(tok::l_brace)) { DS.setExternInLinkageSpec(true); @@ -224,6 +228,8 @@ Decl *Parser::ParseLinkage(ParsingDeclSpec &DS, CXX0XAttributeList Attr; if (getLang().CPlusPlus0x && isCXX0XAttributeSpecifier()) Attr = ParseCXX0XAttributes(); + if (getLang().Microsoft && Tok.is(tok::l_square)) + ParseMicrosoftAttributes(); ParseExternalDeclaration(Attr); } @@ -1321,6 +1327,8 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, // Optional C++0x attribute-specifier if (getLang().CPlusPlus0x && isCXX0XAttributeSpecifier()) AttrList = ParseCXX0XAttributes(); + if (getLang().Microsoft && Tok.is(tok::l_square)) + ParseMicrosoftAttributes(); if (Tok.is(tok::kw_using)) { // FIXME: Check for template aliases @@ -2116,3 +2124,21 @@ ExprResult Parser::ParseCXX0XAlignArgument(SourceLocation Start) { } else return ParseConstantExpression(); } + +/// ParseMicrosoftAttributes - Parse a Microsoft attribute [Attr] +/// +/// [MS] ms-attribute: +/// '[' token-seq ']' +/// +/// [MS] ms-attribute-seq: +/// ms-attribute[opt] +/// ms-attribute ms-attribute-seq +void Parser::ParseMicrosoftAttributes() { + assert(Tok.is(tok::l_square) && "Not a Microsoft attribute list"); + + while (Tok.is(tok::l_square)) { + ConsumeBracket(); + SkipUntil(tok::r_square, true, true); + ExpectAndConsume(tok::r_square, diag::err_expected_rsquare); + } +} |