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 2d036a019aa2879b092a17b740de3009d7352f74
parent 385d7b257acf087e02114c619beee07f2b49cb41
Author: Michael Forney <mforney@mforney.org>
Date:   Wed,  3 Apr 2019 23:22:51 -0700

Error on bit-field access for now

Diffstat:
Mexpr.c | 11+++++++----
Mtype.c | 12++++++------
Mtype.h | 2+-
3 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/expr.c b/expr.c @@ -481,9 +481,10 @@ postfixexpr(struct scope *s, struct expr *r) { struct expr *e, *arr, *idx, *tmp, **end; struct type *t; - enum typequal tq; struct param *p; + struct member *m; uint64_t offset; + enum typequal tq; enum tokenkind op; bool lvalue; @@ -569,11 +570,13 @@ postfixexpr(struct scope *s, struct expr *r) lvalue = op == TARROW || r->unary.base->flags & EXPRFLAG_LVAL; r = exprconvert(r, mkpointertype(&typechar)); offset = 0; - t = typemember(t, tok.lit, &offset); - if (!t) + m = typemember(t, tok.lit, &offset); + if (!m) error(&tok.loc, "struct/union has no member named '%s'", tok.lit); + if (m->bits.before || m->bits.after) + error(&tok.loc, "bit-field access is not yet supported"); r = mkbinaryexpr(&tok.loc, TADD, r, mkconstexpr(&typeulong, offset)); - r = exprconvert(r, mkpointertype(mkqualifiedtype(t, tq))); + r = exprconvert(r, mkpointertype(mkqualifiedtype(m->type, tq))); e = mkunaryexpr(TMUL, r); if (!lvalue) e->flags &= ~EXPRFLAG_LVAL; diff --git a/type.c b/type.c @@ -296,23 +296,23 @@ typecommonreal(struct type *t1, struct type *t2) fatal("internal error; could not find common real type"); } -struct type * +struct member * typemember(struct type *t, const char *name, uint64_t *offset) { - struct member *m; + struct member *m, *sub; assert(t->kind == TYPESTRUCT || t->kind == TYPEUNION); for (m = t->structunion.members; m; m = m->next) { if (m->name) { if (strcmp(m->name, name) == 0) { *offset += m->offset; - return m->type; + return m; } } else { - t = typemember(m->type, name, offset); - if (t) { + sub = typemember(m->type, name, offset); + if (sub) { *offset += m->offset; - return t; + return sub; } } } diff --git a/type.h b/type.h @@ -110,7 +110,7 @@ struct type *typecommonreal(struct type *, struct type *); struct type *typeargpromote(struct type *); struct type *typeintpromote(struct type *); enum typeprop typeprop(struct type *); -struct type *typemember(struct type *, const char *, uint64_t *); +struct member *typemember(struct type *, const char *, uint64_t *); struct param *mkparam(char *, struct type *);