Index: libcfa/prelude/prelude-gen.cc
===================================================================
--- libcfa/prelude/prelude-gen.cc	(revision 3bd950881e1bba6bb9b6912c86686aaab822bf9a)
+++ libcfa/prelude/prelude-gen.cc	(revision 3e91c6f91e5a3f8b46dfbdd035a898ca5dfe818f)
@@ -10,6 +10,6 @@
 // Created On       : Sat Feb 16 08:44:58 2019
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jan 13 14:15:29 2025
-// Update Count     : 55
+// Last Modified On : Mon Mar 10 17:30:48 2025
+// Update Count     : 65
 //
 
Index: libcfa/prelude/prototypes.awk
===================================================================
--- libcfa/prelude/prototypes.awk	(revision 3bd950881e1bba6bb9b6912c86686aaab822bf9a)
+++ libcfa/prelude/prototypes.awk	(revision 3e91c6f91e5a3f8b46dfbdd035a898ca5dfe818f)
@@ -10,6 +10,6 @@
 # Created On       : Sat May 16 07:57:37 2015
 # Last Modified By : Peter A. Buhr
-# Last Modified On : Sat Feb 15 13:16:28 2025
-# Update Count     : 60
+# Last Modified On : Mon Mar 10 17:52:39 2025
+# Update Count     : 73
 #
 
@@ -160,4 +160,12 @@
 	printf( "double _Complex __builtin_complex( double, double );\n" );
 	printf( "long double _Complex __builtin_complex( long double, long double );\n" );
+
+	# assorted gcc builltin types
+	# ARM vector floating-point types, strip off text "__builtin.*__"
+	printf( "struct __builtin__Float32x4_t__ {};\n" );
+	printf( "struct __builtin__Float64x2_t__ {};\n" );
+	printf( "struct __builtin__SVFloat32_t__ {};\n" );
+	printf( "struct __builtin__SVFloat64_t__ {};\n" );
+	printf( "struct __builtin__SVBool_t__ {};\n" );
 } # END
 
Index: src/BasicTypes-gen.cpp
===================================================================
--- src/BasicTypes-gen.cpp	(revision 3bd950881e1bba6bb9b6912c86686aaab822bf9a)
+++ src/BasicTypes-gen.cpp	(revision 3e91c6f91e5a3f8b46dfbdd035a898ca5dfe818f)
@@ -53,10 +53,4 @@
 	Float128xComplex,
 	NUMBER_OF_BASIC_TYPES,
-
-	Float32x4,											// ARM, gcc-14
-	Float64x2,
-	Svfloat32,
-	Svfloat64,
-	Svbool,
 };
 
Index: src/Common/Iterate.hpp
===================================================================
--- src/Common/Iterate.hpp	(revision 3bd950881e1bba6bb9b6912c86686aaab822bf9a)
+++ src/Common/Iterate.hpp	(revision 3e91c6f91e5a3f8b46dfbdd035a898ca5dfe818f)
@@ -208,42 +208,2 @@
 	return group_iterate_t<Args...>( std::forward<Args>( args )... );
 }
-
-// -----------------------------------------------------------------------------
-// Helper struct and function to support
-// for ( val : lazy_map( container1, f ) ) {}
-// syntax to have a for each that iterates a container,
-// mapping each element by applying f.
-
-template< typename T, typename Func >
-struct lambda_iterate_t {
-	const T & ref;
-	std::function<Func> f;
-
-	struct iterator {
-		typedef decltype(begin(ref)) Iter;
-		Iter it;
-		std::function<Func> f;
-		iterator( Iter it, std::function<Func> f ) : it(it), f(f) {}
-		iterator & operator++() {
-			++it; return *this;
-		}
-		bool operator!=( const iterator &other ) const { return it != other.it; }
-		auto operator*() const -> decltype(f(*it)) { return f(*it); }
-	};
-
-	lambda_iterate_t( const T & ref, std::function<Func> f ) : ref(ref), f(f) {}
-
-	auto begin() const -> decltype(iterator(std::begin(ref), f)) { return iterator(std::begin(ref), f); }
-	auto end() const   -> decltype(iterator(std::end(ref), f)) { return iterator(std::end(ref), f); }
-};
-
-template< typename... Args >
-lambda_iterate_t<Args...> lazy_map( const Args &... args ) {
-	return lambda_iterate_t<Args...>( args...);
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/GenPoly/InstantiateGeneric.cpp
===================================================================
--- src/GenPoly/InstantiateGeneric.cpp	(revision 3bd950881e1bba6bb9b6912c86686aaab822bf9a)
+++ src/GenPoly/InstantiateGeneric.cpp	(revision 3e91c6f91e5a3f8b46dfbdd035a898ca5dfe818f)
@@ -10,6 +10,6 @@
 // Created On       : Tue Aug 16 10:51:00 2022
 // Last Modified By : Andrew Beach
-// Last Modified On : Mon Oct 31 16:48:00 2022
-// Update Count     : 1
+// Last Modified On : Wed Mar 12 15:18:00 2025
+// Update Count     : 2
 //
 
@@ -159,4 +159,24 @@
 }
 
