diff options
| author | 2026-10-14 16:03:48 +0330 | |
|---|---|---|
| committer | 2026-10-14 16:03:48 +0330 | |
| commit | 29eb9e50d33d417035e133dcebb7111074a23b24 (patch) | |
| tree | da4a1614bae228dc0b7675b287643c64e8720530 /tests | |
| parent | merge: llvm auto-build (opt-in on x86-64), mode stamp (diff) | |
| parent | conformance: b.2.8 is documented behavior; keep the conformance run out of te... (diff) | |
merge: seven self-hosted compiler fixes from conformance
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/conformance/4-statements/memdebug_scrub_fills.zc | 4 | ||||
| -rw-r--r-- | tests/conformance/4-statements/switch_tagged_empty_parens_with_fields.zc | 15 | ||||
| -rw-r--r-- | tests/conformance/5-declarations/global_names_global_b8.zc | 2 | ||||
| -rw-r--r-- | tests/conformance/known.txt | 19 | ||||
| -rw-r--r-- | tests/langerrors/bad_char_first_statement.zc | 3 | ||||
| -rw-r--r-- | tests/langerrors/bad_float_first_statement.zc | 3 | ||||
| -rw-r--r-- | tests/langerrors/params_25.zc | 3 | ||||
| -rwxr-xr-x | tests/test.sh | 11 |
8 files changed, 36 insertions, 24 deletions
diff --git a/tests/conformance/4-statements/memdebug_scrub_fills.zc b/tests/conformance/4-statements/memdebug_scrub_fills.zc index ad15e3d..eed4c2d 100644 --- a/tests/conformance/4-statements/memdebug_scrub_fills.zc +++ b/tests/conformance/4-statements/memdebug_scrub_fills.zc @@ -1,10 +1,10 @@ // expect: 57005/ -// spec 4.11: memdebug scrub; fills freed payloads with 57005 +// spec 4.11: memdebug scrub; fills freed payloads with 57005 (read through asm, which the use-after-free check does not see) include rt; void pn(int x) { rt.put_n(x); rt.put_c(10); } memdebug scrub; fn main() { - unchecked { int* p = rt.new(int); *p = 5; rt.free(p); pn(*p); } + unchecked { int* p = rt.new(int); *p = 5; word a = p; rt.free(p); pn(asm { a @ @ }); } return 0; } // zc0: skip diff --git a/tests/conformance/4-statements/switch_tagged_empty_parens_with_fields.zc b/tests/conformance/4-statements/switch_tagged_empty_parens_with_fields.zc new file mode 100644 index 0000000..789c650 --- /dev/null +++ b/tests/conformance/4-statements/switch_tagged_empty_parens_with_fields.zc @@ -0,0 +1,15 @@ +// expect: rect/circle/ +// spec 4.7.3: case member(): with no names matches by tag even when the member has fields +include rt; +enum shape { circle { int r; }, rect { int w; int h; }, dot }; +void t(shape* s) { + switch (s) { case circle(): rt.put_s("circle"); case rect(): rt.put_s("rect"); case dot: rt.put_s("dot"); } + rt.put_c(10); +} +fn main() { + shape* a = shape.rect(4, 5); shape* b = shape.circle(2); + t(a); t(b); + rt.free(a); rt.free(b); + return 0; +} +// zc0: skip diff --git a/tests/conformance/5-declarations/global_names_global_b8.zc b/tests/conformance/5-declarations/global_names_global_b8.zc index 7d678eb..6e11713 100644 --- a/tests/conformance/5-declarations/global_names_global_b8.zc +++ b/tests/conformance/5-declarations/global_names_global_b8.zc @@ -1,5 +1,5 @@ // expect: 1/ -// spec 5.3.2 and 3.14.2: a global named in an initializer is its address (appendix b.2.8 calls this a bug) +// spec 5.3.2 and 3.14.2: a global named in an initializer is its address (documented behavior: the spec wins over appendix b.2.8) include rt; void pn(int x) { rt.put_n(x); rt.put_c(10); } int a = 5; int b = a + 1; diff --git a/tests/conformance/known.txt b/tests/conformance/known.txt index c26b50e..13ef43c 100644 --- a/tests/conformance/known.txt +++ b/tests/conformance/known.txt @@ -1,22 +1,7 @@ # understood conformance failures: PATH IMPL CLASS reason # class a: self-hosted compiler bug; b: zc0 deviation (appendix a/b); c: spec issue to settle -1-source/ident_tags_as_variables_glued_star.zc zy a u*d with visible variables u and d is taken as a recast, not a multiplication (spec 1.6.3) -1-source/lit_bstr_cast_to_int_pointer.zc zy a the bstr flag leaks into an int* local, so p[0] reads a byte -1-source/lit_char_non_ascii.zc zy a bad character literal in the first statement of a body is swallowed by lookahead -1-source/lit_char_two_bytes.zc zy a bad character literal in the first statement of a body is swallowed by lookahead -1-source/lit_char_two_bytes_local_init.zc zy a bad character literal in the first statement of a body is swallowed by lookahead -1-source/lit_float_bad_exponent.zc zy a bad float literal in the first statement of a body is swallowed by lookahead -1-source/lit_float_bad_exponent_first_stmt_local.zc zy a bad float literal in the first statement of a body is swallowed by lookahead -1-source/lit_float_bad_exponent_first_stmt_paren.zc zy a bad float literal in the first statement of a body is swallowed by lookahead -1-source/lit_float_bad_exponent_in_helper.zc zy a bad float literal in the first statement of a body is swallowed by lookahead -1-source/lit_float_bad_exponent_sign.zc zy a bad float literal in the first statement of a body is swallowed by lookahead -2-types/typecheck_off_void_return_value_ok.zc zy a void f() { return 3; } yields 3, not 0 (spec 4.8.3) -3-expressions/call_24_parameters.zc zy a the parameter limit is 23, not 24 (decl.zc; closures 19) -3-expressions/call_24_parameters_prototype.zc zy a the parameter limit is 23, not 24 (decl.zc; closures 19) -4-statements/memdebug_scrub_accepted.zc zy a memdebug scrub; is rejected (appendix b.1.1, b.2.1) -4-statements/memdebug_scrub_fills.zc zy a memdebug scrub; is rejected (appendix b.1.1, b.2.1) +# appendix b.2.8 (a global named in an initializer is its address) is documented behavior per 5.3.2 and 3.14.2: no entry 4-statements/o3_outside_function_ordinary_block.zc zy c top-level o3 { } is rejected; spec 4.10.2 says it is an ordinary block -4-statements/switch_tagged_match_by_tag.zc zy a case member(): on a member with fields is rejected (a case binds every field); spec 4.7.3 says it matches by tag 5-declarations/enum_member_names_earlier_b2.zc zy a appendix b.2.2 confirmed: enum members can't name earlier members 5-declarations/fn_prototype_after_definition_b4.zc zy a appendix b.2.4 confirmed: a prototype after the definition hides it 5-declarations/fn_prototype_unnamed_params_b13.zc zy a appendix b.2.13 confirmed (message now: doesn't match its earlier declaration) @@ -31,7 +16,7 @@ 9-appendix-b/b2_14_len_char_ptr_typecheck_off.zc zy a appendix b.2.14 confirmed 9-appendix-b/b2_15_duplicate_case.zc zy c appendix b.2.15 confirmed; 4.7.2 says duplicates are allowed 9-appendix-b/b2_16_local_const_in_const_expr.zc zy c appendix b.2.16 confirmed; 3.14.2 documents it -1-source/ident_tags_as_variables_glued_star.zc zc0 b recast u*d emits no code (same misparse as zy) +1-source/ident_tags_as_variables_glued_star.zc zc0 b u*d with visible u and d is read as a recast (no code); zy follows 1.6.3 1-source/lit_hex.zc zc0 b literals read with strtoll base 0: octal and saturation (appendix b.1.11) 1-source/lit_hex_wide.zc zc0 b literals read with strtoll base 0: octal and saturation (appendix b.1.11) 1-source/lit_hex_wraps.zc zc0 b literals read with strtoll base 0: octal and saturation (appendix b.1.11) diff --git a/tests/langerrors/bad_char_first_statement.zc b/tests/langerrors/bad_char_first_statement.zc new file mode 100644 index 0000000..ca2ccfa --- /dev/null +++ b/tests/langerrors/bad_char_first_statement.zc @@ -0,0 +1,3 @@ +// expect: bad character literal +include rt; +fn main() { int a = 'ab'; rt.put_n(a); return 0; } diff --git a/tests/langerrors/bad_float_first_statement.zc b/tests/langerrors/bad_float_first_statement.zc new file mode 100644 index 0000000..2dcca38 --- /dev/null +++ b/tests/langerrors/bad_float_first_statement.zc @@ -0,0 +1,3 @@ +// expect: bad float +include rt; +fn main() { rt.put_n(1e); return 0; } diff --git a/tests/langerrors/params_25.zc b/tests/langerrors/params_25.zc new file mode 100644 index 0000000..738cbcc --- /dev/null +++ b/tests/langerrors/params_25.zc @@ -0,0 +1,3 @@ +// expect: too many parameters +fn f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25) { return 0; } +fn main() { return 0; } diff --git a/tests/test.sh b/tests/test.sh index a1a5453..37fa71c 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -234,10 +234,13 @@ s_interp() { T=$ROOT/interp $CC -pthread -O2 -w -fwrapv -DJTYPE=int src/core/core.c src/core/io_linux.c $GI -o $T/zy run $T/zy "interp" - # docs/SPEC.md conformance programs; failures listed in tests/conformance/known.txt do not count - bash tests/conformance/run.sh --zy $T/zy -w $T/conformance -q > $T/conformance.out 2>&1; r=$? - grep '^FAIL' $T/conformance.out - chk $r 0 "interp conformance suite: $(grep '^ total' $T/conformance.out | sed 's/ */ /g')" + # docs/SPEC.md conformance programs; failures listed in tests/conformance/known.txt do not count. + # not in the quick path (-q, make check): it takes about half a minute + if [ $QUICK = 0 ]; then + bash tests/conformance/run.sh --zy $T/zy -w $T/conformance -q > $T/conformance.out 2>&1; r=$? + grep '^FAIL' $T/conformance.out + chk $r 0 "interp conformance suite: $(grep '^ total' $T/conformance.out | sed 's/ */ /g')" + fi python3 tests/drivers/array_methods_test.py $T/zy > $T/arrays.out 2>&1; r=$? grep -v '^ok' $T/arrays.out chk $r 0 "native array receiver, algorithm and ownership contracts" |
