Index: src/SynTree/Initializer.cc
===================================================================
--- src/SynTree/Initializer.cc	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
+++ src/SynTree/Initializer.cc	(revision f1b1e4c22ee1c825678ab38142bbcf3879708434)
@@ -86,6 +86,6 @@
 
 
-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( Statement * ctor, Statement * dtor, Initializer * init ) : Initializer( true ), ctor( ctor ), dtor( dtor ), init( init ) {}
+ConstructorInit::ConstructorInit( const ConstructorInit &other ) : Initializer( other ), ctor( maybeClone( other.ctor ) ), dtor( maybeClone( other.dtor ) ), init( maybeClone( other.init ) ) {
 }
 
Index: src/SynTree/Initializer.h
===================================================================
--- src/SynTree/Initializer.h	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
+++ src/SynTree/Initializer.h	(revision f1b1e4c22ee1c825678ab38142bbcf3879708434)
@@ -109,5 +109,5 @@
 class ConstructorInit : public Initializer {
   public:
-	ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init, ObjectDecl * objectDecl, Type::Qualifiers qualifiers );
+	ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init );
 	ConstructorInit( const ConstructorInit &other );
 	virtual ~ConstructorInit();
@@ -119,8 +119,4 @@
 	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; }
 
 	ConstructorInit *clone() const { return new ConstructorInit( *this ); }
@@ -135,9 +131,4 @@
 	// 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;
 };
 
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
+++ src/SynTree/Mutator.cc	(revision f1b1e4c22ee1c825678ab38142bbcf3879708434)
@@ -182,4 +182,9 @@
 }
 
