gollvm: remove lhs/rhs context from Backend::var_expression()

Remove the LHS/RHS context flag from the Backend::var_expression()
method. This info is computed locally as part of the materialization
phase, and doesn't need to be generated in the front end. See related
gofrontend change https://go-review.googlesource.com/c/gofrontend/+/77510.

Change-Id: Ie091d4a08d4f7710af19a05fa4b6796978727c77
Reviewed-on: https://go-review.googlesource.com/77511
Reviewed-by: Cherry Zhang <cherryyz@google.com>
diff --git a/llvm-gofrontend/go-llvm-bexpression.h b/llvm-gofrontend/go-llvm-bexpression.h
index ad6e1e5..4c430c1 100644
--- a/llvm-gofrontend/go-llvm-bexpression.h
+++ b/llvm-gofrontend/go-llvm-bexpression.h
@@ -106,6 +106,12 @@
   bool pending_;
 };
 
+// Whether a variable expression appears in lvalue (assignment) context.
+enum Varexpr_context {
+  VE_rvalue,
+  VE_lvalue
+};
+
 // Bexpression is the backend representation of an expression, meaning
 // that it produces a value (llvm::Value) and will encapsulate some
 // set of instructions (llvm::Instruction) needed to produce that
diff --git a/llvm-gofrontend/go-llvm-materialize.cpp b/llvm-gofrontend/go-llvm-materialize.cpp
index 8152e39..6a093ff 100644
--- a/llvm-gofrontend/go-llvm-materialize.cpp
+++ b/llvm-gofrontend/go-llvm-materialize.cpp
@@ -443,7 +443,7 @@
         // nil_pointer_expression, which is untyped/polymorphic).
         // Assume that the type checking in the call to
         // assignment_statement will catch any problems.
-        Bexpression *varExpr = var_expression(tempv, VE_lvalue, location);
+        Bexpression *varExpr = var_expression(tempv, location);
         elseStmt = assignment_statement(function, varExpr, else_expr, location);
       }
     }
@@ -455,7 +455,7 @@
                                     thenBlock, elseBlock, location);
 
   Bexpression *rval = (tempv ?
-                       var_expression(tempv, VE_rvalue, location) :
+                       var_expression(tempv, location) :
                        nbuilder_.mkVoidValue(void_type()));
   Bexpression *result =
       materialize(compound_expression(ifStmt, rval, location));
diff --git a/llvm-gofrontend/go-llvm.cpp b/llvm-gofrontend/go-llvm.cpp
index c31c74f..f8e9099 100644
--- a/llvm-gofrontend/go-llvm.cpp
+++ b/llvm-gofrontend/go-llvm.cpp
@@ -900,7 +900,6 @@
 // An expression that references a variable.
 
 Bexpression *Llvm_backend::var_expression(Bvariable *var,
-                                          Varexpr_context in_lvalue_pos,
                                           Location location)
 {
   if (var == errorVariable_.get())
@@ -1700,7 +1699,7 @@
     } else if (structVal->isConstant()) {
       llvm::Constant *cval = llvm::cast<llvm::Constant>(structVal->value());
       Bvariable *cv = genVarForConstant(cval, structVal->btype());
-      structVal = var_expression(cv, VE_rvalue, location);
+      structVal = var_expression(cv, location);
       structVal = materialize(address_expression(structVal, location));
     }
     toret = structVal;
diff --git a/llvm-gofrontend/go-llvm.h b/llvm-gofrontend/go-llvm.h
index 33ee6f2..14798c5 100644
--- a/llvm-gofrontend/go-llvm.h
+++ b/llvm-gofrontend/go-llvm.h
@@ -144,8 +144,7 @@
 
   Bexpression *nil_pointer_expression();
 
-  Bexpression *var_expression(Bvariable *var, Varexpr_context in_lvalue_pos,
-                              Location);
+  Bexpression *var_expression(Bvariable *var, Location);
 
   Bexpression *indirect_expression(Btype *, Bexpression *expr, bool known_valid,
                                    Location);
diff --git a/unittests/BackendCore/BackendArrayStruct.cpp b/unittests/BackendCore/BackendArrayStruct.cpp
index d2c4ad1..42b043c 100644
--- a/unittests/BackendCore/BackendArrayStruct.cpp
+++ b/unittests/BackendCore/BackendArrayStruct.cpp
@@ -38,30 +38,30 @@
 
   // var loc2 *X = &loc1
   Btype *ps2t = be->pointer_type(s2t);
-  Bexpression *bl1vex = be->var_expression(loc1, VE_rvalue, loc);
+  Bexpression *bl1vex = be->var_expression(loc1, loc);
   Bexpression *adl1 = be->address_expression(bl1vex, loc);
   Bvariable *loc2 = h.mkLocal("loc2", ps2t, adl1);
 
   // var x int32
   // x = loc1.f2
   Bvariable *x = h.mkLocal("x", bi32t);
-  Bexpression *vex = be->var_expression(x, VE_lvalue, loc);
-  Bexpression *sex = be->var_expression(loc1, VE_rvalue, loc);
+  Bexpression *vex = be->var_expression(x, loc);
+  Bexpression *sex = be->var_expression(loc1, loc);
   Bexpression *fex = be->struct_field_expression(sex, 1, loc);
   h.mkAssign(vex, fex);
 
   // var b2 bool
   // loc1.b = &b2
   Bvariable *b2 = h.mkLocal("b2", bt);
-  Bexpression *lvex = be->var_expression(loc1, VE_lvalue, loc);
+  Bexpression *lvex = be->var_expression(loc1, loc);
   Bexpression *bfex = be->struct_field_expression(lvex, 0, loc);
-  Bexpression *b2ex = be->var_expression(b2, VE_rvalue, loc);
+  Bexpression *b2ex = be->var_expression(b2, loc);
   Bexpression *adb2 = be->address_expression(b2ex, loc);
   h.mkAssign(bfex, adb2);
 
   // var b2 bool
   // loc2.f2 = 2 (equivalent to (*loc2).f2 = 2)
-  Bexpression *lvexi = be->var_expression(loc2, VE_lvalue, loc);
+  Bexpression *lvexi = be->var_expression(loc2, loc);
   bool knValid = false;
   Bexpression *lindx = be->indirect_expression(s2t, lvexi, knValid, loc);
   Bexpression *bfex2 = be->struct_field_expression(lindx, 1, loc);
@@ -116,8 +116,8 @@
   Bvariable *y = h.mkLocal("y", bi32t);
   std::vector<Bexpression *> vals1;
   vals1.push_back(be->zero_expression(pbt));
-  vals1.push_back(be->var_expression(y, VE_rvalue, loc));
-  Bexpression *vex1 = be->var_expression(x, VE_lvalue, loc);
+  vals1.push_back(be->var_expression(y, loc));
+  Bexpression *vex1 = be->var_expression(x, loc);
   Bexpression *sex1 = be->constructor_expression(s2t, vals1, loc);
   Bexpression *fex1 = be->struct_field_expression(sex1, 1, loc);
   h.mkAssign(vex1, fex1);
@@ -129,7 +129,7 @@
   std::vector<Bexpression *> vals2;
   vals2.push_back(be->zero_expression(pbt));
   vals2.push_back(mkInt32Const(be, int32_t(42)));
-  Bexpression *vex2 = be->var_expression(z, VE_lvalue, loc);
+  Bexpression *vex2 = be->var_expression(z, loc);
   Bexpression *sex2 = be->constructor_expression(s2t, vals2, loc);
   Bexpression *fex2 = be->struct_field_expression(sex2, 1, loc);
   h.mkAssign(vex2, fex2);
@@ -184,12 +184,12 @@
   Bvariable *y = h.mkLocal("y", bi64t);
   std::vector<unsigned long> indexes = { 0, 1, 2, 3 };
   std::vector<Bexpression *> vals1;
-  vals1.push_back(be->var_expression(y, VE_rvalue, loc));
+  vals1.push_back(be->var_expression(y, loc));
   vals1.push_back(mkInt64Const(be, 3));
   vals1.push_back(mkInt64Const(be, 2));
   vals1.push_back(mkInt64Const(be, 1));
   Bexpression *aex1 = be->array_constructor_expression(at4, indexes, vals1, loc);
-  Bexpression *vex1 = be->var_expression(x, VE_lvalue, loc);
+  Bexpression *vex1 = be->var_expression(x, loc);
   Bexpression *bi32one = mkInt32Const(be, 1);
   Bexpression *eex1 = be->array_index_expression(aex1, bi32one, loc);
   h.mkAssign(vex1, eex1);
@@ -202,7 +202,7 @@
   for (int64_t v : {4, 3, 2, 1})
     vals2.push_back(mkInt64Const(be, v));
   Bexpression *aex2 = be->array_constructor_expression(at4, indexes, vals2, loc);
-  Bexpression *vex2 = be->var_expression(z, VE_lvalue, loc);
+  Bexpression *vex2 = be->var_expression(z, loc);
   Bexpression *eex2 = be->array_index_expression(aex2, bi32one, loc);
   h.mkAssign(vex2, eex2);
 
@@ -214,8 +214,8 @@
   for (int64_t v : {4, 3, 2, 1})
     vals3.push_back(mkInt64Const(be, v));
   Bexpression *aex3 = be->array_constructor_expression(at4, indexes, vals3, loc);
-  Bexpression *vex3 = be->var_expression(w, VE_lvalue, loc);
-  Bexpression *iex3 = be->var_expression(x, VE_rvalue, loc);
+  Bexpression *vex3 = be->var_expression(w, loc);
+  Bexpression *iex3 = be->var_expression(x, loc);
   Bexpression *eex3 = be->array_index_expression(aex3, iex3, loc);
   h.mkAssign(vex3, eex3);
 
@@ -288,7 +288,7 @@
   Bvariable *z = h.mkLocal("z", bi64t);
   std::vector<unsigned long> indexes3 = { 1 };
   std::vector<Bexpression *> vals3;
