Index: translator/GenPoly/Box.cc
===================================================================
--- translator/GenPoly/Box.cc	(revision 6c3744ea42a3b5b7c0caad3216f7a909daf8e9ed)
+++ translator/GenPoly/Box.cc	(revision 42e2ad789d5cd89e0f2a67a8f6507c685dbdc4ef)
@@ -772,5 +772,5 @@
 	Expression *Pass1::mutate( AddressExpr *addrExpr ) {
 	    assert( !addrExpr->get_arg()->get_results().empty() );
-	    mutateExpression( addrExpr->get_arg() );
+	    addrExpr->set_arg( mutateExpression( addrExpr->get_arg() ) );
 	    if ( isPolyType( addrExpr->get_arg()->get_results().front(), env, scopeTyVars ) ) {
 		Expression *ret = addrExpr->get_arg();
Index: translator/GenPoly/ScrubTyVars.cc
===================================================================
--- translator/GenPoly/ScrubTyVars.cc	(revision 6c3744ea42a3b5b7c0caad3216f7a909daf8e9ed)
+++ translator/GenPoly/ScrubTyVars.cc	(revision 42e2ad789d5cd89e0f2a67a8f6507c685dbdc4ef)
@@ -4,49 +4,48 @@
 #include "SynTree/Mutator.h"
 #include "SynTree/Type.h"
+#include "SynTree/Expression.h"
 
 
 namespace GenPoly {
+    Type * ScrubTyVars::mutate( TypeInstType *typeInst ) {
+	TyVarMap::const_iterator tyVar = tyVars.find( typeInst->get_name() );
+	if ( doAll || tyVar != tyVars.end() ) {
+	    switch( tyVar->second ) {
+	      case TypeDecl::Any:
+	      case TypeDecl::Dtype:
+		{
+		    PointerType *ret = new PointerType( Type::Qualifiers(), new VoidType( typeInst->get_qualifiers() ) );
+		    delete typeInst;
+		    return ret;
+		}
+	      case TypeDecl::Ftype:
+		delete typeInst;
+		return new PointerType( Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) );
+	    }
+	}
+	return typeInst;
+    }
 
-Type* 
-ScrubTyVars::mutate( TypeInstType *typeInst )
-{
-  TyVarMap::const_iterator tyVar = tyVars.find( typeInst->get_name() );
-  if( doAll || tyVar != tyVars.end() ) {
-    switch( tyVar->second ) {
-    case TypeDecl::Any:
-    case TypeDecl::Dtype:
-    {
-      PointerType *ret = new PointerType( Type::Qualifiers(), new VoidType( typeInst->get_qualifiers() ) );
-      delete typeInst;
-      return ret;
+    Expression * ScrubTyVars::mutate( SizeofExpr *szeof ) {
+	// sizeof( T ) => T parameter, which is the size of T
+	if ( TypeInstType *typeInst = dynamic_cast< TypeInstType * >( szeof->get_type() ) ) {
+	    Expression *expr = new NameExpr( typeInst->get_name() );
+	    return expr;
+	} else {
+	    return Mutator::mutate( szeof );
+	}
     }
-      
-    case TypeDecl::Ftype:
-      delete typeInst;
-      return new PointerType( Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) );
+
+    Type * ScrubTyVars::mutate( PointerType *pointer ) {
+	if ( TypeInstType *typeInst = dynamic_cast< TypeInstType * >( pointer->get_base() ) ) {
+	    if ( doAll || tyVars.find( typeInst->get_name() ) != tyVars.end() ) {
+		Type *ret = mutate( typeInst );
+		ret->get_qualifiers() += pointer->get_qualifiers();
+		pointer->set_base( 0 );
+		delete pointer;
+		return ret;
+	    }
+	}
+	return Mutator::mutate( pointer );
     }
-  }
-  return typeInst;
-}
-
-Type* 
-ScrubTyVars::mutate( PointerType *pointer )
-{
-  if( TypeInstType *typeInst = dynamic_cast< TypeInstType * >( pointer->get_base() ) ) {
-    if( doAll || tyVars.find( typeInst->get_name() ) != tyVars.end() ) {
-      Type *ret = mutate( typeInst );
-///       std::cout << "pointer is ";
-///       pointer->print( std::cout );
-///       std::cout << std::endl << "ret is ";
-///       ret->print( std::cout );
-///       std::cout << std::endl;
-      ret->get_qualifiers() += pointer->get_qualifiers();
-      pointer->set_base( 0 );
-      delete pointer;
-      return ret;
-    }
-  }
-  return Mutator::mutate( pointer );
-}
-
 } // namespace GenPoly
Index: translator/GenPoly/ScrubTyVars.h
===================================================================
--- translator/GenPoly/ScrubTyVars.h	(revision 6c3744ea42a3b5b7c0caad3216f7a909daf8e9ed)
+++ translator/GenPoly/ScrubTyVars.h	(revision 42e2ad789d5cd89e0f2a67a8f6507c685dbdc4ef)
@@ -1,9 +1,2 @@
-/*
- * This file is part of the Cforall project
- *
- * $Id: ScrubTyVars.h,v 1.4 2005/08/29 20:14:13 rcbilson Exp $
- *
- */
-
 #ifndef GENPOLY_SCRUBTYVARS_H
 #define GENPOLY_SCRUBTYVARS_H
@@ -15,43 +8,36 @@
 
 namespace GenPoly {
+    class ScrubTyVars : public Mutator {
+      public:
+	ScrubTyVars( bool doAll, const TyVarMap &tyVars ): doAll( doAll ), tyVars( tyVars ) {}
+  
+	template< typename SynTreeClass >
+	static SynTreeClass *scrub( SynTreeClass *target, const TyVarMap &tyVars );
+	template< typename SynTreeClass >
+	static SynTreeClass *scrub( SynTreeClass *target );
+  
+	virtual Type* mutate( TypeInstType *typeInst );
+	Expression* mutate( SizeofExpr *szeof );
+	virtual Type* mutate( PointerType *pointer );
+      private:
+	bool doAll;
+	const TyVarMap &tyVars;
+    };
 
-class ScrubTyVars : public Mutator
-{
-public:
-  ScrubTyVars( bool doAll, const TyVarMap &tyVars ): doAll( doAll ), tyVars( tyVars ) {}
-  
-  template< typename SynTreeClass >
-  static SynTreeClass *scrub( SynTreeClass *target, const TyVarMap &tyVars );
-  template< typename SynTreeClass >
-  static SynTreeClass *scrub( SynTreeClass *target );
-  
-  virtual Type* mutate( TypeInstType *typeInst );
-  virtual Type* mutate( PointerType *pointer );
+    /* static class method */
+    template< typename SynTreeClass >
+    SynTreeClass * ScrubTyVars::scrub( SynTreeClass *target, const TyVarMap &tyVars ) {
+	ScrubTyVars scrubber( false, tyVars );
+	return static_cast< SynTreeClass * >( target->acceptMutator( scrubber ) );
+    }
 
-private:
-  bool doAll;
-  const TyVarMap &tyVars;
-};
-
-/* static class method */
-template< typename SynTreeClass >
-SynTreeClass *
-ScrubTyVars::scrub( SynTreeClass *target, const TyVarMap &tyVars )
-{
-  ScrubTyVars scrubber( false, tyVars );
-  return static_cast< SynTreeClass* >( target->acceptMutator( scrubber ) );
-}
-
-/* static class method */
-template< typename SynTreeClass >
-SynTreeClass *
-ScrubTyVars::scrub( SynTreeClass *target )
-{
-  TyVarMap tyVars;
-  ScrubTyVars scrubber( true, tyVars );
-  return static_cast< SynTreeClass* >( target->acceptMutator( scrubber ) );
-}
-
+    /* static class method */
+    template< typename SynTreeClass >
+    SynTreeClass * ScrubTyVars::scrub( SynTreeClass *target ) {
+	TyVarMap tyVars;
+	ScrubTyVars scrubber( true, tyVars );
+	return static_cast< SynTreeClass* >( target->acceptMutator( scrubber ) );
+    }
 } // namespace GenPoly
 
-#endif /* #ifndef GENPOLY_SCRUBTYVARS_H */
+#endif // GENPOLY_SCRUBTYVARS_H
