Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision 677c1be0989eb8e5ed859540a0550f1788df1234)
+++ src/InitTweak/GenInit.cc	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
@@ -143,4 +143,10 @@
 		if ( tryConstruct( objDecl ) ) {
 			if ( inFunction ) {
+				// remove qualifiers so that const objects can be initialized, and attach the
+				// qualifiers to ConstructorInit so that they can be replaced after resolving
+				Type * type = objDecl->get_type();
+				Type::Qualifiers qualifiers = type->get_qualifiers();
+				type->get_qualifiers() = Type::Qualifiers();
+
 				if ( ArrayType * at = dynamic_cast< ArrayType * >( objDecl->get_type() ) ) {
 					// call into makeArrayFunction from validate.cc to generate calls to ctor/dtor for each element of array
@@ -165,5 +171,5 @@
 						assert( dtor.size() == 1 );
 
-						objDecl->set_init( new ConstructorInit( ctor.front(), dtor.front(), objDecl->get_init() ) );
+						objDecl->set_init( new ConstructorInit( ctor.front(), dtor.front(), objDecl->get_init(), objDecl, qualifiers ) );
 					} else {
 						// array came with an initializer list: initialize each element
@@ -185,5 +191,5 @@
 					ExprStmt * ctorStmt = new ExprStmt( noLabels, ctor );
 					ExprStmt * dtorStmt = new ExprStmt( noLabels, dtor );
-					objDecl->set_init( new ConstructorInit( ctorStmt, dtorStmt, objDecl->get_init() ) );
+					objDecl->set_init( new ConstructorInit( ctorStmt, dtorStmt, objDecl->get_init(), objDecl, qualifiers ) );
 				}
 			}
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision 677c1be0989eb8e5ed859540a0550f1788df1234)
+++ src/InitTweak/InitTweak.cc	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
@@ -83,3 +83,27 @@
     }
   }
+
+  namespace {
+    template<typename CallExpr>
+    std::string funcName( CallExpr * expr ) {
+      Expression * func = expr->get_function();
+      if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( func ) ) {
+        return nameExpr->get_name();
+      } else if ( VariableExpr * varExpr = dynamic_cast< VariableExpr * >( func ) ) {
+        return varExpr->get_var()->get_name();
+      } else {
+        assert( false && "Unexpected expression type being called as a function in call expression" );
+      }
+    }
+  }
+
+  std::string getFunctionName( Expression * expr ) {
+    if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr ) ) {
+      return funcName( appExpr );
+    } else if ( UntypedExpr * untypedExpr = dynamic_cast< UntypedExpr * > ( expr ) ) {
+      return funcName( untypedExpr );
+    } else {
+      assert( false && "Unexpected expression type passed to getFunctionName" );
+    }
+  }
 }
Index: src/InitTweak/InitTweak.h
===================================================================
--- src/InitTweak/InitTweak.h	(revision 677c1be0989eb8e5ed859540a0550f1788df1234)
+++ src/InitTweak/InitTweak.h	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
@@ -39,4 +39,7 @@
   /// Currently has assertions that make it less than fully general.
   bool isInstrinsicSingleArgCallStmt( Statement * expr );
+
+  /// returns the name of the function being called
+  std::string getFunctionName(Expression * expr);
 } // namespace
 
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 677c1be0989eb8e5ed859540a0550f1788df1234)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
@@ -39,4 +39,5 @@
 #include "Tuples/NameMatcher.h"
 #include "Common/utility.h"
+#include "InitTweak/InitTweak.h"
 
 extern bool resolvep;
@@ -546,7 +547,6 @@
 
 		{
-			NameExpr *fname = 0;;
-			if ( ( fname = dynamic_cast<NameExpr *>( untypedExpr->get_function()))
-				 && ( fname->get_name() == std::string("&&")) ) {
+			std::string fname = InitTweak::getFunctionName( untypedExpr );
+			if ( fname == "&&" ) {
 				VoidType v = Type::Qualifiers();		// resolve to type void *
 				PointerType pt( Type::Qualifiers(), v.clone() );
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 677c1be0989eb8e5ed859540a0550f1788df1234)
+++ src/ResolvExpr/Resolver.cc	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
@@ -492,8 +492,13 @@
 		} catch ( SemanticError ) {
 			// no alternatives for the constructor initializer - fallback on C-style initializer
-			// xxx- not sure if this makes a ton of sense - should maybe never be able to have this situation?
+			// xxx - not sure if this makes a ton of sense - should maybe never be able to have this situation?
+
+			// reset type qualifiers
+			ctorInit->get_object()->get_type()->get_qualifiers() = ctorInit->get_qualifiers();
 			fallbackInit( ctorInit );
 			return;
 		}
+		// reset type qualifiers
+		ctorInit->get_object()->get_type()->get_qualifiers() = ctorInit->get_qualifiers();
 
 		// found a constructor - can get rid of C-style initializer
Index: src/SynTree/Initializer.cc
===================================================================
--- src/SynTree/Initializer.cc	(revision 677c1be0989eb8e5ed859540a0550f1788df1234)
+++ src/SynTree/Initializer.cc	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
@@ -20,4 +20,7 @@
 
 Initializer::Initializer( bool maybeConstructed ) : maybeConstructed( maybeConstructed ) {}
+Initializer::Initializer( const Initializer & other ) : maybeConstructed( other.maybeConstructed ) {
+}
+
 
 Initializer::~Initializer() {}
@@ -39,7 +42,7 @@
 }
 
