Index: src/Tuples/TupleExpansion.cc
===================================================================
--- src/Tuples/TupleExpansion.cc	(revision c0aa3360803b4a312708b494a8067a91f03e9e8f)
+++ 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;
