1 // Copyright 2020 The Tint Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "src/reader/wgsl/parser_impl_test_helper.h"
16
17 namespace tint {
18 namespace reader {
19 namespace wgsl {
20 namespace {
21
22 const diag::Formatter::Style formatter_style{
23 /* print_file: */ true, /* print_severity: */ true,
24 /* print_line: */ true, /* print_newline_at_end: */ false};
25
26 class ParserImplErrorTest : public ParserImplTest {};
27
28 #define EXPECT(SOURCE, EXPECTED) \
29 do { \
30 std::string source = SOURCE; \
31 std::string expected = EXPECTED; \
32 auto p = parser(source); \
33 p->set_max_errors(5); \
34 EXPECT_EQ(false, p->Parse()); \
35 auto diagnostics = p->builder().Diagnostics(); \
36 EXPECT_EQ(true, diagnostics.contains_errors()); \
37 EXPECT_EQ(expected, diag::Formatter(formatter_style).format(diagnostics)); \
38 } while (false)
39
TEST_F(ParserImplErrorTest,AdditiveInvalidExpr)40 TEST_F(ParserImplErrorTest, AdditiveInvalidExpr) {
41 EXPECT("fn f() { return 1.0 + <; }",
42 "test.wgsl:1:23 error: unable to parse right side of + expression\n"
43 "fn f() { return 1.0 + <; }\n"
44 " ^\n");
45 }
46
TEST_F(ParserImplErrorTest,AndInvalidExpr)47 TEST_F(ParserImplErrorTest, AndInvalidExpr) {
48 EXPECT("fn f() { return 1 & >; }",
49 "test.wgsl:1:21 error: unable to parse right side of & expression\n"
50 "fn f() { return 1 & >; }\n"
51 " ^\n");
52 }
53
TEST_F(ParserImplErrorTest,AliasDeclInvalidDeco)54 TEST_F(ParserImplErrorTest, AliasDeclInvalidDeco) {
55 EXPECT("[[block]]type e=u32;",
56 "test.wgsl:1:3 error: unexpected decorations\n"
57 "[[block]]type e=u32;\n"
58 " ^^^^^\n");
59 }
60
TEST_F(ParserImplErrorTest,IndexExprInvalidExpr)61 TEST_F(ParserImplErrorTest, IndexExprInvalidExpr) {
62 EXPECT("fn f() { x = y[^]; }",
63 "test.wgsl:1:16 error: unable to parse expression inside []\n"
64 "fn f() { x = y[^]; }\n"
65 " ^\n");
66 }
67
TEST_F(ParserImplErrorTest,IndexExprMissingRBracket)68 TEST_F(ParserImplErrorTest, IndexExprMissingRBracket) {
69 EXPECT("fn f() { x = y[1; }",
70 "test.wgsl:1:17 error: expected ']' for index accessor\n"
71 "fn f() { x = y[1; }\n"
72 " ^\n");
73 }
74
TEST_F(ParserImplErrorTest,AssignmentStmtMissingAssignment)75 TEST_F(ParserImplErrorTest, AssignmentStmtMissingAssignment) {
76 EXPECT("fn f() { a; }",
77 "test.wgsl:1:11 error: expected '=' for assignment\n"
78 "fn f() { a; }\n"
79 " ^\n");
80 }
81
TEST_F(ParserImplErrorTest,AssignmentStmtMissingAssignment2)82 TEST_F(ParserImplErrorTest, AssignmentStmtMissingAssignment2) {
83 EXPECT("fn f() { a : i32; }",
84 "test.wgsl:1:10 error: expected 'var' for variable declaration\n"
85 "fn f() { a : i32; }\n"
86 " ^\n");
87 }
88
TEST_F(ParserImplErrorTest,AssignmentStmtMissingSemicolon)89 TEST_F(ParserImplErrorTest, AssignmentStmtMissingSemicolon) {
90 EXPECT("fn f() { a = 1 }",
91 "test.wgsl:1:16 error: expected ';' for assignment statement\n"
92 "fn f() { a = 1 }\n"
93 " ^\n");
94 }
95
TEST_F(ParserImplErrorTest,AssignmentStmtInvalidLHS_IntrinsicFunctionName)96 TEST_F(ParserImplErrorTest, AssignmentStmtInvalidLHS_IntrinsicFunctionName) {
97 EXPECT("normalize = 5;",
98 "test.wgsl:1:1 error: statement found outside of function body\n"
99 "normalize = 5;\n"
100 "^^^^^^^^^\n");
101 }
102
TEST_F(ParserImplErrorTest,AssignmentStmtInvalidRHS)103 TEST_F(ParserImplErrorTest, AssignmentStmtInvalidRHS) {
104 EXPECT("fn f() { a = >; }",
105 "test.wgsl:1:14 error: unable to parse right side of assignment\n"
106 "fn f() { a = >; }\n"
107 " ^\n");
108 }
109
TEST_F(ParserImplErrorTest,BitcastExprMissingLessThan)110 TEST_F(ParserImplErrorTest, BitcastExprMissingLessThan) {
111 EXPECT("fn f() { x = bitcast(y); }",
112 "test.wgsl:1:21 error: expected '<' for bitcast expression\n"
113 "fn f() { x = bitcast(y); }\n"
114 " ^\n");
115 }
116
TEST_F(ParserImplErrorTest,BitcastExprMissingGreaterThan)117 TEST_F(ParserImplErrorTest, BitcastExprMissingGreaterThan) {
118 EXPECT("fn f() { x = bitcast<u32(y); }",
119 "test.wgsl:1:25 error: expected '>' for bitcast expression\n"
120 "fn f() { x = bitcast<u32(y); }\n"
121 " ^\n");
122 }
123
TEST_F(ParserImplErrorTest,BitcastExprMissingType)124 TEST_F(ParserImplErrorTest, BitcastExprMissingType) {
125 EXPECT("fn f() { x = bitcast<>(y); }",
126 "test.wgsl:1:22 error: invalid type for bitcast expression\n"
127 "fn f() { x = bitcast<>(y); }\n"
128 " ^\n");
129 }
130
TEST_F(ParserImplErrorTest,BreakStmtMissingSemicolon)131 TEST_F(ParserImplErrorTest, BreakStmtMissingSemicolon) {
132 EXPECT("fn f() { loop { break } }",
133 "test.wgsl:1:23 error: expected ';' for break statement\n"
134 "fn f() { loop { break } }\n"
135 " ^\n");
136 }
137
TEST_F(ParserImplErrorTest,CallExprMissingRParen)138 TEST_F(ParserImplErrorTest, CallExprMissingRParen) {
139 EXPECT("fn f() { x = f(1.; }",
140 "test.wgsl:1:18 error: expected ')' for function call\n"
141 "fn f() { x = f(1.; }\n"
142 " ^\n");
143 }
144
TEST_F(ParserImplErrorTest,CallStmtMissingRParen)145 TEST_F(ParserImplErrorTest, CallStmtMissingRParen) {
146 EXPECT("fn f() { f(1.; }",
147 "test.wgsl:1:14 error: expected ')' for function call\n"
148 "fn f() { f(1.; }\n"
149 " ^\n");
150 }
151
TEST_F(ParserImplErrorTest,CallStmtInvalidArgument0)152 TEST_F(ParserImplErrorTest, CallStmtInvalidArgument0) {
153 EXPECT("fn f() { f(<); }",
154 "test.wgsl:1:12 error: expected ')' for function call\n"
155 "fn f() { f(<); }\n"
156 " ^\n");
157 }
158
TEST_F(ParserImplErrorTest,CallStmtInvalidArgument1)159 TEST_F(ParserImplErrorTest, CallStmtInvalidArgument1) {
160 EXPECT("fn f() { f(1.0, <); }",
161 "test.wgsl:1:17 error: expected ')' for function call\n"
162 "fn f() { f(1.0, <); }\n"
163 " ^\n");
164 }
165
TEST_F(ParserImplErrorTest,CallStmtMissingSemicolon)166 TEST_F(ParserImplErrorTest, CallStmtMissingSemicolon) {
167 EXPECT("fn f() { f() }",
168 "test.wgsl:1:14 error: expected ';' for function call\n"
169 "fn f() { f() }\n"
170 " ^\n");
171 }
172
TEST_F(ParserImplErrorTest,ConstructorExprMissingLParen)173 TEST_F(ParserImplErrorTest, ConstructorExprMissingLParen) {
174 EXPECT("fn f() { x = vec2<u32>1,2); }",
175 "test.wgsl:1:23 error: expected '(' for type constructor\n"
176 "fn f() { x = vec2<u32>1,2); }\n"
177 " ^\n");
178 }
179
TEST_F(ParserImplErrorTest,ConstructorExprMissingRParen)180 TEST_F(ParserImplErrorTest, ConstructorExprMissingRParen) {
181 EXPECT("fn f() { x = vec2<u32>(1,2; }",
182 "test.wgsl:1:27 error: expected ')' for type constructor\n"
183 "fn f() { x = vec2<u32>(1,2; }\n"
184 " ^\n");
185 }
186
TEST_F(ParserImplErrorTest,ConstVarStmtInvalid)187 TEST_F(ParserImplErrorTest, ConstVarStmtInvalid) {
188 EXPECT("fn f() { let >; }",
189 "test.wgsl:1:14 error: expected identifier for let declaration\n"
190 "fn f() { let >; }\n"
191 " ^\n");
192 }
193
TEST_F(ParserImplErrorTest,ConstVarStmtMissingAssignment)194 TEST_F(ParserImplErrorTest, ConstVarStmtMissingAssignment) {
195 EXPECT("fn f() { let a : i32; }",
196 "test.wgsl:1:21 error: expected '=' for let declaration\n"
197 "fn f() { let a : i32; }\n"
198 " ^\n");
199 }
200
TEST_F(ParserImplErrorTest,ConstVarStmtMissingConstructor)201 TEST_F(ParserImplErrorTest, ConstVarStmtMissingConstructor) {
202 EXPECT("fn f() { let a : i32 = >; }",
203 "test.wgsl:1:24 error: missing constructor for let declaration\n"
204 "fn f() { let a : i32 = >; }\n"
205 " ^\n");
206 }
207
TEST_F(ParserImplErrorTest,ContinueStmtMissingSemicolon)208 TEST_F(ParserImplErrorTest, ContinueStmtMissingSemicolon) {
209 EXPECT("fn f() { loop { continue } }",
210 "test.wgsl:1:26 error: expected ';' for continue statement\n"
211 "fn f() { loop { continue } }\n"
212 " ^\n");
213 }
214
TEST_F(ParserImplErrorTest,DiscardStmtMissingSemicolon)215 TEST_F(ParserImplErrorTest, DiscardStmtMissingSemicolon) {
216 EXPECT("fn f() { discard }",
217 "test.wgsl:1:18 error: expected ';' for discard statement\n"
218 "fn f() { discard }\n"
219 " ^\n");
220 }
221
TEST_F(ParserImplErrorTest,EqualityInvalidExpr)222 TEST_F(ParserImplErrorTest, EqualityInvalidExpr) {
223 EXPECT("fn f() { return 1 == >; }",
224 "test.wgsl:1:22 error: unable to parse right side of == expression\n"
225 "fn f() { return 1 == >; }\n"
226 " ^\n");
227 }
228
TEST_F(ParserImplErrorTest,ForLoopInitializerMissingSemicolon)229 TEST_F(ParserImplErrorTest, ForLoopInitializerMissingSemicolon) {
230 EXPECT("fn f() { for (var i : i32 = 0 i < 8; i=i+1) {} }",
231 "test.wgsl:1:31 error: expected ';' for initializer in for loop\n"
232 "fn f() { for (var i : i32 = 0 i < 8; i=i+1) {} }\n"
233 " ^\n");
234 }
235
TEST_F(ParserImplErrorTest,ForLoopInitializerMissingVar)236 TEST_F(ParserImplErrorTest, ForLoopInitializerMissingVar) {
237 EXPECT("fn f() { for (i : i32 = 0; i < 8; i=i+1) {} }",
238 "test.wgsl:1:15 error: expected 'var' for variable declaration\n"
239 "fn f() { for (i : i32 = 0; i < 8; i=i+1) {} }\n"
240 " ^\n");
241 }
242
TEST_F(ParserImplErrorTest,ForLoopConditionMissingSemicolon)243 TEST_F(ParserImplErrorTest, ForLoopConditionMissingSemicolon) {
244 EXPECT("fn f() { for (var i : i32 = 0; i < 8 i=i+1) {} }",
245 "test.wgsl:1:38 error: expected ';' for condition in for loop\n"
246 "fn f() { for (var i : i32 = 0; i < 8 i=i+1) {} }\n"
247 " ^\n");
248 }
249
TEST_F(ParserImplErrorTest,ForLoopMissingLParen)250 TEST_F(ParserImplErrorTest, ForLoopMissingLParen) {
251 EXPECT("fn f() { for var i : i32 = 0; i < 8; i=i+1) {} }",
252 "test.wgsl:1:14 error: expected '(' for for loop\n"
253 "fn f() { for var i : i32 = 0; i < 8; i=i+1) {} }\n"
254 " ^^^\n");
255 }
256
TEST_F(ParserImplErrorTest,ForLoopMissingRParen)257 TEST_F(ParserImplErrorTest, ForLoopMissingRParen) {
258 EXPECT("fn f() { for (var i : i32 = 0; i < 8; i=i+1 {} }",
259 "test.wgsl:1:45 error: expected ')' for for loop\n"
260 "fn f() { for (var i : i32 = 0; i < 8; i=i+1 {} }\n"
261 " ^\n");
262 }
263
TEST_F(ParserImplErrorTest,ForLoopMissingLBrace)264 TEST_F(ParserImplErrorTest, ForLoopMissingLBrace) {
265 EXPECT("fn f() { for (var i : i32 = 0; i < 8; i=i+1) }",
266 "test.wgsl:1:46 error: expected '{' for for loop\n"
267 "fn f() { for (var i : i32 = 0; i < 8; i=i+1) }\n"
268 " ^\n");
269 }
270
TEST_F(ParserImplErrorTest,ForLoopMissingRBrace)271 TEST_F(ParserImplErrorTest, ForLoopMissingRBrace) {
272 EXPECT("fn f() { for (var i : i32 = 0; i < 8; i=i+1) {",
273 "test.wgsl:1:47 error: expected '}' for for loop\n"
274 "fn f() { for (var i : i32 = 0; i < 8; i=i+1) {\n"
275 " ^\n");
276 }
277
TEST_F(ParserImplErrorTest,FunctionDeclDecoMissingEnd)278 TEST_F(ParserImplErrorTest, FunctionDeclDecoMissingEnd) {
279 EXPECT("[[stage(vertex) fn f() {}",
280 "test.wgsl:1:17 error: expected ']]' for decoration list\n"
281 "[[stage(vertex) fn f() {}\n"
282 " ^^\n");
283 }
284
TEST_F(ParserImplErrorTest,FunctionDeclDecoStageMissingLParen)285 TEST_F(ParserImplErrorTest, FunctionDeclDecoStageMissingLParen) {
286 EXPECT("[[stage vertex]] fn f() {}",
287 "test.wgsl:1:9 error: expected '(' for stage decoration\n"
288 "[[stage vertex]] fn f() {}\n"
289 " ^^^^^^\n");
290 }
291
TEST_F(ParserImplErrorTest,FunctionDeclDecoStageMissingRParen)292 TEST_F(ParserImplErrorTest, FunctionDeclDecoStageMissingRParen) {
293 EXPECT("[[stage(vertex]] fn f() {}",
294 "test.wgsl:1:15 error: expected ')' for stage decoration\n"
295 "[[stage(vertex]] fn f() {}\n"
296 " ^^\n");
297 }
298
TEST_F(ParserImplErrorTest,FunctionDeclDecoStageInvalid)299 TEST_F(ParserImplErrorTest, FunctionDeclDecoStageInvalid) {
300 EXPECT("[[stage(x)]] fn f() {}",
301 "test.wgsl:1:9 error: invalid value for stage decoration\n"
302 "[[stage(x)]] fn f() {}\n"
303 " ^\n");
304 }
305
TEST_F(ParserImplErrorTest,FunctionDeclDecoStageTypeInvalid)306 TEST_F(ParserImplErrorTest, FunctionDeclDecoStageTypeInvalid) {
307 EXPECT("[[shader(vertex)]] fn main() {}",
308 "test.wgsl:1:3 error: expected decoration\n"
309 "[[shader(vertex)]] fn main() {}\n"
310 " ^^^^^^\n");
311 }
312
TEST_F(ParserImplErrorTest,FunctionDeclDecoWorkgroupSizeMissingLParen)313 TEST_F(ParserImplErrorTest, FunctionDeclDecoWorkgroupSizeMissingLParen) {
314 EXPECT("[[workgroup_size 1]] fn f() {}",
315 "test.wgsl:1:18 error: expected '(' for workgroup_size decoration\n"
316 "[[workgroup_size 1]] fn f() {}\n"
317 " ^\n");
318 }
319
TEST_F(ParserImplErrorTest,FunctionDeclDecoWorkgroupSizeMissingRParen)320 TEST_F(ParserImplErrorTest, FunctionDeclDecoWorkgroupSizeMissingRParen) {
321 EXPECT("[[workgroup_size(1]] fn f() {}",
322 "test.wgsl:1:19 error: expected ')' for workgroup_size decoration\n"
323 "[[workgroup_size(1]] fn f() {}\n"
324 " ^^\n");
325 }
326
TEST_F(ParserImplErrorTest,FunctionDeclDecoWorkgroupSizeXInvalid)327 TEST_F(ParserImplErrorTest, FunctionDeclDecoWorkgroupSizeXInvalid) {
328 EXPECT("[[workgroup_size()]] fn f() {}",
329 "test.wgsl:1:18 error: expected workgroup_size x parameter\n"
330 "[[workgroup_size()]] fn f() {}\n"
331 " ^\n");
332 }
333
TEST_F(ParserImplErrorTest,FunctionDeclDecoWorkgroupSizeYInvalid)334 TEST_F(ParserImplErrorTest, FunctionDeclDecoWorkgroupSizeYInvalid) {
335 EXPECT("[[workgroup_size(1, )]] fn f() {}",
336 "test.wgsl:1:21 error: expected workgroup_size y parameter\n"
337 "[[workgroup_size(1, )]] fn f() {}\n"
338 " ^\n");
339 }
340
TEST_F(ParserImplErrorTest,FunctionDeclDecoWorkgroupSizeZInvalid)341 TEST_F(ParserImplErrorTest, FunctionDeclDecoWorkgroupSizeZInvalid) {
342 EXPECT("[[workgroup_size(1, 2, )]] fn f() {}",
343 "test.wgsl:1:24 error: expected workgroup_size z parameter\n"
344 "[[workgroup_size(1, 2, )]] fn f() {}\n"
345 " ^\n");
346 }
347
TEST_F(ParserImplErrorTest,FunctionDeclMissingIdentifier)348 TEST_F(ParserImplErrorTest, FunctionDeclMissingIdentifier) {
349 EXPECT("fn () {}",
350 "test.wgsl:1:4 error: expected identifier for function declaration\n"
351 "fn () {}\n"
352 " ^\n");
353 }
354
TEST_F(ParserImplErrorTest,FunctionDeclMissingLParen)355 TEST_F(ParserImplErrorTest, FunctionDeclMissingLParen) {
356 EXPECT("fn f) {}",
357 "test.wgsl:1:5 error: expected '(' for function declaration\n"
358 "fn f) {}\n"
359 " ^\n");
360 }
361
TEST_F(ParserImplErrorTest,FunctionDeclMissingRParen)362 TEST_F(ParserImplErrorTest, FunctionDeclMissingRParen) {
363 EXPECT("fn f( {}",
364 "test.wgsl:1:7 error: expected ')' for function declaration\n"
365 "fn f( {}\n"
366 " ^\n");
367 }
368
TEST_F(ParserImplErrorTest,FunctionDeclMissingArrow)369 TEST_F(ParserImplErrorTest, FunctionDeclMissingArrow) {
370 EXPECT("fn f() f32 {}",
371 "test.wgsl:1:8 error: expected '{'\n"
372 "fn f() f32 {}\n"
373 " ^^^\n");
374 }
375
TEST_F(ParserImplErrorTest,FunctionDeclInvalidReturnType)376 TEST_F(ParserImplErrorTest, FunctionDeclInvalidReturnType) {
377 EXPECT("fn f() -> 1 {}",
378 "test.wgsl:1:11 error: unable to determine function return type\n"
379 "fn f() -> 1 {}\n"
380 " ^\n");
381 }
382
TEST_F(ParserImplErrorTest,FunctionDeclParamMissingColon)383 TEST_F(ParserImplErrorTest, FunctionDeclParamMissingColon) {
384 EXPECT("fn f(x) {}",
385 "test.wgsl:1:7 error: expected ':' for parameter\n"
386 "fn f(x) {}\n"
387 " ^\n");
388 }
389
TEST_F(ParserImplErrorTest,FunctionDeclParamInvalidType)390 TEST_F(ParserImplErrorTest, FunctionDeclParamInvalidType) {
391 EXPECT("fn f(x : 1) {}",
392 "test.wgsl:1:10 error: invalid type for parameter\n"
393 "fn f(x : 1) {}\n"
394 " ^\n");
395 }
396
TEST_F(ParserImplErrorTest,FunctionDeclParamMissing)397 TEST_F(ParserImplErrorTest, FunctionDeclParamMissing) {
398 EXPECT("fn f(x : i32, ,) {}",
399 "test.wgsl:1:15 error: expected ')' for function declaration\n"
400 "fn f(x : i32, ,) {}\n"
401 " ^\n");
402 }
403
TEST_F(ParserImplErrorTest,FunctionDeclMissingLBrace)404 TEST_F(ParserImplErrorTest, FunctionDeclMissingLBrace) {
405 EXPECT("fn f() }",
406 "test.wgsl:1:8 error: expected '{'\n"
407 "fn f() }\n"
408 " ^\n");
409 }
410
TEST_F(ParserImplErrorTest,FunctionDeclMissingRBrace)411 TEST_F(ParserImplErrorTest, FunctionDeclMissingRBrace) {
412 EXPECT("fn f() {",
413 "test.wgsl:1:9 error: expected '}'\n"
414 "fn f() {\n"
415 " ^\n");
416 }
417
TEST_F(ParserImplErrorTest,FunctionScopeUnusedDecl)418 TEST_F(ParserImplErrorTest, FunctionScopeUnusedDecl) {
419 EXPECT("fn f(a:i32)->i32{return a;[[size(1)]]}",
420 "test.wgsl:1:29 error: unexpected decorations\n"
421 "fn f(a:i32)->i32{return a;[[size(1)]]}\n"
422 " ^^^^\n");
423 }
424
TEST_F(ParserImplErrorTest,FunctionMissingOpenLine)425 TEST_F(ParserImplErrorTest, FunctionMissingOpenLine) {
426 EXPECT(R"(let bar : vec2<f32> = vec2<f32>(1., 2.);
427 var a : f32 = bar[0];
428 return;
429 })",
430 "test.wgsl:2:17 error: unable to parse const_expr\n"
431 " var a : f32 = bar[0];\n"
432 " ^^^\n"
433 "\n"
434 "test.wgsl:3:3 error: statement found outside of function body\n"
435 " return;\n"
436 " ^^^^^^\n");
437 }
438
TEST_F(ParserImplErrorTest,GlobalDeclConstInvalidIdentifier)439 TEST_F(ParserImplErrorTest, GlobalDeclConstInvalidIdentifier) {
440 EXPECT("let ^ : i32 = 1;",
441 "test.wgsl:1:5 error: expected identifier for let declaration\n"
442 "let ^ : i32 = 1;\n"
443 " ^\n");
444 }
445
TEST_F(ParserImplErrorTest,GlobalDeclConstMissingSemicolon)446 TEST_F(ParserImplErrorTest, GlobalDeclConstMissingSemicolon) {
447 EXPECT("let i : i32 = 1",
448 "test.wgsl:1:16 error: expected ';' for let declaration\n"
449 "let i : i32 = 1\n"
450 " ^\n");
451 }
452
TEST_F(ParserImplErrorTest,GlobalDeclConstMissingLParen)453 TEST_F(ParserImplErrorTest, GlobalDeclConstMissingLParen) {
454 EXPECT("let i : vec2<i32> = vec2<i32>;",
455 "test.wgsl:1:30 error: expected '(' for type constructor\n"
456 "let i : vec2<i32> = vec2<i32>;\n"
457 " ^\n");
458 }
459
TEST_F(ParserImplErrorTest,GlobalDeclConstMissingRParen)460 TEST_F(ParserImplErrorTest, GlobalDeclConstMissingRParen) {
461 EXPECT("let i : vec2<i32> = vec2<i32>(1., 2.;",
462 "test.wgsl:1:37 error: expected ')' for type constructor\n"
463 "let i : vec2<i32> = vec2<i32>(1., 2.;\n"
464 " ^\n");
465 }
466
TEST_F(ParserImplErrorTest,GlobalDeclConstBadConstLiteral)467 TEST_F(ParserImplErrorTest, GlobalDeclConstBadConstLiteral) {
468 EXPECT("let i : vec2<i32> = vec2<i32>(!);",
469 "test.wgsl:1:31 error: unable to parse const_expr\n"
470 "let i : vec2<i32> = vec2<i32>(!);\n"
471 " ^\n");
472 }
473
TEST_F(ParserImplErrorTest,GlobalDeclConstBadConstLiteralSpaceLessThan)474 TEST_F(ParserImplErrorTest, GlobalDeclConstBadConstLiteralSpaceLessThan) {
475 EXPECT("let i = 1 < 2;",
476 "test.wgsl:1:11 error: expected \';\' for let declaration\n"
477 "let i = 1 < 2;\n"
478 " ^\n");
479 }
480
TEST_F(ParserImplErrorTest,GlobalDeclConstNotConstExpr)481 TEST_F(ParserImplErrorTest, GlobalDeclConstNotConstExpr) {
482 EXPECT(
483 "let a = 1;\n"
484 "let b = a;",
485 "test.wgsl:2:9 error: unable to parse const_expr\n"
486 "let b = a;\n"
487 " ^\n");
488 }
489
TEST_F(ParserImplErrorTest,GlobalDeclConstExprMaxDepth)490 TEST_F(ParserImplErrorTest, GlobalDeclConstExprMaxDepth) {
491 uint32_t kMaxDepth = 128;
492
493 std::stringstream src;
494 std::stringstream mkr;
495 src << "let i : i32 = ";
496 mkr << " ";
497 for (size_t i = 0; i < kMaxDepth + 8; i++) {
498 src << "f32(";
499 if (i < kMaxDepth) {
500 mkr << " ";
501 } else if (i == kMaxDepth) {
502 mkr << "^^^";
503 }
504 }
505 src << "1.0";
506 for (size_t i = 0; i < 200; i++) {
507 src << ")";
508 }
509 src << ";";
510 std::stringstream err;
511 err << "test.wgsl:1:527 error: maximum parser recursive depth reached\n"
512 << src.str() << "\n"
513 << mkr.str() << "\n";
514 EXPECT(src.str().c_str(), err.str().c_str());
515 }
516
TEST_F(ParserImplErrorTest,GlobalDeclConstExprMissingLParen)517 TEST_F(ParserImplErrorTest, GlobalDeclConstExprMissingLParen) {
518 EXPECT("let i : vec2<i32> = vec2<i32> 1, 2);",
519 "test.wgsl:1:31 error: expected '(' for type constructor\n"
520 "let i : vec2<i32> = vec2<i32> 1, 2);\n"
521 " ^\n");
522 }
523
TEST_F(ParserImplErrorTest,GlobalDeclConstExprMissingRParen)524 TEST_F(ParserImplErrorTest, GlobalDeclConstExprMissingRParen) {
525 EXPECT("let i : vec2<i32> = vec2<i32>(1, 2;",
526 "test.wgsl:1:35 error: expected ')' for type constructor\n"
527 "let i : vec2<i32> = vec2<i32>(1, 2;\n"
528 " ^\n");
529 }
530
TEST_F(ParserImplErrorTest,GlobalDeclInvalidDeco)531 TEST_F(ParserImplErrorTest, GlobalDeclInvalidDeco) {
532 EXPECT("[[stage(vertex)]] x;",
533 "test.wgsl:1:19 error: expected declaration after decorations\n"
534 "[[stage(vertex)]] x;\n"
535 " ^\n");
536 }
537
TEST_F(ParserImplErrorTest,GlobalDeclSampledTextureMissingLessThan)538 TEST_F(ParserImplErrorTest, GlobalDeclSampledTextureMissingLessThan) {
539 EXPECT("var x : texture_1d;",
540 "test.wgsl:1:19 error: expected '<' for sampled texture type\n"
541 "var x : texture_1d;\n"
542 " ^\n");
543 }
544
TEST_F(ParserImplErrorTest,GlobalDeclSampledTextureMissingGreaterThan)545 TEST_F(ParserImplErrorTest, GlobalDeclSampledTextureMissingGreaterThan) {
546 EXPECT("var x : texture_1d<f32;",
547 "test.wgsl:1:23 error: expected '>' for sampled texture type\n"
548 "var x : texture_1d<f32;\n"
549 " ^\n");
550 }
551
TEST_F(ParserImplErrorTest,GlobalDeclSampledTextureInvalidSubtype)552 TEST_F(ParserImplErrorTest, GlobalDeclSampledTextureInvalidSubtype) {
553 EXPECT("var x : texture_1d<1>;",
554 "test.wgsl:1:20 error: invalid type for sampled texture type\n"
555 "var x : texture_1d<1>;\n"
556 " ^\n");
557 }
558
TEST_F(ParserImplErrorTest,GlobalDeclMultisampledTextureMissingLessThan)559 TEST_F(ParserImplErrorTest, GlobalDeclMultisampledTextureMissingLessThan) {
560 EXPECT("var x : texture_multisampled_2d;",
561 "test.wgsl:1:32 error: expected '<' for multisampled texture type\n"
562 "var x : texture_multisampled_2d;\n"
563 " ^\n");
564 }
565
TEST_F(ParserImplErrorTest,GlobalDeclMultisampledTextureMissingGreaterThan)566 TEST_F(ParserImplErrorTest, GlobalDeclMultisampledTextureMissingGreaterThan) {
567 EXPECT("var x : texture_multisampled_2d<f32;",
568 "test.wgsl:1:36 error: expected '>' for multisampled texture type\n"
569 "var x : texture_multisampled_2d<f32;\n"
570 " ^\n");
571 }
572
TEST_F(ParserImplErrorTest,GlobalDeclMultisampledTextureInvalidSubtype)573 TEST_F(ParserImplErrorTest, GlobalDeclMultisampledTextureInvalidSubtype) {
574 EXPECT("var x : texture_multisampled_2d<1>;",
575 "test.wgsl:1:33 error: invalid type for multisampled texture type\n"
576 "var x : texture_multisampled_2d<1>;\n"
577 " ^\n");
578 }
579
TEST_F(ParserImplErrorTest,GlobalDeclStorageTextureMissingLessThan)580 TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingLessThan) {
581 EXPECT("var x : texture_storage_2d;",
582 "test.wgsl:1:27 error: expected '<' for storage texture type\n"
583 "var x : texture_storage_2d;\n"
584 " ^\n");
585 }
586
TEST_F(ParserImplErrorTest,GlobalDeclStorageTextureMissingGreaterThan)587 TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingGreaterThan) {
588 EXPECT("var x : texture_storage_2d<r8uint, read;",
589 "test.wgsl:1:40 error: expected '>' for storage texture type\n"
590 "var x : texture_storage_2d<r8uint, read;\n"
591 " ^\n");
592 }
593
TEST_F(ParserImplErrorTest,GlobalDeclStorageTextureMissingSubtype)594 TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingSubtype) {
595 EXPECT("var x : texture_storage_2d<>;",
596 "test.wgsl:1:28 error: invalid format for storage texture type\n"
597 "var x : texture_storage_2d<>;\n"
598 " ^\n");
599 }
600
TEST_F(ParserImplErrorTest,GlobalDeclStorageTextureMissingInvalidSubtype)601 TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingInvalidSubtype) {
602 EXPECT("var x : texture_storage_2d<1>;",
603 "test.wgsl:1:28 error: invalid format for storage texture type\n"
604 "var x : texture_storage_2d<1>;\n"
605 " ^\n");
606 }
607
TEST_F(ParserImplErrorTest,GlobalDeclStructDecoMissingStruct)608 TEST_F(ParserImplErrorTest, GlobalDeclStructDecoMissingStruct) {
609 EXPECT("[[block]];",
610 "test.wgsl:1:10 error: expected declaration after decorations\n"
611 "[[block]];\n"
612 " ^\n");
613 }
614
TEST_F(ParserImplErrorTest,GlobalDeclStructDecoMissingEnd)615 TEST_F(ParserImplErrorTest, GlobalDeclStructDecoMissingEnd) {
616 EXPECT("[[block struct {};",
617 "test.wgsl:1:9 error: expected ']]' for decoration list\n"
618 "[[block struct {};\n"
619 " ^^^^^^\n");
620 }
621
TEST_F(ParserImplErrorTest,GlobalDeclStructDeclMissingIdentifier)622 TEST_F(ParserImplErrorTest, GlobalDeclStructDeclMissingIdentifier) {
623 EXPECT("struct {};",
624 "test.wgsl:1:8 error: expected identifier for struct declaration\n"
625 "struct {};\n"
626 " ^\n");
627 }
628
TEST_F(ParserImplErrorTest,GlobalDeclStructDeclMissingSemicolon)629 TEST_F(ParserImplErrorTest, GlobalDeclStructDeclMissingSemicolon) {
630 EXPECT("struct S {}",
631 "test.wgsl:1:12 error: expected ';' for struct declaration\n"
632 "struct S {}\n"
633 " ^\n");
634 }
635
TEST_F(ParserImplErrorTest,GlobalDeclStructDeclMissingLBrace)636 TEST_F(ParserImplErrorTest, GlobalDeclStructDeclMissingLBrace) {
637 EXPECT("struct S };",
638 "test.wgsl:1:10 error: expected '{' for struct declaration\n"
639 "struct S };\n"
640 " ^\n");
641 }
642
TEST_F(ParserImplErrorTest,GlobalDeclStructDeclMissingRBrace)643 TEST_F(ParserImplErrorTest, GlobalDeclStructDeclMissingRBrace) {
644 EXPECT("struct S { i : i32;",
645 "test.wgsl:1:20 error: expected '}' for struct declaration\n"
646 "struct S { i : i32;\n"
647 " ^\n");
648 }
649
TEST_F(ParserImplErrorTest,GlobalDeclStructMemberDecoEmpty)650 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberDecoEmpty) {
651 EXPECT("struct S { [[]] i : i32; };",
652 "test.wgsl:1:14 error: empty decoration list\n"
653 "struct S { [[]] i : i32; };\n"
654 " ^^\n");
655 }
656
TEST_F(ParserImplErrorTest,GlobalDeclStructMemberDecoMissingEnd)657 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberDecoMissingEnd) {
658 EXPECT("struct S { [[ i : i32; };",
659 "test.wgsl:1:15 error: expected decoration\n"
660 "struct S { [[ i : i32; };\n"
661 " ^\n");
662 }
663
TEST_F(ParserImplErrorTest,GlobalDeclStructMemberInvalidIdentifier)664 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberInvalidIdentifier) {
665 EXPECT("struct S { 1 : i32; };",
666 "test.wgsl:1:12 error: expected identifier for struct member\n"
667 "struct S { 1 : i32; };\n"
668 " ^\n");
669 }
670
TEST_F(ParserImplErrorTest,GlobalDeclStructMemberMissingSemicolon)671 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberMissingSemicolon) {
672 EXPECT("struct S { i : i32 };",
673 "test.wgsl:1:20 error: expected ';' for struct member\n"
674 "struct S { i : i32 };\n"
675 " ^\n");
676 }
677
TEST_F(ParserImplErrorTest,GlobalDeclStructMemberAlignMissingLParen)678 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberAlignMissingLParen) {
679 EXPECT("struct S { [[align 1)]] i : i32; };",
680 "test.wgsl:1:20 error: expected '(' for align decoration\n"
681 "struct S { [[align 1)]] i : i32; };\n"
682 " ^\n");
683 }
684
TEST_F(ParserImplErrorTest,GlobalDeclStructMemberAlignMissingRParen)685 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberAlignMissingRParen) {
686 EXPECT("struct S { [[align(1]] i : i32; };",
687 "test.wgsl:1:21 error: expected ')' for align decoration\n"
688 "struct S { [[align(1]] i : i32; };\n"
689 " ^^\n");
690 }
691
TEST_F(ParserImplErrorTest,GlobalDeclStructMemberAlignInvaldValue)692 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberAlignInvaldValue) {
693 EXPECT("struct S { [[align(x)]] i : i32; };",
694 "test.wgsl:1:20 error: expected signed integer literal for align "
695 "decoration\n"
696 "struct S { [[align(x)]] i : i32; };\n"
697 " ^\n");
698 }
699
TEST_F(ParserImplErrorTest,GlobalDeclStructMemberAlignNegativeValue)700 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberAlignNegativeValue) {
701 EXPECT("struct S { [[align(-2)]] i : i32; };",
702 "test.wgsl:1:20 error: align decoration must be positive\n"
703 "struct S { [[align(-2)]] i : i32; };\n"
704 " ^^\n");
705 }
706
TEST_F(ParserImplErrorTest,GlobalDeclStructMemberSizeMissingLParen)707 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberSizeMissingLParen) {
708 EXPECT("struct S { [[size 1)]] i : i32; };",
709 "test.wgsl:1:19 error: expected '(' for size decoration\n"
710 "struct S { [[size 1)]] i : i32; };\n"
711 " ^\n");
712 }
713
TEST_F(ParserImplErrorTest,GlobalDeclStructMemberSizeMissingRParen)714 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberSizeMissingRParen) {
715 EXPECT("struct S { [[size(1]] i : i32; };",
716 "test.wgsl:1:20 error: expected ')' for size decoration\n"
717 "struct S { [[size(1]] i : i32; };\n"
718 " ^^\n");
719 }
720
TEST_F(ParserImplErrorTest,GlobalDeclStructMemberSizeInvaldValue)721 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberSizeInvaldValue) {
722 EXPECT("struct S { [[size(x)]] i : i32; };",
723 "test.wgsl:1:19 error: expected signed integer literal for size "
724 "decoration\n"
725 "struct S { [[size(x)]] i : i32; };\n"
726 " ^\n");
727 }
728
TEST_F(ParserImplErrorTest,GlobalDeclStructMemberSizeNegativeValue)729 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberSizeNegativeValue) {
730 EXPECT("struct S { [[size(-2)]] i : i32; };",
731 "test.wgsl:1:19 error: size decoration must be positive\n"
732 "struct S { [[size(-2)]] i : i32; };\n"
733 " ^^\n");
734 }
735
TEST_F(ParserImplErrorTest,GlobalDeclTypeAliasMissingIdentifier)736 TEST_F(ParserImplErrorTest, GlobalDeclTypeAliasMissingIdentifier) {
737 EXPECT("type 1 = f32;",
738 "test.wgsl:1:6 error: expected identifier for type alias\n"
739 "type 1 = f32;\n"
740 " ^\n");
741 }
742
TEST_F(ParserImplErrorTest,GlobalDeclTypeAliasInvalidType)743 TEST_F(ParserImplErrorTest, GlobalDeclTypeAliasInvalidType) {
744 EXPECT("type meow = 1;",
745 "test.wgsl:1:13 error: invalid type alias\n"
746 "type meow = 1;\n"
747 " ^\n");
748 }
749
TEST_F(ParserImplErrorTest,GlobalDeclTypeAliasMissingAssignment)750 TEST_F(ParserImplErrorTest, GlobalDeclTypeAliasMissingAssignment) {
751 EXPECT("type meow f32",
752 "test.wgsl:1:11 error: expected '=' for type alias\n"
753 "type meow f32\n"
754 " ^^^\n");
755 }
756
TEST_F(ParserImplErrorTest,GlobalDeclTypeAliasMissingSemicolon)757 TEST_F(ParserImplErrorTest, GlobalDeclTypeAliasMissingSemicolon) {
758 EXPECT("type meow = f32",
759 "test.wgsl:1:16 error: expected ';' for type alias\n"
760 "type meow = f32\n"
761 " ^\n");
762 }
763
TEST_F(ParserImplErrorTest,GlobalDeclTypeDecoInvalid)764 TEST_F(ParserImplErrorTest, GlobalDeclTypeDecoInvalid) {
765 EXPECT("var x : [[]] i32;",
766 "test.wgsl:1:11 error: empty decoration list\n"
767 "var x : [[]] i32;\n"
768 " ^^\n");
769 }
770
TEST_F(ParserImplErrorTest,GlobalDeclVarArrayMissingLessThan)771 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayMissingLessThan) {
772 EXPECT("var i : array;",
773 "test.wgsl:1:14 error: expected '<' for array declaration\n"
774 "var i : array;\n"
775 " ^\n");
776 }
777
TEST_F(ParserImplErrorTest,GlobalDeclVarArrayMissingGreaterThan)778 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayMissingGreaterThan) {
779 EXPECT("var i : array<u32, 3;",
780 "test.wgsl:1:21 error: expected '>' for array declaration\n"
781 "var i : array<u32, 3;\n"
782 " ^\n");
783 }
784
TEST_F(ParserImplErrorTest,GlobalDeclVarArrayDecoNotArray)785 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayDecoNotArray) {
786 EXPECT("var i : [[stride(1)]] i32;",
787 "test.wgsl:1:11 error: unexpected decorations\n"
788 "var i : [[stride(1)]] i32;\n"
789 " ^^^^^^\n");
790 }
791
TEST_F(ParserImplErrorTest,GlobalDeclVarArrayDecoMissingEnd)792 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayDecoMissingEnd) {
793 EXPECT("var i : [[stride(1) array<i32>;",
794 "test.wgsl:1:21 error: expected ']]' for decoration list\n"
795 "var i : [[stride(1) array<i32>;\n"
796 " ^^^^^\n");
797 }
798
TEST_F(ParserImplErrorTest,GlobalDeclVarArrayDecoStrideMissingLParen)799 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayDecoStrideMissingLParen) {
800 EXPECT("var i : [[stride 1)]] array<i32>;",
801 "test.wgsl:1:18 error: expected '(' for stride decoration\n"
802 "var i : [[stride 1)]] array<i32>;\n"
803 " ^\n");
804 }
805
TEST_F(ParserImplErrorTest,GlobalDeclVarArrayDecoStrideMissingRParen)806 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayDecoStrideMissingRParen) {
807 EXPECT("var i : [[stride(1]] array<i32>;",
808 "test.wgsl:1:19 error: expected ')' for stride decoration\n"
809 "var i : [[stride(1]] array<i32>;\n"
810 " ^^\n");
811 }
812
TEST_F(ParserImplErrorTest,GlobalDeclVarArrayDecoStrideInvalid)813 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayDecoStrideInvalid) {
814 EXPECT("var i : [[stride(x)]] array<i32>;",
815 "test.wgsl:1:18 error: expected signed integer literal for stride "
816 "decoration\n"
817 "var i : [[stride(x)]] array<i32>;\n"
818 " ^\n");
819 }
820
TEST_F(ParserImplErrorTest,GlobalDeclVarArrayDecoStrideNegative)821 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayDecoStrideNegative) {
822 EXPECT("var i : [[stride(-1)]] array<i32>;",
823 "test.wgsl:1:18 error: stride decoration must be greater than 0\n"
824 "var i : [[stride(-1)]] array<i32>;\n"
825 " ^^\n");
826 }
827
TEST_F(ParserImplErrorTest,GlobalDeclVarArrayMissingType)828 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayMissingType) {
829 EXPECT("var i : array<1, 3>;",
830 "test.wgsl:1:15 error: invalid type for array declaration\n"
831 "var i : array<1, 3>;\n"
832 " ^\n");
833 }
834
TEST_F(ParserImplErrorTest,GlobalDeclVarArrayMissingSize)835 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayMissingSize) {
836 EXPECT("var i : array<u32, >;",
837 "test.wgsl:1:20 error: expected array size expression\n"
838 "var i : array<u32, >;\n"
839 " ^\n");
840 }
841
TEST_F(ParserImplErrorTest,GlobalDeclVarArrayInvalidSize)842 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayInvalidSize) {
843 EXPECT("var i : array<u32, !>;",
844 "test.wgsl:1:20 error: expected array size expression\n"
845 "var i : array<u32, !>;\n"
846 " ^\n");
847 }
848
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoListEmpty)849 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoListEmpty) {
850 EXPECT("[[]] var i : i32;",
851 "test.wgsl:1:3 error: empty decoration list\n"
852 "[[]] var i : i32;\n"
853 " ^^\n");
854 }
855
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoListInvalid)856 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoListInvalid) {
857 EXPECT("[[location(1), meow]] var i : i32;",
858 "test.wgsl:1:16 error: expected decoration\n"
859 "[[location(1), meow]] var i : i32;\n"
860 " ^^^^\n");
861 }
862
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoListMissingComma)863 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoListMissingComma) {
864 EXPECT("[[location(1) group(2)]] var i : i32;",
865 "test.wgsl:1:15 error: expected ',' for decoration list\n"
866 "[[location(1) group(2)]] var i : i32;\n"
867 " ^^^^^\n");
868 }
869
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoListMissingEnd)870 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoListMissingEnd) {
871 EXPECT("[[location(1) meow]] var i : i32;",
872 "test.wgsl:1:15 error: expected ']]' for decoration list\n"
873 "[[location(1) meow]] var i : i32;\n"
874 " ^^^^\n");
875 }
876
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoLocationMissingLParen)877 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoLocationMissingLParen) {
878 EXPECT("[[location 1]] var i : i32;",
879 "test.wgsl:1:12 error: expected '(' for location decoration\n"
880 "[[location 1]] var i : i32;\n"
881 " ^\n");
882 }
883
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoLocationMissingRParen)884 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoLocationMissingRParen) {
885 EXPECT("[[location (1]] var i : i32;",
886 "test.wgsl:1:14 error: expected ')' for location decoration\n"
887 "[[location (1]] var i : i32;\n"
888 " ^^\n");
889 }
890
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoLocationInvalidValue)891 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoLocationInvalidValue) {
892 EXPECT("[[location(x)]] var i : i32;",
893 "test.wgsl:1:12 error: expected signed integer literal for location "
894 "decoration\n"
895 "[[location(x)]] var i : i32;\n"
896 " ^\n");
897 }
898
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoBuiltinMissingLParen)899 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBuiltinMissingLParen) {
900 EXPECT("[[builtin position]] var i : i32;",
901 "test.wgsl:1:11 error: expected '(' for builtin decoration\n"
902 "[[builtin position]] var i : i32;\n"
903 " ^^^^^^^^\n");
904 }
905
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoBuiltinMissingRParen)906 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBuiltinMissingRParen) {
907 EXPECT("[[builtin(position]] var i : i32;",
908 "test.wgsl:1:19 error: expected ')' for builtin decoration\n"
909 "[[builtin(position]] var i : i32;\n"
910 " ^^\n");
911 }
912
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoBuiltinInvalidIdentifer)913 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBuiltinInvalidIdentifer) {
914 EXPECT("[[builtin(1)]] var i : i32;",
915 "test.wgsl:1:11 error: expected identifier for builtin\n"
916 "[[builtin(1)]] var i : i32;\n"
917 " ^\n");
918 }
919
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoBuiltinInvalidValue)920 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBuiltinInvalidValue) {
921 EXPECT("[[builtin(x)]] var i : i32;",
922 "test.wgsl:1:11 error: invalid value for builtin decoration\n"
923 "[[builtin(x)]] var i : i32;\n"
924 " ^\n");
925 }
926
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoBindingMissingLParen)927 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBindingMissingLParen) {
928 EXPECT("[[binding 1]] var i : i32;",
929 "test.wgsl:1:11 error: expected '(' for binding decoration\n"
930 "[[binding 1]] var i : i32;\n"
931 " ^\n");
932 }
933
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoBindingMissingRParen)934 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBindingMissingRParen) {
935 EXPECT("[[binding(1]] var i : i32;",
936 "test.wgsl:1:12 error: expected ')' for binding decoration\n"
937 "[[binding(1]] var i : i32;\n"
938 " ^^\n");
939 }
940
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoBindingInvalidValue)941 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBindingInvalidValue) {
942 EXPECT("[[binding(x)]] var i : i32;",
943 "test.wgsl:1:11 error: expected signed integer literal for binding "
944 "decoration\n"
945 "[[binding(x)]] var i : i32;\n"
946 " ^\n");
947 }
948
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoGroupMissingLParen)949 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoGroupMissingLParen) {
950 EXPECT("[[group 1]] var i : i32;",
951 "test.wgsl:1:9 error: expected '(' for group decoration\n"
952 "[[group 1]] var i : i32;\n"
953 " ^\n");
954 }
955
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoGroupMissingRParen)956 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoGroupMissingRParen) {
957 EXPECT("[[group(1]] var i : i32;",
958 "test.wgsl:1:10 error: expected ')' for group decoration\n"
959 "[[group(1]] var i : i32;\n"
960 " ^^\n");
961 }
962
TEST_F(ParserImplErrorTest,GlobalDeclVarDecoBindingGroupValue)963 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBindingGroupValue) {
964 EXPECT("[[group(x)]] var i : i32;",
965 "test.wgsl:1:9 error: expected signed integer literal for group "
966 "decoration\n"
967 "[[group(x)]] var i : i32;\n"
968 " ^\n");
969 }
970
TEST_F(ParserImplErrorTest,GlobalDeclVarInvalidIdentifier)971 TEST_F(ParserImplErrorTest, GlobalDeclVarInvalidIdentifier) {
972 EXPECT("var ^ : mat4x4;",
973 "test.wgsl:1:5 error: expected identifier for variable declaration\n"
974 "var ^ : mat4x4;\n"
975 " ^\n");
976 }
977
TEST_F(ParserImplErrorTest,GlobalDeclVarMatrixMissingLessThan)978 TEST_F(ParserImplErrorTest, GlobalDeclVarMatrixMissingLessThan) {
979 EXPECT("var i : mat4x4;",
980 "test.wgsl:1:15 error: expected '<' for matrix\n"
981 "var i : mat4x4;\n"
982 " ^\n");
983 }
984
TEST_F(ParserImplErrorTest,GlobalDeclVarMatrixMissingGreaterThan)985 TEST_F(ParserImplErrorTest, GlobalDeclVarMatrixMissingGreaterThan) {
986 EXPECT("var i : mat4x4<u32;",
987 "test.wgsl:1:19 error: expected '>' for matrix\n"
988 "var i : mat4x4<u32;\n"
989 " ^\n");
990 }
991
TEST_F(ParserImplErrorTest,GlobalDeclVarMatrixMissingType)992 TEST_F(ParserImplErrorTest, GlobalDeclVarMatrixMissingType) {
993 EXPECT("var i : mat4x4<1>;",
994 "test.wgsl:1:16 error: invalid type for matrix\n"
995 "var i : mat4x4<1>;\n"
996 " ^\n");
997 }
998
TEST_F(ParserImplErrorTest,GlobalDeclVarMissingSemicolon)999 TEST_F(ParserImplErrorTest, GlobalDeclVarMissingSemicolon) {
1000 EXPECT("var i : i32",
1001 "test.wgsl:1:12 error: expected ';' for variable declaration\n"
1002 "var i : i32\n"
1003 " ^\n");
1004 }
1005
TEST_F(ParserImplErrorTest,GlobalDeclVarPtrMissingLessThan)1006 TEST_F(ParserImplErrorTest, GlobalDeclVarPtrMissingLessThan) {
1007 EXPECT("var i : ptr;",
1008 "test.wgsl:1:12 error: expected '<' for ptr declaration\n"
1009 "var i : ptr;\n"
1010 " ^\n");
1011 }
1012
TEST_F(ParserImplErrorTest,GlobalDeclVarPtrMissingGreaterThan)1013 TEST_F(ParserImplErrorTest, GlobalDeclVarPtrMissingGreaterThan) {
1014 EXPECT("var i : ptr<private, u32;",
1015 "test.wgsl:1:25 error: expected '>' for ptr declaration\n"
1016 "var i : ptr<private, u32;\n"
1017 " ^\n");
1018 }
1019
TEST_F(ParserImplErrorTest,GlobalDeclVarPtrMissingComma)1020 TEST_F(ParserImplErrorTest, GlobalDeclVarPtrMissingComma) {
1021 EXPECT("var i : ptr<private u32>;",
1022 "test.wgsl:1:21 error: expected ',' for ptr declaration\n"
1023 "var i : ptr<private u32>;\n"
1024 " ^^^\n");
1025 }
1026
TEST_F(ParserImplErrorTest,GlobalDeclVarPtrMissingStorageClass)1027 TEST_F(ParserImplErrorTest, GlobalDeclVarPtrMissingStorageClass) {
1028 EXPECT("var i : ptr<meow, u32>;",
1029 "test.wgsl:1:13 error: invalid storage class for ptr declaration\n"
1030 "var i : ptr<meow, u32>;\n"
1031 " ^^^^\n");
1032 }
1033
TEST_F(ParserImplErrorTest,GlobalDeclVarPtrMissingType)1034 TEST_F(ParserImplErrorTest, GlobalDeclVarPtrMissingType) {
1035 EXPECT("var i : ptr<private, 1>;",
1036 "test.wgsl:1:22 error: invalid type for ptr declaration\n"
1037 "var i : ptr<private, 1>;\n"
1038 " ^\n");
1039 }
1040
TEST_F(ParserImplErrorTest,GlobalDeclVarAtomicMissingLessThan)1041 TEST_F(ParserImplErrorTest, GlobalDeclVarAtomicMissingLessThan) {
1042 EXPECT("var i : atomic;",
1043 "test.wgsl:1:15 error: expected '<' for atomic declaration\n"
1044 "var i : atomic;\n"
1045 " ^\n");
1046 }
1047
TEST_F(ParserImplErrorTest,GlobalDeclVarAtomicMissingGreaterThan)1048 TEST_F(ParserImplErrorTest, GlobalDeclVarAtomicMissingGreaterThan) {
1049 EXPECT("var i : atomic<u32 x;",
1050 "test.wgsl:1:20 error: expected '>' for atomic declaration\n"
1051 "var i : atomic<u32 x;\n"
1052 " ^\n");
1053 }
1054
TEST_F(ParserImplErrorTest,GlobalDeclVarStorageDeclInvalidClass)1055 TEST_F(ParserImplErrorTest, GlobalDeclVarStorageDeclInvalidClass) {
1056 EXPECT("var<fish> i : i32",
1057 "test.wgsl:1:5 error: invalid storage class for variable declaration\n"
1058 "var<fish> i : i32\n"
1059 " ^^^^\n");
1060 }
1061
TEST_F(ParserImplErrorTest,GlobalDeclVarStorageDeclMissingGThan)1062 TEST_F(ParserImplErrorTest, GlobalDeclVarStorageDeclMissingGThan) {
1063 EXPECT("var<private i : i32",
1064 "test.wgsl:1:13 error: expected '>' for variable declaration\n"
1065 "var<private i : i32\n"
1066 " ^\n");
1067 }
1068
TEST_F(ParserImplErrorTest,GlobalDeclVarVectorMissingLessThan)1069 TEST_F(ParserImplErrorTest, GlobalDeclVarVectorMissingLessThan) {
1070 EXPECT("var i : vec3;",
1071 "test.wgsl:1:13 error: expected '<' for vector\n"
1072 "var i : vec3;\n"
1073 " ^\n");
1074 }
1075
TEST_F(ParserImplErrorTest,GlobalDeclVarVectorMissingGreaterThan)1076 TEST_F(ParserImplErrorTest, GlobalDeclVarVectorMissingGreaterThan) {
1077 EXPECT("var i : vec3<u32;",
1078 "test.wgsl:1:17 error: expected '>' for vector\n"
1079 "var i : vec3<u32;\n"
1080 " ^\n");
1081 }
1082
TEST_F(ParserImplErrorTest,GlobalDeclVarVectorMissingType)1083 TEST_F(ParserImplErrorTest, GlobalDeclVarVectorMissingType) {
1084 EXPECT("var i : vec3<1>;",
1085 "test.wgsl:1:14 error: invalid type for vector\n"
1086 "var i : vec3<1>;\n"
1087 " ^\n");
1088 }
1089
TEST_F(ParserImplErrorTest,IfStmtMissingLParen)1090 TEST_F(ParserImplErrorTest, IfStmtMissingLParen) {
1091 EXPECT("fn f() { if true) {} }",
1092 "test.wgsl:1:13 error: expected '('\n"
1093 "fn f() { if true) {} }\n"
1094 " ^^^^\n");
1095 }
1096
TEST_F(ParserImplErrorTest,IfStmtMissingRParen)1097 TEST_F(ParserImplErrorTest, IfStmtMissingRParen) {
1098 EXPECT("fn f() { if (true {} }",
1099 "test.wgsl:1:19 error: expected ')'\n"
1100 "fn f() { if (true {} }\n"
1101 " ^\n");
1102 }
1103
TEST_F(ParserImplErrorTest,IfStmtInvalidCond)1104 TEST_F(ParserImplErrorTest, IfStmtInvalidCond) {
1105 EXPECT("fn f() { if (>) {} }",
1106 "test.wgsl:1:14 error: unable to parse expression\n"
1107 "fn f() { if (>) {} }\n"
1108 " ^\n");
1109 }
1110
TEST_F(ParserImplErrorTest,LogicalAndInvalidExpr)1111 TEST_F(ParserImplErrorTest, LogicalAndInvalidExpr) {
1112 EXPECT("fn f() { return 1 && >; }",
1113 "test.wgsl:1:22 error: unable to parse right side of && expression\n"
1114 "fn f() { return 1 && >; }\n"
1115 " ^\n");
1116 }
1117
TEST_F(ParserImplErrorTest,LogicalOrInvalidExpr)1118 TEST_F(ParserImplErrorTest, LogicalOrInvalidExpr) {
1119 EXPECT("fn f() { return 1 || >; }",
1120 "test.wgsl:1:22 error: unable to parse right side of || expression\n"
1121 "fn f() { return 1 || >; }\n"
1122 " ^\n");
1123 }
1124
TEST_F(ParserImplErrorTest,LoopMissingLBrace)1125 TEST_F(ParserImplErrorTest, LoopMissingLBrace) {
1126 EXPECT("fn f() { loop }",
1127 "test.wgsl:1:15 error: expected '{' for loop\n"
1128 "fn f() { loop }\n"
1129 " ^\n");
1130 }
1131
TEST_F(ParserImplErrorTest,LoopMissingRBrace)1132 TEST_F(ParserImplErrorTest, LoopMissingRBrace) {
1133 EXPECT("fn f() { loop {",
1134 "test.wgsl:1:16 error: expected '}' for loop\n"
1135 "fn f() { loop {\n"
1136 " ^\n");
1137 }
1138
TEST_F(ParserImplErrorTest,MaxErrorsReached)1139 TEST_F(ParserImplErrorTest, MaxErrorsReached) {
1140 EXPECT("x; x; x; x; x; x; x; x;",
1141 "test.wgsl:1:1 error: unexpected token\n"
1142 "x; x; x; x; x; x; x; x;\n"
1143 "^\n\n"
1144 "test.wgsl:1:4 error: unexpected token\n"
1145 "x; x; x; x; x; x; x; x;\n"
1146 " ^\n\n"
1147 "test.wgsl:1:7 error: unexpected token\n"
1148 "x; x; x; x; x; x; x; x;\n"
1149 " ^\n\n"
1150 "test.wgsl:1:10 error: unexpected token\n"
1151 "x; x; x; x; x; x; x; x;\n"
1152 " ^\n\n"
1153 "test.wgsl:1:13 error: unexpected token\n"
1154 "x; x; x; x; x; x; x; x;\n"
1155 " ^\n\n"
1156 "test.wgsl error: stopping after 5 errors");
1157 }
1158
TEST_F(ParserImplErrorTest,MemberExprMissingIdentifier)1159 TEST_F(ParserImplErrorTest, MemberExprMissingIdentifier) {
1160 EXPECT("fn f() { x = a.; }",
1161 "test.wgsl:1:16 error: expected identifier for member accessor\n"
1162 "fn f() { x = a.; }\n"
1163 " ^\n");
1164 }
1165
TEST_F(ParserImplErrorTest,MultiplicativeInvalidExpr)1166 TEST_F(ParserImplErrorTest, MultiplicativeInvalidExpr) {
1167 EXPECT("fn f() { return 1.0 * <; }",
1168 "test.wgsl:1:23 error: unable to parse right side of * expression\n"
1169 "fn f() { return 1.0 * <; }\n"
1170 " ^\n");
1171 }
1172
TEST_F(ParserImplErrorTest,OrInvalidExpr)1173 TEST_F(ParserImplErrorTest, OrInvalidExpr) {
1174 EXPECT("fn f() { return 1 | >; }",
1175 "test.wgsl:1:21 error: unable to parse right side of | expression\n"
1176 "fn f() { return 1 | >; }\n"
1177 " ^\n");
1178 }
1179
TEST_F(ParserImplErrorTest,RelationalInvalidExpr)1180 TEST_F(ParserImplErrorTest, RelationalInvalidExpr) {
1181 EXPECT("fn f() { return 1 < >; }",
1182 "test.wgsl:1:21 error: unable to parse right side of < expression\n"
1183 "fn f() { return 1 < >; }\n"
1184 " ^\n");
1185 }
1186
TEST_F(ParserImplErrorTest,ReturnStmtMissingSemicolon)1187 TEST_F(ParserImplErrorTest, ReturnStmtMissingSemicolon) {
1188 EXPECT("fn f() { return }",
1189 "test.wgsl:1:17 error: expected ';' for return statement\n"
1190 "fn f() { return }\n"
1191 " ^\n");
1192 }
1193
TEST_F(ParserImplErrorTest,ShiftInvalidExpr)1194 TEST_F(ParserImplErrorTest, ShiftInvalidExpr) {
1195 EXPECT("fn f() { return 1 << >; }",
1196 "test.wgsl:1:22 error: unable to parse right side of << expression\n"
1197 "fn f() { return 1 << >; }\n"
1198 " ^\n");
1199 }
1200
TEST_F(ParserImplErrorTest,SwitchStmtMissingLBrace)1201 TEST_F(ParserImplErrorTest, SwitchStmtMissingLBrace) {
1202 EXPECT("fn f() { switch(1) }",
1203 "test.wgsl:1:20 error: expected '{' for switch statement\n"
1204 "fn f() { switch(1) }\n"
1205 " ^\n");
1206 }
1207
TEST_F(ParserImplErrorTest,SwitchStmtMissingRBrace)1208 TEST_F(ParserImplErrorTest, SwitchStmtMissingRBrace) {
1209 EXPECT("fn f() { switch(1) {",
1210 "test.wgsl:1:21 error: expected '}' for switch statement\n"
1211 "fn f() { switch(1) {\n"
1212 " ^\n");
1213 }
1214
TEST_F(ParserImplErrorTest,SwitchStmtInvalidCase)1215 TEST_F(ParserImplErrorTest, SwitchStmtInvalidCase) {
1216 EXPECT("fn f() { switch(1) { case ^: } }",
1217 "test.wgsl:1:27 error: unable to parse case selectors\n"
1218 "fn f() { switch(1) { case ^: } }\n"
1219 " ^\n");
1220 }
1221
TEST_F(ParserImplErrorTest,SwitchStmtInvalidCase2)1222 TEST_F(ParserImplErrorTest, SwitchStmtInvalidCase2) {
1223 EXPECT(
1224 "fn f() { switch(1) { case false: } }",
1225 "test.wgsl:1:27 error: invalid case selector must be an integer value\n"
1226 "fn f() { switch(1) { case false: } }\n"
1227 " ^^^^^\n");
1228 }
1229
TEST_F(ParserImplErrorTest,SwitchStmtCaseMissingColon)1230 TEST_F(ParserImplErrorTest, SwitchStmtCaseMissingColon) {
1231 EXPECT("fn f() { switch(1) { case 1 {} } }",
1232 "test.wgsl:1:29 error: expected ':' for case statement\n"
1233 "fn f() { switch(1) { case 1 {} } }\n"
1234 " ^\n");
1235 }
1236
TEST_F(ParserImplErrorTest,SwitchStmtCaseMissingLBrace)1237 TEST_F(ParserImplErrorTest, SwitchStmtCaseMissingLBrace) {
1238 EXPECT("fn f() { switch(1) { case 1: } }",
1239 "test.wgsl:1:30 error: expected '{' for case statement\n"
1240 "fn f() { switch(1) { case 1: } }\n"
1241 " ^\n");
1242 }
1243
TEST_F(ParserImplErrorTest,SwitchStmtCaseMissingRBrace)1244 TEST_F(ParserImplErrorTest, SwitchStmtCaseMissingRBrace) {
1245 EXPECT("fn f() { switch(1) { case 1: {",
1246 "test.wgsl:1:31 error: expected '}' for case statement\n"
1247 "fn f() { switch(1) { case 1: {\n"
1248 " ^\n");
1249 }
1250
TEST_F(ParserImplErrorTest,SwitchStmtCaseFallthroughMissingSemicolon)1251 TEST_F(ParserImplErrorTest, SwitchStmtCaseFallthroughMissingSemicolon) {
1252 EXPECT("fn f() { switch(1) { case 1: { fallthrough } case 2: {} } }",
1253 "test.wgsl:1:44 error: expected ';' for fallthrough statement\n"
1254 "fn f() { switch(1) { case 1: { fallthrough } case 2: {} } }\n"
1255 " ^\n");
1256 }
1257
TEST_F(ParserImplErrorTest,VarStmtMissingSemicolon)1258 TEST_F(ParserImplErrorTest, VarStmtMissingSemicolon) {
1259 EXPECT("fn f() { var a : u32 }",
1260 "test.wgsl:1:22 error: expected ';' for variable declaration\n"
1261 "fn f() { var a : u32 }\n"
1262 " ^\n");
1263 }
1264
TEST_F(ParserImplErrorTest,VarStmtInvalidAssignment)1265 TEST_F(ParserImplErrorTest, VarStmtInvalidAssignment) {
1266 EXPECT("fn f() { var a : u32 = >; }",
1267 "test.wgsl:1:24 error: missing constructor for variable declaration\n"
1268 "fn f() { var a : u32 = >; }\n"
1269 " ^\n");
1270 }
1271
TEST_F(ParserImplErrorTest,UnaryInvalidExpr)1272 TEST_F(ParserImplErrorTest, UnaryInvalidExpr) {
1273 EXPECT("fn f() { return !<; }",
1274 "test.wgsl:1:18 error: unable to parse right side of ! expression\n"
1275 "fn f() { return !<; }\n"
1276 " ^\n");
1277 }
1278
TEST_F(ParserImplErrorTest,UnexpectedToken)1279 TEST_F(ParserImplErrorTest, UnexpectedToken) {
1280 EXPECT("unexpected",
1281 "test.wgsl:1:1 error: unexpected token\n"
1282 "unexpected\n"
1283 "^^^^^^^^^^\n");
1284 }
1285
TEST_F(ParserImplErrorTest,XorInvalidExpr)1286 TEST_F(ParserImplErrorTest, XorInvalidExpr) {
1287 EXPECT("fn f() { return 1 ^ >; }",
1288 "test.wgsl:1:21 error: unable to parse right side of ^ expression\n"
1289 "fn f() { return 1 ^ >; }\n"
1290 " ^\n");
1291 }
1292
1293 } // namespace
1294 } // namespace wgsl
1295 } // namespace reader
1296 } // namespace tint
1297