+/// Get the scrubbed type of a declaration (see scrubTypeVars functions).
+ast::TypeExpr const * scrubTypeDecl(
+		CodeLocation const & location, ast::TypeDecl const * typeDecl ) {
+	switch ( typeDecl->kind ) {
+	// Erase any incomplete dtype to `void` (`T *` -> `void *`).
+	case ast::TypeDecl::Dtype:
+		return new ast::TypeExpr( location, new ast::VoidType() );
+	// Erase any ftype to `void (*)(void)`.
+	case ast::TypeDecl::Ftype:
+		return new ast::TypeExpr( location, new ast::FunctionType() );
+	// Remaining cases are not supported.
+	case ast::TypeDecl::Ttype:
+		assertf( false, "Ttype parameters are not currently allowed as parameters to generic types." );
+		break;
+	default:
+		assertf( false, "Unhandled type parameter kind" );
+		break;
+	}
+}
+
 /// Makes substitutions of params into baseParams; returns dtypeStatic if
 /// there is a concrete instantiation based only on {d,f}type-to-void
@@ -190,21 +210,6 @@
 				gt |= GenericType::concrete;
 			}
-		} else switch ( (*baseParam)->kind ) {
-		case ast::TypeDecl::Dtype:
-			// Here, pretend that any incomplete dtype is `void`.
-			out.emplace_back( new ast::TypeExpr( paramExpr->location,
-				new ast::VoidType() ) );
-			break;
-		case ast::TypeDecl::Ftype:
-			// Here, pretend that any ftype is `void (*)(void)`.
-			out.emplace_back( new ast::TypeExpr( paramExpr->location,
-				new ast::FunctionType() ) );
-			break;
-		case ast::TypeDecl::Ttype:
-			assertf( false, "Ttype parameters are not currently allowed as parameters to generic types." );
-			break;
-		default:
-			assertf( false, "Unhandled type parameter kind" );
-			break;
+		} else {
+			out.emplace_back( scrubTypeDecl( paramExpr->location, *baseParam ) );
 		}
 	}
@@ -443,4 +448,7 @@
 		instantiations(), dtypeStatics(), typeNamer("_conc_") {}
 
+	ast::StructDecl const * previsit( ast::StructDecl const * );
+	ast::UnionDecl const * previsit( ast::UnionDecl const * );
+
 	ast::Type const * postvisit( ast::StructInstType const * inst );
 	ast::Type const * postvisit( ast::UnionInstType const * inst );
@@ -481,4 +489,7 @@
 
 	template<typename AggrDecl>
+	AggrDecl const * fixAggrDecl( AggrDecl const * decl );
+
+	template<typename AggrDecl>
 	ast::Type const * fixInstType( ast::SueInstType<AggrDecl> const * inst );
 
@@ -489,4 +500,33 @@
 		ast::vector<ast::TypeExpr> const & typeSubs );
 };
