annotate clang/test/Parser/c2x-attributes.c @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1f2b6ac9f198
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1 // RUN: %clang_cc1 -fsyntax-only -verify=expected,notc2x -Wno-strict-prototypes %s
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
2 // RUN: %clang_cc1 -fsyntax-only -std=gnu2x -verify=expected,c2x %s
150
anatofuz
parents:
diff changeset
3
anatofuz
parents:
diff changeset
4 enum [[]] E {
anatofuz
parents:
diff changeset
5 One [[]],
anatofuz
parents:
diff changeset
6 Two,
anatofuz
parents:
diff changeset
7 Three [[]]
anatofuz
parents:
diff changeset
8 };
anatofuz
parents:
diff changeset
9
anatofuz
parents:
diff changeset
10 enum [[]] { Four };
anatofuz
parents:
diff changeset
11 [[]] enum E2 { Five }; // expected-error {{misplaced attributes}}
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 // FIXME: this diagnostic can be improved.
anatofuz
parents:
diff changeset
14 enum { [[]] Six }; // expected-error {{expected identifier}}
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 // FIXME: this diagnostic can be improved.
anatofuz
parents:
diff changeset
17 enum E3 [[]] { Seven }; // expected-error {{expected identifier or '('}}
anatofuz
parents:
diff changeset
18
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
19 [[deprecated([""])]] int WrongArgs; // expected-error {{expected expression}}
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
20 [[,,,,,]] int Commas1; // ok
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
21 [[,, maybe_unused]] int Commas2; // ok
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
22 [[maybe_unused,,,]] int Commas3; // ok
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
23 [[,,maybe_unused,]] int Commas4; // ok
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
24 [[foo bar]] int NoComma; // expected-error {{expected ','}} \
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
25 // expected-warning {{unknown attribute 'foo' ignored}}
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
26
150
anatofuz
parents:
diff changeset
27 struct [[]] S1 {
anatofuz
parents:
diff changeset
28 int i [[]];
anatofuz
parents:
diff changeset
29 int [[]] j;
anatofuz
parents:
diff changeset
30 int k[10] [[]];
anatofuz
parents:
diff changeset
31 int l[[]][10];
anatofuz
parents:
diff changeset
32 [[]] int m, n;
anatofuz
parents:
diff changeset
33 int o [[]] : 12;
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
34 int [[]] : 0; // OK, attribute applies to the type.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
35 int p, [[]] : 0; // expected-error {{an attribute list cannot appear here}}
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
36 int q, [[]] r; // expected-error {{an attribute list cannot appear here}}
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
37 [[]] int; // expected-error {{an attribute list cannot appear here}} \
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
38 // expected-warning {{declaration does not declare anything}}
150
anatofuz
parents:
diff changeset
39 };
anatofuz
parents:
diff changeset
40
anatofuz
parents:
diff changeset
41 [[]] struct S2 { int a; }; // expected-error {{misplaced attributes}}
anatofuz
parents:
diff changeset
42 struct S3 [[]] { int a; }; // expected-error {{an attribute list cannot appear here}}
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 union [[]] U {
anatofuz
parents:
diff changeset
45 double d [[]];
anatofuz
parents:
diff changeset
46 [[]] int i;
anatofuz
parents:
diff changeset
47 };
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 [[]] union U2 { double d; }; // expected-error {{misplaced attributes}}
anatofuz
parents:
diff changeset
50 union U3 [[]] { double d; }; // expected-error {{an attribute list cannot appear here}}
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 struct [[]] IncompleteStruct;
anatofuz
parents:
diff changeset
53 union [[]] IncompleteUnion;
anatofuz
parents:
diff changeset
54 enum [[]] IncompleteEnum;
anatofuz
parents:
diff changeset
55 enum __attribute__((deprecated)) IncompleteEnum2;
anatofuz
parents:
diff changeset
56
anatofuz
parents:
diff changeset
57 [[]] void f1(void);
anatofuz
parents:
diff changeset
58 void [[]] f2(void);
anatofuz
parents:
diff changeset
59 void f3 [[]] (void);
anatofuz
parents:
diff changeset
60 void f4(void) [[]];
anatofuz
parents:
diff changeset
61
anatofuz
parents:
diff changeset
62 void f5(int i [[]], [[]] int j, int [[]] k);
anatofuz
parents:
diff changeset
63
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
64 void f6(a, b) [[]] int a; int b; { // notc2x-error {{an attribute list cannot appear here}} \
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
65 c2x-error {{unknown type name 'a'}} \
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
66 c2x-error {{unknown type name 'b'}} \
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
67 c2x-error {{expected ';' after top level declarator}} \
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
68 c2x-error {{expected identifier or '('}}
150
anatofuz
parents:
diff changeset
69 }
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71 // FIXME: technically, an attribute list cannot appear here, but we currently
anatofuz
parents:
diff changeset
72 // parse it as part of the return type of the function, which is reasonable
anatofuz
parents:
diff changeset
73 // behavior given that we *don't* want to parse it as part of the K&R parameter
anatofuz
parents:
diff changeset
74 // declarations. It is disallowed to avoid a parsing ambiguity we already
anatofuz
parents:
diff changeset
75 // handle well.
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
76 int (*f7(a, b))(int, int) [[]] int a; int b; { // c2x-error {{unknown type name 'a'}} \
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
77 c2x-error {{unknown type name 'b'}} \
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
78 c2x-error {{expected ';' after top level declarator}} \
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
79 c2x-error {{expected identifier or '('}}
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
80
150
anatofuz
parents:
diff changeset
81 return 0;
anatofuz
parents:
diff changeset
82 }
anatofuz
parents:
diff changeset
83
anatofuz
parents:
diff changeset
84 [[]] int a, b;
anatofuz
parents:
diff changeset
85 int c [[]], d [[]];
anatofuz
parents:
diff changeset
86
anatofuz
parents:
diff changeset
87 void f8(void) [[]] {
anatofuz
parents:
diff changeset
88 [[]] int i, j;
anatofuz
parents:
diff changeset
89 int k, l [[]];
anatofuz
parents:
diff changeset
90 }
anatofuz
parents:
diff changeset
91
anatofuz
parents:
diff changeset
92 [[]] void f9(void) {
anatofuz
parents:
diff changeset
93 int i[10] [[]];
anatofuz
parents:
diff changeset
94 int (*fp1)(void)[[]];
anatofuz
parents:
diff changeset
95 int (*fp2 [[]])(void);
anatofuz
parents:
diff changeset
96
anatofuz
parents:
diff changeset
97 int * [[]] *ipp;
anatofuz
parents:
diff changeset
98 }
anatofuz
parents:
diff changeset
99
anatofuz
parents:
diff changeset
100 void f10(int j[static 10] [[]], int k[*] [[]]);
anatofuz
parents:
diff changeset
101
anatofuz
parents:
diff changeset
102 void f11(void) {
anatofuz
parents:
diff changeset
103 [[]] {}
anatofuz
parents:
diff changeset
104 [[]] if (1) {}
anatofuz
parents:
diff changeset
105
anatofuz
parents:
diff changeset
106 [[]] switch (1) {
anatofuz
parents:
diff changeset
107 [[]] case 1: [[]] break;
anatofuz
parents:
diff changeset
108 [[]] default: break;
anatofuz
parents:
diff changeset
109 }
anatofuz
parents:
diff changeset
110
anatofuz
parents:
diff changeset
111 goto foo;
anatofuz
parents:
diff changeset
112 [[]] foo: (void)1;
anatofuz
parents:
diff changeset
113
anatofuz
parents:
diff changeset
114 [[]] for (;;);
anatofuz
parents:
diff changeset
115 [[]] while (1);
anatofuz
parents:
diff changeset
116 [[]] do [[]] { } while(1);
anatofuz
parents:
diff changeset
117
anatofuz
parents:
diff changeset
118 [[]] (void)1;
anatofuz
parents:
diff changeset
119
anatofuz
parents:
diff changeset
120 [[]];
anatofuz
parents:
diff changeset
121
anatofuz
parents:
diff changeset
122 (void)sizeof(int [4][[]]);
anatofuz
parents:
diff changeset
123 (void)sizeof(struct [[]] S3 { int a [[]]; });
anatofuz
parents:
diff changeset
124
anatofuz
parents:
diff changeset
125 [[]] return;
anatofuz
parents:
diff changeset
126 }
anatofuz
parents:
diff changeset
127
anatofuz
parents:
diff changeset
128 [[attr]] void f12(void); // expected-warning {{unknown attribute 'attr' ignored}}
anatofuz
parents:
diff changeset
129 [[vendor::attr]] void f13(void); // expected-warning {{unknown attribute 'attr' ignored}}
anatofuz
parents:
diff changeset
130
anatofuz
parents:
diff changeset
131 // Ensure that asm statements properly handle double colons.
anatofuz
parents:
diff changeset
132 void test_asm(void) {
anatofuz
parents:
diff changeset
133 asm("ret" :::);
anatofuz
parents:
diff changeset
134 asm("foo" :: "r" (xx)); // expected-error {{use of undeclared identifier 'xx'}}
anatofuz
parents:
diff changeset
135 }
anatofuz
parents:
diff changeset
136
anatofuz
parents:
diff changeset
137 // Do not allow 'using' to introduce vendor attribute namespaces.
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
138 [[using vendor: attr1, attr2]] void f14(void); // expected-error {{expected ','}} \
150
anatofuz
parents:
diff changeset
139 // expected-warning {{unknown attribute 'using' ignored}}
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 struct [[]] S4 *s; // expected-error {{an attribute list cannot appear here}}
anatofuz
parents:
diff changeset
142 struct S5 {};
anatofuz
parents:
diff changeset
143 int c = sizeof(struct [[]] S5); // expected-error {{an attribute list cannot appear here}}
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
144
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
145 // Ensure that '::' outside of attributes does not crash and is not treated as scope
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
146 double n::v; // expected-error {{expected ';' after top level declarator}}