• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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