This patch from Than McIntosh fixes a missing case in Array_type::get_value_pointer in the Go frontend. It updates the code in Array_type::get_value_pointer that handles "lvalue" context to look for both regular var expressions and temp var expressions, since both can appear in array/slice index expressions on the left hand side of assignments. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 249477) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -a4b455aa584e0d6e362a88597f11bba1427088e2 +0b93af68feb0a4135e83dd9e6c11df1563d862a9 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: gcc/go/gofrontend/types.cc =================================================================== --- gcc/go/gofrontend/types.cc (revision 249208) +++ gcc/go/gofrontend/types.cc (working copy) @@ -7635,12 +7635,19 @@ Array_type::get_value_pointer(Gogo*, Exp { Temporary_reference_expression* tref = array->temporary_reference_expression(); + Var_expression* ve = array->var_expression(); if (tref != NULL) { tref = tref->copy()->temporary_reference_expression(); tref->set_is_lvalue(); array = tref; } + else if (ve != NULL) + { + ve = new Var_expression(ve->named_object(), ve->location()); + ve->set_in_lvalue_pos(); + array = ve; + } } return Expression::make_slice_info(array,