compiler: additional lvalue/rvalue context fixes
Fix lvalue/rvalue context mixup Set_and_use_temporary_expression's
do_get_backend() method. Enhance Mark_lvalue_varexprs to handle
conversions and temporary reference expressions, since occasionally
the front end emits code such as "deref(conv(tempref)) = ...".
Change-Id: I4a2b5b82d553d04a695ad8c8bac0a3a1f106b566
Reviewed-on: https://go-review.googlesource.com/45141
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/go/expressions.cc b/go/expressions.cc
index 5689c77..d6d27ee 100644
--- a/go/expressions.cc
+++ b/go/expressions.cc
@@ -962,7 +962,7 @@
Location loc = this->location();
Gogo* gogo = context->gogo();
Bvariable* bvar = this->statement_->get_backend_variable(context);
- Bexpression* lvar_ref = gogo->backend()->var_expression(bvar, VE_rvalue, loc);
+ Bexpression* lvar_ref = gogo->backend()->var_expression(bvar, VE_lvalue, loc);
Named_object* fn = context->function();
go_assert(fn != NULL);
@@ -970,7 +970,7 @@
Bexpression* bexpr = this->expr_->get_backend(context);
Bstatement* set = gogo->backend()->assignment_statement(bfn, lvar_ref,
bexpr, loc);
- Bexpression* var_ref = gogo->backend()->var_expression(bvar, VE_lvalue, loc);
+ Bexpression* var_ref = gogo->backend()->var_expression(bvar, VE_rvalue, loc);
Bexpression* ret = gogo->backend()->compound_expression(set, var_ref, loc);
return ret;
}
diff --git a/go/statements.cc b/go/statements.cc
index ae3873e..7a448d7 100644
--- a/go/statements.cc
+++ b/go/statements.cc
@@ -912,6 +912,21 @@
if (ue && ue->op() == OPERATOR_MULT)
return TRAVERSE_CONTINUE;
+ Type_conversion_expression* ce = e->conversion_expression();
+ if (ce)
+ return TRAVERSE_CONTINUE;
+
+ Temporary_reference_expression* tre =
+ e->temporary_reference_expression();
+ if (tre)
+ {
+ tre = new Temporary_reference_expression(tre->statement(),
+ tre->location());
+ *ppexpr = tre;
+ tre->set_is_lvalue();
+ return TRAVERSE_EXIT;
+ }
+
return TRAVERSE_EXIT;
}