X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=ast.c;h=5c7d6931323cf702f679016b8fae27b94e72e8bf;hp=89d738cd5d40cc060e9236f41f168275b7ae167a;hb=755ee5462fb3d59b181da79d7c7f7eeba32bda2c;hpb=3567abbd64d4cb5a0db5e434955c83a924635d6f diff --git a/ast.c b/ast.c index 89d738c..5c7d693 100644 --- a/ast.c +++ b/ast.c @@ -209,8 +209,11 @@ bool ast_compare_type(ast_expression *a, ast_expression *b) return false; if (vec_size(a->expression.params) != vec_size(b->expression.params)) return false; - if (a->expression.flags != b->expression.flags) + if ((a->expression.flags & AST_FLAG_TYPE_MASK) != + (b->expression.flags & AST_FLAG_TYPE_MASK) ) + { return false; + } if (vec_size(a->expression.params)) { size_t i; for (i = 0; i < vec_size(a->expression.params); ++i) { @@ -570,7 +573,8 @@ ast_member* ast_member_new(lex_ctx ctx, ast_expression *owner, unsigned int fiel self->expression.next = ast_shallow_type(ctx, TYPE_FLOAT); } - self->owner = owner; + self->rvalue = false; + self->owner = owner; ast_propagate_effects(self, owner); self->field = field; @@ -2082,14 +2086,17 @@ bool ast_member_codegen(ast_member *self, ast_function *func, bool lvalue, ir_va ir_value *vec; /* in QC this is always an lvalue */ - (void)lvalue; + if (lvalue && self->rvalue) { + compile_error(ast_ctx(self), "not an l-value (member access)"); + return false; + } if (self->expression.outl) { *out = self->expression.outl; return true; } cgen = self->owner->expression.codegen; - if (!(*cgen)((ast_expression*)(self->owner), func, true, &vec)) + if (!(*cgen)((ast_expression*)(self->owner), func, false, &vec)) return false; if (vec->vtype != TYPE_VECTOR &&