+
+ast::StructDecl const * GenericInstantiator::previsit( ast::StructDecl const * decl ) {
+	return fixAggrDecl( decl );
+}
+
+ast::UnionDecl const * GenericInstantiator::previsit( ast::UnionDecl const * decl ) {
+	return fixAggrDecl( decl );
+}
+
+template<typename AggrDecl>
+AggrDecl const * GenericInstantiator::fixAggrDecl( AggrDecl const * decl ) {
+	// This function and stripDtypeParams handle declarations before their
+	// first use (required to be in the previsit for types with a self use).
+	if ( decl->params.empty() || !isDtypeStatic( decl->params ) ) {
+		return decl;
+	}
+
+	ast::vector<ast::TypeExpr> typeSubs;
+	for ( auto const & param : decl->params ) {
+		assert( !param->isComplete() );
+		typeSubs.emplace_back( scrubTypeDecl( param->location, param ) );
+	}
+
+	assert( decl->unique() );
+	auto mutDecl = ast::mutate( decl );
+	stripDtypeParams( mutDecl, mutDecl->params, typeSubs );
+
+	return mutDecl;
+}
 
 ast::Type const * GenericInstantiator::postvisit(
@@ -531,4 +571,6 @@
 	case GenericType::dtypeStatic:
 	{
+		// This call to stripDtypeParams is used when a forward declaration
+		// has allowed an instance to appear before the full declaration.
 		auto mutInst = ast::mutate( inst );
 		assert( mutInst->base->unique() );
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 3bd950881e1bba6bb9b6912c86686aaab822bf9a)
+++ src/Parser/lex.ll	(revision 3e91c6f91e5a3f8b46dfbdd035a898ca5dfe818f)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Fri Jan 17 14:36:16 2025
- * Update Count     : 878
+ * Last Modified On : Mon Mar  3 09:21:33 2025
+ * Update Count     : 880
  */
 
@@ -240,5 +240,5 @@
 basetypeof		{ KEYWORD_RETURN(BASETYPEOF); }			// CFA
 _Bool			{ KEYWORD_RETURN(BOOL); }				// C99
-__SVBool_t		{ KEYWORD_RETURN(SVBOOL); }				// gcc (ARM)
+__SVBool_t		{ KEYWORD_RETURN(BOOL); }				// gcc (ARM)
 break			{ KEYWORD_RETURN(BREAK); }
 case			{ KEYWORD_RETURN(CASE); }
@@ -287,8 +287,8 @@
 _Float128		{ FLOATXX(FLOAT128); }					// GCC
 _Float128x		{ FLOATXX(FLOAT128X); }					// GCC
-__Float32x4_t	{ FLOATXX(FLOAT32X4); }					// GCC (ARM)
-__Float64x2_t	{ FLOATXX(FLOAT64X2); }					// GCC (ARM)
-__SVFloat32_t	{ FLOATXX(SVFLOAT32); }					// GCC (ARM)
-__SVFloat64_t	{ FLOATXX(SVFLOAT64); }					// GCC (ARM)
+__Float32x4_t	{ FLOATXX(FLOAT128); }					// GCC (ARM)
+__Float64x2_t	{ FLOATXX(FLOAT128); }					// GCC (ARM)
+__SVFloat32_t	{ FLOATXX(FLOAT128); }					// GCC (ARM)
+__SVFloat64_t	{ FLOATXX(FLOAT128); }					// GCC (ARM)
 for				{ KEYWORD_RETURN(FOR); }
 forall			{ KEYWORD_RETURN(FORALL); }				// CFA
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 3bd950881e1bba6bb9b6912c86686aaab822bf9a)
+++ src/Parser/parser.yy	(revision 3e91c6f91e5a3f8b46dfbdd035a898ca5dfe818f)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Mar  3 20:47:00 2025
-// Update Count     : 7254
+// Last Modified On : Thu Mar 13 09:23:21 2025
+// Update Count     : 7255
 //
 
@@ -2244,5 +2244,5 @@
 	basic_type_specifier
 	| sue_type_specifier
-	| type_type_specifier
+	| type_type_specifier attribute_list_opt
 	;
 
Index: tests/.expect/attributes.x86.txt
===================================================================
--- tests/.expect/attributes.x86.txt	(revision 3bd950881e1bba6bb9b6912c86686aaab822bf9a)
+++ tests/.expect/attributes.x86.txt	(revision 3e91c6f91e5a3f8b46dfbdd035a898ca5dfe818f)
@@ -97,9 +97,11 @@
     __attribute__ ((used,used,unused)) signed int _X2f8i_1;
     __attribute__ ((unused)) signed int *_X2f9Pi_1;
-    __attribute__ ((unused,used)) signed int *_X3f10Pi_1;
+    __attribute__ ((used,unused)) signed int *_X3f10Pi_1;
     __attribute__ ((unused,unused)) signed int *_X3f11Pi_1;
     __attribute__ ((unused,unused,unused)) signed int *_X3f12Pi_1;
     __attribute__ ((unused,unused,unused)) signed int *_X3f13Pi_1;
     __attribute__ ((unused,unused,unused)) signed int *_X3f14Pi_1;
