Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision 5af7306aa8aedc45c7e1b675f42139b19edd2a7c)
+++ src/SymTab/Indexer.cc	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -501,7 +501,7 @@
 
 	bool addedDeclConflicts( AggregateDecl *existing, AggregateDecl *added ) {
-		if ( existing->get_members().empty() ) {
+		if ( ! existing->body ) {
 			return false;
-		} else if ( ! added->get_members().empty() ) {
+		} else if ( added->body ) {
 			SemanticError( added, "redeclaration of " );
 		} // if
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 5af7306aa8aedc45c7e1b675f42139b19edd2a7c)
+++ src/SymTab/Validate.cc	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
@@ -90,4 +90,5 @@
 		void previsit( StructDecl * aggregateDecl );
 		void previsit( UnionDecl * aggregateDecl );
+		void previsit( StaticAssertDecl * assertDecl );
 
 	  private:
@@ -148,4 +149,5 @@
 		void previsit( ObjectDecl * object );
 		void previsit( FunctionDecl * func );
+		void previsit( FunctionType * ftype );
 		void previsit( StructDecl * aggrDecl );
 		void previsit( UnionDecl * aggrDecl );
@@ -296,6 +298,6 @@
 	}
 
-	bool isStructOrUnion( Declaration *decl ) {
-		return dynamic_cast< StructDecl * >( decl ) || dynamic_cast< UnionDecl * >( decl );
+	bool shouldHoist( Declaration *decl ) {
+		return dynamic_cast< StructDecl * >( decl ) || dynamic_cast< UnionDecl * >( decl ) || dynamic_cast< StaticAssertDecl * >( decl );
 	}
 
@@ -310,9 +312,9 @@
 		} // if
 		// Always remove the hoisted aggregate from the inner structure.
-		GuardAction( [aggregateDecl]() { filter( aggregateDecl->members, isStructOrUnion ); } );
+		GuardAction( [aggregateDecl]() { filter( aggregateDecl->members, shouldHoist, false ); } );
 	}
 
 	void HoistStruct::previsit( EnumInstType * inst ) {
-		if ( inst->baseEnum ) {
+		if ( inst->baseEnum && inst->baseEnum->body ) {
 			declsToAddBefore.push_front( inst->baseEnum );
 		}
@@ -320,5 +322,5 @@
 
 	void HoistStruct::previsit( StructInstType * inst ) {
-		if ( inst->baseStruct ) {
+		if ( inst->baseStruct && inst->baseStruct->body ) {
 			declsToAddBefore.push_front( inst->baseStruct );
 		}
@@ -326,6 +328,12 @@
 
 	void HoistStruct::previsit( UnionInstType * inst ) {
-		if ( inst->baseUnion ) {
+		if ( inst->baseUnion && inst->baseUnion->body ) {
 			declsToAddBefore.push_front( inst->baseUnion );
+		}
+	}
+
+	void HoistStruct::previsit( StaticAssertDecl * assertDecl ) {
+		if ( parentAggr ) {
+			declsToAddBefore.push_back( assertDecl );
 		}
 	}
@@ -623,14 +631,17 @@
 
 	void ForallPointerDecay::previsit( ObjectDecl *object ) {
-		forallFixer( object->type->forall, object );
-		if ( PointerType *pointer = dynamic_cast< PointerType * >( object->type ) ) {
-			forallFixer( pointer->base->forall, object );
-		} // if
+		// ensure that operator names only apply to functions or function pointers
+		if ( CodeGen::isOperator( object->name ) && ! dynamic_cast< FunctionType * >( object->type->stripDeclarator() ) ) {
+			SemanticError( object->location, toCString( "operator ", object->name.c_str(), " is not a function or function pointer." )  );
+		}
 		object->fixUniqueId();
 	}
 
 	void ForallPointerDecay::previsit( FunctionDecl *func ) {
-		forallFixer( func->type->forall, func );
 		func->fixUniqueId();
+	}
+
+	void ForallPointerDecay::previsit( FunctionType * ftype ) {
+		forallFixer( ftype->forall, ftype );
 	}
 
@@ -681,5 +692,5 @@
 				new_static_root<BasicType>( Type::Qualifiers(), BasicType::LongUnsignedInt );
 		}
-		filter( translationUnit, isTypedef );
+		filter( translationUnit, isTypedef, true );
 	}
 
@@ -818,5 +829,5 @@
 			} // if
 			return false;
-		} );
+		}, true);
 		return compoundStmt;
 	}
@@ -826,5 +837,5 @@
 	template<typename AggDecl>
 	AggDecl *EliminateTypedef::handleAggregate( AggDecl * aggDecl ) {
-		filter( aggDecl->members, isTypedef );
+		filter( aggDecl->members, isTypedef, true );
 		return aggDecl;
 	}
