Home
cc1: Fix sizeof expressions - scc - simple c99 compiler HTML git clone git://git.simple-cc.org/scc DIR Log DIR Files DIR Refs DIR Submodules DIR README DIR LICENSE --- DIR commit 4ed4dac59ff781ba4bd54db585c2384595e175dc DIR parent eb28f98e61cf995a7c1f9c85faf3431438018e03 HTML Author: Roberto E. Vargas Caballero <k0ga@shike2.com> Date: Tue, 8 Oct 2024 12:51:19 +0200 cc1: Fix sizeof expressions The commit c863f707 tried to fix expressions like: sizeof((int) 1) and changed the reduction in sizeexp() from unary to cast, but it had the side effect of allowing things like sizeof (int) 1 that is invalid, and having problems with things like sizeof "hello" - 1 The commit 4a0c2ccd tried to fix this last case reverting c863f707 that moved the code to the original point. The problem is that to avoid the ambiguity when a '(' follows a sizeof (because it can be a typename or an expression) then the rule chain unary -> SIZEOF unary -> SIZEOF postfix -> SIZEOF primary -> SIZEOF ( expr ) was collapsed to unary -> SIZEOF ( unary ) because when a ( happend after a SIZEOF token then the next token was looked to see if it was a typename or not to decide to apply the chain: unary -> SIZEOF ( typename ) And it can be seen the problem is that the collapsing was wrong because we should have SIZEOF ( expr ) instead of SIZEOF ( unary ), but still SIZEOF unary when no ( follows the SIZEOF token. Diffstat: M src/cmd/cc/cc1/expr.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) --- DIR diff --git a/src/cmd/cc/cc1/expr.c b/src/cmd/cc/cc1/expr.c @@ -843,7 +843,7 @@ typeof(Node *np) return tp; } -static Node *unary(void), *cast(void); +static Node *unary(void); static Type * sizeexp(void) @@ -859,7 +859,7 @@ sizeexp(void) tp = typename(); break; default: - tp = typeof(unary()); + tp = typeof(expr()); break; } expect(')'); @@ -903,6 +903,8 @@ postfix(Node *lp) } } +static Node *cast(void); + static Node * unary(void) {