summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2016-06-14 03:20:28 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2016-06-14 03:20:28 +0000
commit15b311c75244afa19d0cfd4057b397e5829ebad4 (patch)
treed5697f24d29422fe1c9ed40e6115d94da99001ec
parent34d9707825a13572e7dd5f7855e0d92b9134d27e (diff)
downloadbcm5719-llvm-15b311c75244afa19d0cfd4057b397e5829ebad4.tar.gz
bcm5719-llvm-15b311c75244afa19d0cfd4057b397e5829ebad4.zip
[Parser] Handle __pragma(pack, etc. after type definitions
Support certain MS pragmas right after the closing curly brace of a class. Clang did not expect __pragma in this position. This fixes PR28094. llvm-svn: 272628
-rw-r--r--clang/lib/Parse/ParseDecl.cpp16
-rw-r--r--clang/lib/Parse/ParseDeclCXX.cpp7
-rw-r--r--clang/test/Parser/pragma-pack.c4
3 files changed, 27 insertions, 0 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 746f996d368..be694901b91 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -3453,6 +3453,22 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
ParseDecltypeSpecifier(DS);
continue;
+ case tok::annot_pragma_pack:
+ HandlePragmaPack();
+ continue;
+
+ case tok::annot_pragma_ms_pragma:
+ HandlePragmaMSPragma();
+ continue;
+
+ case tok::annot_pragma_ms_vtordisp:
+ HandlePragmaMSVtorDisp();
+ continue;
+
+ case tok::annot_pragma_ms_pointers_to_members:
+ HandlePragmaMSPointersToMembers();
+ continue;
+
case tok::kw___underlying_type:
ParseUnderlyingTypeSpecifier(DS);
continue;
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index b80f9ee1b02..d55b2d9442c 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -1100,6 +1100,13 @@ bool Parser::isValidAfterTypeSpecifier(bool CouldBeBitfield) {
// FIXME: we should emit semantic diagnostic when declaration
// attribute is in type attribute position.
case tok::kw___attribute: // struct foo __attribute__((used)) x;
+ case tok::annot_pragma_pack: // struct foo {...} _Pragma(pack(pop));
+ // struct foo {...} _Pragma(section(...));
+ case tok::annot_pragma_ms_pragma:
+ // struct foo {...} _Pragma(vtordisp(pop));
+ case tok::annot_pragma_ms_vtordisp:
+ // struct foo {...} _Pragma(pointers_to_members(...));
+ case tok::annot_pragma_ms_pointers_to_members:
return true;
case tok::colon:
return CouldBeBitfield; // enum E { ... } : 2;
diff --git a/clang/test/Parser/pragma-pack.c b/clang/test/Parser/pragma-pack.c
index 172a332510a..0859f4157ce 100644
--- a/clang/test/Parser/pragma-pack.c
+++ b/clang/test/Parser/pragma-pack.c
@@ -44,3 +44,7 @@ struct S
#pragma pack()
int e;
};
+
+_Pragma("pack(push, 1)") struct PR28094 {
+ int a;
+} _Pragma("pack(pop)");
OpenPOWER on IntegriCloud