From d889bc80be5a2389240a24b30873138a54991e10 Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Fri, 27 Dec 2019 23:30:02 -0800 Subject: expr: Disallow function/incomplete types and bit-fields in sizeof/_Alignof --- expr.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/expr.c b/expr.c index 171c239..98f6246 100644 --- a/expr.c +++ b/expr.c @@ -842,18 +842,24 @@ unaryexpr(struct scope *s) expect(TRPAREN, "after expression"); if (op == TSIZEOF) e = postfixexpr(s, e); - if (e->decayed) - e = e->base; - t = e->type; } } else if (op == TSIZEOF) { + t = NULL; e = unaryexpr(s); + } else { + error(&tok.loc, "expected ')' after '_Alignof'"); + } + if (!t) { if (e->decayed) e = e->base; + if (e->kind == EXPRBITFIELD) + error(&tok.loc, "%s operator applied to bitfield expression", tokstr[op]); t = e->type; - } else { - error(&tok.loc, "expected ')' after '_Alignof'"); } + if (t->incomplete) + error(&tok.loc, "%s operator applied to incomplete type", tokstr[op]); + if (t->kind == TYPEFUNC) + error(&tok.loc, "%s operator applied to function type", tokstr[op]); e = mkconstexpr(&typeulong, op == TSIZEOF ? t->size : t->align); break; default: -- cgit v1.2.3