+    __attribute__ ((used)) signed short int _X4shi3s_1;
+    __attribute__ ((used,used)) signed short int _X4shi4s_1;
 };
 static inline void _X12_constructorFv_S3Fdl_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1){
@@ -160,4 +162,12 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X12_constructorFv_S3FdlS3Fdl_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) struct Fdl _X4_srcS3Fdl_1){
@@ -218,6 +228,22 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1=_X4_srcS3Fdl_1._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1=_X4_srcS3Fdl_1._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X11_destructorFv_S3Fdl_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1){
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ^?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ^?{} */);
+    }
+
     {
         ((void)((*_X4_dstS3Fdl_1)._X3f14Pi_1) /* ^?{} */);
@@ -336,4 +362,12 @@
 
     {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1=_X4_srcS3Fdl_1._X4shi3s_1));
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1=_X4_srcS3Fdl_1._X4shi4s_1));
+    }
+
+    {
         ((void)_X12_constructorFv_S3FdlS3Fdl_autogen___1((&_X4_retS3Fdl_1), (*_X4_dstS3Fdl_1)));
     }
@@ -398,4 +432,12 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X12_constructorFv_S3Fdlii_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1){
@@ -456,4 +498,12 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X12_constructorFv_S3Fdliii_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1, __attribute__ ((unused,unused)) signed int _X2f3i_1){
@@ -514,4 +564,12 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X12_constructorFv_S3Fdliiii_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1, __attribute__ ((unused,unused)) signed int _X2f3i_1, __attribute__ ((unused)) signed int _X2f4i_1){
@@ -572,4 +630,12 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X12_constructorFv_S3Fdliiiii_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1, __attribute__ ((unused,unused)) signed int _X2f3i_1, __attribute__ ((unused)) signed int _X2f4i_1, __attribute__ ((unused,unused)) signed int _X2f5i_1){
@@ -630,4 +696,12 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X12_constructorFv_S3Fdliiiiii_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1, __attribute__ ((unused,unused)) signed int _X2f3i_1, __attribute__ ((unused)) signed int _X2f4i_1, __attribute__ ((unused,unused)) signed int _X2f5i_1, signed int _X2f6i_1){
@@ -688,4 +762,12 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X12_constructorFv_S3Fdliiiiiii_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1, __attribute__ ((unused,unused)) signed int _X2f3i_1, __attribute__ ((unused)) signed int _X2f4i_1, __attribute__ ((unused,unused)) signed int _X2f5i_1, signed int _X2f6i_1, __attribute__ ((unused,unused)) signed int _X2f7i_1){
@@ -746,4 +828,12 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X12_constructorFv_S3Fdliiiiiiii_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1, __attribute__ ((unused,unused)) signed int _X2f3i_1, __attribute__ ((unused)) signed int _X2f4i_1, __attribute__ ((unused,unused)) signed int _X2f5i_1, signed int _X2f6i_1, __attribute__ ((unused,unused)) signed int _X2f7i_1, __attribute__ ((unused)) signed int _X2f8i_1){
@@ -804,4 +894,12 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X12_constructorFv_S3FdliiiiiiiiPi_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1, __attribute__ ((unused,unused)) signed int _X2f3i_1, __attribute__ ((unused)) signed int _X2f4i_1, __attribute__ ((unused,unused)) signed int _X2f5i_1, signed int _X2f6i_1, __attribute__ ((unused,unused)) signed int _X2f7i_1, __attribute__ ((unused)) signed int _X2f8i_1, __attribute__ ((unused)) signed int *_X2f9Pi_1){
@@ -862,4 +960,12 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X12_constructorFv_S3FdliiiiiiiiPiPi_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1, __attribute__ ((unused,unused)) signed int _X2f3i_1, __attribute__ ((unused)) signed int _X2f4i_1, __attribute__ ((unused,unused)) signed int _X2f5i_1, signed int _X2f6i_1, __attribute__ ((unused,unused)) signed int _X2f7i_1, __attribute__ ((unused)) signed int _X2f8i_1, __attribute__ ((unused)) signed int *_X2f9Pi_1, __attribute__ ((unused)) signed int *_X3f10Pi_1){
@@ -920,4 +1026,12 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X12_constructorFv_S3FdliiiiiiiiPiPiPi_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1, __attribute__ ((unused,unused)) signed int _X2f3i_1, __attribute__ ((unused)) signed int _X2f4i_1, __attribute__ ((unused,unused)) signed int _X2f5i_1, signed int _X2f6i_1, __attribute__ ((unused,unused)) signed int _X2f7i_1, __attribute__ ((unused)) signed int _X2f8i_1, __attribute__ ((unused)) signed int *_X2f9Pi_1, __attribute__ ((unused)) signed int *_X3f10Pi_1, __attribute__ ((unused,unused)) signed int *_X3f11Pi_1){
@@ -978,4 +1092,12 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X12_constructorFv_S3FdliiiiiiiiPiPiPiPi_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1, __attribute__ ((unused,unused)) signed int _X2f3i_1, __attribute__ ((unused)) signed int _X2f4i_1, __attribute__ ((unused,unused)) signed int _X2f5i_1, signed int _X2f6i_1, __attribute__ ((unused,unused)) signed int _X2f7i_1, __attribute__ ((unused)) signed int _X2f8i_1, __attribute__ ((unused)) signed int *_X2f9Pi_1, __attribute__ ((unused)) signed int *_X3f10Pi_1, __attribute__ ((unused,unused)) signed int *_X3f11Pi_1, __attribute__ ((unused,unused,unused)) signed int *_X3f12Pi_1){
@@ -1036,4 +1158,12 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X12_constructorFv_S3FdliiiiiiiiPiPiPiPiPi_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1, __attribute__ ((unused,unused)) signed int _X2f3i_1, __attribute__ ((unused)) signed int _X2f4i_1, __attribute__ ((unused,unused)) signed int _X2f5i_1, signed int _X2f6i_1, __attribute__ ((unused,unused)) signed int _X2f7i_1, __attribute__ ((unused)) signed int _X2f8i_1, __attribute__ ((unused)) signed int *_X2f9Pi_1, __attribute__ ((unused)) signed int *_X3f10Pi_1, __attribute__ ((unused,unused)) signed int *_X3f11Pi_1, __attribute__ ((unused,unused,unused)) signed int *_X3f12Pi_1, __attribute__ ((unused,unused,unused)) signed int *_X3f13Pi_1){
@@ -1094,4 +1224,12 @@
     }
 
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
 }
 static inline void _X12_constructorFv_S3FdliiiiiiiiPiPiPiPiPiPi_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1, __attribute__ ((unused,unused)) signed int _X2f3i_1, __attribute__ ((unused)) signed int _X2f4i_1, __attribute__ ((unused,unused)) signed int _X2f5i_1, signed int _X2f6i_1, __attribute__ ((unused,unused)) signed int _X2f7i_1, __attribute__ ((unused)) signed int _X2f8i_1, __attribute__ ((unused)) signed int *_X2f9Pi_1, __attribute__ ((unused)) signed int *_X3f10Pi_1, __attribute__ ((unused,unused)) signed int *_X3f11Pi_1, __attribute__ ((unused,unused,unused)) signed int *_X3f12Pi_1, __attribute__ ((unused,unused,unused)) signed int *_X3f13Pi_1, __attribute__ ((unused,unused,unused)) signed int *_X3f14Pi_1){
@@ -1150,4 +1288,144 @@
     {
         ((void)((*_X4_dstS3Fdl_1)._X3f14Pi_1=_X3f14Pi_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
+}
+static inline void _X12_constructorFv_S3FdliiiiiiiiPiPiPiPiPiPis_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1, __attribute__ ((unused,unused)) signed int _X2f3i_1, __attribute__ ((unused)) signed int _X2f4i_1, __attribute__ ((unused,unused)) signed int _X2f5i_1, signed int _X2f6i_1, __attribute__ ((unused,unused)) signed int _X2f7i_1, __attribute__ ((unused)) signed int _X2f8i_1, __attribute__ ((unused)) signed int *_X2f9Pi_1, __attribute__ ((unused)) signed int *_X3f10Pi_1, __attribute__ ((unused,unused)) signed int *_X3f11Pi_1, __attribute__ ((unused,unused,unused)) signed int *_X3f12Pi_1, __attribute__ ((unused,unused,unused)) signed int *_X3f13Pi_1, __attribute__ ((unused,unused,unused)) signed int *_X3f14Pi_1, signed short int _X4shi3s_1){
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f1i_1=_X2f1i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f2i_1=_X2f2i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f3i_1=_X2f3i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f4i_1=_X2f4i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f5i_1=_X2f5i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f6i_1=_X2f6i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f7i_1=_X2f7i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f8i_1=_X2f8i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f9Pi_1=_X2f9Pi_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X3f10Pi_1=_X3f10Pi_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X3f11Pi_1=_X3f11Pi_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X3f12Pi_1=_X3f12Pi_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X3f13Pi_1=_X3f13Pi_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X3f14Pi_1=_X3f14Pi_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1=_X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1) /* ?{} */);
+    }
+
+}
+static inline void _X12_constructorFv_S3FdliiiiiiiiPiPiPiPiPiPiss_autogen___1(__attribute__ ((unused)) struct Fdl *_X4_dstS3Fdl_1, __attribute__ ((unused)) signed int _X2f1i_1, __attribute__ ((unused)) signed int _X2f2i_1, __attribute__ ((unused,unused)) signed int _X2f3i_1, __attribute__ ((unused)) signed int _X2f4i_1, __attribute__ ((unused,unused)) signed int _X2f5i_1, signed int _X2f6i_1, __attribute__ ((unused,unused)) signed int _X2f7i_1, __attribute__ ((unused)) signed int _X2f8i_1, __attribute__ ((unused)) signed int *_X2f9Pi_1, __attribute__ ((unused)) signed int *_X3f10Pi_1, __attribute__ ((unused,unused)) signed int *_X3f11Pi_1, __attribute__ ((unused,unused,unused)) signed int *_X3f12Pi_1, __attribute__ ((unused,unused,unused)) signed int *_X3f13Pi_1, __attribute__ ((unused,unused,unused)) signed int *_X3f14Pi_1, signed short int _X4shi3s_1, signed short int _X4shi4s_1){
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f1i_1=_X2f1i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f2i_1=_X2f2i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f3i_1=_X2f3i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f4i_1=_X2f4i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f5i_1=_X2f5i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f6i_1=_X2f6i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f7i_1=_X2f7i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f8i_1=_X2f8i_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X2f9Pi_1=_X2f9Pi_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X3f10Pi_1=_X3f10Pi_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X3f11Pi_1=_X3f11Pi_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X3f12Pi_1=_X3f12Pi_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X3f13Pi_1=_X3f13Pi_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X3f14Pi_1=_X3f14Pi_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi3s_1=_X4shi3s_1) /* ?{} */);
+    }
+
+    {
+        ((void)((*_X4_dstS3Fdl_1)._X4shi4s_1=_X4shi4s_1) /* ?{} */);
     }
 
