From d3f79c544692375da8d26de856cb616aacc3503a Mon Sep 17 00:00:00 2001 From: Alp Toker Date: Sun, 24 Nov 2013 20:24:54 +0000 Subject: [PATCH] Parse Microsoft __declspec appearing after class body MSVC applies these to the following declaration only if present, otherwise silently ignores them whereas we'll issue a warning. Handling differs from ordinary attributes appearing in the same place, so add a Sema test to make sure we get it right. llvm-svn: 195577 --- clang/lib/Parse/ParseDeclCXX.cpp | 1 + clang/test/SemaCXX/MicrosoftExtensions.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index d2d9b220fd73..32e151cf2c29 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/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/clang/test/SemaCXX/MicrosoftExtensions.cpp b/clang/test/SemaCXX/MicrosoftExtensions.cpp index c5b45a2905c8..5c51331500b5 100644 --- a/clang/test/SemaCXX/MicrosoftExtensions.cpp +++ b/clang/test/SemaCXX/MicrosoftExtensions.cpp @@ -410,3 +410,14 @@ struct SealedType sealed : SomeBase { // expected-error@+1 {{base 'SealedType' is marked 'sealed'}} struct InheritFromSealed : SealedType {}; + +void AfterClassBody() { + // expected-warning@+1 {{attribute 'deprecated' is ignored, place it after "struct" to apply attribute to type declaration}} + struct D {} __declspec(deprecated); + + 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, ""); +}