]> granicus.if.org Git - clang/commitdiff
[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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@277352 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 9043ebb9a2b7129de8d693d0d0bfc1bcd24da8d7..d0557b8a62bd4324f228633f426bceb31c595605 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 39ab51f31fa67ef196730789fbea34e8258dba47..2af6c421bcce294b91a4dc3ff439c1616d18529e 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;
+  }
+}