Index: src/SynTree/AddressExpr.cc
===================================================================
--- src/SynTree/AddressExpr.cc	(revision 4a6048888d2c5b87f57f18dd27293dda6de1a8d8)
+++ src/SynTree/AddressExpr.cc	(revision 396b830fbd39b9c51314bba40c12d1cca6f9fc52)
@@ -53,6 +53,4 @@
 			} // if
 		}
-		// result of & is never an lvalue
-		get_result()->set_lvalue( false );
 	}
 }
Index: src/SynTree/ArrayType.cc
===================================================================
--- src/SynTree/ArrayType.cc	(revision 4a6048888d2c5b87f57f18dd27293dda6de1a8d8)
+++ src/SynTree/ArrayType.cc	(revision 396b830fbd39b9c51314bba40c12d1cca6f9fc52)
@@ -26,5 +26,4 @@
 ArrayType::ArrayType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes )
 	: Type( tq, attributes ), base( base ), dimension( dimension ), isVarLen( isVarLen ), isStatic( isStatic ) {
-	base->set_lvalue( false );
 }
 
Index: src/SynTree/CommaExpr.cc
===================================================================
--- src/SynTree/CommaExpr.cc	(revision 4a6048888d2c5b87f57f18dd27293dda6de1a8d8)
+++ src/SynTree/CommaExpr.cc	(revision 396b830fbd39b9c51314bba40c12d1cca6f9fc52)
@@ -23,9 +23,5 @@
 CommaExpr::CommaExpr( Expression *arg1, Expression *arg2 )
 		: Expression(), arg1( arg1 ), arg2( arg2 ) {
-	// xxx - result of a comma expression is never an lvalue, so should set lvalue
-	// to false on all result types. Actually doing this causes some strange things
-	// to happen in later passes (particularly, Specialize, Lvalue, and Box). This needs to be looked into.
 	set_result( maybeClone( arg2->get_result() ) );
-	// get_type->set_isLvalue( false );
 }
 
@@ -41,4 +37,5 @@
 bool CommaExpr::get_lvalue() const {
 	// This is wrong by C, but the current implementation uses it.
+	// (ex: Specialize, Lvalue and Box)
 	return arg2->get_lvalue();
 }
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 4a6048888d2c5b87f57f18dd27293dda6de1a8d8)
+++ src/SynTree/Expression.cc	(revision 396b830fbd39b9c51314bba40c12d1cca6f9fc52)
@@ -115,5 +115,4 @@
 	assert( var->get_type() );
 	Type * type = var->get_type()->clone();
-	type->set_lvalue( true );
 
 	// xxx - doesn't quite work yet - get different alternatives with the same cost
@@ -125,5 +124,5 @@
 	// 	long long int value;
 	// 	if ( decl->valueOf( var, value ) ) {
-	// 		type->set_lvalue( false );
+	// 		type->set_lvalue( false ); // Would have to move to get_lvalue.
 	// 	}
 	// }
@@ -384,5 +383,4 @@
 	sub.apply( res );
 	result = res;
-	result->set_lvalue( true );
 	result->get_qualifiers() |= aggregate->result->get_qualifiers();
 }
@@ -433,7 +431,4 @@
 			// if references are still allowed in the AST, dereference returns a reference
 			ret->set_result( new ReferenceType( Type::Qualifiers(), ret->get_result() ) );
-		} else {
-			// references have been removed, in which case dereference returns an lvalue of the base type.
-			ret->result->set_lvalue( true );
 		}
 	}
@@ -591,5 +586,4 @@
 CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : initializer( initializer ) {
 	assert( type && initializer );
-	type->set_lvalue( true );
 	set_result( type );
 }
