diff options
| author | Michael Forney <mforney@mforney.org> | 2019-04-03 23:22:51 -0700 | 
|---|---|---|
| committer | Michael Forney <mforney@mforney.org> | 2019-04-03 23:22:51 -0700 | 
| commit | 2d036a019aa2879b092a17b740de3009d7352f74 (patch) | |
| tree | ab89f5a3af54a635d132099ebf663b157f408bce | |
| parent | 385d7b257acf087e02114c619beee07f2b49cb41 (diff) | |
| download | cproc-2d036a019aa2879b092a17b740de3009d7352f74.tar.xz | |
Error on bit-field access for now
| -rw-r--r-- | expr.c | 11 | ||||
| -rw-r--r-- | type.c | 12 | ||||
| -rw-r--r-- | type.h | 2 | 
3 files changed, 14 insertions, 11 deletions
@@ -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; @@ -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;  			}  		}  	} @@ -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 *);  | 
