diff options
| author | 2026-10-14 16:08:50 +0330 | |
|---|---|---|
| committer | 2026-10-14 16:08:50 +0330 | |
| commit | 0b7a396cc5375afdeea1716126f8dd1a0efea870 (patch) | |
| tree | 495135b43eab0e683910f996ee379bf3b868f716 /src/compiler/expr.zc | |
| parent | closures: allow 24 parameters, like functions (was 19) (diff) | |
unary: u*x, m*x, d*x are not recasts when the tag names a global variable either
Diffstat (limited to 'src/compiler/expr.zc')
| -rw-r--r-- | src/compiler/expr.zc | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/compiler/expr.zc b/src/compiler/expr.zc index c8cb11a..ffb90a7 100644 --- a/src/compiler/expr.zc +++ b/src/compiler/expr.zc @@ -1507,12 +1507,17 @@ int postfix_tail(int c) { } return c; } +// a global variable or array named u, m or d: then u*x is a multiplication (spec 1.6.3) +int tag_is_global(int n) { + int s = lookup(n); + return s >= 0 && (skind[s] == K_GVAR || skind[s] == K_GARR); +} // prefix operators: the u*x / d*x / m*x recasts (the star has to touch the // tag), casts like (int)x and (node*)x, dereference, address-of, prefix ++ and // --, and any unary operator a program added (- ! ~ built in). int unary() { int c, un, t, place, constant, value; word storage, dependency; - if (tk == T_ID && (tv == s_u || tv == s_m || tv == s_d) && findloc(tv) < 0) { // u*x, d*x, m*x: recast only when * is glued and the tag is not a local's name + if (tk == T_ID && (tv == s_u || tv == s_m || tv == s_d) && findloc(tv) < 0 && !tag_is_global(tv)) { // u*x, d*x, m*x: recast only when * is glued and the tag is not a local's name peek(); if (pk_tk == T_OP && pk_tv == s_star && pq_gl[0]) { t = S_M; if (tv == s_u) t = S_U; if (tv == s_d) t = S_D; |
