From d93000c4b5ff7b3dda0e59a4d333b0463e745e04 Mon Sep 17 00:00:00 2001 From: zinc Date: Wed, 14 Oct 2026 16:14:02 +0330 Subject: include: written inside a function body is 'include is top level only' (appendix b.2.9) --- src/compiler/builtins.zc | 1 + tests/conformance/5-declarations/include_in_function_b9.zc | 2 +- tests/conformance/known.txt | 1 - tests/langerrors/include_in_function.zc | 2 ++ 4 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 tests/langerrors/include_in_function.zc diff --git a/src/compiler/builtins.zc b/src/compiler/builtins.zc index d04c444..d6a58fb 100644 --- a/src/compiler/builtins.zc +++ b/src/compiler/builtins.zc @@ -312,6 +312,7 @@ int inc_compile(char* buf, char* name, char*.d dir) { int kw_include() { int pp, sv; char* path; char* buf; stmtonly(); + if (infn) { die("include is top level only"); return 0; } // appendix b.2.9 next(); if (tk == T_ID) { while (1) { diff --git a/tests/conformance/5-declarations/include_in_function_b9.zc b/tests/conformance/5-declarations/include_in_function_b9.zc index cccaea5..64f170c 100644 --- a/tests/conformance/5-declarations/include_in_function_b9.zc +++ b/tests/conformance/5-declarations/include_in_function_b9.zc @@ -1,4 +1,4 @@ -// expect error: include +// expect error: include is top level only // spec 5.12.7 and appendix b.2.9: expected an error saying include is top level only include rt; void pn(int x) { rt.put_n(x); rt.put_c(10); } diff --git a/tests/conformance/known.txt b/tests/conformance/known.txt index 044b862..8415b18 100644 --- a/tests/conformance/known.txt +++ b/tests/conformance/known.txt @@ -4,7 +4,6 @@ 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 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_unnamed_params_b13.zc zy c spec 5.2.1 says prototype parameter names are required, and a type name alone is read as an untyped parameter of that name (paramstart); b.2.13 is a spec choice, not fixed -5-declarations/include_in_function_b9.zc zy a appendix b.2.9 confirmed: include in a body gives "return outside a function" 9-appendix-b/b2_05_ternary_int_float.zc zy a appendix b.2.5 confirmed 9-appendix-b/b2_06_bool_normalises.zc zy a appendix b.2.6 confirmed 9-appendix-b/b2_10_recovery_hides_errors.zc zy c appendix b.2.10 confirmed; by design per 8.2 diff --git a/tests/langerrors/include_in_function.zc b/tests/langerrors/include_in_function.zc new file mode 100644 index 0000000..06136f9 --- /dev/null +++ b/tests/langerrors/include_in_function.zc @@ -0,0 +1,2 @@ +// expect: include is top level only +fn main() { include std; return 0; } -- cgit v1.2.3