Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 31468a2b995c7c930b775e67316f1d4ea96aaa2c)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 85517ddb80a87a5c4695d8b50281ac0813ba271b)
@@ -42,4 +42,5 @@
 #include "Common/utility.h"
 #include "InitTweak/InitTweak.h"
+#include "ResolveTypeof.h"
 
 extern bool resolvep;
@@ -707,4 +708,5 @@
 	void AlternativeFinder::visit( CastExpr *castExpr ) {
 		for ( std::list< Type* >::iterator i = castExpr->get_results().begin(); i != castExpr->get_results().end(); ++i ) {
+			*i = resolveTypeof( *i, indexer );
 			SymTab::validateType( *i, &indexer );
 			adjustExprType( *i, env, indexer );
@@ -795,5 +797,7 @@
 
 	void AlternativeFinder::visit( VariableExpr *variableExpr ) {
-		alternatives.push_back( Alternative( variableExpr->clone(), env, Cost::zero ) );
+		// not sufficient to clone here, because variable's type may have changed
+		// since the VariableExpr was originally created.
+		alternatives.push_back( Alternative( new VariableExpr( variableExpr->get_var() ), env, Cost::zero ) );
 	}
 
@@ -804,4 +808,5 @@
 	void AlternativeFinder::visit( SizeofExpr *sizeofExpr ) {
 		if ( sizeofExpr->get_isType() ) {
+			// xxx - resolveTypeof?
 			alternatives.push_back( Alternative( sizeofExpr->clone(), env, Cost::zero ) );
 		} else {
@@ -823,4 +828,5 @@
 	void AlternativeFinder::visit( AlignofExpr *alignofExpr ) {
 		if ( alignofExpr->get_isType() ) {
+			// xxx - resolveTypeof?
 			alternatives.push_back( Alternative( alignofExpr->clone(), env, Cost::zero ) );
 		} else {
@@ -856,4 +862,5 @@
 	void AlternativeFinder::visit( UntypedOffsetofExpr *offsetofExpr ) {
 		AlternativeFinder funcFinder( indexer, env );
+		// xxx - resolveTypeof?
 		if ( StructInstType *structInst = dynamic_cast< StructInstType* >( offsetofExpr->get_type() ) ) {
 			addOffsetof( structInst, offsetofExpr->get_member() );
