Index: src/ResolvExpr/ConversionCost.cc
===================================================================
--- src/ResolvExpr/ConversionCost.cc	(revision 158b026fb8f759ed1b6cebe96e8a07ccb25235cb)
+++ src/ResolvExpr/ConversionCost.cc	(revision 849720f09e161bb0a6d5dba500bf709d48c37197)
@@ -157,5 +157,4 @@
 			if ( typesCompatibleIgnoreQualifiers( src, destAsRef->base, indexer, env ) ) {
 				PRINT( std::cerr << "converting compatible base type" << std::endl; )
-				assert( src->get_lvalue() == srcIsLvalue );
 				if ( srcIsLvalue ) {
 					PRINT(
Index: src/SynTree/ApplicationExpr.cc
===================================================================
--- src/SynTree/ApplicationExpr.cc	(revision 158b026fb8f759ed1b6cebe96e8a07ccb25235cb)
+++ src/SynTree/ApplicationExpr.cc	(revision 849720f09e161bb0a6d5dba500bf709d48c37197)
@@ -25,4 +25,5 @@
 #include "Declaration.h"         // for Declaration
 #include "Expression.h"          // for ParamEntry, ApplicationExpr, Expression
+#include "InitTweak/InitTweak.h" // for getFunction
 #include "ResolvExpr/typeops.h"  // for extractResultType
 #include "Type.h"                // for Type, PointerType, FunctionType
@@ -77,5 +78,10 @@
 
 bool ApplicationExpr::get_lvalue() const {
-	return result->get_lvalue();
+	// from src/GenPoly/Lvalue.cc: isIntrinsicReference
+	static std::set<std::string> lvalueFunctions = { "*?", "?[?]" };
+	if ( const DeclarationWithType * func = InitTweak::getFunction( this ) ) {
+		return func->linkage == LinkageSpec::Intrinsic && lvalueFunctions.count(func->name);
+	}
+	return false;
 }
 
Index: src/SynTree/CommaExpr.cc
===================================================================
--- src/SynTree/CommaExpr.cc	(revision 158b026fb8f759ed1b6cebe96e8a07ccb25235cb)
+++ src/SynTree/CommaExpr.cc	(revision 849720f09e161bb0a6d5dba500bf709d48c37197)
@@ -40,6 +40,6 @@
 
 bool CommaExpr::get_lvalue() const {
-	// xxx - as above, shouldn't be an lvalue but that information is used anyways.
-	return result->get_lvalue();
+	// This is wrong by C, but the current implementation uses it.
+	return arg2->get_lvalue();
 }
 
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 158b026fb8f759ed1b6cebe96e8a07ccb25235cb)
+++ src/SynTree/Expression.cc	(revision 849720f09e161bb0a6d5dba500bf709d48c37197)
@@ -19,4 +19,5 @@
 #include <iostream>                  // for ostream, operator<<, basic_ostream
 #include <list>                      // for list, _List_iterator, list<>::co...
+#include <set>                       // for set
 
 #include "Common/utility.h"          // for maybeClone, cloneAll, deleteAll
@@ -64,5 +65,4 @@
 
 bool Expression::get_lvalue() const {
-	assert( !result->get_lvalue() );
 	return false;
 }
@@ -140,5 +140,6 @@
 
 bool VariableExpr::get_lvalue() const {
-	return result->get_lvalue();
+	// It isn't always an lvalue, but it is never an rvalue.
+	return true;
 }
 
@@ -277,5 +278,6 @@
 
 bool CastExpr::get_lvalue() const {
-	return result->get_lvalue();
+	// This is actually wrong by C, but it works with our current set-up.
+	return arg->get_lvalue();
 }
 
@@ -360,4 +362,8 @@
 }
 
+bool UntypedMemberExpr::get_lvalue() const {
+	return aggregate->get_lvalue();
+}
+
 void UntypedMemberExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Untyped Member Expression, with field: " << std::endl << indent+1;
@@ -392,5 +398,5 @@
 
 bool MemberExpr::get_lvalue() const {
-	assert( result->get_lvalue() );
+	// This is actually wrong by C, but it works with our current set-up.
 	return true;
 }
@@ -447,5 +453,8 @@
 
 bool UntypedExpr::get_lvalue() const {
-	return result->get_lvalue();
+	// from src/GenPoly/Lvalue.cc: isIntrinsicReference
+	static std::set<std::string> lvalueFunctions = { "*?", "?[?]" };
+	std::string fname = InitTweak::getFunctionName( const_cast< UntypedExpr * >( this ) );
+	return lvalueFunctions.count(fname);
 }
 
@@ -510,5 +519,5 @@
 
 bool ConditionalExpr::get_lvalue() const {
-	return result->get_lvalue();
+	return false;
 }
 
@@ -570,5 +579,5 @@
 
 bool ConstructorExpr::get_lvalue() const {
-	return result->get_lvalue();
+	return false;
 }
 
@@ -593,5 +602,4 @@
 
 bool CompoundLiteralExpr::get_lvalue() const {
-	assert( result->get_lvalue() );
 	return true;
 }
@@ -648,5 +656,5 @@
 }
 bool StmtExpr::get_lvalue() const {
-	return result->get_lvalue();
+	return false;
 }
 void StmtExpr::print( std::ostream & os, Indenter indent ) const {
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 158b026fb8f759ed1b6cebe96e8a07ccb25235cb)
+++ src/SynTree/Expression.h	(revision 849720f09e161bb0a6d5dba500bf709d48c37197)
@@ -275,4 +275,6 @@
 	virtual ~UntypedMemberExpr();
 
+	bool get_lvalue() const final;
+
 	Expression * get_member() const { return member; }
 	void set_member( Expression * newValue ) { member = newValue; }
Index: src/SynTree/TupleExpr.cc
===================================================================
--- src/SynTree/TupleExpr.cc	(revision 158b026fb8f759ed1b6cebe96e8a07ccb25235cb)
+++ src/SynTree/TupleExpr.cc	(revision 849720f09e161bb0a6d5dba500bf709d48c37197)
@@ -58,5 +58,5 @@
 
 bool TupleExpr::get_lvalue() const {
-	return result->get_lvalue();
+	return false;
 }
 
@@ -83,6 +83,5 @@
 
 bool TupleIndexExpr::get_lvalue() const {
-	assert( result->get_lvalue() );
-	return true;
+	return tuple->get_lvalue();
 }
 