+Statement *Mutator::mutate( ImplicitCtorDtorStmt *impCtorDtorStmt ) {
+	impCtorDtorStmt->set_callStmt( maybeMutate( impCtorDtorStmt->get_callStmt(), *this ) );
+	return impCtorDtorStmt;
+}
+
 Expression *Mutator::mutate( ApplicationExpr *applicationExpr ) {
 	mutateAll( applicationExpr->get_results(), *this );
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
+++ src/SynTree/Mutator.h	(revision f1b1e4c22ee1c825678ab38142bbcf3879708434)
@@ -52,4 +52,5 @@
 	virtual NullStmt* mutate( NullStmt *nullStmt );
 	virtual Statement* mutate( DeclStmt *declStmt );
+	virtual Statement* mutate( ImplicitCtorDtorStmt *impCtorDtorStmt );
 
 	virtual Expression* mutate( ApplicationExpr *applicationExpr );
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
+++ src/SynTree/Statement.cc	(revision f1b1e4c22ee1c825678ab38142bbcf3879708434)
@@ -358,5 +358,5 @@
 
 void CatchStmt::print( std::ostream &os, int indent ) const {
-	os << string( indent, ' ' ) << "Catch Statement" << endl;
+	os << "Catch Statement" << endl;
 
 	os << string( indent, ' ' ) << "... catching" << endl;
@@ -383,5 +383,5 @@
 
 void FinallyStmt::print( std::ostream &os, int indent ) const {
-	os << string( indent, ' ' ) << "Finally Statement" << endl;
+	os << "Finally Statement" << endl;
 	os << string( indent + 2, ' ' ) << "with block: " << endl;
 	block->print( os, indent + 4 );
@@ -393,4 +393,21 @@
 void NullStmt::print( std::ostream &os, int indent ) const {
 	os << "Null Statement" << endl ;
+}
+
+ImplicitCtorDtorStmt::ImplicitCtorDtorStmt( Statement * callStmt ) : Statement( std::list<Label>() ), callStmt( callStmt ) {
+	assert( callStmt );
+}
+
+ImplicitCtorDtorStmt::ImplicitCtorDtorStmt( const ImplicitCtorDtorStmt & other ) : Statement( other ), callStmt( other.callStmt ) {
+}
+
+ImplicitCtorDtorStmt::~ImplicitCtorDtorStmt() {
+}
+
+void ImplicitCtorDtorStmt::print( std::ostream &os, int indent ) const {
+	os << "Implicit Ctor Dtor Statement" << endl;
+	os << string( indent + 2, ' ' ) << "with Ctor/Dtor: ";
+	callStmt->print( os, indent + 2);
+	os << endl;
 }
 
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
+++ src/SynTree/Statement.h	(revision f1b1e4c22ee1c825678ab38142bbcf3879708434)
@@ -21,4 +21,5 @@
 #include "Mutator.h"
 #include "Common/SemanticError.h"
+#include "Type.h"
 
 class Statement {
@@ -394,5 +395,5 @@
 	virtual ~DeclStmt();
 
-	Declaration *get_decl() { return decl; }
+	Declaration *get_decl() const { return decl; }
 	void set_decl( Declaration *newValue ) { decl = newValue; }
 
@@ -404,4 +405,28 @@
 	Declaration *decl;
 };
+
+
+/// represents an implicit application of a constructor or destructor. Qualifiers are replaced
+/// immediately before and after the call so that qualified objects can be constructed
+/// with the same functions as unqualified objects.
+class ImplicitCtorDtorStmt : public Statement {
+  public:
+	ImplicitCtorDtorStmt( Statement * callStmt );
+	ImplicitCtorDtorStmt( const ImplicitCtorDtorStmt & other );
+	virtual ~ImplicitCtorDtorStmt();
+
+	Statement *get_callStmt() const { return callStmt; }
+	void set_callStmt( Statement * newValue ) { callStmt = newValue; }
+
+	virtual ImplicitCtorDtorStmt *clone() const { return new ImplicitCtorDtorStmt( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+
+  private:
+	// Non-owned pointer to the constructor/destructor statement
+	Statement * callStmt;
+};
+
 
 std::ostream & operator<<( std::ostream & out, Statement * statement );
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
+++ src/SynTree/SynTree.h	(revision f1b1e4c22ee1c825678ab38142bbcf3879708434)
@@ -56,4 +56,5 @@
 class DeclStmt;
 class NullStmt;
+class ImplicitCtorDtorStmt;
 
 class Expression;
Index: src/SynTree/Type.cc
===================================================================
--- src/SynTree/Type.cc	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
+++ src/SynTree/Type.cc	(revision f1b1e4c22ee1c825678ab38142bbcf3879708434)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// Type.cc -- 
+// Type.cc --
 //
 // Author           : Richard C. Bilson
@@ -54,4 +54,25 @@
 }
 
+void Type::Qualifiers::print( std::ostream &os, int indent ) const {
+	if ( isConst ) {
+		os << "const ";
+	} // if
+	if ( isVolatile ) {
+		os << "volatile ";
+	} // if
+	if ( isRestrict ) {
+		os << "restrict ";
+	} // if
+	if ( isLvalue ) {
+		os << "lvalue ";
+	} // if
+	if ( isAtomic ) {
+		os << "_Atomic ";
+	} // if
+	if ( isAttribute ) {
+		os << "__attribute(( )) ";
+	} // if
+}
+
 void Type::print( std::ostream &os, int indent ) const {
 	if ( ! forall.empty() ) {
@@ -60,22 +81,5 @@
 		os << std::string( indent+2, ' ' );
 	} // if
-	if ( tq.isConst ) {
-		os << "const ";
-	} // if
-	if ( tq.isVolatile ) {
-		os << "volatile ";
-	} // if
-	if ( tq.isRestrict ) {
-		os << "restrict ";
-	} // if
-	if ( tq.isLvalue ) {
-		os << "lvalue ";
-	} // if
-	if ( tq.isAtomic ) {
-		os << "_Atomic ";
-	} // if
-	if ( tq.isAttribute ) {
-		os << "__attribute(( )) ";
-	} // if
+	tq.print( os, indent );
 }
 
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
+++ src/SynTree/Type.h	(revision f1b1e4c22ee1c825678ab38142bbcf3879708434)
@@ -36,4 +36,5 @@
 		bool operator<( const Qualifiers &other );
 		bool operator>( const Qualifiers &other );
+		void print( std::ostream &os, int indent = 0 ) const;
 
 		bool isConst;
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
+++ src/SynTree/Visitor.cc	(revision f1b1e4c22ee1c825678ab38142bbcf3879708434)
@@ -152,4 +152,8 @@
 }
 
+void Visitor::visit( ImplicitCtorDtorStmt *impCtorDtorStmt ) {
+	maybeAccept( impCtorDtorStmt->get_callStmt(), *this );
+}
+
 void Visitor::visit( ApplicationExpr *applicationExpr ) {
 	acceptAll( applicationExpr->get_results(), *this );
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 70f89d00f25700f0fc226d5210840f0199c6d9f0)
+++ src/SynTree/Visitor.h	(revision f1b1e4c22ee1c825678ab38142bbcf3879708434)
@@ -52,4 +52,5 @@
 	virtual void visit( NullStmt *nullStmt );
 	virtual void visit( DeclStmt *declStmt );
+	virtual void visit( ImplicitCtorDtorStmt *impCtorDtorStmt );
 
 	virtual void visit( ApplicationExpr *applicationExpr );
