Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 9d944b2a97f0468ab2208567dbc494494cf66a93)
+++ src/CodeGen/CodeGenerator.cc	(revision 077810d99973b2543325df49a6b292650323694f)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 17 09:06:01 2017
-// Update Count     : 481
+// Last Modified On : Thu Mar 30 16:38:01 2017
+// Update Count     : 482
 //
 
@@ -674,6 +674,6 @@
 
 	void CodeGenerator::visit( CompoundLiteralExpr *compLitExpr ) {
-		assert( compLitExpr->get_type() && dynamic_cast< ListInit * > ( compLitExpr->get_initializer() ) );
-		output << "(" << genType( compLitExpr->get_type(), "", pretty ) << ")";
+		assert( compLitExpr->get_result() && dynamic_cast< ListInit * > ( compLitExpr->get_initializer() ) );
+		output << "(" << genType( compLitExpr->get_result(), "", pretty ) << ")";
 		compLitExpr->get_initializer()->accept( *this );
 	}
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 9d944b2a97f0468ab2208567dbc494494cf66a93)
+++ src/InitTweak/FixInit.cc	(revision 077810d99973b2543325df49a6b292650323694f)
@@ -738,10 +738,14 @@
 						stmtsToAddAfter.push_back( ifStmt );
 
-						if ( ctorInit->get_dtor() ) {
+						Statement * dtor = ctorInit->get_dtor();
+						objDecl->set_init( NULL );
+						ctorInit->set_ctor( NULL );
+						ctorInit->set_dtor( nullptr );
+						if ( dtor ) {
 							// if the object has a non-trivial destructor, have to
 							// hoist it and the object into the global space and
 							// call the destructor function with atexit.
 
-							Statement * dtorStmt = ctorInit->get_dtor()->clone();
+							Statement * dtorStmt = dtor->clone();
 
 							// void __objName_dtor_atexitN(...) {...}
@@ -772,12 +776,9 @@
 							objDecl->set_mangleName( SymTab::Mangler::mangle( objDecl ) );
 
-							objDecl->set_init( NULL );
-							ctorInit->set_ctor( NULL );
-							delete ctorInit;
-
 							// xxx - temporary hack: need to return a declaration, but want to hoist the current object out of this scope
 							// create a new object which is never used
 							static UniqueName dummyNamer( "_dummy" );
 							ObjectDecl * dummy = new ObjectDecl( dummyNamer.newName(), Type::StorageClasses( Type::Static ), LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new VoidType( Type::Qualifiers() ) ), 0, std::list< Attribute * >{ new Attribute("unused") } );
+							delete ctorInit;
 							return dummy;
 						}
Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision 9d944b2a97f0468ab2208567dbc494494cf66a93)
+++ src/InitTweak/GenInit.cc	(revision 077810d99973b2543325df49a6b292650323694f)
@@ -294,8 +294,8 @@
 		handleDWT( objDecl );
 		// hands off if @=, extern, builtin, etc.