Index: src/SynTree/TopLvalue.cc
===================================================================
--- src/SynTree/TopLvalue.cc	(revision 4a6048888d2c5b87f57f18dd27293dda6de1a8d8)
+++ 	(revision )
@@ -1,132 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// TopLvalue.cc -- Check and force that lvalue is only at the top of types.
-//
-// Author           : Andrew Beach
-// Created On       : Wed Jul 31 15:49:00 2019
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Aug  7 15:36:00 2019
-// Update Count     : 0
-//
-
-#include <iostream>
-
-#include "Common/PassVisitor.h"
-
-namespace {
-	class TopLvalue : public WithGuards {
-		bool inType = false;
-	public:
-		void previsit( const BaseSyntaxNode * ) {
-			if ( inType ) {
-				GuardValue( inType );
-				inType = false;
-			}
-		}
-
-		void previsit( const Type * type ) {
-			if ( inType ) {
-				assert( !type->get_lvalue() );
-			} else {
-				GuardValue( inType );
-				inType = true;
-			}
-		}
-
-	};
-
-	class ClearLvalue : public WithGuards {
-		bool inType = false;
-	public:
-		void previsit( BaseSyntaxNode * ) {
-			if ( inType ) {
-				GuardValue( inType );
-				inType = false;
-			}
-		}
-
-		void previsit( Type * type ) {
-			if ( !inType ) {
-				GuardValue( inType );
-				inType = true;
-			} else if ( type->get_lvalue() ) {
-				type->set_lvalue( false );
-			}
-		}
-	};
-
-	class TopLvaluePrint : public WithGuards, public WithShortCircuiting {
-		bool failed = false;
-		bool inType = false;
-		bool typeTop = false;
-	public:
-		bool failedAny = false;
-		void previsit() {
-			if ( failed ) {
-				visit_children = false;
-			} else if ( typeTop ) {
-				GuardValue( typeTop );
-				typeTop = false;
-			}
-		}
-
-		void previsit( const BaseSyntaxNode * ) {
-			previsit();
-			if ( inType ) {
-				GuardValue( inType );
-				inType = false;
-			}
-		}
-
-		void previsit( const Type * type ) {
-			previsit();
-			if ( inType ) {
-				if ( type->get_lvalue() ) {
-					failed = true;
-					failedAny = true;
-					visit_children = false;
-					std::cout << type->location << std::endl;
-				}
-				//assert( !type->get_lvalue() );
-			} else {
-				GuardValue( inType );
-				inType = true;
-				typeTop = true;
-			}
-		}
-
-		void postvisit( const Type * type ) {
-			if ( typeTop ) {
-				if ( failed ) {
-					std::cout << type->location << std::endl;
-					type->print( std::cout );
-					//assert( !failed );
-					failed = false;
-				}
-				typeTop = false;
-			}
-		}
-	};
-}
-
-void assertTopLvalue( const std::list< Declaration * > & translationUnit ) {
-	PassVisitor< TopLvaluePrint > visitor;
-	acceptAll( translationUnit, visitor );
-	assert( !visitor.pass.failedAny );
-}
-
-void clearInnerLvalue( std::list< Declaration * > & translationUnit ) {
-	PassVisitor< ClearLvalue > visitor;
-	acceptAll( translationUnit, visitor );
-}
-
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/SynTree/TopLvalue.h
===================================================================
--- src/SynTree/TopLvalue.h	(revision 4a6048888d2c5b87f57f18dd27293dda6de1a8d8)
+++ 	(revision )
@@ -1,34 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// TopLvalue.h -- Check and force that lvalue is only at the top of types.
-//
-// Author           : Andrew Beach
-// Created On       : Wed Jul 31 16:04:00 2019
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Aug  7 15:26:00 2019
-// Update Count     : 0
-//
-
-#include <list>
-class Declaration;
-
-void assertTopLvalue( const std::list< Declaration * > & translationUnit );
-/* Assert that all lvalue qualifiers are set on the top level.
- *
- * Does not return if the test fails.
- */
-
-void clearInnerLvalue( std::list< Declaration * > & translationUnit );
-/* Make all types that are not at the top level rvalues (not-lvalues).
- */
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
-
Index: src/SynTree/TupleExpr.cc
===================================================================
--- src/SynTree/TupleExpr.cc	(revision 4a6048888d2c5b87f57f18dd27293dda6de1a8d8)
+++ src/SynTree/TupleExpr.cc	(revision 396b830fbd39b9c51314bba40c12d1cca6f9fc52)
@@ -71,6 +71,4 @@
 	assertf( type->size() > index, "TupleIndexExpr index out of bounds: tuple size %d, requested index %d in expr %s", type->size(), index, toString( tuple ).c_str() );
 	set_result( (*std::next( type->get_types().begin(), index ))->clone() );