-  vals3.push_back(be->var_expression(z, VE_rvalue, loc));
+  vals3.push_back(be->var_expression(z, loc));
   Bexpression *arcon3 =
       be->array_constructor_expression(at4, indexes3, vals3, loc);
   h.mkLocal("ac", at4, arcon3);
@@ -346,9 +346,9 @@
 
   // var loc2 X = { &param1, loc1.f2 }
   Bvariable *p1 = func->getNthParamVar(0);
-  Bexpression *ve1 = be->var_expression(p1, VE_rvalue, loc);
+  Bexpression *ve1 = be->var_expression(p1, loc);
   Bexpression *adp = be->address_expression(ve1, loc);
-  Bexpression *ve2 = be->var_expression(loc1, VE_rvalue, loc);
+  Bexpression *ve2 = be->var_expression(loc1, loc);
   Bexpression *fex = be->struct_field_expression(ve2, 1, loc);
   std::vector<Bexpression *> vals2;
   vals2.push_back(adp);
@@ -398,7 +398,7 @@
   // var l1 Y = Y{ X{nil, 3}, 3.0}
   std::vector<Bexpression *> vals1;
   Bvariable *p1 = func->getNthParamVar(0);
-  Bexpression *ve1 = be->var_expression(p1, VE_rvalue, loc);
+  Bexpression *ve1 = be->var_expression(p1, loc);
   Bexpression *adp = be->address_expression(ve1, loc);
   vals1.push_back(adp);
   vals1.push_back(mkInt32Const(be, int32_t(3)));
@@ -411,7 +411,7 @@
   Bexpression *scon2 =
       be->constructor_expression(syt, vals2, loc);
   Bvariable *loc1 = h.mkLocal("loc1", syt);
-  Bexpression *vex = be->var_expression(loc1, VE_lvalue, loc);
+  Bexpression *vex = be->var_expression(loc1, loc);
   h.mkAssign(vex, scon2);
 
   const char *exp = R"RAW_RESULT(
@@ -455,10 +455,10 @@
   // *p0 = { p1, 101 }
   Bvariable *p0 = func->getNthParamVar(0);
   Bvariable *p1 = func->getNthParamVar(1);
-  Bexpression *ve = be->var_expression(p0, VE_lvalue, loc);
+  Bexpression *ve = be->var_expression(p0, loc);
   Bexpression *dex = be->indirect_expression(s2t, ve, false, loc);
   std::vector<Bexpression *> vals;
-  vals.push_back(be->var_expression(p1, VE_rvalue, loc));
+  vals.push_back(be->var_expression(p1, loc));
   vals.push_back(mkInt32Const(be, int32_t(101)));
   Bexpression *scon =
       be->constructor_expression(s2t, vals, loc);
@@ -499,19 +499,19 @@
                                      false, /* is_hidden */
                                      false, /* unique_section */
                                      loc);
-  Bexpression *xvex = be->var_expression(x, VE_rvalue, loc);
+  Bexpression *xvex = be->var_expression(x, loc);
   std::vector<Bexpression *> vals1 = {xvex};
   Bexpression *scon1 = be->constructor_expression(s1t, vals1, loc);
   Bvariable *t = be->global_variable("t", "t", s1t, false, /* is_external */
                                      false, /* is_hidden */
                                      false, /* unique_section */
                                      loc);
-  Bexpression *tvex = be->var_expression(t, VE_lvalue, loc);
+  Bexpression *tvex = be->var_expression(t, loc);
   h.mkAssign(tvex, scon1);
 
   // Construct a struct with a field from a field of global var
   // var t2 = T{t.x}
-  Bexpression *tvex2 = be->var_expression(t, VE_rvalue, loc);
+  Bexpression *tvex2 = be->var_expression(t, loc);
   Bexpression *fex = be->struct_field_expression(tvex2, 0, loc);
   std::vector<Bexpression *> vals2 = {fex};
   Bexpression *scon2 = be->constructor_expression(s1t, vals2, loc);
@@ -552,20 +552,20 @@
 
   // aa[1]
   Bexpression *bi32one = mkInt32Const(be, 1);
-  Bexpression *vea1 = be->var_expression(aa, VE_rvalue, loc);
+  Bexpression *vea1 = be->var_expression(aa, loc);
   Bexpression *aa1 = be->array_index_expression(vea1, bi32one, loc);
 
   // aa[3]
   Bexpression *bi64three = mkInt64Const(be, 3);
-  Bexpression *vea2 = be->var_expression(aa, VE_rvalue, loc);
+  Bexpression *vea2 = be->var_expression(aa, loc);
   Bexpression *aa2 = be->array_index_expression(vea2, bi64three, loc);
 
   // aa[aa[3]]
-  Bexpression *vea3 = be->var_expression(aa, VE_rvalue, loc);
+  Bexpression *vea3 = be->var_expression(aa, loc);
   Bexpression *aa3 = be->array_index_expression(vea3, aa2, loc);
 
   // aa[aa[1]]
-  Bexpression *vea4 = be->var_expression(aa, VE_lvalue, loc);
+  Bexpression *vea4 = be->var_expression(aa, loc);
   Bexpression *aa4 = be->array_index_expression(vea4, aa1, loc);
 
   // aa[aa[1]] = aa[aa[3]]
