Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
+++ src/SynTree/Expression.cc	(revision d88f256ade0eaa8dd3de01f0df046f5252ccb73e)
@@ -28,4 +28,5 @@
 #include "TypeSubstitution.h"
 #include "Common/utility.h"
+#include "InitTweak/InitTweak.h"
 
 
@@ -493,5 +494,5 @@
 
 void ImplicitCopyCtorExpr::print( std::ostream &os, int indent ) const {
-	os << std::string( indent, ' ' ) <<  "Implicit Copy Constructor Expression: " << std::endl;
+	os <<  "Implicit Copy Constructor Expression: " << std::endl;
 	assert( callExpr );
 	callExpr->print( os, indent + 2 );
@@ -503,4 +504,46 @@
 }
 
+
+ConstructorExpr::ConstructorExpr( Expression * callExpr ) : callExpr( callExpr ) {
+	// allow resolver to type a constructor used as an expression as if it has the same type as its first argument
+	assert( callExpr );
+	Expression * arg = InitTweak::getCallArg( callExpr, 0 );
+	assert( arg );
+	cloneAll( arg->get_results(), results );
+}
+
+ConstructorExpr::ConstructorExpr( const ConstructorExpr & other ) : Expression( other ), callExpr( maybeClone( other.callExpr ) ) {
+}
+
+ConstructorExpr::~ConstructorExpr() {
+	delete callExpr;
+}
+
+void ConstructorExpr::print( std::ostream &os, int indent ) const {
+	os <<  "Constructor Expression: " << std::endl;
+	assert( callExpr );
+	os << std::string( indent+2, ' ' );
+	callExpr->print( os, indent + 2 );
+	Expression::print( os, indent );
+}
+
+
+CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : type( type ), initializer( initializer ) {
+	add_result( type->clone() );
+}
+
+CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), type( maybeClone( other.type ) ), initializer( maybeClone( other.initializer ) ) {}
+
+CompoundLiteralExpr::~CompoundLiteralExpr() {
+	delete initializer;
+	delete type;
+}
+
+void CompoundLiteralExpr::print( std::ostream &os, int indent ) const {
+	os << "Compound Literal Expression: " << std::endl;
+	if ( type ) type->print( os, indent + 2 );
+	if ( initializer ) initializer->print( os, indent + 2 );
+}
+
 UntypedValofExpr::UntypedValofExpr( const UntypedValofExpr & other ) : Expression( other ), body ( maybeClone( other.body ) ) {}
 
@@ -511,22 +554,4 @@
 	if ( get_body() != 0 )
 		get_body()->print( os, indent + 2 );
-}
-
-
-CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : type( type ), initializer( initializer ) {
-	add_result( type->clone() );
-}
-
-CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), type( maybeClone( other.type ) ), initializer( maybeClone( other.initializer ) ) {}
-
-CompoundLiteralExpr::~CompoundLiteralExpr() {
-	delete initializer;
-	delete type;
-}
-
-void CompoundLiteralExpr::print( std::ostream &os, int indent ) const {
-	os << "Compound Literal Expression: " << std::endl;
-	if ( type ) type->print( os, indent + 2 );
-	if ( initializer ) initializer->print( os, indent + 2 );
 }
 
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
+++ src/SynTree/Expression.h	(revision d88f256ade0eaa8dd3de01f0df046f5252ccb73e)
@@ -595,4 +595,44 @@
 };
 
