diff options
author | Francois Pichet <pichet2000@gmail.com> | 2010-10-11 12:59:39 +0000 |
---|---|---|
committer | Francois Pichet <pichet2000@gmail.com> | 2010-10-11 12:59:39 +0000 |
commit | 334d47e92e9f241576fdeb7477b69a03136ba854 (patch) | |
tree | 76d1eff598d39f89054b7ca6fd842e6dc6aea6b2 /lib/Parse/ParseDeclCXX.cpp | |
parent | b2419466892e5445fec6ce30f97784ae8b99f134 (diff) |
Add parsing support for Microsoft attributes. MS attributes will just be skipped and not inserted into the AST for now.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116203 91177308-0d34-0410-b5e6-96231b3b80d8
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); + } +} |