History

No more ; needed

OpenCode[AI] committed 7 months ago

Commit 6547ea41 parent 898f4963 files · +28 −10Browse files

Unified · Split

3 files
  1. AGENTS.md +14 −0
  2. tccgen.c +13 −9
  3. tests/tests2/60_errors_and_warnings.expect +1 −1
AGENTS.md+14−0
@@ -38,3 +38,17 @@ · 37 unmodified lines
38- Some tests need special flags (see `FLAGS =` assignments in `tests/tests2/Makefile`).38- Some tests need special flags (see `FLAGS =` assignments in `tests/tests2/Makefile`).
39- Bound-check tests (`-b` flag) are skipped when `CONFIG_bcheck=no`.39- Bound-check tests (`-b` flag) are skipped when `CONFIG_bcheck=no`.
40- `.expect` files are generated with gcc by default; some use TCC (flagged with `GEN-TCC`).40- `.expect` files are generated with gcc by default; some use TCC (flagged with `GEN-TCC`).
41
42## Language Extension: Optional Semicolons
43
44Semicolons are optional after most statements and declarations:
45- `return`, `break`, `continue`, `goto`, expression statements
46- `do-while` trailing semicolon
47- Variable declarations
48
49Semicolons are still **required** for:
50- `for()` loop init/condition/increment sections (e.g., `for(i=0; i<n; i++)`)
51- Old-style function parameter declarations
52- Struct/enum member declarations
53
54The `skip(';')` function in `tccpp.c:100` errors if token doesn't match. Use `if (tok == ';') next();` instead to make semicolons optional.
tccgen.c+13−9
@@ -7205,7 +7205,7 @@ again: · 7204 unmodified lines
7205 label_push(&local_label_stack, tok, LABEL_DECLARED);7205 label_push(&local_label_stack, tok, LABEL_DECLARED);
7206 next();7206 next();
7207 } while (tok == ',');7207 } while (tok == ',');
7208 skip(';');7208 if (tok == ';') next();
7209 }7209 }
7210 7210
7211 while (tok != '}') {7211 while (tok != '}') {
@@ -7241,7 +7241,7 @@ again: · 29 unmodified lines
7241 leave_scope(root_scope);7241 leave_scope(root_scope);
7242 if (b)7242 if (b)
7243 gfunc_return(&func_vt);7243 gfunc_return(&func_vt);
7244 skip(';');7244 if (tok == ';') next();
7245 /* jump unless last stmt in top-level block */7245 /* jump unless last stmt in top-level block */
7246 if (tok != '}' || local_scope != 1)7246 if (tok != '}' || local_scope != 1)
7247 rsym = gjmp(rsym);7247 rsym = gjmp(rsym);
@@ -7258,7 +7258,7 @@ again: · 10 unmodified lines
7258 else7258 else
7259 leave_scope(loop_scope);7259 leave_scope(loop_scope);
7260 *cur_scope->bsym = gjmp(*cur_scope->bsym);7260 *cur_scope->bsym = gjmp(*cur_scope->bsym);
7261 skip(';');7261 if (tok == ';') next();
7262 7262
7263 } else if (t == TOK_CONTINUE) {7263 } else if (t == TOK_CONTINUE) {
7264 /* compute jump */7264 /* compute jump */
@@ -7266,7 +7266,7 @@ again: · 1 unmodified line
7266 tcc_error("cannot continue");7266 tcc_error("cannot continue");
7267 leave_scope(loop_scope);7267 leave_scope(loop_scope);
7268 *cur_scope->csym = gjmp(*cur_scope->csym);7268 *cur_scope->csym = gjmp(*cur_scope->csym);
7269 skip(';');7269 if (tok == ';') next();
7270 7270
7271 } else if (t == TOK_FOR) {7271 } else if (t == TOK_FOR) {
7272 new_scope(&o);7272 new_scope(&o);
@@ -7314,7 +7314,7 @@ again: · 41 unmodified lines
7314 gexpr();7314 gexpr();
7315 c = gvtst(0, 0);7315 c = gvtst(0, 0);
7316 skip(')');7316 skip(')');
7317 skip(';');7317 if (tok == ';') next();
7318 gsym_addr(c, d);7318 gsym_addr(c, d);
7319 gsym(a);7319 gsym(a);
7320 prev_scope_s(&o);7320 prev_scope_s(&o);
@@ -7426,7 +7426,7 @@ again: · 105 unmodified lines
7426 } else {7426 } else {
7427 expect("label identifier");7427 expect("label identifier");
7428 }7428 }
7429 skip(';');7429 if (tok == ';') next();
7430 7430
7431 } else if (t == TOK_ASM1 || t == TOK_ASM2 || t == TOK_ASM3) {7431 } else if (t == TOK_ASM1 || t == TOK_ASM2 || t == TOK_ASM3) {
7432 asm_instr();7432 asm_instr();
@@ -7481,7 +7481,7 @@ again: · 48 unmodified lines
7481 gexpr();7481 gexpr();
7482 vpop();7482 vpop();
7483 }7483 }
7484 skip(';');7484 if (tok == ';') next();
7485 }7485 }
7486 }7486 }
7487 }7487 }
@@ -8637,7 +8637,7 @@ static void do_Static_assert(void) · 1149 unmodified lines
8637 skip(')');8637 skip(')');
8638 if (c == 0)8638 if (c == 0)
8639 tcc_error("%s", msg);8639 tcc_error("%s", msg);
8640 skip(';');8640 if (tok == ';') next();
8641}8641}
8642 8642
8643#ifdef TCC_TARGET_PE8643#ifdef TCC_TARGET_PE
@@ -8718,6 +8718,10 @@ static int decl(int l) · 74 unmodified lines
8718 return 1;8718 return 1;
8719 next();8719 next();
8720 continue;8720 continue;
8721 } else if (l != VT_JMP && l != VT_CMP) {
8722 /* no semicolon - let caller handle it */
8723 } else {
8724 expect(";");
8721 }8725 }
8722 8726
8723 while (1) { /* iterate thru each declaration */8727 while (1) { /* iterate thru each declaration */
@@ -8904,7 +8908,7 @@ static int decl(int l) · 180 unmodified lines
8904 if (tok != ',') {8908 if (tok != ',') {
8905 if (l == VT_JMP)8909 if (l == VT_JMP)
8906 return has_init ? v : 1;8910 return has_init ? v : 1;
8907 skip(';');8911 if (tok == ';') next();
8908 break;8912 break;
8909 }8913 }
8910 next();8914 next();
tests/tests2/60_errors_and_warnings.expect+1−1
@@ -179,7 +179,7 @@ bar : 3 ; 3 · 178 unmodified lines
17960_errors_and_warnings.c:372: error: statement expression outside of function17960_errors_and_warnings.c:372: error: statement expression outside of function
180 180
181[test_invalid_tokckill]181[test_invalid_tokckill]
18260_errors_and_warnings.c:375: error: ';' expected (got '3')18260_errors_and_warnings.c:375: warning: function might return no value: 'f'
183 183
184[test_duplicate_member]184[test_duplicate_member]
18560_errors_and_warnings.c:381: error: duplicate member 'a'18560_errors_and_warnings.c:381: error: duplicate member 'a'

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t