]> granicus.if.org Git - clang/commitdiff
Add support for parsing an attribute-specifier-seq containing multiple
authorPeter Collingbourne <peter@pcc.me.uk>
Thu, 29 Sep 2011 18:04:05 +0000 (18:04 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Thu, 29 Sep 2011 18:04:05 +0000 (18:04 +0000)
attribute-specifiers

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140794 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Parse/Parser.h
lib/Parse/ParseDeclCXX.cpp
test/Parser/cxx0x-attributes.cpp

index afcfda042567e29a6f8b6bf4b883d4e7a3fe01a1..4d81abde98f72e9fbf4447f8a230037f1f599b75 100644 (file)
@@ -1739,6 +1739,9 @@ private:
     if (getLang().CPlusPlus0x && isCXX0XAttributeSpecifier())
       ParseCXX0XAttributes(attrs, endLoc);
   }
+
+  void ParseCXX0XAttributeSpecifier(ParsedAttributes &attrs,
+                                    SourceLocation *EndLoc = 0);
   void ParseCXX0XAttributes(ParsedAttributesWithRange &attrs,
                             SourceLocation *EndLoc = 0);
 
index 88e93a05b735ac53ecd1361fcebc4ee9bbd6ff89..ab953dc9c8282ba8db1710cd4ecd4f1accfe6f0b 100644 (file)
@@ -2556,8 +2556,8 @@ void Parser::PopParsingClass(Sema::ParsingClassState state) {
   Victim->TemplateScope = getCurScope()->getParent()->isTemplateParamScope();
 }
 
-/// ParseCXX0XAttributes - Parse a C++0x attribute-specifier. Currently only
-/// parses standard attributes.
+/// ParseCXX0XAttributeSpecifier - Parse a C++0x attribute-specifier. Currently
+/// only parses standard attributes.
 ///
 /// [C++0x] attribute-specifier:
 ///         '[' '[' attribute-list ']' ']'
@@ -2591,13 +2591,11 @@ void Parser::PopParsingClass(Sema::ParsingClassState state) {
 ///         '[' balanced-token-seq ']'
 ///         '{' balanced-token-seq '}'
 ///         any token but '(', ')', '[', ']', '{', or '}'
-void Parser::ParseCXX0XAttributes(ParsedAttributesWithRange &attrs,
-                                  SourceLocation *endLoc) {
+void Parser::ParseCXX0XAttributeSpecifier(ParsedAttributes &attrs,
+                                          SourceLocation *endLoc) {
   assert(Tok.is(tok::l_square) && NextToken().is(tok::l_square)
       && "Not a C++0x attribute list");
 
-  SourceLocation StartLoc = Tok.getLocation(), Loc;
-
   ConsumeBracket();
   ConsumeBracket();
 
@@ -2692,11 +2690,27 @@ void Parser::ParseCXX0XAttributes(ParsedAttributesWithRange &attrs,
 
   if (ExpectAndConsume(tok::r_square, diag::err_expected_rsquare))
     SkipUntil(tok::r_square, false);
-  Loc = Tok.getLocation();
+  if (endLoc)
+    *endLoc = Tok.getLocation();
   if (ExpectAndConsume(tok::r_square, diag::err_expected_rsquare))
     SkipUntil(tok::r_square, false);
+}
+
+/// ParseCXX0XAttributes - Parse a C++0x attribute-specifier-seq.
+///
+/// attribute-specifier-seq:
+///       attribute-specifier-seq[opt] attribute-specifier
+void Parser::ParseCXX0XAttributes(ParsedAttributesWithRange &attrs,
+                                  SourceLocation *endLoc) {
+  SourceLocation StartLoc = Tok.getLocation(), Loc;
+  if (!endLoc)
+    endLoc = &Loc;
+
+  do
+    ParseCXX0XAttributeSpecifier(attrs, endLoc);
+  while (isCXX0XAttributeSpecifier());
 
-  attrs.Range = SourceRange(StartLoc, Loc);
+  attrs.Range = SourceRange(StartLoc, *endLoc);
 }
 
 /// ParseCXX0XAlignArgument - Parse the argument to C++0x's [[align]]
index 75f23c657c6a397a2e0121765134f181104e2acd..0b6413cfb2772e522d2f87eed965f9f4a80fa0cb 100644 (file)
@@ -13,6 +13,7 @@ void fn_attr () [[]];
 class [[]] class_attr {};
 extern "C++" [[]] int extern_attr;
 template <typename T> [[]] void template_attr ();
+[[]] [[]] int [[]] [[]] multi_attr [[]] [[]];
 
 int comma_attr [[,]]; // expected-error {{expected identifier}}
 int scope_attr [[foo::]]; // expected-error {{expected identifier}}