[PATCH] Parse Microsoft __declspec appearing after class body
Alp Toker
alp at nuanti.com
Sun Nov 24 05:08:13 PST 2013
Hi David,
The attached patch fixes __declspec parsing after the class specification.
Verified against MSVC.
Alp.
--
http://www.nuanti.com
the browser experts
-------------- next part --------------
commit a6f855750215e1a6652ab6a3bc6d551ca030101b
Author: Alp Toker <alp at nuanti.com>
Date: Sun Nov 24 07:09:59 2013 +0000
Parse Microsoft __declspec appearing after class body
MSVC applies these to the object only.
Handling differs from ordinary attributes appearing in the same place, so add a
Sema test to make sure we get it right.
diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp
index d2d9b22..32e151c 100644
--- a/lib/Parse/ParseDeclCXX.cpp
+++ b/lib/Parse/ParseDeclCXX.cpp
@@ -1021,6 +1021,7 @@ bool Parser::isValidAfterTypeSpecifier(bool CouldBeBitfield) {
case tok::l_paren: // struct foo {...} ( x);
case tok::comma: // __builtin_offsetof(struct foo{...} ,
case tok::kw_operator: // struct foo operator ++() {...}
+ case tok::kw___declspec: // struct foo {...} __declspec(...)
return true;
case tok::colon:
return CouldBeBitfield; // enum E { ... } : 2;
diff --git a/test/SemaCXX/MicrosoftExtensions.cpp b/test/SemaCXX/MicrosoftExtensions.cpp
index c5b45a2..69fefc2 100644
--- a/test/SemaCXX/MicrosoftExtensions.cpp
+++ b/test/SemaCXX/MicrosoftExtensions.cpp
@@ -410,3 +410,11 @@ struct SealedType sealed : SomeBase {
// expected-error at +1 {{base 'SealedType' is marked 'sealed'}}
struct InheritFromSealed : SealedType {};
+
+void AfterClassBody() {
+ struct __declspec(align(4)) S {} __declspec(align(8)) s1;
+ S s2;
+ _Static_assert(__alignof(S) == 4, "");
+ _Static_assert(__alignof(s1) == 8, "");
+ _Static_assert(__alignof(s2) == 4, "");
+}
More information about the cfe-commits
mailing list