Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 992b089b757e9cf93e5640c3fdef4a53aab2e434)
+++ src/InitTweak/FixInit.cc	(revision aa9ee191287d197ed82aead2f0124d33ef7c31d1)
@@ -1116,4 +1116,6 @@
 			// xxx - is the size check necessary?
 			assert( ctorExpr->has_result() && ctorExpr->get_result()->size() == 1 );
+
+			// xxx - ideally we would reuse the temporary generated from the copy constructor passes from within firstArg if it exists and not generate a temporary if it's unnecessary.
 			ObjectDecl * tmp = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, nullptr, ctorExpr->get_result()->clone(), nullptr );
 			addDeclaration( tmp );
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision 992b089b757e9cf93e5640c3fdef4a53aab2e434)
+++ src/InitTweak/InitTweak.cc	(revision aa9ee191287d197ed82aead2f0124d33ef7c31d1)
@@ -332,4 +332,13 @@
 			return nullptr;
 		}
+	}
+
+	DeclarationWithType * getFunction( Expression * expr ) {
+		if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr ) ) {
+			return getCalledFunction( appExpr->get_function() );
+		} else if ( UntypedExpr * untyped = dynamic_cast< UntypedExpr * > ( expr ) ) {
+			return getCalledFunction( untyped->get_function() );
+		}
+		assertf( false, "getFunction received unknown expression: %s", toString( expr ).c_str() );
 	}
 
Index: src/InitTweak/InitTweak.h
===================================================================
--- src/InitTweak/InitTweak.h	(revision 992b089b757e9cf93e5640c3fdef4a53aab2e434)
+++ src/InitTweak/InitTweak.h	(revision aa9ee191287d197ed82aead2f0124d33ef7c31d1)
@@ -51,6 +51,9 @@
 	bool checkInitDepth( ObjectDecl * objDecl );
 
-  /// Non-Null if expr is a call expression whose target function is intrinsic
-  ApplicationExpr * isIntrinsicCallExpr( Expression * expr );
+	/// returns the declaration of the function called by the expr (must be ApplicationExpr or UntypedExpr)
+	DeclarationWithType * getFunction( Expression * expr );
+
+	/// Non-Null if expr is a call expression whose target function is intrinsic
+	ApplicationExpr * isIntrinsicCallExpr( Expression * expr );
 
 	/// True if stmt is a call statement where the function called is intrinsic and takes one parameter.
Index: src/Tuples/TupleExpansion.cc
===================================================================
--- src/Tuples/TupleExpansion.cc	(revision 992b089b757e9cf93e5640c3fdef4a53aab2e434)
+++ src/Tuples/TupleExpansion.cc	(revision aa9ee191287d197ed82aead2f0124d33ef7c31d1)
@@ -29,4 +29,5 @@
 #include "ResolvExpr/typeops.h"
 #include "InitTweak/GenInit.h"
+#include "InitTweak/InitTweak.h"
 
 namespace Tuples {
@@ -337,5 +338,16 @@
 		public:
 			typedef Visitor Parent;
-			virtual void visit( ApplicationExpr * appExpr ) { maybeImpure = true;	}
+			virtual void visit( ApplicationExpr * appExpr ) {
+				if ( DeclarationWithType * function = InitTweak::getFunction( appExpr ) ) {
+					if ( function->get_linkage() == LinkageSpec::Intrinsic ) {
+						if ( function->get_name() == "*?" || function->get_name() == "?[?]" ) {
+							// intrinsic dereference, subscript are pure, but need to recursively look for impurity
+							Parent::visit( appExpr );
+							return;
+						}
+					}
+				}
+				maybeImpure = true;
+			}
 			virtual void visit( UntypedExpr * untypedExpr ) { maybeImpure = true; }
 			bool maybeImpure = false;
