Index: src/SynTree/AggregateDecl.cc
===================================================================
--- src/SynTree/AggregateDecl.cc	(revision 5ded7395234578d7bb8fba071aabd2c9c3142fa2)
+++ src/SynTree/AggregateDecl.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
@@ -69,5 +69,5 @@
 std::string EnumDecl::typeString() const { return "enum"; }
 
-std::string TraitDecl::typeString() const { return "context"; }
+std::string TraitDecl::typeString() const { return "trait"; }
 
 // Local Variables: //
Index: src/SynTree/ReferenceToType.cc
===================================================================
--- src/SynTree/ReferenceToType.cc	(revision 5ded7395234578d7bb8fba071aabd2c9c3142fa2)
+++ src/SynTree/ReferenceToType.cc	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
@@ -64,4 +64,6 @@
 }
 
+bool StructInstType::isComplete() const { return baseStruct->has_body(); }
+
 void StructInstType::lookup( const std::string &name, std::list< Declaration* > &foundDecls ) const {
 	assert( baseStruct );
@@ -90,4 +92,6 @@
 }
 
+bool UnionInstType::isComplete() const { return baseUnion->has_body(); }
+
 void UnionInstType::lookup( const std::string &name, std::list< Declaration* > &foundDecls ) const {
 	assert( baseUnion );
@@ -111,5 +115,5 @@
 std::string EnumInstType::typeString() const { return "enum"; }
 
-std::string TraitInstType::typeString() const { return "context"; }
+std::string TraitInstType::typeString() const { return "trait"; }
 
 TraitInstType::TraitInstType( const TraitInstType &other ) : Parent( other ) {
@@ -120,4 +124,6 @@
 	deleteAll( members );
 }
+
+bool TraitInstType::isComplete() const { assert( false ); }
 
 TypeInstType::TypeInstType( const Type::Qualifiers &tq, const std::string &name, TypeDecl *baseType ) : Parent( tq, name ) {
@@ -143,4 +149,6 @@
 std::string TypeInstType::typeString() const { return "type"; }
 
+bool TypeInstType::isComplete() const { return baseType->isComplete(); }
+
 void TypeInstType::print( std::ostream &os, int indent ) const {
 	using std::endl;
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 5ded7395234578d7bb8fba071aabd2c9c3142fa2)
+++ src/SynTree/Type.h	(revision 4a9ccc35f7b5fed64bf53eee245fc9caa37f687d)
@@ -74,4 +74,6 @@
 	virtual Type * getComponent( unsigned i ) { assertf( size() == 1 && i == 0, "Type::getComponent was called with size %d and index %d\n", size(), i ); return this; }
 
+	virtual bool isComplete() const { return true; }
+
 	virtual Type *clone() const = 0;
 	virtual void accept( Visitor &v ) = 0;
@@ -90,4 +92,5 @@
 
 	virtual unsigned size() const { return 0; };
+	virtual bool isComplete() const { return false; }
 
 	virtual VoidType *clone() const { return new VoidType( *this ); }
@@ -185,4 +188,6 @@
 	void set_isStatic( bool newValue ) { isStatic = newValue; }
 
+	virtual bool isComplete() const { return ! isVarLen; }
+
 	virtual ArrayType *clone() const { return new ArrayType( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
@@ -258,4 +263,6 @@
 	std::list<TypeDecl*> * get_baseParameters();
 
+	virtual bool isComplete() const;
+
 	/// Looks up the members of this struct named "name" and places them into "foundDecls".
 	/// Clones declarations into "foundDecls", caller responsible for freeing
@@ -287,4 +294,6 @@
 	std::list<TypeDecl*> * get_baseParameters();
 
+	virtual bool isComplete() const;
+
 	/// looks up the members of this union named "name" and places them into "foundDecls"
 	/// Clones declarations into "foundDecls", caller responsible for freeing
@@ -310,4 +319,7 @@
 	EnumInstType( const EnumInstType &other ) : Parent( other ) {}
 
+	// xxx - enum inst does not currently contain a pointer to base, this should be fixed.
+	// virtual bool isComplete() const { return baseEnum()->hasBody(); }
+
 	virtual EnumInstType *clone() const { return new EnumInstType( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
@@ -325,4 +337,6 @@
 
 	std::list< Declaration* >& get_members() { return members; }
+
+	virtual bool isComplete() const;
 
 	virtual TraitInstType *clone() const { return new TraitInstType( *this ); }
@@ -349,4 +363,6 @@
 	bool get_isFtype() const { return isFtype; }
 	void set_isFtype( bool newValue ) { isFtype = newValue; }
+
+	virtual bool isComplete() const;
 
 	virtual TypeInstType *clone() const { return new TypeInstType( *this ); }
@@ -382,4 +398,6 @@
 	}
 
+	// virtual bool isComplete() const { return true; } // xxx - not sure if this is right, might need to recursively check complete-ness
+
 	virtual TupleType *clone() const { return new TupleType( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
@@ -398,4 +416,6 @@
 	Expression *get_expr() const { return expr; }
 	void set_expr( Expression *newValue ) { expr = newValue; }
+
+	virtual bool isComplete() const { assert( false ); return false; }
 
 	virtual TypeofType *clone() const { return new TypeofType( *this ); }
@@ -423,4 +443,6 @@
 	void set_isType( bool newValue ) { isType = newValue; }
 
+	virtual bool isComplete() const { assert( false ); } // xxx - not sure what to do here
+
 	virtual AttrType *clone() const { return new AttrType( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
@@ -439,4 +461,6 @@
 	VarArgsType();
 	VarArgsType( Type::Qualifiers tq );
+
+	virtual bool isComplete() const{ return true; } // xxx - is this right?
 
 	virtual VarArgsType *clone() const { return new VarArgsType( *this ); }
