================
@@ -0,0 +1,147 @@
+// RUN: %clang_cc1 -std=c2y -verify -fsyntax-only -fblocks %s
+// RUN: %clang_cc1 -std=c23 -verify -fsyntax-only -fblocks -fnamed-loops %s
+// RUN: %clang_cc1 -x c++ -verify -fsyntax-only -fblocks -fnamed-loops %s
+
+void f1() {
+  l1: while (true) {
+    break l1;
+    continue l1;
+  }
+
+  l2: for (;;) {
+    break l2;
+    continue l2;
+  }
+
+  l3: do {
+    break l3;
+    continue l3;
+  } while (true);
+
+  l4: switch (1) {
+    case 1:
+      break l4;
+  }
+}
+
+void f2() {
+  l1:;
+  break l1; // expected-error {{'break' label does not name an enclosing loop 
or 'switch'}}
+  continue l1; // expected-error {{'continue' label does not name an enclosing 
loop}}
+
+  l2: while (true) {
+    break l1; // expected-error {{'break' label does not name an enclosing 
loop or 'switch'}}
+    continue l1; // expected-error {{'continue' label does not name an 
enclosing loop}}
+  }
+
+  while (true) {
+    break l2; // expected-error {{'break' label does not name an enclosing 
loop or 'switch'}}
+    continue l2; // expected-error {{'continue' label does not name an 
enclosing loop}}
+  }
+
+  break l3; // expected-error {{'break' label does not name an enclosing loop 
or 'switch'}}
+  continue l3; // expected-error {{'continue' label does not name an enclosing 
loop}}
+  l3: while (true) {}
+}
+
+void f3() {
+  a: b: c: d: while (true) {
+    break a;
+    break b;
+    break c;
+    break d;
+
+    continue a;
+    continue b;
+    continue c;
+    continue d;
+
+    e: while (true) {
+      break a;
+      break b;
+      break c;
+      break d;
+      break e;
+
+      continue a;
+      continue b;
+      continue c;
+      continue d;
+      continue e;
+    }
+
+    break e; // expected-error {{'break' label does not name an enclosing loop 
or 'switch'}}
+    continue e; // expected-error {{'continue' label does not name an 
enclosing loop}}
+  }
+}
+
+void f4() {
+  a: switch (1) {
+    case 1: {
+      continue a; // expected-error {{label of 'continue' refers to a switch 
statement}}
+    }
+  }
+}
+
+void f5() {
+  a: {
+    break a; // expected-error {{'break' label does not name an enclosing loop 
or 'switch'}}
+  }
+
+  b: {
+    while (true)
+      break b; // expected-error {{'break' label does not name an enclosing 
loop or 'switch'}}
+  }
+}
+
+void f6() {
+  a: while (({
+    break a; // expected-error {{'break' label does not name an enclosing loop 
or 'switch'}}
+    continue a; // expected-error {{'continue' label does not name an 
enclosing loop}}
+    1;
+  })) {}
+
+  b: for (
+    int x = ({
+      break b; // expected-error {{'break' label does not name an enclosing 
loop or 'switch'}}
+      continue b; // expected-error {{'continue' label does not name an 
enclosing loop}}
+      1;
+    });
+    ({
+      break b; // expected-error {{'break' label does not name an enclosing 
loop or 'switch'}}
+      continue b; // expected-error {{'continue' label does not name an 
enclosing loop}}
+      1;
+    });
+    (void) ({
+      break b; // expected-error {{'break' label does not name an enclosing 
loop or 'switch'}}
+      continue b; // expected-error {{'continue' label does not name an 
enclosing loop}}
+      1;
+    })
+  ) {}
+
+  c: do {} while (({
+    break c; // expected-error {{'break' label does not name an enclosing loop 
or 'switch'}}
+    continue c; // expected-error {{'continue' label does not name an 
enclosing loop}}
+    1;
+  }));
+
+  d: switch (({
+    break d; // expected-error {{'break' label does not name an enclosing loop 
or 'switch'}}
+    continue d; // expected-error {{'continue' label does not name an 
enclosing loop}}
+    1;
+  })) { case 1:; }
+}
+
+void f7() {
+  a: b: while (true) {
+    (void) ^{
+      break a; // expected-error {{'break' label does not name an enclosing 
loop or 'switch'}}
+      continue b; // expected-error {{'continue' label does not name an 
enclosing loop}}
+    };
+  }
+
+  while (true) {
+    break c; // expected-error {{'break' label does not name an enclosing loop 
or 'switch'}}
+    continue d; // expected-error {{'continue' label does not name an 
enclosing loop}}
+  }
+}
----------------
AaronBallman wrote:

We should also have some tests like:
```
name:
while (true) {
  ({break name;});
  ({continue name;});
}
```

https://github.com/llvm/llvm-project/pull/152870
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to