+/// ConstructorExpr represents the use of a constructor in an expression context, e.g. int * x = malloc() { 5 };
+class ConstructorExpr : public Expression {
+public:
+	ConstructorExpr( Expression * callExpr );
+	ConstructorExpr( const ConstructorExpr & other );
+	~ConstructorExpr();
+
+	Expression *get_callExpr() const { return callExpr; }
+	void set_callExpr( Expression *newValue ) { callExpr = newValue; }
+
+	virtual ConstructorExpr *clone() const { return new ConstructorExpr( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+private:
+	Expression * callExpr;
+};
+
+/// CompoundLiteralExpr represents a C99 'compound literal'
+class CompoundLiteralExpr : public Expression {
+  public:
+	CompoundLiteralExpr( Type * type, Initializer * initializer );
+	CompoundLiteralExpr( const CompoundLiteralExpr &other );
+	~CompoundLiteralExpr();
+
+	Type * get_type() const { return type; }
+	void set_type( Type * t ) { type = t; }
+
+	Initializer * get_initializer() const { return initializer; }
+	void set_initializer( Initializer * i ) { initializer = i; }
+
+	virtual CompoundLiteralExpr *clone() const { return new CompoundLiteralExpr( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+  private:
+	Type * type;
+	Initializer * initializer;
+};
+
 /// ValofExpr represents a GCC 'lambda expression'
 class UntypedValofExpr : public Expression {
@@ -613,26 +653,5 @@
 };
 
-/// CompoundLiteralExpr represents a C99 'compound literal'
-class CompoundLiteralExpr : public Expression {
-  public:
-	CompoundLiteralExpr( Type * type, Initializer * initializer );
-	CompoundLiteralExpr( const CompoundLiteralExpr &other );
-	~CompoundLiteralExpr();
-
-	Type * get_type() const { return type; }
-	void set_type( Type * t ) { type = t; }
-
-	Initializer * get_initializer() const { return initializer; }
-	void set_initializer( Initializer * i ) { initializer = i; }
-
-	virtual CompoundLiteralExpr *clone() const { return new CompoundLiteralExpr( *this ); }
-	virtual void accept( Visitor &v ) { v.visit( this ); }
-	virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
-	virtual void print( std::ostream &os, int indent = 0 ) const;
-  private:
-	Type * type;
-	Initializer * initializer;
-};
-
+/// RangeExpr represents a range e.g. '3 ... 5' or '1~10'
 class RangeExpr : public Expression {
   public:
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
+++ src/SynTree/Mutator.cc	(revision d88f256ade0eaa8dd3de01f0df046f5252ccb73e)
@@ -339,7 +339,8 @@
 }
 
-Expression *Mutator::mutate( UntypedValofExpr *valofExpr ) {
-	mutateAll( valofExpr->get_results(), *this );
-	return valofExpr;
+Expression* Mutator::mutate( ConstructorExpr *ctorExpr ) {
+	mutateAll( ctorExpr->get_results(), *this );
+	ctorExpr->set_callExpr( maybeMutate( ctorExpr->get_callExpr(), *this ) );
+	return ctorExpr;
 }
 
@@ -349,4 +350,9 @@
 	compLitExpr->set_initializer( maybeMutate( compLitExpr->get_initializer(), *this ) );
 	return compLitExpr;
+}
+
+Expression *Mutator::mutate( UntypedValofExpr *valofExpr ) {
+	mutateAll( valofExpr->get_results(), *this );
+	return valofExpr;
 }
 
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
+++ src/SynTree/Mutator.h	(revision d88f256ade0eaa8dd3de01f0df046f5252ccb73e)
@@ -76,6 +76,7 @@
 	virtual Expression* mutate( AsmExpr *asmExpr );
 	virtual Expression* mutate( ImplicitCopyCtorExpr *impCpCtorExpr );
+	virtual Expression* mutate( ConstructorExpr *ctorExpr );
+	virtual Expression* mutate( CompoundLiteralExpr *compLitExpr );
 	virtual Expression* mutate( UntypedValofExpr *valofExpr );
-	virtual Expression* mutate( CompoundLiteralExpr *compLitExpr );
 	virtual Expression* mutate( RangeExpr *rangeExpr );
 
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
+++ src/SynTree/SynTree.h	(revision d88f256ade0eaa8dd3de01f0df046f5252ccb73e)
@@ -81,6 +81,7 @@
 class AsmExpr;
 class ImplicitCopyCtorExpr;
+class ConstructorExpr;
+class CompoundLiteralExpr;
 class UntypedValofExpr;
-class CompoundLiteralExpr;
 class RangeExpr;
 
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
+++ src/SynTree/Visitor.cc	(revision d88f256ade0eaa8dd3de01f0df046f5252ccb73e)
@@ -287,7 +287,7 @@
 }
 
-void Visitor::visit( UntypedValofExpr *valofExpr ) {
-	acceptAll( valofExpr->get_results(), *this );
-	maybeAccept( valofExpr->get_body(), *this );
+void Visitor::visit( ConstructorExpr * ctorExpr ) {
+	acceptAll( ctorExpr->get_results(), *this );
+	maybeAccept( ctorExpr->get_callExpr(), *this );
 }
 
@@ -296,4 +296,9 @@
 	maybeAccept( compLitExpr->get_type(), *this );
 	maybeAccept( compLitExpr->get_initializer(), *this );
+}
+
+void Visitor::visit( UntypedValofExpr *valofExpr ) {
+	acceptAll( valofExpr->get_results(), *this );
+	maybeAccept( valofExpr->get_body(), *this );
 }
 
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
+++ src/SynTree/Visitor.h	(revision d88f256ade0eaa8dd3de01f0df046f5252ccb73e)
@@ -76,6 +76,7 @@
 	virtual void visit( AsmExpr *asmExpr );
 	virtual void visit( ImplicitCopyCtorExpr *impCpCtorExpr );
+	virtual void visit( ConstructorExpr * ctorExpr );
+	virtual void visit( CompoundLiteralExpr *compLitExpr );
 	virtual void visit( UntypedValofExpr *valofExpr );
-	virtual void visit( CompoundLiteralExpr *compLitExpr );
 	virtual void visit( RangeExpr *rangeExpr );
 