-		// if global but initializer is not constexpr, always try to construct, since this is not legal C
-		if ( ( tryConstruct( objDecl ) && isManaged( objDecl ) ) || (! inFunction && ! isConstExpr( objDecl->get_init() ) ) ) {
+		// even if unmanaged, try to construct global or static if initializer is not constexpr, since this is not legal C
+		if ( tryConstruct( objDecl ) && ( isManaged( objDecl ) || ((! inFunction || objDecl->get_storageClasses().is_static ) && ! isConstExpr( objDecl->get_init() ) ) ) ) {
 			// constructed objects cannot be designated
-			if ( isDesignated( objDecl->get_init() ) ) throw SemanticError( "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.", objDecl );
+			if ( isDesignated( objDecl->get_init() ) ) throw SemanticError( "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.\n", objDecl );
 			// constructed objects should not have initializers nested too deeply
 			if ( ! checkInitDepth( objDecl ) ) throw SemanticError( "Managed object's initializer is too deep ", objDecl );
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision 9d944b2a97f0468ab2208567dbc494494cf66a93)
+++ src/Parser/ExpressionNode.cc	(revision 077810d99973b2543325df49a6b292650323694f)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Mar  4 06:58:47 2017
-// Update Count     : 509
+// Last Modified On : Thu Mar 30 17:02:46 2017
+// Update Count     : 515
 //
 
@@ -356,9 +356,21 @@
 	// these types do not have associated type information
 	} else if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( newDecl )  ) {
-		return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), maybeMoveBuild< Initializer >(kids) );
+		if ( newDeclStructDecl->has_body() ) {
+			return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl ), maybeMoveBuild< Initializer >(kids) );
+		} else {
+			return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), maybeMoveBuild< Initializer >(kids) );
+		} // if
 	} else if ( UnionDecl * newDeclUnionDecl = dynamic_cast< UnionDecl * >( newDecl )  ) {
-		return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), maybeMoveBuild< Initializer >(kids) );
+		if ( newDeclUnionDecl->has_body() ) {
+			return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl ), maybeMoveBuild< Initializer >(kids) );
+		} else {
+			return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), maybeMoveBuild< Initializer >(kids) );
+		} // if
 	} else if ( EnumDecl * newDeclEnumDecl = dynamic_cast< EnumDecl * >( newDecl )  ) {
-		return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), maybeMoveBuild< Initializer >(kids) );
+		if ( newDeclEnumDecl->has_body() ) {
+			return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl ), maybeMoveBuild< Initializer >(kids) );
+		} else {
+			return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), maybeMoveBuild< Initializer >(kids) );
+		} // if
 	} else {
 		assert( false );
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 9d944b2a97f0468ab2208567dbc494494cf66a93)
+++ src/Parser/parser.yy	(revision 077810d99973b2543325df49a6b292650323694f)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 17 15:42:22 2017
-// Update Count     : 2317
+// Last Modified On : Thu Mar 30 15:42:32 2017
+// Update Count     : 2318
 //
 
@@ -423,5 +423,5 @@
 	| postfix_expression DECR
 	  	{ $$ = new ExpressionNode( build_unary_ptr( OperKinds::DecrPost, $1 ) ); }
-	| '(' type_name_no_function ')' '{' initializer_list comma_opt '}' // C99
+	| '(' type_name_no_function ')' '{' initializer_list comma_opt '}' // C99, compound-literal
 		{ $$ = new ExpressionNode( build_compoundLiteral( $2, new InitializerNode( $5, true ) ) ); }
 	| postfix_expression '{' argument_expression_list '}' // CFA
Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision 9d944b2a97f0468ab2208567dbc494494cf66a93)
+++ src/SymTab/Indexer.cc	(revision 077810d99973b2543325df49a6b292650323694f)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:37:33 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Mar 14 08:07:34 2017
-// Update Count     : 17
+// Last Modified On : Thu Mar 30 16:38:47 2017
+// Update Count     : 19
 //
 
@@ -483,5 +483,4 @@
 	void Indexer::visit( CompoundLiteralExpr *compLitExpr ) {
 		acceptNewScope( compLitExpr->get_result(), *this );
-		maybeAccept( compLitExpr->get_type(), *this );
 		maybeAccept( compLitExpr->get_initializer(), *this );
 	}
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 9d944b2a97f0468ab2208567dbc494494cf66a93)
+++ src/SymTab/Validate.cc	(revision 077810d99973b2543325df49a6b292650323694f)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:50:04 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 16:39:15 2017
-// Update Count     : 353
+// Last Modified On : Thu Mar 30 16:50:13 2017
+// Update Count     : 357
 //
 
@@ -222,6 +222,6 @@
 		CompoundLiteral compoundliteral;
 
+		HoistStruct::hoistStruct( translationUnit );
 		EliminateTypedef::eliminateTypedef( translationUnit );
-		HoistStruct::hoistStruct( translationUnit );
 		ReturnTypeFixer::fix( translationUnit ); // must happen before autogen
 		acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions
@@ -824,6 +824,6 @@
 		static UniqueName indexName( "_compLit" );
 
