summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2016-08-01 16:39:29 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2016-08-01 16:39:29 +0000
commit6ac7dd19f7c3b2deb0450a349152bf75a92e987a (patch)
treeb81e2b7fc101a0e3a073657eb3ef3fb7924e14ac /clang
parent431368a9e6443b6d868a75dca7d54d874899ccb4 (diff)
downloadbcm5719-llvm-6ac7dd19f7c3b2deb0450a349152bf75a92e987a.tar.gz
bcm5719-llvm-6ac7dd19f7c3b2deb0450a349152bf75a92e987a.zip
[Parse] Let declarations follow labels in -fms-extensions mode
MSVC permits declarations in these places as conforming extension (it is a constraint violation otherwise). This fixes PR28782. llvm-svn: 277352
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Parse/ParseStmt.cpp3
-rw-r--r--clang/test/Parser/MicrosoftExtensions.c9
2 files changed, 11 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp
index 9043ebb9a2b..d0557b8a62b 100644
--- a/clang/lib/Parse/ParseStmt.cpp
+++ b/clang/lib/Parse/ParseStmt.cpp
@@ -206,7 +206,8 @@ Retry:
}
default: {
- if ((getLangOpts().CPlusPlus || Allowed == ACK_Any) &&
+ if ((getLangOpts().CPlusPlus || getLangOpts().MicrosoftExt ||
+ Allowed == ACK_Any) &&
isDeclarationStatement()) {
SourceLocation DeclStart = Tok.getLocation(), DeclEnd;
DeclGroupPtrTy Decl = ParseDeclaration(Declarator::BlockContext,
diff --git a/clang/test/Parser/MicrosoftExtensions.c b/clang/test/Parser/MicrosoftExtensions.c
index 39ab51f31fa..2af6c421bcc 100644
--- a/clang/test/Parser/MicrosoftExtensions.c
+++ b/clang/test/Parser/MicrosoftExtensions.c
@@ -106,3 +106,12 @@ __declspec(align(16)) struct align_before_key3 {} *align_before_key3_var;
_Static_assert(__alignof(struct align_before_key1) == 16, "");
_Static_assert(__alignof(struct align_before_key2) == 16, "");
_Static_assert(__alignof(struct align_before_key3) == 16, "");
+
+void PR28782(int i) {
+foo:
+ int n;
+ switch (i) {
+ case 0:
+ int m;
+ }
+}
OpenPOWER on IntegriCloud