Index: src/AST/Expr.cpp
===================================================================
--- src/AST/Expr.cpp	(revision 4a6048888d2c5b87f57f18dd27293dda6de1a8d8)
+++ src/AST/Expr.cpp	(revision cf32116a7c8c54e0d0839465e3e60ca0be290dbc)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 15 17:00:00 2019
 // Last Modified By : Andrew Beach
-// Created On       : Thr Jun 13 13:38:00 2019
-// Update Count     : 2
+// Created On       : Thr Jun 26 12:12:00 2019
+// Update Count     : 3
 //
 
@@ -23,4 +23,5 @@
 #include "Eval.hpp"                // for call
 #include "GenericSubstitution.hpp"
+#include "LinkageSpec.hpp"
 #include "Stmt.hpp"
 #include "Type.hpp"
@@ -29,9 +30,18 @@
 #include "Common/SemanticError.h"
 #include "GenPoly/Lvalue.h"        // for referencesPermissable
-#include "InitTweak/InitTweak.h"   // for getPointerBase
+#include "InitTweak/InitTweak.h"   // for getFunction, getPointerBase
 #include "ResolvExpr/typeops.h"    // for extractResultType
 #include "Tuples/Tuples.h"         // for makeTupleType
 
 namespace ast {
+
+namespace {
+	std::set<std::string> const lvalueFunctionNames = {"*?", "?[?]"};
+}
+
+// --- Expr
+bool Expr::get_lvalue() const {
+	return false;
+}
 
 // --- ApplicationExpr
@@ -46,4 +56,11 @@
 	result = ResolvExpr::extractResultType( fn );
 	assert( result );
+}
+
+bool ApplicationExpr::get_lvalue() const {
+	if ( const DeclWithType * func = InitTweak::getFunction( this ) ) {
+		return func->linkage == Linkage::Intrinsic && lvalueFunctionNames.count( func->name );
+	}
+	return false;
 }
 
@@ -71,4 +88,9 @@
 }
 
+bool UntypedExpr::get_lvalue() const {
+	std::string fname = InitTweak::getFunctionName( this );
+	return lvalueFunctionNames.count( fname );
+}
+
 UntypedExpr * UntypedExpr::createAssign( const CodeLocation & loc, Expr * lhs, Expr * rhs ) {
 	assert( lhs && rhs );
@@ -106,5 +128,5 @@
 AddressExpr::AddressExpr( const CodeLocation & loc, const Expr * a ) : Expr( loc ), arg( a ) {
 	if ( arg->result ) {
-		if ( arg->result->is_lvalue() ) {
+		if ( arg->get_lvalue() ) {
 			// lvalue, retains all levels of reference, and gains a pointer inside the references
 			Type * res = addrType( arg->result );
@@ -137,4 +159,9 @@
 : Expr( loc, new VoidType{} ), arg( a ), isGenerated( g ) {}
 
+bool CastExpr::get_lvalue() const {
+	// This is actually wrong by C, but it works with our current set-up.
+	return arg->get_lvalue();
+}
+
 // --- KeywordCastExpr
 
@@ -150,4 +177,10 @@
 }
 
+// --- UntypedMemberExpr
+
+bool UntypedMemberExpr::get_lvalue() const {
+	return aggregate->get_lvalue();
+}
+
 // --- MemberExpr
 
@@ -210,4 +243,9 @@
 }
 
+bool MemberExpr::get_lvalue() const {
+	// This is actually wrong by C, but it works with our current set-up.
+	return true;
+}
+
 // --- VariableExpr
 
@@ -222,4 +260,9 @@
 	r->qualifiers |= CV::Lvalue;
 	result = r;
+}
+
+bool VariableExpr::get_lvalue() const {
+	// It isn't always an lvalue, but it is never an rvalue.
+	return true;
 }
 
@@ -308,4 +351,11 @@
 : Expr( loc, new BasicType{ BasicType::SignedInt } ), arg1( a1 ), arg2( a2 ), isAnd( ia ) {}
 
+// --- CommaExpr
+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();
+}
+
 // --- ConstructorExpr
 
@@ -329,4 +379,8 @@
 }
 
+bool CompoundLiteralExpr::get_lvalue() const {
+	return true;
+}
+
 // --- TupleExpr
 
@@ -344,4 +398,8 @@
 	result = type->types[ index ];
 	add_qualifiers( result, CV::Lvalue );
+}
+
+bool TupleIndexExpr::get_lvalue() const {
+	return tuple->get_lvalue();
 }
 
Index: src/AST/Expr.hpp
===================================================================
--- src/AST/Expr.hpp	(revision 4a6048888d2c5b87f57f18dd27293dda6de1a8d8)
+++ src/AST/Expr.hpp	(revision cf32116a7c8c54e0d0839465e3e60ca0be290dbc)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Fri May 10 10:30:00 2019
-// Last Modified By : Aaron B. Moss
-// Created On       : Fri May 10 10:30:00 2019
-// Update Count     : 1
+// Last Modified By : Andrew Beach
+// Created On       : Thr Sep 26 12:51:00 2019
+// Update Count     : 2
 //
 
@@ -187,4 +187,5 @@
 
 	Expr * set_extension( bool ex ) { extension = ex; return this; }
+	virtual bool get_lvalue() const;
 
 	virtual const Expr * accept( Visitor & v ) const override = 0;
@@ -203,4 +204,6 @@
 	ApplicationExpr( const CodeLocation & loc, const Expr * f, std::vector<ptr<Expr>> && as = {} );
 
+	bool get_lvalue() const final;
+
 	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
 private:
@@ -217,4 +220,6 @@
 	UntypedExpr( const CodeLocation & loc, const Expr * f, std::vector<ptr<Expr>> && as = {} )
 	: Expr( loc ), func( f ), args( std::move(as) ) {}
+
+	bool get_lvalue() const final;
 
 	/// Creates a new dereference expression
@@ -293,4 +298,6 @@
 	CastExpr( const Expr * a ) : CastExpr( a->location, a, GeneratedCast ) {}
 
+	bool get_lvalue() const final;
+
 	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
 private:
@@ -340,4 +347,6 @@
 	: Expr( loc ), member( mem ), aggregate( agg ) { assert( aggregate ); }
 
+	bool get_lvalue() const final;
+
 	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
 private:
@@ -353,4 +362,6 @@
 
 	MemberExpr( const CodeLocation & loc, const DeclWithType * mem, const Expr * agg );
+
+	bool get_lvalue() const final;
 
 	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
@@ -374,4 +385,6 @@
 	VariableExpr( const CodeLocation & loc );
 	VariableExpr( const CodeLocation & loc, const DeclWithType * v );
+
+	bool get_lvalue() const final;
 
 	/// generates a function pointer for a given function
@@ -545,4 +558,6 @@
 	}
 
+	bool get_lvalue() const final;
+
 	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
 private:
@@ -616,4 +631,6 @@
 	CompoundLiteralExpr( const CodeLocation & loc, const Type * t, const Init * i );
 
+	bool get_lvalue() const final;
+
 	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
 private:
@@ -671,4 +688,6 @@
 
 	TupleIndexExpr( const CodeLocation & loc, const Expr * t, unsigned i );
+
+	bool get_lvalue() const final;
 
 	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