@@ -1405,5 +1683,79 @@
 
 }
-__attribute__ (( noreturn )) void _X4fredFv___1(void){
+void _X4fredFv___1(void){
+    __attribute__ ((unused)) signed int _X1ii_2;
+    {
+        __attribute__ ((unused)) signed int _X3reti_3;
+        switch ( 3 ) {
+            case 2:
+                {
+                    {
+                        ((void)4);
+                    }
+
+                    /* null statement */ ;
+                    /* null statement */ ;
+                }
+            case 1:
+                {
+                    {
+                        ((void)3);
+                    }
+
+                }
+        }
+
+    }
+
+    L: __attribute__ ((unused)) goto L;
+    L2: __attribute__ (( unused )) L1: __attribute__ (( unused )) goto L2;
+    return ;
+    return ;
+    return ;
+    {
+        ((void)(_X1ii_2+=((signed int )1)));
+    }
+
+}
+void _X4maryFv___1(void){
+    struct __attribute__ ((aligned(64))) S {
+        signed int _X1ii_2;
+    };
+    inline void _X12_constructorFv_S1S_autogen___2(__attribute__ ((unused)) struct S *_X4_dstS1S_2){
+        {
+            ((void)((*_X4_dstS1S_2)._X1ii_2) /* ?{} */);
+        }
+
+    }
+    inline void _X12_constructorFv_S1SS1S_autogen___2(__attribute__ ((unused)) struct S *_X4_dstS1S_2, __attribute__ ((unused)) struct S _X4_srcS1S_2){
+        {
+            ((void)((*_X4_dstS1S_2)._X1ii_2=_X4_srcS1S_2._X1ii_2) /* ?{} */);
+        }
+
+    }
+    inline void _X11_destructorFv_S1S_autogen___2(__attribute__ ((unused)) struct S *_X4_dstS1S_2){
+        {
+            ((void)((*_X4_dstS1S_2)._X1ii_2) /* ^?{} */);
+        }
+
+    }
+    inline struct S _X16_operator_assignFS1S_S1SS1S_autogen___2(__attribute__ ((unused)) struct S *_X4_dstS1S_2, __attribute__ ((unused)) struct S _X4_srcS1S_2){
+        __attribute__ ((unused)) struct S _X4_retS1S_2;
+        {
+            ((void)((*_X4_dstS1S_2)._X1ii_2=_X4_srcS1S_2._X1ii_2));
+        }
+
+        {
+            ((void)_X12_constructorFv_S1SS1S_autogen___2((&_X4_retS1S_2), (*_X4_dstS1S_2)));
+        }
+
+        return _X4_retS1S_2;
+    }
+    inline void _X12_constructorFv_S1Si_autogen___2(__attribute__ ((unused)) struct S *_X4_dstS1S_2, signed int _X1ii_2){
+        {
+            ((void)((*_X4_dstS1S_2)._X1ii_2=_X1ii_2) /* ?{} */);
+        }
+
+    }
     __attribute__ ((unused)) signed int _X1ii_2;
     switch ( 3 ) {
@@ -1414,4 +1766,6 @@
                 }
 
+                /* null statement */ ;
+                /* null statement */ ;
             }
         case 1:
@@ -1424,70 +1778,14 @@
     }
 
