annotate clang/test/Sema/captured-statements.c @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 1d019706d866
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // RUN: %clang_cc1 -fsyntax-only -verify %s -fblocks
anatofuz
parents:
diff changeset
2
anatofuz
parents:
diff changeset
3 void test_gotos() {
anatofuz
parents:
diff changeset
4 goto L1; // expected-error {{use of undeclared label 'L1'}}
anatofuz
parents:
diff changeset
5 goto L3; // OK
anatofuz
parents:
diff changeset
6 #pragma clang __debug captured
anatofuz
parents:
diff changeset
7 {
anatofuz
parents:
diff changeset
8 L1:
anatofuz
parents:
diff changeset
9 goto L2; // OK
anatofuz
parents:
diff changeset
10 L2:
anatofuz
parents:
diff changeset
11 goto L3; // expected-error {{use of undeclared label 'L3'}}
anatofuz
parents:
diff changeset
12 }
anatofuz
parents:
diff changeset
13 L3: ;
anatofuz
parents:
diff changeset
14 }
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 void test_break_continue() {
anatofuz
parents:
diff changeset
17 while (1) {
anatofuz
parents:
diff changeset
18 #pragma clang __debug captured
anatofuz
parents:
diff changeset
19 {
anatofuz
parents:
diff changeset
20 break; // expected-error {{'break' statement not in loop or switch statement}}
anatofuz
parents:
diff changeset
21 continue; // expected-error {{'continue' statement not in loop statement}}
anatofuz
parents:
diff changeset
22 }
anatofuz
parents:
diff changeset
23 }
anatofuz
parents:
diff changeset
24 }
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26 void test_return() {
anatofuz
parents:
diff changeset
27 while (1) {
anatofuz
parents:
diff changeset
28 #pragma clang __debug captured
anatofuz
parents:
diff changeset
29 {
anatofuz
parents:
diff changeset
30 return; // expected-error {{cannot return from default captured statement}}
anatofuz
parents:
diff changeset
31 }
anatofuz
parents:
diff changeset
32 }
anatofuz
parents:
diff changeset
33 }
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 void test_nest() {
anatofuz
parents:
diff changeset
36 int x;
anatofuz
parents:
diff changeset
37 #pragma clang __debug captured
anatofuz
parents:
diff changeset
38 {
anatofuz
parents:
diff changeset
39 int y;
anatofuz
parents:
diff changeset
40 #pragma clang __debug captured
anatofuz
parents:
diff changeset
41 {
anatofuz
parents:
diff changeset
42 int z;
anatofuz
parents:
diff changeset
43 #pragma clang __debug captured
anatofuz
parents:
diff changeset
44 {
anatofuz
parents:
diff changeset
45 x = z = y; // OK
anatofuz
parents:
diff changeset
46 }
anatofuz
parents:
diff changeset
47 }
anatofuz
parents:
diff changeset
48 }
anatofuz
parents:
diff changeset
49 }
anatofuz
parents:
diff changeset
50
anatofuz
parents:
diff changeset
51 void test_nest_block() {
anatofuz
parents:
diff changeset
52 __block int x; // expected-note {{'x' declared here}}
anatofuz
parents:
diff changeset
53 int y;
anatofuz
parents:
diff changeset
54 ^{
anatofuz
parents:
diff changeset
55 int z;
anatofuz
parents:
diff changeset
56 #pragma clang __debug captured
anatofuz
parents:
diff changeset
57 {
anatofuz
parents:
diff changeset
58 x = y; // expected-error{{__block variable 'x' cannot be captured in a captured statement}}
anatofuz
parents:
diff changeset
59 y = z; // expected-error{{variable is not assignable (missing __block type specifier)}}
anatofuz
parents:
diff changeset
60 z = y; // OK
anatofuz
parents:
diff changeset
61 }
anatofuz
parents:
diff changeset
62 }();
anatofuz
parents:
diff changeset
63
anatofuz
parents:
diff changeset
64 __block int a; // expected-note 2 {{'a' declared here}}
anatofuz
parents:
diff changeset
65 int b;
anatofuz
parents:
diff changeset
66 #pragma clang __debug captured
anatofuz
parents:
diff changeset
67 {
anatofuz
parents:
diff changeset
68 int d;
anatofuz
parents:
diff changeset
69 ^{
anatofuz
parents:
diff changeset
70 a = b; // expected-error{{__block variable 'a' cannot be captured in a captured statement}}
anatofuz
parents:
diff changeset
71 a = b; // (duplicate diagnostic suppressed)
anatofuz
parents:
diff changeset
72 b = d; // OK - Consistent with block inside a lambda
anatofuz
parents:
diff changeset
73 }();
anatofuz
parents:
diff changeset
74 }
anatofuz
parents:
diff changeset
75 #pragma clang __debug captured
anatofuz
parents:
diff changeset
76 {
anatofuz
parents:
diff changeset
77 __block int c;
anatofuz
parents:
diff changeset
78 int d;
anatofuz
parents:
diff changeset
79 ^{
anatofuz
parents:
diff changeset
80 c = a; // expected-error{{__block variable 'a' cannot be captured in a captured statement}}
anatofuz
parents:
diff changeset
81 c = d; // OK
anatofuz
parents:
diff changeset
82 d = b; // expected-error{{variable is not assignable (missing __block type specifier)}}
anatofuz
parents:
diff changeset
83 }();
anatofuz
parents:
diff changeset
84 }
anatofuz
parents:
diff changeset
85 }