diff options
Diffstat (limited to 'awkgram.y')
-rw-r--r-- | awkgram.y | 27 |
1 files changed, 14 insertions, 13 deletions
@@ -650,7 +650,7 @@ statement $$ = list_prepend(ip, $1); bcfree($4); } /* else - $1 and $4 are NULLs */ + $1 and $4 are NULLs */ } | LEX_FOR '(' NAME LEX_IN simple_variable r_paren opt_nls statement { @@ -852,7 +852,7 @@ non_compound_stmt (void) list_prepend($$, instruction(Op_push_i)); $$->nexti->memory = dupnode(Nnull_string); } else { - if (do_optimize > 1 + if (do_optimize && $3->lasti->opcode == Op_func_call && strcmp($3->lasti->func_name, in_function) == 0 ) { @@ -1356,7 +1356,7 @@ common_exp */ } - if (do_optimize > 1 + if (do_optimize && $1->nexti == $1->lasti && $1->nexti->opcode == Op_push_i && $2->nexti == $2->lasti && $2->nexti->opcode == Op_push_i ) { @@ -1494,7 +1494,7 @@ non_post_simp_exp $$ = list_append(list_append(list_create($1), instruction(Op_field_spec)), $2); } else { - if (do_optimize > 1 && $2->nexti == $2->lasti + if (do_optimize && $2->nexti == $2->lasti && $2->nexti->opcode == Op_push_i && ($2->nexti->memory->flags & (MPFN|MPZN)) == 0 ) { @@ -4157,7 +4157,7 @@ mk_function(INSTRUCTION *fi, INSTRUCTION *def) thisfunc = fi->func_body; assert(thisfunc != NULL); - if (do_optimize > 1 && def->lasti->opcode == Op_pop) { + if (do_optimize && def->lasti->opcode == Op_pop) { /* tail call which does not return any value. */ INSTRUCTION *t; @@ -4685,7 +4685,7 @@ mk_binary(INSTRUCTION *s1, INSTRUCTION *s2, INSTRUCTION *op) if (s2->lasti == ip2 && ip2->opcode == Op_push_i) { /* do any numeric constant folding */ ip1 = s1->nexti; - if (do_optimize > 1 + if (do_optimize && ip1 == s1->lasti && ip1->opcode == Op_push_i && (ip1->memory->flags & (MPFN|MPZN|STRCUR|STRING)) == 0 && (ip2->memory->flags & (MPFN|MPZN|STRCUR|STRING)) == 0 @@ -5028,8 +5028,13 @@ mk_assignment(INSTRUCTION *lhs, INSTRUCTION *rhs, INSTRUCTION *op) case Op_push_array: tp->opcode = Op_push_lhs; break; + case Op_field_assign: + yyerror(_("cannot assign a value to the result of a field post-increment expression")); + break; default: - cant_happen(); + yyerror(_("invalid target of assignment (opcode %s)"), + opcode2str(tp->opcode)); + break; } tp->do_reference = (op->opcode != Op_assign); /* check for uninitialized reference */ @@ -5099,10 +5104,8 @@ optimize_assignment(INSTRUCTION *exp) i2 = NULL; i1 = exp->lasti; - if ( ! do_optimize - || ( i1->opcode != Op_assign - && i1->opcode != Op_field_assign) - ) + if ( i1->opcode != Op_assign + && i1->opcode != Op_field_assign) return list_append(exp, instruction(Op_pop)); for (i2 = exp->nexti; i2 != i1; i2 = i2->nexti) { @@ -5392,10 +5395,8 @@ add_lint(INSTRUCTION *list, LINTTYPE linttype) ; if (do_lint) { /* compile-time warning */ -#ifndef NO_LINT if (isnoeffect(ip->opcode)) lintwarn_ln(ip->source_line, ("statement may have no effect")); -#endif } if (ip->opcode == Op_push) { /* run-time warning */ |