-SingleInit::~SingleInit() {}
-
-SingleInit *SingleInit::clone() const { return new SingleInit( *this); }
+SingleInit::~SingleInit() {
+	deleteAll(designators);
+}
 
 void SingleInit::print( std::ostream &os, int indent ) {
@@ -58,11 +61,10 @@
 
 ListInit::ListInit( const std::list<Initializer*> &_initializers, const std::list<Expression *> &_designators, bool maybeConstructed )
-	: Initializer( maybeConstructed), initializers( _initializers ), designators( _designators ) {
+	: Initializer( maybeConstructed ), initializers( _initializers ), designators( _designators ) {
 }
 
-ListInit::~ListInit() {}
-
-ListInit *ListInit::clone() const {
-	return new ListInit( *this );
+ListInit::~ListInit() {
+	deleteAll( initializers );
+	deleteAll( designators );
 }
 
@@ -84,12 +86,12 @@
 
 
-ConstructorInit::ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init ) : Initializer( true ), ctor( ctor ), dtor( dtor ), init( init ) {}
+ConstructorInit::ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init, ObjectDecl * object, Type::Qualifiers qualifiers ) : Initializer( true ), ctor( ctor ), dtor( dtor ), init( init ), object( object ), qualifiers( qualifiers ) {}
+ConstructorInit::ConstructorInit( const ConstructorInit &other ) : Initializer( other ), ctor( maybeClone( other.ctor ) ), dtor( maybeClone( other.dtor ) ), init( maybeClone( other.init ) ), object( other.object ), qualifiers( other.qualifiers ) {
+}
+
 ConstructorInit::~ConstructorInit() {
 	delete ctor;
+	delete dtor;
 	delete init;
-}
-
-ConstructorInit *ConstructorInit::clone() const {
-	return new ConstructorInit( *this );
 }
 
Index: src/SynTree/Initializer.h
===================================================================
--- src/SynTree/Initializer.h	(revision 677c1be0989eb8e5ed859540a0550f1788df1234)
+++ src/SynTree/Initializer.h	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
@@ -20,4 +20,5 @@
 #include "Visitor.h"
 #include "Mutator.h"
+#include "Type.h"
 
 #include <cassert>
@@ -28,4 +29,5 @@
 	//	Initializer( std::string _name = std::string(""), int _pos = 0 );
 	Initializer( bool maybeConstructed );
+	Initializer( const Initializer & other );
 	virtual ~Initializer();
 
@@ -68,5 +70,5 @@
 	std::list<Expression *> &get_designators() { return designators; }
 
-	virtual SingleInit *clone() const;
+	virtual SingleInit *clone() const { return new SingleInit( *this); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
 	virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }
@@ -94,5 +96,5 @@
 	std::list<Initializer*>::iterator end_initializers() { return initializers.end(); }
 
-	virtual ListInit *clone() const;
+	virtual ListInit *clone() const { return new ListInit( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
 	virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }
@@ -107,5 +109,6 @@
 class ConstructorInit : public Initializer {
   public:
-	ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init );
+	ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init, ObjectDecl * objectDecl, Type::Qualifiers qualifiers );
+	ConstructorInit( const ConstructorInit &other );
 	virtual ~ConstructorInit();
 
@@ -116,6 +119,10 @@
 	void set_init( Initializer * newValue ) { init = newValue; }
 	Initializer * get_init() const { return init; }
+	void set_object( ObjectDecl * newValue ) { object = newValue; }
+	ObjectDecl * get_object() const { return object; }
+	void set_qualifiers( Type::Qualifiers newValue ) { qualifiers = newValue; }
+	Type::Qualifiers get_qualifiers() { return qualifiers; }
 
-	virtual ConstructorInit *clone() const;
+	ConstructorInit *clone() const { return new ConstructorInit( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
 	virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }
@@ -128,4 +135,9 @@
 	// if an appropriate constructor definition is not found by the resolver
 	Initializer * init;
+	// Non-owned pointer back to the object being constructed
+	ObjectDecl * object;
+	// to construct const objects, need to first remove type qualifiers, then resolve
+	// then add qualifiers back onto object
+	Type::Qualifiers qualifiers;
 };
 
