r173752 - Treat alignas and _Alignas as keyword attributes. This allows us to

Richard Smith richard-llvm at metafoo.co.uk
Mon Jan 28 17:48:07 PST 2013


Author: rsmith
Date: Mon Jan 28 19:48:07 2013
New Revision: 173752

URL: http://llvm.org/viewvc/llvm-project?rev=173752&view=rev
Log:
Treat alignas and _Alignas as keyword attributes. This allows us to
pretty-print them properly (modulo the more general badness in alignment
attribute printing).

Modified:
    cfe/trunk/include/clang/Basic/Attr.td
    cfe/trunk/lib/Parse/ParseDecl.cpp
    cfe/trunk/test/Parser/cxx11-stmt-attributes.cpp
    cfe/trunk/test/SemaCXX/cxx11-attr-print.cpp

Modified: cfe/trunk/include/clang/Basic/Attr.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=173752&r1=173751&r2=173752&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/Attr.td (original)
+++ cfe/trunk/include/clang/Basic/Attr.td Mon Jan 28 19:48:07 2013
@@ -150,7 +150,7 @@ def Alias : InheritableAttr {
 
 def Aligned : InheritableAttr {
   let Spellings = [GNU<"aligned">, Declspec<"align">, CXX11<"gnu", "aligned">,
-                   Keyword<"alignas">];
+                   Keyword<"alignas">, Keyword<"_Alignas">];
   let Subjects = [NonBitField, NormalVar, Tag];
   let Args = [AlignedArgument<"Alignment">, BoolArgument<"IsMSDeclSpec">];
 }

Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=173752&r1=173751&r2=173752&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
+++ cfe/trunk/lib/Parse/ParseDecl.cpp Mon Jan 28 19:48:07 2013
@@ -2074,15 +2074,15 @@ ExprResult Parser::ParseAlignArgument(So
 /// alignment-specifier:
 /// [C11]   '_Alignas' '(' type-id ')'
 /// [C11]   '_Alignas' '(' constant-expression ')'
-/// [C++0x] 'alignas' '(' type-id ...[opt] ')'
-/// [C++0x] 'alignas' '(' assignment-expression ...[opt] ')'
+/// [C++11] 'alignas' '(' type-id ...[opt] ')'
+/// [C++11] 'alignas' '(' assignment-expression ...[opt] ')'
 void Parser::ParseAlignmentSpecifier(ParsedAttributes &Attrs,
                                      SourceLocation *endLoc) {
   assert((Tok.is(tok::kw_alignas) || Tok.is(tok::kw__Alignas)) &&
          "Not an alignment-specifier!");
 
-  SourceLocation KWLoc = Tok.getLocation();
-  ConsumeToken();
+  IdentifierInfo *KWName = Tok.getIdentifierInfo();
+  SourceLocation KWLoc = ConsumeToken();
 
   BalancedDelimiterTracker T(*this, tok::l_paren);
   if (T.expectAndConsume(diag::err_expected_lparen))
@@ -2107,12 +2107,8 @@ void Parser::ParseAlignmentSpecifier(Par
 
   ExprVector ArgExprs;
   ArgExprs.push_back(ArgExpr.release());
-  // FIXME: This should not be GNU, but we since the attribute used is
-  //        based on the spelling, and there is no true spelling for
-  //        C++11 attributes, this isn't accepted.
-  Attrs.addNew(PP.getIdentifierInfo("aligned"), KWLoc, 0, KWLoc,
-               0, T.getOpenLocation(), ArgExprs.data(), 1,
-               AttributeList::AS_GNU);
+  Attrs.addNew(KWName, KWLoc, 0, KWLoc, 0, T.getOpenLocation(),
+               ArgExprs.data(), 1, AttributeList::AS_Keyword);
 }
 
 /// ParseDeclarationSpecifiers

Modified: cfe/trunk/test/Parser/cxx11-stmt-attributes.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx11-stmt-attributes.cpp?rev=173752&r1=173751&r2=173752&view=diff
==============================================================================
--- cfe/trunk/test/Parser/cxx11-stmt-attributes.cpp (original)
+++ cfe/trunk/test/Parser/cxx11-stmt-attributes.cpp Mon Jan 28 19:48:07 2013
@@ -27,7 +27,7 @@ void foo(int i) {
   [[unknown_attribute]] return; // expected-warning {{unknown attribute 'unknown_attribute' ignored}}
 	 
 
-  alignas(8) ; // expected-warning {{attribute aligned cannot be specified on a statement}}
+  alignas(8) ; // expected-warning {{attribute alignas cannot be specified on a statement}}
   [[noreturn]] { } // expected-warning {{attribute noreturn cannot be specified on a statement}}
   [[noreturn]] if (0) { } // expected-warning {{attribute noreturn cannot be specified on a statement}}
   [[noreturn]] for (;;); // expected-warning {{attribute noreturn cannot be specified on a statement}}

Modified: cfe/trunk/test/SemaCXX/cxx11-attr-print.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx11-attr-print.cpp?rev=173752&r1=173751&r2=173752&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/cxx11-attr-print.cpp (original)
+++ cfe/trunk/test/SemaCXX/cxx11-attr-print.cpp Mon Jan 28 19:48:07 2013
@@ -17,6 +17,12 @@ int a __attribute__((deprecated("warning
 // CHECK: gnu::deprecated("warning")]];
 int b [[gnu::deprecated("warning")]];
 
+// CHECK: int cxx11_alignas alignas(4, 0);
+alignas(4) int cxx11_alignas;
+
+// CHECK: int c11_alignas _Alignas(alignof(int), 0);
+_Alignas(int) int c11_alignas;
+
 // CHECK: void foo() __attribute__((const));
 void foo() __attribute__((const));
 





More information about the cfe-commits mailing list