From 353b1f945f70845eef4c042f8e10f7489c1fcaab Mon Sep 17 00:00:00 2001 From: "Wolfgang (Blub) Bumiller" Date: Sun, 25 Nov 2012 19:37:31 +0100 Subject: [PATCH] assignment to constant error --- parser.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/parser.c b/parser.c index 3bc4884..3883631 100644 --- a/parser.c +++ b/parser.c @@ -940,6 +940,9 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy) parseerror(parser, "invalid types in assignment: cannot assign %s to %s", ty2, ty1); } } + if (ast_istype(exprs[0], ast_value) && asvalue[0]->constant) { + parseerror(parser, "assignment to constant `%s`", asvalue[0]->name); + } out = (ast_expression*)ast_store_new(ctx, assignop, exprs[0], exprs[1]); break; case opid3('+','+','P'): @@ -954,6 +957,9 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy) addop = INSTR_ADD_F; else addop = INSTR_SUB_F; + if (ast_istype(exprs[0], ast_value) && asvalue[0]->constant) { + parseerror(parser, "assignment to constant `%s`", asvalue[0]->name); + } if (ast_istype(exprs[0], ast_entfield)) { out = (ast_expression*)ast_binstore_new(ctx, INSTR_STOREP_F, addop, exprs[0], @@ -979,6 +985,9 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy) addop = INSTR_SUB_F; subop = INSTR_ADD_F; } + if (ast_istype(exprs[0], ast_value) && asvalue[0]->constant) { + parseerror(parser, "assignment to constant `%s`", asvalue[0]->name); + } if (ast_istype(exprs[0], ast_entfield)) { out = (ast_expression*)ast_binstore_new(ctx, INSTR_STOREP_F, addop, exprs[0], @@ -1005,6 +1014,9 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy) ty1, ty2); return false; } + if (ast_istype(exprs[0], ast_value) && asvalue[0]->constant) { + parseerror(parser, "assignment to constant `%s`", asvalue[0]->name); + } if (ast_istype(exprs[0], ast_entfield)) assignop = type_storep_instr[exprs[0]->expression.vtype]; else @@ -1039,6 +1051,9 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy) ty1, ty2); return false; } + if (ast_istype(exprs[0], ast_value) && asvalue[0]->constant) { + parseerror(parser, "assignment to constant `%s`", asvalue[0]->name); + } if (ast_istype(exprs[0], ast_entfield)) assignop = type_storep_instr[exprs[0]->expression.vtype]; else @@ -1080,6 +1095,9 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy) ty1, ty2); return false; } + if (ast_istype(exprs[0], ast_value) && asvalue[0]->constant) { + parseerror(parser, "assignment to constant `%s`", asvalue[0]->name); + } if (ast_istype(exprs[0], ast_entfield)) assignop = type_storep_instr[exprs[0]->expression.vtype]; else @@ -1107,6 +1125,9 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy) out = (ast_expression*)ast_binary_new(ctx, INSTR_BITAND, exprs[0], exprs[1]); if (!out) return false; + if (ast_istype(exprs[0], ast_value) && asvalue[0]->constant) { + parseerror(parser, "assignment to constant `%s`", asvalue[0]->name); + } out = (ast_expression*)ast_binstore_new(ctx, assignop, INSTR_SUB_F, exprs[0], out); break; } -- 2.39.2