[Parse] Let declarations follow labels in -fms-extensions mode
authorDavid Majnemer <david.majnemer@gmail.com>
Mon, 1 Aug 2016 16:39:29 +0000 (16:39 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Mon, 1 Aug 2016 16:39:29 +0000 (16:39 +0000)
MSVC permits declarations in these places as conforming extension (it is
a constraint violation otherwise).

This fixes PR28782.

llvm-svn: 277352

clang/lib/Parse/ParseStmt.cpp
clang/test/Parser/MicrosoftExtensions.c

index 9043ebb..d0557b8 100644 (file)
@@ -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,
index 39ab51f..2af6c42 100644 (file)
@@ -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;
+  }
+}