-	// like MemberExpr, TupleIndexExpr is always an lvalue
-	get_result()->set_lvalue( true );
 }
 
Index: src/SynTree/Type.cc
===================================================================
--- src/SynTree/Type.cc	(revision 4a6048888d2c5b87f57f18dd27293dda6de1a8d8)
+++ src/SynTree/Type.cc	(revision 396b830fbd39b9c51314bba40c12d1cca6f9fc52)
@@ -85,5 +85,5 @@
 const char * Type::FuncSpecifiersNames[] = { "inline", "_Noreturn", "fortran" };
 const char * Type::StorageClassesNames[] = { "extern", "static", "auto", "register", "_Thread_local" };
-const char * Type::QualifiersNames[] = { "const", "restrict", "volatile", "lvalue", "mutex", "_Atomic" };
+const char * Type::QualifiersNames[] = { "const", "restrict", "volatile", "mutex", "_Atomic" };
 
 Type * Type::stripDeclarator() {
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 4a6048888d2c5b87f57f18dd27293dda6de1a8d8)
+++ src/SynTree/Type.h	(revision 396b830fbd39b9c51314bba40c12d1cca6f9fc52)
@@ -102,8 +102,8 @@
 	}; // StorageClasses
 
-	enum { Const = 1 << 0, Restrict = 1 << 1, Volatile = 1 << 2, Lvalue = 1 << 3, Mutex = 1 << 4, Atomic = 1 << 5, NumTypeQualifier = 6 };
+	enum { Const = 1 << 0, Restrict = 1 << 1, Volatile = 1 << 2, Mutex = 1 << 3, Atomic = 1 << 4, NumTypeQualifier = 5 };
 	static const char * QualifiersNames[];
 	union Qualifiers {
-		enum { Mask = ~(Restrict | Lvalue) };
+		enum { Mask = ~Restrict };
 		unsigned int val;
 		struct {
@@ -111,5 +111,4 @@
 			bool is_restrict : 1;
 			bool is_volatile : 1;
-			bool is_lvalue : 1;
 			bool is_mutex : 1;
 			bool is_atomic : 1;
@@ -153,5 +152,4 @@
 	bool get_volatile() const { return tq.is_volatile; }
 	bool get_restrict() const { return tq.is_restrict; }
-	bool get_lvalue() const { return tq.is_lvalue; }
 	bool get_mutex() const { return tq.is_mutex; }
 	bool get_atomic() const { return tq.is_atomic; }
@@ -159,5 +157,4 @@
 	void set_volatile( bool newValue ) { tq.is_volatile = newValue; }
 	void set_restrict( bool newValue ) { tq.is_restrict = newValue; }
-	void set_lvalue( bool newValue ) { tq.is_lvalue = newValue; }
 	void set_mutex( bool newValue ) { tq.is_mutex = newValue; }
 	void set_atomic( bool newValue ) { tq.is_atomic = newValue; }
Index: src/SynTree/module.mk
===================================================================
--- src/SynTree/module.mk	(revision 4a6048888d2c5b87f57f18dd27293dda6de1a8d8)
+++ src/SynTree/module.mk	(revision 396b830fbd39b9c51314bba40c12d1cca6f9fc52)
@@ -49,6 +49,5 @@
       SynTree/TypeSubstitution.cc \
       SynTree/Attribute.cc \
-      SynTree/DeclReplacer.cc \
-      SynTree/TopLvalue.cc
+      SynTree/DeclReplacer.cc
 
 SRC += $(SRC_SYNTREE)
