summaryrefslogtreecommitdiff
path: root/clang/test/SemaCXX/labeled-break-continue.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/SemaCXX/labeled-break-continue.cpp')
-rw-r--r--clang/test/SemaCXX/labeled-break-continue.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/labeled-break-continue.cpp b/clang/test/SemaCXX/labeled-break-continue.cpp
new file mode 100644
index 000000000000..3d34211ed745
--- /dev/null
+++ b/clang/test/SemaCXX/labeled-break-continue.cpp
@@ -0,0 +1,51 @@
+// RUN: %clang_cc1 -std=c++20 -verify -fsyntax-only -fnamed-loops %s
+
+int a[10]{};
+struct S {
+ int a[10]{};
+};
+
+void f1() {
+ l1: for (int x : a) {
+ break l1;
+ continue l1;
+ }
+
+ l2: for (int x : a) {
+ 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}}
+ }
+
+ l3: for (int x : a) {
+ l4: for (int x : a) {
+ break l3;
+ break l4;
+ continue l3;
+ continue l4;
+ }
+ }
+}
+
+void f2() {
+ l1: for (
+ int x = ({
+ 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}}
+ 1;
+ });
+ int y : ({
+ 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}}
+ S();
+ }).a
+ ) {}
+}
+
+void f3() {
+ a: while (true) {
+ (void) []{
+ 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}}
+ };
+ }
+}