-    {
-        ((void)abort());
-    }
-
-}
-__attribute__ ((noreturn)) void _X4maryFv___1(void){
-    struct __attribute__ ((aligned(16))) S {
-        signed int _X1ii_2;
-    };
-    inline void _X12_constructorFv_S1S_autogen___2(__attribute__ ((unused)) struct S *_X4_dstS1S_2){
-        {
-            ((void)((*_X4_dstS1S_2)._X1ii_2) /* ?{} */);
-        }
-
-    }
-    inline void _X12_constructorFv_S1SS1S_autogen___2(__attribute__ ((unused)) struct S *_X4_dstS1S_2, __attribute__ ((unused)) struct S _X4_srcS1S_2){
-        {
-            ((void)((*_X4_dstS1S_2)._X1ii_2=_X4_srcS1S_2._X1ii_2) /* ?{} */);
-        }
-
-    }
-    inline void _X11_destructorFv_S1S_autogen___2(__attribute__ ((unused)) struct S *_X4_dstS1S_2){
-        {
-            ((void)((*_X4_dstS1S_2)._X1ii_2) /* ^?{} */);
-        }
-
-    }
-    inline struct S _X16_operator_assignFS1S_S1SS1S_autogen___2(__attribute__ ((unused)) struct S *_X4_dstS1S_2, __attribute__ ((unused)) struct S _X4_srcS1S_2){
-        __attribute__ ((unused)) struct S _X4_retS1S_2;
-        {
-            ((void)((*_X4_dstS1S_2)._X1ii_2=_X4_srcS1S_2._X1ii_2));
-        }
-
-        {
-            ((void)_X12_constructorFv_S1SS1S_autogen___2((&_X4_retS1S_2), (*_X4_dstS1S_2)));
-        }
-
-        return _X4_retS1S_2;
-    }
-    inline void _X12_constructorFv_S1Si_autogen___2(__attribute__ ((unused)) struct S *_X4_dstS1S_2, signed int _X1ii_2){
-        {
-            ((void)((*_X4_dstS1S_2)._X1ii_2=_X1ii_2) /* ?{} */);
-        }
-
-    }
-    __attribute__ ((unused)) signed int _X1ii_2;
-    switch ( 3 ) {
-        case 2:
-            {
-                {
-                    ((void)4);
-                }
-
-            }
-        case 1:
-            {
-                {
-                    ((void)3);
-                }
-
-            }
-    }
-
-    {
-        ((void)abort());
-    }
-
-}
+    L: __attribute__ ((unused)) goto L;
+    L2: __attribute__ ((unused)) L1: __attribute__ ((unused)) goto L2;
+    return ;
+    return ;
+    return ;
+}
+__attribute__ (( noreturn )) void _X4jackFv___1(void){
+    {
+        ((void)exit((-((signed int )1))));
+    }
+
+}
Index: tests/.expect/poly-self-cycle.txt
===================================================================
--- tests/.expect/poly-self-cycle.txt	(revision 3e91c6f91e5a3f8b46dfbdd035a898ca5dfe818f)
+++ tests/.expect/poly-self-cycle.txt	(revision 3e91c6f91e5a3f8b46dfbdd035a898ca5dfe818f)
@@ -0,0 +1,1 @@
+done!
Index: tests/include/includes.cfa
===================================================================
--- tests/include/includes.cfa	(revision 3bd950881e1bba6bb9b6912c86686aaab822bf9a)
+++ tests/include/includes.cfa	(revision 3e91c6f91e5a3f8b46dfbdd035a898ca5dfe818f)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 22 10:16:58 2023
-// Update Count     : 811
+// Last Modified On : Mon Mar 10 18:52:14 2025
+// Update Count     : 830
 //
 
