From 0856091ac4f17ca9c89a2cb9bd17c54998676abf Mon Sep 17 00:00:00 2001 From: lemon Date: Sun, 19 Apr 2026 08:56:51 +0200 Subject: c: error for statement expression outside function --- src/c.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/c.c b/src/c.c index a87c748..03d74c2 100644 --- a/src/c.c +++ b/src/c.c @@ -1005,14 +1005,12 @@ tkprec(int tt) static Expr initializer(CComp *, Type *ty, enum evalmode ev, bool globl, enum qualifier qual, internstr name); - static void block(CComp *, Ref *stmtexprval, Type *stmtexprty); static internstr istr__func__, istr_main, istr_memset; static internstr mkhiddensym(const char *fnname, const char *name, int id); - /* parse an expression with the given operator precedence */ /* param ident is a kludge to support block labels without backtracking or extra lookahead * see stmt() */ @@ -1070,8 +1068,21 @@ Unary: Span span = tk.span; Ref val; ex.t = EIRVALUE; - block(cm, &val, &ex.ty); - ex.irref.bits = val.bits; + if (!cm->fn) { + error(&span, "statement expression not allowed outside function"); + int bal = 1; + do { + switch (lex(cm, &tk)) { + case '}': --bal; break; + case '{': ++bal; break; + case TKEOF: bal = 0; break; + } + } while (bal != 0); + ex.ty = mktype(TYINT); + } else { + block(cm, &val, &ex.ty); + ex.irref.bits = val.bits; + } if (expect(cm, ')', NULL)) joinspan(&span.ex, tk.span.ex); ex.span = span; } else if (!isdecltok(cm)) { /* (expr) */ -- cgit v1.2.3