From 9b8765d8baaeb2a16112d68cf9defd4b804b0dc9 Mon Sep 17 00:00:00 2001 From: Detlef Riekenberg Date: Mon, 20 Apr 2026 01:42:41 +0200 Subject: [PATCH] Revert commits from OpenCode-AI and a partial regression fix This reverts the crap from an unknown committer "OpenCode[AI]", that added an extension to TinyCC, which is incompatible to the C standard and not available in any other mainstream C compiler: * Revert "No More ; needed" This reverts commit 6547ea47d66a4d382c9c2cfc317426d8a3a5734e * Revert "Add AGENTS.md" This reverts commit 898f496dc9d68e85a81daa836009930a975ea71a. This also reverts a regression fix by "Zuhaitz.dev", which fixed a small part of the OpenCode-AI chaos: * Revert "tccgen: Fix optional semicolon regression" This reverts commit 169628a6abf2bf32a9f73a7db5b4fd3ea973d97a -- Regards ... Detlef --- AGENTS.md | 54 ---------------------- tccgen.c | 21 ++++----- tests/tests2/60_errors_and_warnings.expect | 2 +- 3 files changed, 10 insertions(+), 67 deletions(-) delete mode 100644 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100644 index 7d1b4f67..00000000 --- a/AGENTS.md +++ /dev/null @@ -1,54 +0,0 @@ -# TinyCC (Tiny C Compiler) - -## Build & Test - -```sh -./configure && make && make test -``` - -- `make` builds `tcc` + `libtcc.a` + `libtcc1.a`. `libtcc1.a` is built by a recursive `make -C lib`. -- `make test` runs the full test suite (`tests/`), ~2 minutes. -- Run a single tests2 test: `make tests2.37` (run) or `make tests2.37+` (update .expect). -- Run a single tests/pp test: `make testspp.17`. -- Sanitizer tests: `make sani-test`, `make sani-tests2.37`, `make sani-testspp.17`. -- Coverage tests: `make tcov-test`, `make tcov-tests2.37`, `make tcov-testspp.17`. -- Test installed tcc: `make test-install`. - -## Architecture - -- **Single-file-ish compiler**: tcc compiles itself (or can be bootstrapped). `tcc.c` is the main entrypoint; `tccpp.c` handles preprocessing, `tccgen.c` handles code generation, `tccelf.c` handles ELF linking, `tccasm.c` handles inline asm, `tccrun.c` handles runtime execution, `tccdbg.c` handles debug info. -- **Backend files per architecture**: `i386-gen.c`, `x86_64-gen.c`, `arm-gen.c`, `arm64-gen.c`, `riscv64-gen.c`, `c67-gen.c`, plus corresponding asm/link files. -- **Generated file**: `include/tccdefs.h` is converted to `tccdefs_.h` by `c2str.exe` (built from `conftest.c`). Always exists after first `make`. -- **Cross-compilers**: `make cross` builds all cross-compilers; `make cross-i386`, `make cross-x86_64`, etc. for one target. `make CROSS_TARGET=i386 ONE_SOURCE=yes` for single-object cross build. -- **`ONE_SOURCE=yes`**: builds tcc as a single object file (default for cross-compilers, native uses separate objects). - -## Coding Style - -- **C90** with these pre-existing non-C90 features: `long long`, `inline`, `//` comments, unnamed struct/union fields, empty macro arguments, assignment between function pointer and `void *`. -- **Indentation**: 4 spaces for most files; some files (e.g. `i386-gen.c`) use 2 spaces for deep nesting. -- **Do not reformat** existing code unless the change is the primary purpose. -- Remove tabs and trailing whitespace from modified lines. -- Check with `./configure --extra-cflags="-std=c90 -Wpedantic"`. - -## Test Quirks - -- `test.ref` (reference output) is generated from `tcctest.c` using gcc: `(cd tests && gcc -I.. tcctest.c && valgrind -q ./a.out > test.ref)` then `make test TCC="valgrind -q --leak-check=full $(pwd)/tcc -B$(pwd) -I$(pwd)"`. -- VLA tests (`79_vla_continue`) produce expected invalid reads under Valgrind. -- tests2 skip list is in `tests/tests2/Makefile` (architecture- and config-specific skips). -- Some tests need special flags (see `FLAGS =` assignments in `tests/tests2/Makefile`). -- Bound-check tests (`-b` flag) are skipped when `CONFIG_bcheck=no`. -- `.expect` files are generated with gcc by default; some use TCC (flagged with `GEN-TCC`). - -## Language Extension: Optional Semicolons - -Semicolons are optional after most statements and declarations: -- `return`, `break`, `continue`, `goto`, expression statements -- `do-while` trailing semicolon -- Variable declarations - -Semicolons are still **required** for: -- `for()` loop init/condition/increment sections (e.g., `for(i=0; ibsym = gjmp(*cur_scope->bsym); - if (tok == ';') next(); + skip(';'); } else if (t == TOK_CONTINUE) { /* compute jump */ @@ -7266,7 +7266,7 @@ again: tcc_error("cannot continue"); leave_scope(loop_scope); *cur_scope->csym = gjmp(*cur_scope->csym); - if (tok == ';') next(); + skip(';'); } else if (t == TOK_FOR) { new_scope(&o); @@ -7314,7 +7314,7 @@ again: gexpr(); c = gvtst(0, 0); skip(')'); - if (tok == ';') next(); + skip(';'); gsym_addr(c, d); gsym(a); prev_scope_s(&o); @@ -7426,7 +7426,7 @@ again: } else { expect("label identifier"); } - if (tok == ';') next(); + skip(';'); } else if (t == TOK_ASM1 || t == TOK_ASM2 || t == TOK_ASM3) { asm_instr(); @@ -7481,7 +7481,7 @@ again: gexpr(); vpop(); } - if (tok == ';') next(); + skip(';'); } } } @@ -8637,7 +8637,7 @@ static void do_Static_assert(void) skip(')'); if (c == 0) tcc_error("%s", msg); - if (tok == ';') next(); + skip(';'); } #ifdef TCC_TARGET_PE @@ -8904,10 +8904,7 @@ static int decl(int l) if (tok != ',') { if (l == VT_JMP) return has_init ? v : 1; - if (l == VT_CMP) - skip(';'); - else if (tok == ';') - next(); + skip(';'); break; } next(); diff --git a/tests/tests2/60_errors_and_warnings.expect b/tests/tests2/60_errors_and_warnings.expect index 0c60aab1..a90f4153 100644 --- a/tests/tests2/60_errors_and_warnings.expect +++ b/tests/tests2/60_errors_and_warnings.expect @@ -179,7 +179,7 @@ bar : 3 ; 3 60_errors_and_warnings.c:372: error: statement expression outside of function [test_invalid_tokckill] -60_errors_and_warnings.c:375: warning: function might return no value: 'f' +60_errors_and_warnings.c:375: error: ';' expected (got '3') [test_duplicate_member] 60_errors_and_warnings.c:381: error: duplicate member 'a'