@@ -63,5 +63,4 @@
 #include <ftw.h>
 #include <sys/types.h>
-//#include <gawkapi.h>									// CFA bug #240 nested anonymous enum fails
 #include <gconv.h>
 #include <getopt.h>
@@ -72,5 +71,5 @@
 #include <gshadow.h>
 #include <iconv.h>
-//#include <ifaddrs.h>									// causes warning messages that break the build
+#include <ifaddrs.h>
 #include <inttypes.h>
 #include <langinfo.h>
@@ -79,5 +78,5 @@
 #include <libintl.h>
 #include <limits.h>
-//#include <link.h>										// CFA bug #240 nested anonymous enum fails
+#include <link.h>
 #include <locale.h>
 #if __has_include( "ltdl.h" )
@@ -97,5 +96,5 @@
 #include <ncurses_dll.h>								// may not be installed, comes with ncurses
 #endif
-//#include <netdb.h>
+#include <netdb.h>
 #include <nl_types.h>
 #include <nss.h>
@@ -111,5 +110,5 @@
 #include <pwd.h>
 #include <regex.h>
-//#include <resolv.h>
+#include <resolv.h>
 #include <re_comp.h>
 #include <sched.h>
@@ -125,4 +124,5 @@
 #include <stdint.h>
 #include <stdio.h>