@@ -628,7 +628,7 @@
 
   // t1[7].ar[3].x = 5
   {
-    Bexpression *vt = be->var_expression(t1, VE_lvalue, loc);
+    Bexpression *vt = be->var_expression(t1, loc);
     Bexpression *bi32sev = mkInt32Const(be, 7);
     Bexpression *ti7 = be->array_index_expression(vt, bi32sev, loc);
     bool knValid = true;
@@ -663,7 +663,7 @@
 
   // q := t1[0].ar[0].y
   {
-    Bexpression *vt = be->var_expression(t1, VE_rvalue, loc);
+    Bexpression *vt = be->var_expression(t1, loc);
     Bexpression *bi32zero = mkInt32Const(be, 0);
     Bexpression *ti0 = be->array_index_expression(vt, bi32zero, loc);
     bool knValid = true;
@@ -717,11 +717,11 @@
 
   // x1 = y1
   // x2 = y2
-  Bexpression *ve1 = be->var_expression(x1, VE_lvalue, loc);
-  Bexpression *ve2 = be->var_expression(y1, VE_rvalue, loc);
+  Bexpression *ve1 = be->var_expression(x1, loc);
+  Bexpression *ve2 = be->var_expression(y1, loc);
   h.mkAssign(ve1, ve2);
-  Bexpression *ve3 = be->var_expression(x2, VE_lvalue, loc);
-  Bexpression *ve4 = be->var_expression(y2, VE_rvalue, loc);
+  Bexpression *ve3 = be->var_expression(x2, loc);
+  Bexpression *ve4 = be->var_expression(y2, loc);
   h.mkAssign(ve3, ve4);
 
   const char *exp = R"RAW_RESULT(
@@ -770,7 +770,7 @@
   // var a1 = &t1.f1
   // var a2 = &t2.f1
   Bvariable *t1 = h.mkLocal("t1", s1t);
-  Bexpression *t1vex = be->var_expression(t1, VE_rvalue, loc);
+  Bexpression *t1vex = be->var_expression(t1, loc);
   Bexpression *fex1 = be->struct_field_expression(t1vex, 0, loc);
   Bexpression *aex1 = be->address_expression(fex1, loc);
   h.mkLocal("a1", bpi32t, aex1);
@@ -779,7 +779,7 @@
                                       false, /* is_hidden */
                                       false, /* unique_section */
                                       loc);
-  Bexpression *t2vex = be->var_expression(t2, VE_rvalue, loc);
+  Bexpression *t2vex = be->var_expression(t2, loc);
   Bexpression *fex2 = be->struct_field_expression(t2vex, 0, loc);
   Bexpression *aex2 = be->address_expression(fex2, loc);
   h.mkLocal("a2", bpi32t, aex2);
diff --git a/unittests/BackendCore/BackendCABIOracleTests.cpp b/unittests/BackendCore/BackendCABIOracleTests.cpp
index c674707..2867cfa 100644
--- a/unittests/BackendCore/BackendCABIOracleTests.cpp
+++ b/unittests/BackendCore/BackendCABIOracleTests.cpp
@@ -276,7 +276,7 @@
   // sm1 == 0
   Bvariable *p3 = func->getNthParamVar(3);
   Location loc;
-  Bexpression *vex = be->var_expression(p3, VE_rvalue, loc);
+  Bexpression *vex = be->var_expression(p3, loc);
   Bexpression *c0 = be->convert_expression(bu8t, mkInt32Const(be, 0), loc);
   Bexpression *eq = be->binary_expression(OPERATOR_EQEQ, vex, c0, loc);
 
@@ -284,30 +284,30 @@
   Bexpression *fn = be->function_code_expression(func, loc);
   std::vector<Bexpression *> args;
   Bvariable *p0 = func->getNthParamVar(0);
-  args.push_back(be->var_expression(p0, VE_rvalue, loc));
+  args.push_back(be->var_expression(p0, loc));
 
   Bvariable *p1 = func->getNthParamVar(1);
-  args.push_back(be->var_expression(p1, VE_rvalue, loc));
+  args.push_back(be->var_expression(p1, loc));
 
   Bvariable *p2 = func->getNthParamVar(2);
-  args.push_back(be->var_expression(p2, VE_rvalue, loc));
+  args.push_back(be->var_expression(p2, loc));
 
   Bvariable *p3x = func->getNthParamVar(3);
-  Bexpression *vex3 = be->var_expression(p3x, VE_rvalue, loc);
+  Bexpression *vex3 = be->var_expression(p3x, loc);
   Bexpression *c1 = be->convert_expression(bu8t, mkInt32Const(be, 1), loc);
   Bexpression *minus = be->binary_expression(OPERATOR_MINUS, vex3, c1, loc);
   args.push_back(minus);
 
   Bvariable *p4 = func->getNthParamVar(4);
-  args.push_back(be->var_expression(p4, VE_rvalue, loc));
+  args.push_back(be->var_expression(p4, loc));
 
   Bvariable *p5 = func->getNthParamVar(5);
-  args.push_back(be->var_expression(p5, VE_rvalue, loc));
+  args.push_back(be->var_expression(p5, loc));
   Bexpression *call = be->call_expression(func, fn, args, nullptr, h.loc());
 
   // return y
   std::vector<Bexpression *> rvals1;
-  rvals1.push_back(be->var_expression(p1, VE_rvalue, loc));
+  rvals1.push_back(be->var_expression(p1, loc));
   Bstatement *rst1 = h.mkReturn(rvals1, FcnTestHarness::NoAppend);
 
   // return call
@@ -367,7 +367,7 @@
   // foo(fp)
   Location loc;
   Bvariable *p0 = func->getNthParamVar(0);
-  Bexpression *vex = be->var_expression(p0, VE_rvalue, loc);
+  Bexpression *vex = be->var_expression(p0, loc);
   Bexpression *fn = be->function_code_expression(func, loc);
   std::vector<Bexpression *> args;
   args.push_back(vex);
@@ -418,11 +418,11 @@
   Bexpression *fn = be->function_code_expression(func, loc);
   Bvariable *p0 = func->getNthParamVar(0);
   std::vector<Bexpression *> args;
-  args.push_back(be->var_expression(p0, VE_rvalue, loc));
-  args.push_back(be->var_expression(p0, VE_rvalue, loc));
+  args.push_back(be->var_expression(p0, loc));
+  args.push_back(be->var_expression(p0, loc));
   args.push_back(mkInt32Const(be, 4));
-  args.push_back(be->var_expression(p0, VE_rvalue, loc));
-  args.push_back(be->var_expression(p0, VE_rvalue, loc));
+  args.push_back(be->var_expression(p0, loc));
+  args.push_back(be->var_expression(p0, loc));
   Bexpression *call = be->call_expression(func, fn, args, nullptr, h.loc());
 
   // return the call above
@@ -485,8 +485,8 @@
   Location loc;
   Bvariable *x = func->getNthParamVar(0);
   Bvariable *y = func->getNthParamVar(1);
-  Bexpression *xvex = be->var_expression(x, VE_rvalue, loc);
-  Bexpression *yvex = be->var_expression(y, VE_rvalue, loc);
+  Bexpression *xvex = be->var_expression(x, loc);
+  Bexpression *yvex = be->var_expression(y, loc);
   Bexpression *fn1 = be->function_code_expression(func, loc);
   std::vector<Bexpression *> args1 = {xvex, yvex};
   Bexpression *call1 = be->call_expression(func, fn1, args1, nullptr, h.loc());
diff --git a/unittests/BackendCore/BackendCallTests.cpp b/unittests/BackendCore/BackendCallTests.cpp
index 3a9993d..cc000be 100644
--- a/unittests/BackendCore/BackendCallTests.cpp
+++ b/unittests/BackendCore/BackendCallTests.cpp
@@ -34,7 +34,7 @@
   args.push_back(be->zero_expression(bpi64t));
   Bexpression *call = be->call_expression(func, fn, args, nullptr, h.loc());
   Bvariable *x = h.mkLocal("x", bi64t, call);
-  h.mkReturn(be->var_expression(x, VE_rvalue, loc));
+  h.mkReturn(be->var_expression(x, loc));
 
   const char *exp = R"RAW_RESULT(
       %call.0 = call i64 @foo(i8* nest undef, i32 3, i32 6, i64* null)
@@ -126,7 +126,7 @@
   //  return p8, nil, nil, 101
   //
   Bvariable *p1 = func->getNthParamVar(0);
-  Bexpression *vex = be->var_expression(p1, VE_rvalue, Location());
+  Bexpression *vex = be->var_expression(p1, Location());
   std::vector<Bexpression *> rvals2 = {
     vex,
     be->nil_pointer_expression(),
@@ -157,7 +157,7 @@
 
   // If statement
   Location loc;
-  Bexpression *ve2 = be->var_expression(p1, VE_rvalue, Location());
+  Bexpression *ve2 = be->var_expression(p1, Location());
   Bexpression *npe = be->nil_pointer_expression();
   Bexpression *cmp = be->binary_expression(OPERATOR_EQEQ, ve2, npe, loc);
   h.mkIf(cmp, s1, s2);
diff --git a/unittests/BackendCore/BackendDebugEmit.cpp b/unittests/BackendCore/BackendDebugEmit.cpp
index b6f6a82..96fbaa8 100644
--- a/unittests/BackendCore/BackendDebugEmit.cpp
+++ b/unittests/BackendCore/BackendDebugEmit.cpp
@@ -134,11 +134,11 @@
   Bvariable *p0 = func->getNthParamVar(0);
   Bvariable *p1 = func->getNthParamVar(1);
   std::vector<Bexpression *> args;
-  args.push_back(be->var_expression(p0, VE_rvalue, loc));
-  args.push_back(be->var_expression(p1, VE_rvalue, loc));
+  args.push_back(be->var_expression(p0, loc));
+  args.push_back(be->var_expression(p1, loc));
   args.push_back(mkInt32Const(be, 4));
-  args.push_back(be->var_expression(p0, VE_rvalue, loc));
-  args.push_back(be->var_expression(p1, VE_rvalue, loc));
+  args.push_back(be->var_expression(p0, loc));
+  args.push_back(be->var_expression(p1, loc));
   Bexpression *call = be->call_expression(func, fn, args, nullptr, h.loc());
   std::vector<Bexpression *> rvals;
   rvals.push_back(call);
diff --git a/unittests/BackendCore/BackendExprTests.cpp b/unittests/BackendCore/BackendExprTests.cpp
index 6ace017..92b53c5 100644
--- a/unittests/BackendCore/BackendExprTests.cpp
+++ b/unittests/BackendCore/BackendExprTests.cpp
@@ -225,7 +225,7 @@
   Btype *bi32t = be->integer_type(false, 32);
   Btype *s2t = mkBackendStruct(be, bi32t, "f1", bi32t, "f2", nullptr);
   Btype *ps2t = be->pointer_type(s2t);
-  Bexpression *vex = be->var_expression(xv, VE_lvalue, loc);
+  Bexpression *vex = be->var_expression(xv, loc);
   Bexpression *adx = be->address_expression(vex, loc);
   Bexpression *cast = be->convert_expression(ps2t, adx, loc);
   Bexpression *dex = be->indirect_expression(s2t, cast, false, loc);
@@ -264,7 +264,7 @@
   // *(*int32)parm3 = 5
   {
     Bvariable *p3 = func->getNthParamVar(2);
-    Bexpression *ve = be->var_expression(p3, VE_lvalue, loc);
+    Bexpression *ve = be->var_expression(p3, loc);
     Bexpression *conv = be->convert_expression(bpi32t, ve, loc);
     Bexpression *dex = be->indirect_expression(bi32t, conv, false, loc);
     h.mkAssign(dex, mkInt32Const(be, 5));
@@ -276,7 +276,7 @@
     Btype *bf64t = be->float_type(64);
     Btype *bu64t = be->integer_type(true, 64);
     Bvariable *p = h.mkLocal("p", bf64t);
-    Bexpression *ve = be->var_expression(p, VE_rvalue, loc);
+    Bexpression *ve = be->var_expression(p, loc);
     Bexpression *conv = be->convert_expression(bu64t, ve, loc);
     Bexpression *conv2 = be->convert_expression(bpi32t, conv, loc);
     Bexpression *dex = be->indirect_expression(bi32t, conv2, false, loc);
@@ -330,12 +330,12 @@
     for (unsigned ii = 0; ii < jj; ++ii) {
       Bvariable *vii = parms[ii];
       Bvariable *vjj = parms[jj];
-      Bexpression *vel1 = be->var_expression(vii, VE_lvalue, loc);
-      Bexpression *ver1 = be->var_expression(vjj, VE_rvalue, loc);
+      Bexpression *vel1 = be->var_expression(vii, loc);
+      Bexpression *ver1 = be->var_expression(vjj, loc);
       Bexpression *conv1 = be->convert_expression(vel1->btype(), ver1, loc);
       h.mkAssign(vel1, conv1);
-      Bexpression *vel2 = be->var_expression(vjj, VE_lvalue, loc);
-      Bexpression *ver2 = be->var_expression(vii, VE_rvalue, loc);
+      Bexpression *vel2 = be->var_expression(vjj, loc);
+      Bexpression *ver2 = be->var_expression(vii, loc);
       Bexpression *conv2 = be->convert_expression(vel2->btype(), ver2, loc);
       h.mkAssign(vel2, conv2);
     }
@@ -455,27 +455,27 @@
   Bvariable *y = h.mkLocal("y", bc128t);
 
   // a = complex64(x)
-  Bexpression *avex1 = be->var_expression(a, VE_lvalue, loc);
-  Bexpression *xvex1 = be->var_expression(x, VE_rvalue, loc);
+  Bexpression *avex1 = be->var_expression(a, loc);
+  Bexpression *xvex1 = be->var_expression(x, loc);
   Bexpression *convex1 = be->convert_expression(bc64t, xvex1, loc);
   h.mkAssign(avex1, convex1);
 
   // y = complex128(b)
-  Bexpression *yvex2 = be->var_expression(y, VE_lvalue, loc);
-  Bexpression *bvex2 = be->var_expression(b, VE_rvalue, loc);
+  Bexpression *yvex2 = be->var_expression(y, loc);
+  Bexpression *bvex2 = be->var_expression(b, loc);
   Bexpression *convex2 = be->convert_expression(bc128t, bvex2, loc);
   h.mkAssign(yvex2, convex2);
 
   // No-op conversions
   // a = complex64(b)
-  Bexpression *avex3 = be->var_expression(a, VE_lvalue, loc);
-  Bexpression *bvex3 = be->var_expression(b, VE_rvalue, loc);
+  Bexpression *avex3 = be->var_expression(a, loc);
+  Bexpression *bvex3 = be->var_expression(b, loc);
   Bexpression *convex3 = be->convert_expression(bc64t, bvex3, loc);
   h.mkAssign(avex3, convex3);
 
   // x = complex128(y)
-  Bexpression *xvex4 = be->var_expression(x, VE_lvalue, loc);
-  Bexpression *yvex4 = be->var_expression(y, VE_rvalue, loc);
+  Bexpression *xvex4 = be->var_expression(x, loc);
+  Bexpression *yvex4 = be->var_expression(y, loc);
   Bexpression *convex4 = be->convert_expression(bc128t, yvex4, loc);
   h.mkAssign(xvex4, convex4);
 
@@ -561,21 +561,21 @@
 
   // We should get a distinct Bexpression each time we create a new
   // var expression.
-  Bexpression *ve1 = be->var_expression(loc1, VE_rvalue, loc);
+  Bexpression *ve1 = be->var_expression(loc1, loc);
   EXPECT_EQ(repr(ve1->value()), "%loc1 = alloca i64");
   h.mkExprStmt(ve1);
-  Bexpression *ve2 = be->var_expression(loc1, VE_rvalue, loc);
+  Bexpression *ve2 = be->var_expression(loc1, loc);
   h.mkExprStmt(ve2);
   EXPECT_EQ(repr(ve2->value()), "%loc1 = alloca i64");
   EXPECT_NE(ve1, ve2);
 
   // Same here.
-  Bexpression *ve3 = be->var_expression(loc1, VE_lvalue, loc);
-  Bexpression *ve3r = be->var_expression(loc1, VE_rvalue, loc);
+  Bexpression *ve3 = be->var_expression(loc1, loc);
+  Bexpression *ve3r = be->var_expression(loc1, loc);
   EXPECT_EQ(repr(ve3->value()), "%loc1 = alloca i64");
   h.mkAssign(ve3, ve3r);
-  Bexpression *ve4 = be->var_expression(loc1, VE_lvalue, loc);
-  Bexpression *ve4r = be->var_expression(loc1, VE_rvalue, loc);
+  Bexpression *ve4 = be->var_expression(loc1, loc);
+  Bexpression *ve4r = be->var_expression(loc1, loc);
   EXPECT_EQ(repr(ve4->value()), "%loc1 = alloca i64");
   EXPECT_NE(ve3, ve4);
   h.mkAssign(ve4, ve4r);
@@ -611,7 +611,7 @@
     Bexpression *bleft = valtotest[tidx].first;
     Bvariable *bv = valtotest[tidx].second;
     for (auto op : optotest) {
-      Bexpression *bright = be->var_expression(bv, VE_rvalue, loc);
+      Bexpression *bright = be->var_expression(bv, loc);
       Bexpression *cmp = be->binary_expression(op, bleft, bright, Location());
       Bstatement *es = be->expression_statement(func, cmp);
       h.addStmt(es);
@@ -707,7 +707,7 @@
     Bexpression *bleft = valtotest[tidx].first;
     Bvariable *bv = valtotest[tidx].second;
     for (auto op : optotest) {
-      Bexpression *bright = be->var_expression(bv, VE_rvalue, loc);
+      Bexpression *bright = be->var_expression(bv, loc);
       Bexpression *cmp = be->binary_expression(op, bleft, bright, loc);
       Bstatement *es = be->expression_statement(func, cmp);
       h.addStmt(es);
@@ -747,12 +747,12 @@
 
   // x = y + z + w
   Location loc;
-  Bexpression *vey = be->var_expression(y, VE_rvalue, loc);
-  Bexpression *vez = be->var_expression(z, VE_rvalue, loc);
-  Bexpression *vew = be->var_expression(w, VE_rvalue, loc);
+  Bexpression *vey = be->var_expression(y, loc);
+  Bexpression *vez = be->var_expression(z, loc);
+  Bexpression *vew = be->var_expression(w, loc);
   Bexpression *ypz = be->binary_expression(OPERATOR_PLUS, vey, vez, loc);
   Bexpression *ypzpw = be->binary_expression(OPERATOR_PLUS, ypz, vew, loc);
-  Bexpression *vex = be->var_expression(x, VE_lvalue, loc);
+  Bexpression *vex = be->var_expression(x, loc);
   h.mkAssign(vex, ypzpw);
 
   const char *exp = R"RAW_RESULT(
@@ -802,8 +802,8 @@
     Bvariable *bvl = valtotest[tidx].first;
     Bvariable *bvr = valtotest[tidx].second;
     for (auto op : optotest) {
-      Bexpression *bleft = be->var_expression(bvl, VE_rvalue, loc);
-      Bexpression *bright = be->var_expression(bvr, VE_rvalue, loc);
+      Bexpression *bleft = be->var_expression(bvl, loc);
+      Bexpression *bright = be->var_expression(bvr, loc);
       Bexpression *cmp = be->binary_expression(op, bleft, bright, Location());
       Bstatement *es = be->expression_statement(func, cmp);
       h.addStmt(es);
@@ -908,7 +908,7 @@
     for (auto op : optotest) {
       if (op == OPERATOR_MOD && bleft->btype()->type()->isFloatingPointTy())
         continue;
-      Bexpression *bright = be->var_expression(bv, VE_rvalue, loc);
+      Bexpression *bright = be->var_expression(bv, loc);
       Bexpression *cmp = be->binary_expression(op, bleft, bright, Location());
       Bstatement *es = be->expression_statement(func, cmp);
       h.addStmt(es);
@@ -967,8 +967,8 @@
     Bvariable *bvl = valtotest[tidx].first;
     Bvariable *bvr = valtotest[tidx].second;
     for (auto op : optotest) {
-      Bexpression *bleft = be->var_expression(bvl, VE_rvalue, loc);
-      Bexpression *bright = be->var_expression(bvr, VE_rvalue, loc);
+      Bexpression *bleft = be->var_expression(bvl, loc);
+      Bexpression *bright = be->var_expression(bvr, loc);
       Bexpression *cmp = be->binary_expression(op, bleft, bright, Location());
       Bstatement *es = be->expression_statement(func, cmp);
       h.addStmt(es);
@@ -978,16 +978,16 @@
   // Verify correct behavior when type of shift amount does not match
   // type of shift value.
   {
-    Bexpression *bleft = be->var_expression(x, VE_rvalue, loc);
-    Bexpression *bright = be->var_expression(z, VE_rvalue, loc);
+    Bexpression *bleft = be->var_expression(x, loc);
+    Bexpression *bright = be->var_expression(z, loc);
     Bexpression *mix = be->binary_expression(OPERATOR_LSHIFT, bleft, bright,
                                              Location());
     Bstatement *es = be->expression_statement(func, mix);
     h.addStmt(es);
   }
   {
-    Bexpression *bleft = be->var_expression(z, VE_rvalue, loc);
-    Bexpression *bright = be->var_expression(y, VE_rvalue, loc);
+    Bexpression *bleft = be->var_expression(z, loc);
+    Bexpression *bright = be->var_expression(y, loc);
     Bexpression *mix = be->binary_expression(OPERATOR_RSHIFT, bleft, bright,
                                              Location());
     Bstatement *es = be->expression_statement(func, mix);
@@ -1048,11 +1048,11 @@
   Bvariable *b = h.mkLocal("b", bt);
 
   for (auto op : optotest) {
-    Bexpression *bleft = be->var_expression(x, VE_rvalue, loc);
-    Bexpression *bright = be->var_expression(y, VE_rvalue, loc);
+    Bexpression *bleft = be->var_expression(x, loc);
+    Bexpression *bright = be->var_expression(y, loc);
     Bexpression *bop = be->binary_expression(op, bleft, bright, Location());
     Bexpression *bvex = be->var_expression(op == OPERATOR_EQEQ || op == OPERATOR_NOTEQ ? b : z,
-                                           VE_lvalue, loc);
+                                           loc);
     h.mkAssign(bvex, bop);
   }
 
@@ -1232,21 +1232,21 @@
   Bvariable *x = h.mkLocal("x", bc128t);
 
   // a = real(x)
-  Bexpression *avex1 = be->var_expression(a, VE_lvalue, loc);
-  Bexpression *xvex1 = be->var_expression(x, VE_rvalue, loc);
+  Bexpression *avex1 = be->var_expression(a, loc);
+  Bexpression *xvex1 = be->var_expression(x, loc);
   Bexpression *realex = be->real_part_expression(xvex1, loc);
   h.mkAssign(avex1, realex);
 
   // b = imag(x)
-  Bexpression *bvex2 = be->var_expression(b, VE_lvalue, loc);
-  Bexpression *xvex2 = be->var_expression(x, VE_rvalue, loc);
+  Bexpression *bvex2 = be->var_expression(b, loc);
+  Bexpression *xvex2 = be->var_expression(x, loc);
   Bexpression *imagex = be->imag_part_expression(xvex2, loc);
   h.mkAssign(bvex2, imagex);
 
   // x = complex(b, a)
-  Bexpression *xvex3 = be->var_expression(x, VE_lvalue, loc);
-  Bexpression *bvex3 = be->var_expression(b, VE_rvalue, loc);
-  Bexpression *avex3 = be->var_expression(a, VE_rvalue, loc);
+  Bexpression *xvex3 = be->var_expression(x, loc);
+  Bexpression *bvex3 = be->var_expression(b, loc);
+  Bexpression *avex3 = be->var_expression(a, loc);
   Bexpression *compex = be->complex_expression(bvex3, avex3, loc);
   h.mkAssign(xvex3, compex);
 
@@ -1320,8 +1320,8 @@
   // Two calls, no type
   Bexpression *call1 = h.mkCallExpr(be, func, nullptr);
   Bexpression *call2 = h.mkCallExpr(be, func, nullptr);
-  Bexpression *vex1 = be->var_expression(pv1, VE_rvalue, loc);
-  Bexpression *vex2 = be->var_expression(pv2, VE_rvalue, loc);
+  Bexpression *vex1 = be->var_expression(pv1, loc);
+  Bexpression *vex2 = be->var_expression(pv2, loc);
   Bexpression *cmp = be->binary_expression(OPERATOR_LT, vex1, vex2, loc);
   Bexpression *condex = be->conditional_expression(func, nullptr, cmp, call1,
                                                    call2, loc);
@@ -1375,7 +1375,7 @@
 
   // Call on true branch,
   Bexpression *call1 = h.mkCallExpr(be, func, nullptr);
-  Bexpression *ve = be->var_expression(pv1, VE_rvalue, loc);
+  Bexpression *ve = be->var_expression(pv1, loc);
   Bexpression *cmp = be->binary_expression(OPERATOR_LT,
                                            mkInt64Const(be, int64_t(3)),
                                            mkInt64Const(be, int64_t(4)), loc);
@@ -1428,10 +1428,10 @@
   // Local var with conditional expression as init
   Bvariable *p0v = func->getNthParamVar(0);
   Bvariable *p1v = func->getNthParamVar(1);
-  Bexpression *vep1 = be->var_expression(p1v, VE_rvalue, loc);
+  Bexpression *vep1 = be->var_expression(p1v, loc);
   Bexpression *cmp = be->binary_expression(OPERATOR_LT, vep1,
                                            mkInt32Const(be, int32_t(7)), loc);
-  Bexpression *vep0 = be->var_expression(p0v, VE_rvalue, loc);
+  Bexpression *vep0 = be->var_expression(p0v, loc);
   Bexpression *bzero = be->zero_expression(s2t);
 
   Bexpression *cond = be->conditional_expression(func, s2t, cmp,
@@ -1491,10 +1491,10 @@
   // x
   Btype *bi64t = be->integer_type(false, 64);
   Bvariable *xv = h.mkLocal("x", bi64t);
-  Bexpression *vex = be->var_expression(xv, VE_lvalue, loc);
+  Bexpression *vex = be->var_expression(xv, loc);
   Bstatement *st =  be->assignment_statement(func, vex,
                                              mkInt64Const(be, 5), loc);
-  Bexpression *vex2 = be->var_expression(xv, VE_rvalue, loc);
+  Bexpression *vex2 = be->var_expression(xv, loc);
   Bexpression *ce = be->compound_expression(st, vex2, loc);
   Bstatement *es = be->expression_statement(func, ce);
   h.addStmt(es);
@@ -1539,11 +1539,11 @@
   // *(p0 == nil ? p1 : p0) = 7
   Bvariable *p0v = func->getNthParamVar(0);
   Bvariable *p1v = func->getNthParamVar(1);
-  Bexpression *vex = be->var_expression(p0v, VE_rvalue, loc);
+  Bexpression *vex = be->var_expression(p0v, loc);
   Bexpression *npe = be->nil_pointer_expression();
   Bexpression *cmp = be->binary_expression(OPERATOR_EQEQ, vex, npe, loc);
-  Bexpression *ver0 = be->var_expression(p0v, VE_rvalue, loc);
-  Bexpression *ver1 = be->var_expression(p1v, VE_rvalue, loc);
+  Bexpression *ver0 = be->var_expression(p0v, loc);
+  Bexpression *ver1 = be->var_expression(p1v, loc);
   Bexpression *guard =
       be->conditional_expression(func, be->pointer_type(bi32t), cmp,
                                  ver1, ver0, loc);
@@ -1599,28 +1599,28 @@
   // var y bool = !x
   Btype *bt = be->bool_type();
   Bvariable *xv = h.mkLocal("x", bt);
-  Bexpression *vex = be->var_expression(xv, VE_rvalue, loc);
+  Bexpression *vex = be->var_expression(xv, loc);
   h.mkLocal("y", bt, be->unary_expression(OPERATOR_NOT, vex, loc));
 
   // var a i32
   // var b i32 = -a
   Btype *bi32t = be->integer_type(false, 32);
   Bvariable *av = h.mkLocal("a", bi32t);
-  Bexpression *vea = be->var_expression(av, VE_rvalue, loc);
+  Bexpression *vea = be->var_expression(av, loc);
   h.mkLocal("b", bi32t, be->unary_expression(OPERATOR_MINUS, vea, loc));
 
   // var z i64
   // var w i64 = ^z
   Btype *bi64t = be->integer_type(false, 64);
   Bvariable *zv = h.mkLocal("z", bi64t);
-  Bexpression *vez = be->var_expression(zv, VE_rvalue, loc);
+  Bexpression *vez = be->var_expression(zv, loc);
   h.mkLocal("w", bi64t, be->unary_expression(OPERATOR_XOR, vez, loc));
 
   // var q float64
   // var r float64 = -z
   Btype *bf64t = be->float_type(64);
   Bvariable *qv = h.mkLocal("q", bf64t);
-  Bexpression *veq = be->var_expression(qv, VE_rvalue, loc);
+  Bexpression *veq = be->var_expression(qv, loc);
   h.mkLocal("r", bf64t, be->unary_expression(OPERATOR_MINUS, veq, loc));
 
   const char *exp = R"RAW_RESULT(
diff --git a/unittests/BackendCore/BackendFcnTests.cpp b/unittests/BackendCore/BackendFcnTests.cpp
index eea8558..c998e46 100644
--- a/unittests/BackendCore/BackendFcnTests.cpp
+++ b/unittests/BackendCore/BackendFcnTests.cpp
@@ -275,7 +275,7 @@
   // __builtin_ctzll(x);
   Bfunction *bfcn = be->lookup_builtin("__builtin_ctzll");
   //Bexpression *fnexpr = be->function_code_expression(bfcn, loc);
-  Bexpression *ve = be->var_expression(x, VE_rvalue, loc);
+  Bexpression *ve = be->var_expression(x, loc);
   Bexpression *call = h.mkCallExpr(be, bfcn, ve, nullptr);
   h.mkExprStmt(call);
 
@@ -307,8 +307,8 @@
   // memcmp(&x,&y,sizeof(x))
   {
   Bfunction *bmemcmp = be->lookup_builtin("memcmp");
-  Bexpression *vex = be->var_expression(x, VE_rvalue, loc);
-  Bexpression *vey = be->var_expression(y, VE_rvalue, loc);
+  Bexpression *vex = be->var_expression(x, loc);
+  Bexpression *vey = be->var_expression(y, loc);
   Bexpression *call =
       h.mkCallExpr(be, bmemcmp,
                    be->address_expression(vex, loc),
@@ -321,8 +321,8 @@
   // memmove(&x,&y,sizeof(x))
   {
   Bfunction *bmemmove = be->lookup_builtin("memmove");
-  Bexpression *vex = be->var_expression(x, VE_rvalue, loc);
-  Bexpression *vey = be->var_expression(y, VE_rvalue, loc);
+  Bexpression *vex = be->var_expression(x, loc);
+  Bexpression *vey = be->var_expression(y, loc);
   Bexpression *call =
       h.mkCallExpr(be, bmemmove,
                    be->address_expression(vex, loc),
@@ -335,8 +335,8 @@
   // memcpy(&y,&x,sizeof(y))
   {
   Bfunction *bmemcpy = be->lookup_builtin("memcpy");
-  Bexpression *vey = be->var_expression(y, VE_rvalue, loc);
-  Bexpression *vex = be->var_expression(x, VE_rvalue, loc);
+  Bexpression *vey = be->var_expression(y, loc);
+  Bexpression *vex = be->var_expression(x, loc);
   Bexpression *call =
       h.mkCallExpr(be, bmemcpy,
                    be->address_expression(vey, loc),
diff --git a/unittests/BackendCore/BackendNodeTests.cpp b/unittests/BackendCore/BackendNodeTests.cpp
index b59a121..3db4e7e 100644
--- a/unittests/BackendCore/BackendNodeTests.cpp
+++ b/unittests/BackendCore/BackendNodeTests.cpp
@@ -70,9 +70,9 @@
   Bexpression *c22 = mkInt32Const(be, 22);
   Bvariable *xv = h.mkLocal("x", bi32t);
   Bvariable *yv = h.mkLocal("y", bpi32t);
-  Bexpression *ve = be->var_expression(xv, VE_rvalue, loc);
+  Bexpression *ve = be->var_expression(xv, loc);
   Bexpression *add = be->binary_expression(OPERATOR_PLUS, c22, ve, loc);
-  Bexpression *ve2 = be->var_expression(yv, VE_rvalue, loc);
+  Bexpression *ve2 = be->var_expression(yv, loc);
   Bexpression *der = be->indirect_expression(bi32t, ve2, false, loc);
   Bexpression *sub = be->binary_expression(OPERATOR_MINUS, add, der, loc);
   Bexpression *matsub = be->materialize(sub);
@@ -141,11 +141,11 @@
   Bvariable *xv = h.mkLocal("x", bi32t);
   Bvariable *yv = h.mkLocal("y", bpi32t);
   Bvariable *zv = h.mkLocal("z", bi16t);
-  Bexpression *vex = be->var_expression(xv, VE_rvalue, loc);
-  Bexpression *vez = be->var_expression(zv, VE_rvalue, loc);
+  Bexpression *vex = be->var_expression(xv, loc);
+  Bexpression *vez = be->var_expression(zv, loc);
   Bexpression *conv = be->convert_expression(bi32t, vez, loc);
   Bexpression *sub = be->binary_expression(OPERATOR_PLUS, vex, conv, loc);
-  Bexpression *vey = be->var_expression(yv, VE_rvalue, loc);
+  Bexpression *vey = be->var_expression(yv, loc);
   Bexpression *der = be->indirect_expression(bi32t, vey, false, loc);
   Bexpression *add = be->binary_expression(OPERATOR_PLUS, sub, der, loc);
   Bexpression *matadd = be->materialize(add);
@@ -188,7 +188,7 @@
   Bvariable *xv = h.mkLocal("x", s4t);
 
   // y = x.f1.f1 + x.f1.f1 [with sharing]
-  Bexpression *vex = be->var_expression(xv, VE_rvalue, loc);
+  Bexpression *vex = be->var_expression(xv, loc);
   Bexpression *f1ex = be->struct_field_expression(vex, 0, loc);
   Bexpression *f2ex = be->struct_field_expression(f1ex, 0, loc);
   Bexpression *der = be->indirect_expression(bi32t, f2ex, false, loc);
diff --git a/unittests/BackendCore/BackendPointerExprTests.cpp b/unittests/BackendCore/BackendPointerExprTests.cpp
index c3c504b..292012d 100644
--- a/unittests/BackendCore/BackendPointerExprTests.cpp
+++ b/unittests/BackendCore/BackendPointerExprTests.cpp
@@ -34,8 +34,8 @@
 
   {
     // x = &y
-    Bexpression *vex = be->var_expression(x, VE_lvalue, loc);
-    Bexpression *vey = be->var_expression(y, VE_rvalue, loc);
+    Bexpression *vex = be->var_expression(x, loc);
+    Bexpression *vey = be->var_expression(y, loc);
     Bexpression *ady = be->address_expression(vey, loc);
     Bstatement *as = be->assignment_statement(func, vex, ady, loc);
     h.addStmt(as);
@@ -43,8 +43,8 @@
 
   {
     // y = *x
-    Bexpression *vey = be->var_expression(y, VE_lvalue, loc);
-    Bexpression *vex = be->var_expression(x, VE_rvalue, loc);
+    Bexpression *vey = be->var_expression(y, loc);
+    Bexpression *vex = be->var_expression(x, loc);
     bool knValid = false;
     Bexpression *indx1 = be->indirect_expression(bi64t, vex, knValid, loc);
     Bstatement *as = be->assignment_statement(func, vey, indx1, loc);
@@ -53,7 +53,7 @@
 
   {
     // *x = 3
-    Bexpression *vex = be->var_expression(x, VE_lvalue, loc);
+    Bexpression *vex = be->var_expression(x, loc);
     Bexpression *indx = be->indirect_expression(bi64t, vex, false, loc);
     Bexpression *beic3 = mkInt64Const(be, 3);
     Bstatement *as = be->assignment_statement(func, indx, beic3, loc);
@@ -103,7 +103,7 @@
   // Pointer-to-FD variables
   Btype *pfd1t = be->pointer_type(fdesct1);
   Btype *pfd2t = be->pointer_type(fdesct2);
-  Bexpression *vex1 = be->var_expression(bfdv1, VE_rvalue, loc);
+  Bexpression *vex1 = be->var_expression(bfdv1, loc);
   Bexpression *adfd1 = be->address_expression(vex1, loc);
   Bvariable *bfpv1 = h.mkLocal("fploc1", pfd1t, adfd1);
   Bvariable *bfpv2 = h.mkLocal("fploc2", pfd2t);
@@ -111,11 +111,11 @@
   // Assignment of function descriptor pointer values. Note that the
   // types here are not going to agree strictly; this test verifies
   // that this flexibility is allowed.
-  Bexpression *vex2 = be->var_expression(bfpv2, VE_lvalue, loc);
-  Bexpression *rvex2 = be->var_expression(bfpv1, VE_rvalue, loc);
+  Bexpression *vex2 = be->var_expression(bfpv2, loc);
+  Bexpression *rvex2 = be->var_expression(bfpv1, loc);
   h.mkAssign(vex2, rvex2);
-  Bexpression *vex3 = be->var_expression(bfpv1, VE_lvalue, loc);
-  Bexpression *rvex3 = be->var_expression(bfpv2, VE_rvalue, loc);
+  Bexpression *vex3 = be->var_expression(bfpv1, loc);
+  Bexpression *rvex3 = be->var_expression(bfpv2, loc);
   h.mkAssign(vex3, rvex3);
 
   const char *exp = R"RAW_RESULT(
@@ -161,8 +161,8 @@
 
   {
     // b1 = (pb1 == nil)
-    Bexpression *vel = be->var_expression(b1, VE_lvalue, loc);
-    Bexpression *ver = be->var_expression(pb1, VE_rvalue, loc);
+    Bexpression *vel = be->var_expression(b1, loc);
+    Bexpression *ver = be->var_expression(pb1, loc);
     Bexpression *npe = be->nil_pointer_expression();
     Bexpression *cmp = be->binary_expression(OPERATOR_EQEQ, ver, npe, loc);
     h.mkAssign(vel, cmp);
@@ -170,8 +170,8 @@
 
   {
     // b1 = (nil == pb1)
-    Bexpression *vel = be->var_expression(b1, VE_lvalue, loc);
-    Bexpression *ver = be->var_expression(pb1, VE_rvalue, loc);
+    Bexpression *vel = be->var_expression(b1, loc);
+    Bexpression *ver = be->var_expression(pb1, loc);
     Bexpression *npe = be->nil_pointer_expression();
     Bexpression *cmp = be->binary_expression(OPERATOR_EQEQ, npe, ver, loc);
     h.mkAssign(vel, cmp);
@@ -258,16 +258,16 @@
 
   {
     // cpv1 = &cpv2
-    Bexpression *ve1 = be->var_expression(cpv1, VE_lvalue, loc);
-    Bexpression *ve2 = be->var_expression(cpv2, VE_rvalue, loc);
+    Bexpression *ve1 = be->var_expression(cpv1, loc);
+    Bexpression *ve2 = be->var_expression(cpv2, loc);
     Bexpression *adx = be->address_expression(ve2, loc);
     h.mkAssign(ve1, adx);
   }
 
   {
     // cpv2 = &cpv1
-    Bexpression *ve1 = be->var_expression(cpv2, VE_lvalue, loc);
-    Bexpression *ve2 = be->var_expression(cpv1, VE_rvalue, loc);
+    Bexpression *ve1 = be->var_expression(cpv2, loc);
+    Bexpression *ve2 = be->var_expression(cpv1, loc);
     Bexpression *adx = be->address_expression(ve2, loc);
     h.mkAssign(ve1, adx);
   }
@@ -279,9 +279,9 @@
 
   {
     // b1 := (cpv1 == *cpv2)
-    Bexpression *ve0 = be->var_expression(b1, VE_lvalue, loc);
-    Bexpression *ve1 = be->var_expression(cpv1, VE_rvalue, loc);
-    Bexpression *ve2 = be->var_expression(cpv2, VE_rvalue, loc);
+    Bexpression *ve0 = be->var_expression(b1, loc);
+    Bexpression *ve1 = be->var_expression(cpv1, loc);
+    Bexpression *ve2 = be->var_expression(cpv2, loc);
     Bexpression *dex = be->indirect_expression(pht, ve2, false, loc);
     Bexpression *cmp = be->binary_expression(OPERATOR_EQEQ, ve1, dex, loc);
     h.mkAssign(ve0, cmp);
@@ -289,19 +289,19 @@
 
   {
     // b2 := (&cpv1 != cpv2)
-    Bexpression *ve0 = be->var_expression(b2, VE_lvalue, loc);
-    Bexpression *ve1 = be->var_expression(cpv1, VE_rvalue, loc);
+    Bexpression *ve0 = be->var_expression(b2, loc);
+    Bexpression *ve1 = be->var_expression(cpv1, loc);
     Bexpression *adx = be->address_expression(ve1, loc);
-    Bexpression *ve2 = be->var_expression(cpv2, VE_rvalue, loc);
+    Bexpression *ve2 = be->var_expression(cpv2, loc);
     Bexpression *cmp = be->binary_expression(OPERATOR_EQEQ, adx, ve2, loc);
     h.mkAssign(ve0, cmp);
   }
 
   {
     // b3 := (cpv1 == ***cpv2)
-    Bexpression *ve0 = be->var_expression(b3, VE_lvalue, loc);
-    Bexpression *ve1 = be->var_expression(cpv1, VE_rvalue, loc);
-    Bexpression *ve2 = be->var_expression(cpv2, VE_rvalue, loc);
+    Bexpression *ve0 = be->var_expression(b3, loc);
+    Bexpression *ve1 = be->var_expression(cpv1, loc);
+    Bexpression *ve2 = be->var_expression(cpv2, loc);
     Bexpression *dex1 = be->indirect_expression(pht, ve2, false, loc);
     Bexpression *dex2 = be->indirect_expression(pht, dex1, false, loc);
     Bexpression *dex3 = be->indirect_expression(pht, dex2, false, loc);
@@ -382,16 +382,16 @@
 
   {
     // x = &y
-    Bexpression *ve1 = be->var_expression(cpv1, VE_lvalue, loc);
-    Bexpression *ve2 = be->var_expression(cpv2, VE_rvalue, loc);
+    Bexpression *ve1 = be->var_expression(cpv1, loc);
+    Bexpression *ve2 = be->var_expression(cpv2, loc);
     Bexpression *adx = be->address_expression(ve2, loc);
     h.mkAssign(ve1, adx);
   }
 
   {
     // y = &x
-    Bexpression *ve1 = be->var_expression(cpv2, VE_lvalue, loc);
-    Bexpression *ve2 = be->var_expression(cpv1, VE_rvalue, loc);
+    Bexpression *ve1 = be->var_expression(cpv2, loc);
+    Bexpression *ve2 = be->var_expression(cpv1, loc);
     Bexpression *adx = be->address_expression(ve2, loc);
     h.mkAssign(ve1, adx);
   }
@@ -401,9 +401,9 @@
 
   {
     // b1 := (x == *y)
-    Bexpression *ve0 = be->var_expression(b1, VE_lvalue, loc);
-    Bexpression *ve1 = be->var_expression(cpv1, VE_rvalue, loc);
-    Bexpression *ve2 = be->var_expression(cpv2, VE_rvalue, loc);
+    Bexpression *ve0 = be->var_expression(b1, loc);
+    Bexpression *ve1 = be->var_expression(cpv1, loc);
+    Bexpression *ve2 = be->var_expression(cpv2, loc);
     Bexpression *dex = be->indirect_expression(pht1, ve2, false, loc);
     Bexpression *cmp = be->binary_expression(OPERATOR_EQEQ, ve1, dex, loc);
     h.mkAssign(ve0, cmp);
@@ -444,7 +444,7 @@
 
   {
     // deref(ptr_offset(p3, 5)) = 9
-    Bexpression *ve = be->var_expression(p3, VE_lvalue, loc);
+    Bexpression *ve = be->var_expression(p3, loc);
     Bexpression *cfive = mkInt32Const(be, 5);
     Bexpression *poe1 = be->pointer_offset_expression(ve, cfive, loc);
     Bexpression *der = be->indirect_expression(bi64t, poe1, false, loc);
@@ -455,8 +455,8 @@
   {
     // p0 = int32(deref(ptr_offset(p3, 7)))
     Btype *bi32t = be->integer_type(false, 32);
-    Bexpression *ve = be->var_expression(p0, VE_lvalue, loc);
-    Bexpression *ver = be->var_expression(p3, VE_rvalue, loc);
+    Bexpression *ve = be->var_expression(p0, loc);
+    Bexpression *ver = be->var_expression(p3, loc);
     Bexpression *cseven = mkInt32Const(be, 7);
     Bexpression *poe2 = be->pointer_offset_expression(ver, cseven, loc);
     Bexpression *der = be->indirect_expression(bi64t, poe2, false, loc);
@@ -494,13 +494,13 @@
   Bvariable *xv = h.mkLocal("x", bi64t);
 
   // p3 = addr(deref(addr(deref(addr(x))))))
-  Bexpression *vexr = be->var_expression(xv, VE_rvalue, loc);
+  Bexpression *vexr = be->var_expression(xv, loc);
   Bexpression *ad1 = be->address_expression(vexr, loc);
   Bexpression *der1 = be->indirect_expression(bi64t, ad1, false, loc);
   Bexpression *ad2 = be->address_expression(der1, loc);
   Bexpression *der2 = be->indirect_expression(bi64t, ad2, false, loc);
   Bexpression *ad3 = be->address_expression(der2, loc);
-  Bexpression *vexl = be->var_expression(p3, VE_lvalue, loc);
+  Bexpression *vexl = be->var_expression(p3, loc);
   h.mkAssign(vexl, ad3);
 
   const char *exp = R"RAW_RESULT(
diff --git a/unittests/BackendCore/BackendStmtTests.cpp b/unittests/BackendCore/BackendStmtTests.cpp
index dc2ebe5..9e55ef8 100644
--- a/unittests/BackendCore/BackendStmtTests.cpp
+++ b/unittests/BackendCore/BackendStmtTests.cpp
@@ -54,7 +54,7 @@
 
   // assign a constant to a variable
   Bvariable *loc1 = h.mkLocal("loc1", bi64t);
-  Bexpression *ve1 = be->var_expression(loc1, VE_lvalue, loc);
+  Bexpression *ve1 = be->var_expression(loc1, loc);
   Bstatement *as =
       be->assignment_statement(func, ve1, mkInt64Const(be, 123), loc);
   ASSERT_TRUE(as != nullptr);
@@ -62,8 +62,8 @@
 
   // assign a variable to a variable
   Bvariable *loc2 = h.mkLocal("loc2", bi64t);
-  Bexpression *ve2 = be->var_expression(loc2, VE_lvalue, loc);
-  Bexpression *ve3 = be->var_expression(loc1, VE_rvalue, loc);
+  Bexpression *ve2 = be->var_expression(loc2, loc);
+  Bexpression *ve3 = be->var_expression(loc1, loc);
   Bstatement *as2 = be->assignment_statement(func, ve2, ve3, loc);
   ASSERT_TRUE(as2 != nullptr);
   h.addStmt(as2);
@@ -80,7 +80,7 @@
 
   // error handling
   Bvariable *loc3 = h.mkLocal("loc3", bi64t);
-  Bexpression *ve4 = be->var_expression(loc3, VE_lvalue, loc);
+  Bexpression *ve4 = be->var_expression(loc3, loc);
   Bstatement *badas =
       be->assignment_statement(func, ve4, be->error_expression(), loc);
   ASSERT_TRUE(badas != nullptr);
@@ -101,7 +101,7 @@
 
   // return loc1
   Location loc;
-  Bexpression *ve1 = be->var_expression(loc1, VE_rvalue, loc);
+  Bexpression *ve1 = be->var_expression(loc1, loc);
   Bstatement *ret = h.mkReturn(ve1);
 
   const char *exp = R"RAW_RESULT(
@@ -136,12 +136,12 @@
   Bvariable *x = h.mkLocal("x", bi64t, mkInt64Const(be, 10));
 
   // return x
-  Bexpression *ve1 = be->var_expression(x, VE_rvalue, loc);
+  Bexpression *ve1 = be->var_expression(x, loc);
   h.mkReturn(ve1);
 
   // some dead code
   // return x+20
-  Bexpression *ve2 = be->var_expression(x, VE_rvalue, loc);
+  Bexpression *ve2 = be->var_expression(x, loc);
   Bexpression *addexpr = be->binary_expression(OPERATOR_PLUS, ve2, mkInt64Const(be, 20), loc);
   h.mkReturn(addexpr);
 
@@ -185,7 +185,7 @@
   h.addStmt(gots);
 
   // dead stmt: loc1 = 11
-  h.mkAssign(be->var_expression(loc1, VE_lvalue, loc),
+  h.mkAssign(be->var_expression(loc1, loc),
              mkInt64Const(be, 11));
 
   // labeldef
@@ -221,7 +221,7 @@
   // Now define the label, throw a statement in it.
   Bstatement *ldef = be->label_definition_statement(lab1);
   h.addStmt(ldef);
-  h.mkAssign(be->var_expression(loc1, VE_lvalue, h.loc()),
+  h.mkAssign(be->var_expression(loc1, h.loc()),
              be->zero_expression(bu8t));
 
   bool broken = h.finish(StripDebugInfo);
@@ -253,12 +253,12 @@
   Bvariable *loc1 = h.mkLocal("loc1", bi64t);
 
   // loc1 = 123
-  Bexpression *ve1 = be->var_expression(loc1, VE_lvalue, loc);
+  Bexpression *ve1 = be->var_expression(loc1, loc);
   Bexpression *c123 = mkInt64Const(be, 123);
   Bstatement *as1 = be->assignment_statement(func, ve1, c123, loc);
 
   // loc1 = 987
-  Bexpression *ve2 = be->var_expression(loc1, VE_lvalue, loc);
+  Bexpression *ve2 = be->var_expression(loc1, loc);
   Bexpression *c987 = mkInt64Const(be, 987);
   Bstatement *as2 = be->assignment_statement(func, ve2, c987, loc);
 
@@ -283,7 +283,7 @@
   // loc2 = 456
   Btype *bi64t = be->integer_type(false, 64);
   Bvariable *loc2 = h.mkLocal("loc2", bi64t);
-  Bexpression *ve3 = be->var_expression(loc2, VE_lvalue, loc);
+  Bexpression *ve3 = be->var_expression(loc2, loc);
   Bexpression *c456 = mkInt64Const(be, 456);
   Bstatement *as3 = be->assignment_statement(func, ve3, c456, loc);
 
@@ -348,8 +348,8 @@
 
   // first case
   // loc1 = loc1 / 123
-  Bexpression *ve1 = be->var_expression(loc1, VE_lvalue, loc);
-  Bexpression *ve1r = be->var_expression(loc1, VE_rvalue, loc);
+  Bexpression *ve1 = be->var_expression(loc1, loc);
+  Bexpression *ve1r = be->var_expression(loc1, loc);
   Bexpression *c123 = mkInt64Const(be, 123);
   Bexpression *div = be->binary_expression(OPERATOR_DIV, ve1r, c123, loc);
   Bstatement *as1 = be->assignment_statement(func, ve1, div, loc);
@@ -358,10 +358,10 @@
 
   // second case
   // loc1 = loc1 < 987 ? loc1 : 987 * loc1
-  Bexpression *ve2 = be->var_expression(loc1, VE_lvalue, loc);
-  Bexpression *ve2r = be->var_expression(loc1, VE_rvalue, loc);
-  Bexpression *ve2r2 = be->var_expression(loc1, VE_rvalue, loc);
-  Bexpression *ve2r3 = be->var_expression(loc1, VE_rvalue, loc);
+  Bexpression *ve2 = be->var_expression(loc1, loc);
+  Bexpression *ve2r = be->var_expression(loc1, loc);
+  Bexpression *ve2r2 = be->var_expression(loc1, loc);
+  Bexpression *ve2r3 = be->var_expression(loc1, loc);
   Bexpression *c987 = mkInt64Const(be, 987);
   Bexpression *mul = be->binary_expression(OPERATOR_MULT, c987, ve2r, loc);
   Bexpression *cmp = be->binary_expression(OPERATOR_LE, ve2r2, c987, loc);
@@ -375,7 +375,7 @@
 
   // fourth case
   // loc1 = 456
-  Bexpression *ve4 = be->var_expression(loc1, VE_lvalue, loc);
+  Bexpression *ve4 = be->var_expression(loc1, loc);
   Bexpression *c456 = mkInt64Const(be, 456);
   Bstatement *as4 = be->assignment_statement(func, ve4, c456, loc);
   Bstatement *goto4 = be->goto_statement(brklab, loc);
@@ -391,7 +391,7 @@
   cases.push_back(std::vector<Bexpression*>()); // default
 
   // switch
-  Bexpression *vesw = be->var_expression(loc1, VE_rvalue, loc);
+  Bexpression *vesw = be->var_expression(loc1, loc);
   h.mkSwitch(vesw, cases, statements);
 
   // label definition
@@ -525,7 +525,7 @@
   // Materialize call to deferreturn
   Bexpression *retfn = be->function_code_expression(bdefretfcn, h.newloc());
   std::vector<Bexpression *> args1;
-  Bexpression *ve1 = be->var_expression(loc1, VE_rvalue, h.newloc());
+  Bexpression *ve1 = be->var_expression(loc1, h.newloc());
   Bexpression *adve1 = be->address_expression(ve1, h.newloc());
   args1.push_back(adve1);
   Bexpression *undcall = be->call_expression(func, retfn, args1,
@@ -534,7 +534,7 @@
   // Materialize call to checkdefer
   Bexpression *ckfn = be->function_code_expression(bchkfcn, h.newloc());
   std::vector<Bexpression *> args2;
-  Bexpression *ve2 = be->var_expression(loc1, VE_rvalue, h.loc());
+  Bexpression *ve2 = be->var_expression(loc1, h.loc());
   Bexpression *adve2 = be->address_expression(ve2, h.loc());
   args2.push_back(adve2);
   Bexpression *ckdefcall = be->call_expression(func, ckfn, args2,
@@ -630,12 +630,12 @@
   // x = id(99)
   // plark()
   // x = 123
-  Bexpression *ve1 = be->var_expression(loc1, VE_lvalue, h.newloc());
+  Bexpression *ve1 = be->var_expression(loc1, h.newloc());
   Bstatement *as1 =
       be->assignment_statement(func, ve1, calls[3], h.newloc());
   Bblock *bb1 = mkBlockFromStmt(be, func, as1);
   addStmtToBlock(be, bb1, h.mkExprStmt(calls[0], FcnTestHarness::NoAppend));
-  Bexpression *ve2 = be->var_expression(loc1, VE_lvalue, h.newloc());
+  Bexpression *ve2 = be->var_expression(loc1, h.newloc());
   Bstatement *as2 =
       be->assignment_statement(func, ve2, mkInt64Const(be, 123), h.newloc());
   addStmtToBlock(be, bb1, as2);
@@ -726,12 +726,12 @@
 {
   // Store value to tmp
   Location loc;
-  Bexpression *ve = be->var_expression(rtmp, VE_lvalue, loc);
+  Bexpression *ve = be->var_expression(rtmp, loc);
   Bstatement *as = be->assignment_statement(func, ve, val, loc);
   Bblock *block = mkBlockFromStmt(be, func, as);
 
   // Load from temp and return
-  Bexpression *ve2 = be->var_expression(rtmp, VE_rvalue, loc);
+  Bexpression *ve2 = be->var_expression(rtmp, loc);
   std::vector<Bexpression *> vals;
   vals.push_back(ve2);
   Bstatement *rst = be->return_statement(func, vals, loc);
@@ -775,7 +775,7 @@
                                           mkInt64Const(be, 88),
                                           h.loc());
     Bvariable *p0 = func->getNthParamVar(0);
-    Bexpression *ve1 = be->var_expression(p0, VE_rvalue, h.newloc());
+    Bexpression *ve1 = be->var_expression(p0, h.newloc());
 
     Bstatement *retparm = mkMemReturn(be, func, rtmp, ve1);
     Bstatement *ret22 = mkMemReturn(be, func, rtmp, mkInt64Const(be, 22));
diff --git a/unittests/BackendCore/BackendTreeIntegrity.cpp b/unittests/BackendCore/BackendTreeIntegrity.cpp
index c0fa2dc..a03dc2b 100644
--- a/unittests/BackendCore/BackendTreeIntegrity.cpp
+++ b/unittests/BackendCore/BackendTreeIntegrity.cpp
@@ -28,7 +28,7 @@
   // Create "2 + x"
   Btype *bi64t = be->integer_type(false, 64);
   Bvariable *xv = h.mkLocal("x", bi64t);
-  Bexpression *vex = be->var_expression(xv, VE_rvalue, loc);
+  Bexpression *vex = be->var_expression(xv, loc);
   Bexpression *bl1 = mkInt64Const(be, 2);
   Bexpression *badd1 = be->binary_expression(OPERATOR_PLUS, bl1, vex, loc);
   Bstatement *es = be->expression_statement(func, badd1);
@@ -75,7 +75,7 @@
   Bvariable *loc2 = be->local_variable(func, "loc2", bi64t, true, loc);
 
   // Create "loc1" varexpr, then supply to more than one statement
-  Bexpression *ve = be->var_expression(loc1, VE_rvalue, loc);
+  Bexpression *ve = be->var_expression(loc1, loc);
   Bstatement *es1 = be->expression_statement(func, ve);
   Bblock *block = mkBlockFromStmt(be.get(), func, es1);
   Bstatement *es2 = be->expression_statement(func, ve);
@@ -89,7 +89,7 @@
 
   be->nodeBuilder().destroy(block, DelBoth);
 
-  Bexpression *ve3 = be->var_expression(loc2, VE_rvalue, loc);
+  Bexpression *ve3 = be->var_expression(loc2, loc);
   Bstatement *es3 = be->expression_statement(func, ve3);
   Bblock *block2 = mkBlockFromStmt(be.get(), func, es3);
 
diff --git a/unittests/BackendCore/BackendVarTests.cpp b/unittests/BackendCore/BackendVarTests.cpp
index fee4cf7..f94e7ed 100644
--- a/unittests/BackendCore/BackendVarTests.cpp
+++ b/unittests/BackendCore/BackendVarTests.cpp
@@ -47,12 +47,12 @@
   EXPECT_TRUE(loc1 != loc2 && loc1->value() != loc2->value());
 
   // Test var_expression created from local variable
-  Bexpression *ve1 = be->var_expression(loc1, VE_lvalue, Location());
+  Bexpression *ve1 = be->var_expression(loc1, Location());
   ASSERT_TRUE(ve1 != nullptr);
   EXPECT_EQ(ve1->value(), loc1->value());
 
   // Test var_expression created from local variable
-  Bexpression *ve2 = be->var_expression(loc1, VE_rvalue, Location());
+  Bexpression *ve2 = be->var_expression(loc1, Location());
   ASSERT_TRUE(ve2 != nullptr);
   Bstatement *es = h.mkExprStmt(ve2);
   EXPECT_EQ(repr(ve2->value()), "%loc1 = alloca i64");
@@ -88,7 +88,7 @@
   EXPECT_TRUE(isa<AllocaInst>(p2->value()));
 
   // Test var_expression created from param variable
-  Bexpression *ve1 = be->var_expression(p1, VE_lvalue, Location());
+  Bexpression *ve1 = be->var_expression(p1, Location());
   ASSERT_TRUE(ve1 != nullptr);
   EXPECT_EQ(ve1->value(), p1->value());
 
@@ -120,7 +120,7 @@
   be->global_variable_set_init(g1, mkInt32Const(be.get(), 101));
 
   // Test var_expression created from global variable
-  Bexpression *ve1 = be->var_expression(g1, VE_lvalue, Location());
+  Bexpression *ve1 = be->var_expression(g1, Location());
   ASSERT_TRUE(ve1 != nullptr);
   EXPECT_EQ(ve1->value(), g1->value());
 
@@ -510,8 +510,8 @@
   Bstatement *is2 = be->init_statement(func, y, be->zero_expression(bst));
 
   // x := y.f1
-  Bexpression *ve1 = be->var_expression(x, VE_lvalue, loc);
-  Bexpression *ve2 = be->var_expression(y, VE_rvalue, loc);
+  Bexpression *ve1 = be->var_expression(x, loc);
+  Bexpression *ve2 = be->var_expression(y, loc);
   Bexpression *fex = be->struct_field_expression(ve2, 1, loc);
   Bstatement *as =
       be->assignment_statement(func, ve1, fex, loc);
@@ -651,21 +651,21 @@
   // some accesses to them.
 
   // emptys2f.f1 = emptystruct
-  Bexpression *vex1 = be->var_expression(gs2, VE_lvalue, loc);
+  Bexpression *vex1 = be->var_expression(gs2, loc);
   Bexpression *fex1 = be->struct_field_expression(vex1, 0, loc);
-  Bexpression *vex2 = be->var_expression(gs1, VE_rvalue, loc);
+  Bexpression *vex2 = be->var_expression(gs1, loc);
   h.mkAssign(fex1, vex2);
 
   // localemptys2f = emptys2f
   Bvariable *loc1 = h.mkLocal("localemptys2f", bef2);
-  Bexpression *vex3 = be->var_expression(loc1, VE_lvalue, loc);
-  Bexpression *vex4 = be->var_expression(gs2, VE_rvalue, loc);
+  Bexpression *vex3 = be->var_expression(loc1, loc);
+  Bexpression *vex4 = be->var_expression(gs2, loc);
   h.mkAssign(vex3, vex4);
 
   // localemptyintar = emptyintar
   Bvariable *loc2 = h.mkLocal("localemptyintar", atint0);
-  Bexpression *vex5 = be->var_expression(loc2, VE_lvalue, loc);
-  Bexpression *vex6 = be->var_expression(ga2, VE_rvalue, loc);
+  Bexpression *vex5 = be->var_expression(loc2, loc);
+  Bexpression *vex6 = be->var_expression(ga2, loc);
   h.mkAssign(vex5, vex6);
 
   bool broken = h.finish(StripDebugInfo);