cproc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/cproc
Log | Files | Refs | Submodules | README | LICENSE

commit d889bc80be5a2389240a24b30873138a54991e10
parent 8589d9d364c07227f717868b8bdb18919d8f7530
Author: Michael Forney <mforney@mforney.org>
Date:   Fri, 27 Dec 2019 23:30:02 -0800

expr: Disallow function/incomplete types and bit-fields in sizeof/_Alignof

Diffstat:
Mexpr.c | 16+++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)

diff --git 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: