1# Copyright 2017 syzkaller project authors. All rights reserved.
2# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
3
4foo$0(x fileoff, y int8, z buffer[in])
5foo$1(x "bar")			### unexpected string "bar", expect type
6foo$2(x 123, y "bar")		### unexpected int 123, expect type	### unexpected string "bar", expect type
7foo$3(x string)			### string can't be syscall argument
8
9resource r0[int32]: 0, 0x1
10resource r1[string["foo"]]	### string can't be resource base (int types can)
11resource r1[int32]		### type r1 redeclared, previously declared as resource at LOCATION
12resource int32[int32]		### resource name int32 conflicts with builtin type
13resource fileoff[intptr]	### resource name fileoff conflicts with builtin type
14
15s1 {
16	f1	int32
17}
18
19s1 {				### type s1 redeclared, previously declared as struct at LOCATION
20	f1	int32
21	f1	intptr		### duplicate field f1 in struct s1
22	parent	int8		### reserved field name parent in struct s1
23}
24
25s2 {				### struct s2 has no fields, need at least 1 field
26}
27
28int32 {				### struct name int32 conflicts with builtin type
29	f1	int32
30}
31
32r0 {				### type r0 redeclared, previously declared as resource at LOCATION
33	f1	int32
34}
35
36u0 [
37	f1	int32
38	f2	fileoff[int32]
39]
40
41u1 [				### union u1 has no fields, need at least 1 field
42]
43
44u2 [
45	f1	int8
46	f1	int16		### duplicate field f1 in union u2
47	parent	int32		### reserved field name parent in union u2
48]
49
50foo$4(a int8, a int16)		### duplicate argument a in syscall foo$4
51foo$4()				### syscall foo$4 redeclared, previously declared at LOCATION
52foo()
53foo()				### syscall foo redeclared, previously declared at LOCATION
54foo$5(a0 int8, a1 int8, a2 int8, a3 int8, a4 int8, a5 int8, a6 int8, a7 int8, a8 int8, a9 int8)	### syscall foo$5 has 10 arguments, allowed maximum is 9
55foo$6(parent int8)		### reserved argument name parent in syscall foo$6
56
57f1 = 1
58f2 = 1, 2
59f2 = 1, 2			### flags f2 redeclared, previously declared at LOCATION
60sf1 = "a"
61sf2 = "a", "b"
62sf2 = "c"			### string flags sf2 redeclared, previously declared at LOCATION
63
64resource r2[r0]: 2
65resource r3[int32:1]		###  unexpected ':', only struct fields can be bitfields
66resource r4[int32[opt]]		### resource base can't be marked as opt
67resource r5[non_existent]	### unknown type non_existent
68resource r9["foo"]		### unexpected string "foo", expect type
69
70foo$7(a r0, a1 r2[opt])
71foo$8(a fileoff[a, b, c])	### wrong number of arguments for type fileoff, expect no arguments
72foo$9(a buffer[inout])
73foo$10(a buffer[intout])	### unexpected value intout for direction argument of buffer type, expect [in out inout]
74foo$11(a buffer["in"])		### unexpected string "in" for direction argument of buffer type, expect [in out inout]
75foo$12(a buffer[10])		### unexpected int 10 for direction argument of buffer type, expect [in out inout]
76foo$13(a int32[2:3])
77foo$14(a int32[2:2])
78foo$16(a int32[3])
79foo$17(a ptr[in, int32])
80foo$18(a ptr[in, int32[2:3]])
81foo$19(a ptr[in, int32[opt]])
82foo$20(a ptr)			### wrong number of arguments for type ptr, expect direction, type, [opt]
83foo$21(a ptr["foo"])		### wrong number of arguments for type ptr, expect direction, type, [opt]
84foo$22(a ptr[in])		### wrong number of arguments for type ptr, expect direction, type, [opt]
85foo$23(a ptr[in, s3[in]])	### wrong number of arguments for type s3, expect no arguments
86foo$25(a proc[0, "foo"])	### unexpected string "foo" for per-proc values argument of proc type, expect int
87foo$26(a flags[no])		### unknown flags no
88foo$27(a flags["foo"])		### unexpected string "foo" for flags argument of flags type, expect identifier
89foo$28(a ptr[in, string["foo"]], b ptr[in, string["foo", 4]])
90foo$30(a ptr[in, string[no]])	### unknown string flags no
91foo$31(a int8, b ptr[in, csum[a, inet]])		### wrong number of arguments for type csum, expect csum target, kind, [proto], base type
92foo$32(a int8, b ptr[in, csum[a, inet, 1, int32]])	### only pseudo csum can have proto
93foo$33(a int8, b ptr[in, csum[a, pseudo, 1, int32]])
94foo$34(a int32["foo"])		### unexpected string "foo" for range argument of int32 type, expect int
95foo$35(a ptr[in, s3[opt]])	### s3 can't be marked as opt
96foo$36(a const[1:2])		### unexpected ':'
97foo$39(a fileoff:1)		### unexpected ':'
98foo$40(a len["a"])		### unexpected string "a" for len target argument of len type, expect identifier
99foo$41(a vma[C1:C2])
100foo$43(a ptr[in, string[1]])	### unexpected int 1, string arg must be a string literal or string flags
101foo$44(a int32) len[a]		### len can't be syscall return
102foo$45(a int32) len[b]		### len can't be syscall return
103foo$46(a ptr[in, in])		### unknown type in
104foo$47(a int32:2)		### unexpected ':', only struct fields can be bitfields
105foo$48(a ptr[in, int32:7])	### unexpected ':', only struct fields can be bitfields
106foo$49(a ptr[in, array[int32, 0:1]])
107foo$52(a intptr, b bitsize[a])
108foo$53(a proc[20, 10, opt])
109# This must not error yet (consts are not patched).
110foo$54(a ptr[in, string["foo", C1]])
111foo$55(a int8[opt[int8]])	### opt can't have arguments
112foo$56(a void)			### void can't be syscall argument
113foo$57(a ptr[in, stringnoz["foo", 10]])	### fixed-size string can't be non-zero-terminated
114foo$58(a ptr[in, stringnoz[sf2, 10]])	### fixed-size string can't be non-zero-terminated
115foo$59(a s1)			### s1 can't be syscall argument
116foo$60() s1			### s1 can't be syscall return
117foo$61(a u6)			### u6 can't be syscall argument
118foo$62() u6			### u6 can't be syscall return
119foo$63(a int32[1[2]])		### range argument has subargs
120foo$64(a ptr[in, flags[f1[int32], int32]])	### flags argument has subargs
121
122opt {				### struct uses reserved name opt
123	f1	int32
124}
125
126in = 1, 2			### flags uses reserved name in
127out = "1", "2"			### string flags uses reserved name out
128
129out [				### union uses reserved name out
130	f1	int32
131	f2	int8
132]
133
134resource inout[int32]		### resource uses reserved name inout
135
136bar()
137
138s3 {
139	f1	int8:0		### bitfields of size 0 are not supported
140	f2	int8:1
141	f3	int8:7
142	f4	int8:8
143	f5	int8:9		### bitfield of size 9 is too large for base type of size 8
144	f6	int32:32
145	f7	int32:33	### bitfield of size 33 is too large for base type of size 32
146	f8	const[0, int32:C1]	### literal const bitfield sizes are not supported
147} [packed, align_4]
148
149s4 {
150	f1	int8
151} [align_7]			###  bad struct s4 alignment 7 (must be a sane power of 2)
152
153s5 {
154	f1	int8
155} [varlen]			### unknown struct s5 attribute varlen
156
157s6 {
158	f1	int8
159} [align_foo]			### bad struct s6 alignment foo
160
161s7 {
162	f1	ptr64[in, int32]
163}
164
165s8 {
166	f1	int8
167} [unknown]			### unknown struct s8 attribute unknown
168
169s9 {
170	f1	int8
171} ["foo"[0]]			### unexpected string "foo", expect attribute
172
173s10 {
174	f1	int8
175} [packed[0]]			### packed attribute has args
176
177s11 {
178	f1	int8
179} [size["foo"]]			### unexpected string "foo", expect int
180
181s12 {
182	f1	int8
183} [size[0:1]]			### size attribute has colon or args
184
185s13 {
186	f1	int8
187} [size[0[0]]]			### size attribute has colon or args
188
189u3 [
190	f1	int8
191	f2	int32
192] [varlen]
193
194u4 [
195	f1	int8
196	f2	int32
197] [packed]			### unknown union u4 attribute packed
198
199u5 [
200	f1	int8:1		### unexpected ':', only struct fields can be bitfields
201	f2	int8:2		### unexpected ':', only struct fields can be bitfields
202]
203
204u6 [
205	f1	int8
206	f2	int64
207	f3	array[int8]
208]
209
210define d0 SOMETHING
211define d1 `some C expression`
212define d2 some C expression
213define d2 SOMETHING		### duplicate define d2
214define d3 1
215
216# Type aliases.
217
218type mybool8 int8[0:1]
219type mybool16 int16[0:1]
220type net_port proc[100, 1, int16be]
221resource typeres0[mybool8]
222typestruct {
223	f1	mybool8
224	f2	mybool16
225}
226
227type type0 int8
228type type0 int8			### type type0 redeclared, previously declared as type alias at LOCATION
229resource type0[int32]		### type type0 redeclared, previously declared as type alias at LOCATION
230type0 = 0, 1
231type type1 type1		### type instantiation loop: type1 -> type1
232type type2 int8:4		### unexpected ':', only struct fields can be bitfields
233type type3 type2		### unknown type type2
234type type4 const[0]		### wrong number of arguments for type const, expect value, base type
235type type6 len[foo, int32]	### len can't be type alias target
236type type7 len[foo]		### len can't be type alias target
237resource typeres1[int32]
238type type8 typeres1		### typeres1 can't be type alias target
239type int8 int8			### type name int8 conflicts with builtin type
240type opt int8			### type uses reserved name opt
241type type9 const[0, int8]
242type type12 proc[123, 2, int16, opt]
243type type13 ptr[in, typestruct13]
244type type14 flags[type0, int32]
245type type15 const[0, type0]	### unexpected value type0 for base type argument of const type, expect [int8 int16 int32 int64 int16be int32be int64be intptr]
246type bool8 int8[0:1]		### type name bool8 conflicts with builtin type
247
248typestruct11 {
249	f	type11		### unknown type type11
250}
251
252typestruct12 {
253	f	type11		### unknown type type11
254}
255
256typestruct13 {
257	f1	type9
258	f2	type12
259}
260
261foo$100(a mybool8, b mybool16)
262foo$102(a type2)		### unknown type type2
263foo$103(a type0:4)		### type alias type0 with ':'
264foo$104(a type0[opt])		### type type0 is not a template
265foo$105() type0			### int8 can't be syscall return
266foo$106() type6			### unknown type type6
267foo$107(a type9, b type12)
268foo$108(a flags[type0])
269foo$109(a ptr[in, type0])
270
271# Type templates.
272
273type templ0[A, B] const[A, B]
274type templ2[A] A[0]
275type templ3[A] ptr[in, A]
276type templ4[A, A] ptr[in, A]	### duplicate type argument A
277type templ5[abc] ptr[in, abc]	### type argument abc must be ALL_CAPS
278type templ6[T] ptr[in, T]
279type templ7 templ0[templ6, int8]
280
281# Note: here 42 is stripped as base type, so const ends up without arguments.
282foo$201(a templ1[42])		### wrong number of arguments for type const, expect value
283type templ1[A] const[A]
284
285type templ_struct0[A, B] {
286	len	len[parent, int16]
287	typ	const[A, int16]
288	data	B
289} [align_4]
290
291type templ_struct1[STR] {
292	f	string[STR, 40]
293	f	int32		### duplicate field f in template struct templ_struct1
294}
295
296type templ_struct2[A] {
297	f	B		### unknown type B
298}
299
300type templ_base0[TYPE] {
301	f1	TYPE
302}
303
304type templ_templ0[BASE] {
305	f1	BASE
306}
307
308type templ_templ1[BASE] {
309	f1	BASE[int16]			### both template parameter BASE and its usage have sub-arguments
310}
311
312templ_templ_use0 {
313	f1	templ_templ0[templ_base0]	### template templ_base0 needs 1 arguments instead of 0
314	f2	templ_templ1[templ_base0[int32]]
315}
316
317foo$200(a templ0[42, int8])
318foo$202(a templ0)		### template templ0 needs 2 arguments instead of 0
319foo$203(a type0[42])		### type type0 is not a template
320foo$204(a ptr[in, templ_struct0[42, int8]])
321foo$205(a ptr[in, templ_struct0[int8, int8]])
322foo$207(a ptr[in, templ_struct2[1]])
323
324# fmt
325
326foo$fmt0(a ptr[in, fmt])			### wrong number of arguments for type fmt, expect format, value
327foo$fmt1(a fmt[dec, int8])			### fmt can't be syscall argument
328foo$fmt2(a ptr[in, fmt[dec, ptr[in, int8]]])	### bad fmt value ptr, expect an integer
329foo$fmt3(a ptr[in, fmt[foo, int8]])		### unexpected value foo for format argument of fmt type, expect [dec hex oct]
330foo$fmt4(a ptr[in, fmt[dec, int8:3]])		### unexpected ':', only struct fields can be bitfields
331
332struct$fmt0 {
333	f0	fmt[dec, int8:3]		### unexpected ':', only struct fields can be bitfields
334	f1	int32:-1			### bitfield of size 18446744073709551615 is too large for base type of size 32
335}
336