Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision 4da6a6c62c48d6182b9a9e4567acfd2fb4311701)
+++ src/SymTab/Autogen.cc	(revision 2f26687a4d0fc0c7de8418af76ff6fc9bcc47a77)
@@ -151,5 +151,5 @@
 	bool hasDynamicLayout( AggrDecl * aggregateDecl ) {
 		for ( TypeDecl * param : aggregateDecl->get_parameters() ) {
-			if ( param->get_kind() == TypeDecl::Any ) return true;
+			if ( param->isComplete() ) return true;
 		}
 		return false;
Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision 4da6a6c62c48d6182b9a9e4567acfd2fb4311701)
+++ src/SymTab/Indexer.cc	(revision 2f26687a4d0fc0c7de8418af76ff6fc9bcc47a77)
@@ -119,11 +119,13 @@
 				FunctionDecl * decl;
 				bool isUserDefinedFunc; // properties for this particular decl
-				bool isDefaultFunc;
+				bool isDefaultCtor;
+				bool isDtor;
 				bool isCopyFunc;
 			};
 			// properties for this type
-			bool userDefinedFunc = false; // any user defined function found
-			bool userDefinedDefaultFunc = false; // user defined default ctor found
-			bool userDefinedCopyFunc = false; // user defined copy ctor found
+			bool userDefinedFunc = false; // any user-defined function found
+			bool userDefinedCtor = false; // any user-defined constructor found
+			bool userDefinedDtor = false; // any user-defined destructor found
+			bool userDefinedCopyFunc = false; // user-defined copy ctor found
 			std::list< DeclBall > decls;
 
@@ -132,9 +134,11 @@
 			ValueType & operator+=( FunctionDecl * function ) {
 				bool isUserDefinedFunc = ! LinkageSpec::isOverridable( function->get_linkage() );
-				bool isDefaultFunc = function->get_functionType()->get_parameters().size() == 1;
+				bool isDefaultCtor = InitTweak::isDefaultConstructor( function );
+				bool isDtor = InitTweak::isDestructor( function );
 				bool isCopyFunc = InitTweak::isCopyFunction( function, function->get_name() );
-				decls.push_back( DeclBall{ function, isUserDefinedFunc, isDefaultFunc, isCopyFunc } );
+				decls.push_back( DeclBall{ function, isUserDefinedFunc, isDefaultCtor, isDtor, isCopyFunc } );
 				userDefinedFunc = userDefinedFunc || isUserDefinedFunc;
-				userDefinedDefaultFunc = userDefinedDefaultFunc || (isUserDefinedFunc && isDefaultFunc);
+				userDefinedCtor = userDefinedCtor || (isUserDefinedFunc && InitTweak::isConstructor( function->get_name() ) );
+				userDefinedDtor = userDefinedDtor || (isUserDefinedFunc && isDtor);
 				userDefinedCopyFunc = userDefinedCopyFunc || (isUserDefinedFunc && isCopyFunc);
 				return *this;
@@ -163,8 +167,9 @@
 		// a default ctor, then the generated default ctor should never be seen, likewise for copy ctor
 		// and dtor. If the user defines any ctor/dtor, then no generated field ctors should be seen.
+		// If the user defines any ctor then the generated default ctor should not be seen.
 		for ( std::pair< const std::string, ValueType > & pair : funcMap ) {
 			ValueType & val = pair.second;
 			for ( ValueType::DeclBall ball : val.decls ) {
-				if ( ! val.userDefinedFunc || ball.isUserDefinedFunc || (! val.userDefinedDefaultFunc && ball.isDefaultFunc) || (! val.userDefinedCopyFunc && ball.isCopyFunc) ) {
+				if ( ! val.userDefinedFunc || ball.isUserDefinedFunc || (! val.userDefinedCtor && ball.isDefaultCtor) || (! val.userDefinedCopyFunc && ball.isCopyFunc) || (! val.userDefinedDtor && ball.isDtor) ) {
 					// decl conforms to the rules described above, so it should be seen by the requester
 					out.push_back( ball.decl );
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 4da6a6c62c48d6182b9a9e4567acfd2fb4311701)
+++ src/SymTab/Validate.cc	(revision 2f26687a4d0fc0c7de8418af76ff6fc9bcc47a77)
@@ -224,7 +224,7 @@
 		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
 		autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecayPass
 		acceptAll( translationUnit, epc );
-		acceptAll( translationUnit, lrt );
 		ReturnChecker::checkFunctionReturns( translationUnit );
 		compoundliteral.mutateDeclarationList( translationUnit );
@@ -838,6 +838,6 @@
 		assertf( retVals.size() == 0 || retVals.size() == 1, "Function %s has too many return values: %d", functionDecl->get_name().c_str(), retVals.size() );
 		if ( retVals.size() == 1 ) {
-			// ensure all function return values have a name - use the name of the function to disambiguate (this also provides a nice bit of help for debugging)
-			// ensure other return values have a name
+			// ensure all function return values have a name - use the name of the function to disambiguate (this also provides a nice bit of help for debugging).
+			// ensure other return values have a name.
 			DeclarationWithType * ret = retVals.front();
 			if ( ret->get_name() == "" ) {
