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 44c0cbd2080fce59bffe8b91f4ec44512710f2c5
parent a0c8910f8f834b833ce2b8a38915b7857875c942
Author: Michael Forney <mforney@mforney.org>
Date:   Sun, 14 Apr 2019 00:19:03 -0700

decl: Make signedness of enum types match gcc

Diffstat:
Mdecl.c | 13++++++++++---
Mtests/compatible-enum-types.c | 7++++---
Mtests/compatible-enum-types.qbe | 1+
3 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/decl.c b/decl.c @@ -154,6 +154,7 @@ tagspec(struct scope *s) char *tag; enum typekind kind; struct decl *d; + struct expr *e; struct structbuilder b; uint64_t i; @@ -182,7 +183,7 @@ tagspec(struct scope *s) } else { t = mktype(kind); if (kind == TYPEBASIC) { - *t = typeint; + *t = typeuint; t->basic.kind = BASICENUM; } else { t->repr = &i64; // XXX @@ -217,8 +218,14 @@ tagspec(struct scope *s) d = mkdecl(DECLCONST, &typeint, QUALNONE, LINKNONE); scopeputdecl(s, tok.lit, d); next(); - if (consume(TASSIGN)) - i = intconstexpr(s, true); + if (consume(TASSIGN)) { + e = constexpr(s); + if (e->kind != EXPRCONST || !(typeprop(e->type) & PROPINT)) + error(&tok.loc, "expected integer constant expression"); + if (e->type->basic.issigned && e->constant.i >= 1ull << 63) + t->basic.issigned = true; + i = e->constant.i; + } d->value = mkintconst(t->repr, i); if (!consume(TCOMMA)) break; diff --git a/tests/compatible-enum-types.c b/tests/compatible-enum-types.c @@ -1,3 +1,4 @@ -enum E {A = -1, B}; -enum E x; -int x; +enum {A = 1} x; +unsigned x; +enum {B = -1} y; +int y; diff --git a/tests/compatible-enum-types.qbe b/tests/compatible-enum-types.qbe @@ -1 +1,2 @@ export data $x = align 4 { z 4 } +export data $y = align 4 { z 4 }