-		ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageClasses, LinkageSpec::C, 0, compLitExpr->get_type(), compLitExpr->get_initializer() );
-		compLitExpr->set_type( 0 );
+		ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageClasses, LinkageSpec::C, 0, compLitExpr->get_result(), compLitExpr->get_initializer() );
+		compLitExpr->set_result( 0 );
 		compLitExpr->set_initializer( 0 );
 		delete compLitExpr;
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 9d944b2a97f0468ab2208567dbc494494cf66a93)
+++ src/SynTree/Expression.cc	(revision 077810d99973b2543325df49a6b292650323694f)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 17 09:42:04 2017
-// Update Count     : 51
+// Last Modified On : Thu Mar 30 16:41:13 2017
+// Update Count     : 52
 //
 
@@ -571,14 +571,13 @@
 
 
-CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : type( type ), initializer( initializer ) {
+CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : initializer( initializer ) {
 	assert( type && initializer );
-	set_result( type->clone() );
-}
-
-CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), type( other.type->clone() ), initializer( other.initializer->clone() ) {}
+	set_result( type );
+}
+
+CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), initializer( other.initializer->clone() ) {}
 
 CompoundLiteralExpr::~CompoundLiteralExpr() {
 	delete initializer;
-	delete type;
 }
 
@@ -586,5 +585,5 @@
 	os << "Compound Literal Expression: " << std::endl;
 	os << std::string( indent+2, ' ' );
-	type->print( os, indent + 2 );
+	get_result()->print( os, indent + 2 );
 	os << std::string( indent+2, ' ' );
 	initializer->print( os, indent + 2 );
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 9d944b2a97f0468ab2208567dbc494494cf66a93)
+++ src/SynTree/Expression.h	(revision 077810d99973b2543325df49a6b292650323694f)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jan 14 14:37:54 2017
-// Update Count     : 37
+// Last Modified On : Thu Mar 30 16:44:00 2017
+// Update Count     : 41
 //
 
@@ -35,4 +35,5 @@
 
 	Type *& get_result() { return result; }
+	const Type * get_result() const { return result; }
 	void set_result( Type * newValue ) { result = newValue; }
 	bool has_result() const { return result != nullptr; }
@@ -586,7 +587,4 @@
 	virtual ~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; }
@@ -597,5 +595,4 @@
 	virtual void print( std::ostream & os, int indent = 0 ) const;
   private:
-	Type * type;
 	Initializer * initializer;
 };
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision 9d944b2a97f0468ab2208567dbc494494cf66a93)
+++ src/SynTree/Mutator.cc	(revision 077810d99973b2543325df49a6b292650323694f)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb 16 15:02:23 2017
-// Update Count     : 21
+// Last Modified On : Thu Mar 30 16:45:19 2017
+// Update Count     : 22
 //
 
@@ -369,5 +369,4 @@
 	compLitExpr->set_env( maybeMutate( compLitExpr->get_env(), *this ) );
 	compLitExpr->set_result( maybeMutate( compLitExpr->get_result(), *this ) );
-	compLitExpr->set_type( maybeMutate( compLitExpr->get_type(), *this ) );
 	compLitExpr->set_initializer( maybeMutate( compLitExpr->get_initializer(), *this ) );
 	return compLitExpr;
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision 9d944b2a97f0468ab2208567dbc494494cf66a93)
+++ src/SynTree/Visitor.cc	(revision 077810d99973b2543325df49a6b292650323694f)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb 16 15:01:25 2017
-// Update Count     : 23
+// Last Modified On : Thu Mar 30 16:45:25 2017
+// Update Count     : 24
 //
 
@@ -292,5 +292,4 @@
 void Visitor::visit( CompoundLiteralExpr *compLitExpr ) {
 	maybeAccept( compLitExpr->get_result(), *this );
-	maybeAccept( compLitExpr->get_type(), *this );
 	maybeAccept( compLitExpr->get_initializer(), *this );
 }
Index: src/libcfa/iostream.c
===================================================================
--- src/libcfa/iostream.c	(revision 9d944b2a97f0468ab2208567dbc494494cf66a93)
+++ src/libcfa/iostream.c	(revision 077810d99973b2543325df49a6b292650323694f)
@@ -154,5 +154,5 @@
 ostype * ?|?( ostype * os, const char * cp ) {
 	enum { Open = 1, Close, OpenClose };
-	static const unsigned char mask[256] = {
+	static const unsigned char mask[256] @= {
 		// opening delimiters, no space after
 		['('] : Open, ['['] : Open, ['{'] : Open,
