diff options
| author | 2023-06-04 10:26:48 +0200 | |
|---|---|---|
| committer | 2023-06-04 10:26:48 +0200 | |
| commit | 2075cfc9b395b413de1a540f6262e7b994907bee (patch) | |
| tree | 2ee5114e0a5b288d40ac40e9d06f0e86157fd18f | |
| parent | bd390afdf4eabfe13c1dd18bde23f4246ad73514 (diff) | |
fix associativity of assignment expressions
| -rw-r--r-- | parse.c | 3 | ||||
| -rw-r--r-- | test.c | 5 |
2 files changed, 5 insertions, 3 deletions
@@ -896,10 +896,11 @@ Postfix: lex(pr, &tk); ek = bintab[tk.t].t; if (ek != ECOND) { + bool leftassoc = (bintab[tk.t].k & BCSET) == 0; /* only the assignment operators are right-associative */ /* ex OP rhs */ span.sl = tk.span.sl; span.ex = ex.span.ex; - rhs = exprparse(pr, opprec + 1); + rhs = exprparse(pr, opprec + leftassoc); if (!joinspan(&span.ex, tk.span.ex) || !joinspan(&span.ex, rhs.span.ex)) span.ex = tk.span.ex; ty = bintypecheck(&span, tk.t, &ex, &rhs); @@ -56,9 +56,10 @@ struct f2 f2test(struct f2 *r) { return *r; } -void memset(volatile char *p, int c, unsigned long n) +void fill(char *p, int c, unsigned long n) { - if (n) do *p++ = c; while (--n); + int t; + if (n) do t = *p++ = c; while (--n); } |