aboutsummaryrefslogtreecommitdiff
path: root/gcc/go/gofrontend/statements.cc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2017-06-09 04:35:57 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2017-06-09 04:35:57 +0000
commit1ee77fbdea58944b047de8ff88901aea4e93ed7d (patch)
treefde3276ecdbc4adc9069be75cd0ed4b3fbe684f7 /gcc/go/gofrontend/statements.cc
parent120ef1d50ab7fe53a67fb2026374b2bdd67838bd (diff)
downloadgcc-1ee77fbdea58944b047de8ff88901aea4e93ed7d.zip
gcc-1ee77fbdea58944b047de8ff88901aea4e93ed7d.tar.gz
gcc-1ee77fbdea58944b047de8ff88901aea4e93ed7d.tar.bz2
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)) = ...". Reviewed-on: https://go-review.googlesource.com/45141 From-SVN: r249047
Diffstat (limited to 'gcc/go/gofrontend/statements.cc')
-rw-r--r--gcc/go/gofrontend/statements.cc15
1 files changed, 15 insertions, 0 deletions
diff --git a/gcc/go/gofrontend/statements.cc b/gcc/go/gofrontend/statements.cc
index ae3873e..7a448d7 100644
--- a/gcc/go/gofrontend/statements.cc
+++ b/gcc/go/gofrontend/statements.cc
@@ -912,6 +912,21 @@ int Mark_lvalue_varexprs::expression(Expression** ppexpr)
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;
}