+#include <gawkapi.h>									// requires stdio.h, so appears after it
 #include <stdio_ext.h>
 #include <stdlib.h>
@@ -140,7 +140,7 @@
 #include <termio.h>
 #include <termios.h>
-// #include <term_entry.h>								// conflicts with search.h on some machines
+#include <term_entry.h>
 #include <tgmath.h>
-//#include <threads.h>									// does not exist
+#include <threads.h>									// does not exist
 #include <thread_db.h>
 #include <time.h>
Index: tests/meta/dumpable.cfa
===================================================================
--- tests/meta/dumpable.cfa	(revision 3bd950881e1bba6bb9b6912c86686aaab822bf9a)
+++ tests/meta/dumpable.cfa	(revision 3e91c6f91e5a3f8b46dfbdd035a898ca5dfe818f)
@@ -10,6 +10,6 @@
 // Created On       : Wed Jan 05 13:53:22 2022
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 19 07:58:45 2024
-// Update Count     : 10
+// Last Modified On : Sun Mar  2 20:56:32 2025
+// Update Count     : 18
 //
 
@@ -44,7 +44,9 @@
 void check_permission() {
 	char myExe[PATH_MAX];
-	ssize_t n = readlink( "/proc/self/exe", myExe, sizeof(myExe));
+
+	#define exe "/proc/self/exe"
+	ssize_t n = readlink( exe, myExe, sizeof(myExe));
 	if ( n < 0 ) {
-		perror( "readlink(/proc/self/exe ) error" );
+		perror( "readlink( " exe " ) error" );
 		return 1;
 	} // if
@@ -103,9 +105,10 @@
 
 void check_core_pattern() {
+	#define core_pattern "/proc/sys/kernel/core_pattern"
 	int ret;
-	int cp = open( "/proc/sys/kernel/core_pattern", 0, O_RDONLY );
+	int cp = open( core_pattern, 0, O_RDONLY );
 
 	if ( cp < 0 ) {
-		perror( "open(/proc/sys/kernel/core_pattern, O_RDONLY ) error" );
+		perror( "open( " core_pattern ", 0, O_RDONLY ) error" );
 		return;
 	} // if
@@ -128,5 +131,5 @@
 	} finally {
 		ret = close( cp );
-		if ( ret < 0 ) perror( "close( /proc/sys/kernel/core_pattern ) error" );
+		if ( ret < 0 ) perror( "close( " core_pattern " ) error" );
 	} // try
 }
Index: tests/poly-self-cycle.cfa
===================================================================
--- tests/poly-self-cycle.cfa	(revision 3e91c6f91e5a3f8b46dfbdd035a898ca5dfe818f)
+++ tests/poly-self-cycle.cfa	(revision 3e91c6f91e5a3f8b46dfbdd035a898ca5dfe818f)
@@ -0,0 +1,38 @@
+// Make sure that self references in polymorphic types do not cause issues.
+
+forall(T)
+struct TreeNodeO {
+	T data;
+	TreeNodeO(T) * left;
+	TreeNodeO(T) * right;
+};
+
+forall(T &)
+struct TreeNodeD {
+	T * data;
+	TreeNodeD(T) * left;
+	TreeNodeD(T) * right;
+};
+
+// Instantiate the two types in different ways.
+forall(U)
+void tree_node(TreeNodeO(U) & this) {
+	TreeNodeO(U) local;
+	local.left = &this;
+}
+
+forall(U)
+void tree_node(TreeNodeD(U) & this) {
+	TreeNodeD(U) local;
+	local.left = &this;
+}
+
+int main() {
+	TreeNodeO(int) node0;
+	tree_node(node0);
+	TreeNodeD(int) node1;
+	tree_node(node1);
+
+	// There is nothing interesting to print, so just print some noise.
+	printf("done!\n");
+}
