Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 4c0b674ab581090dfc425f4931071a611831ff0d)
+++ src/Parser/DeclarationNode.cc	(revision dc3fbe5bd865dbd99791884dd9ea7dbd1bbbb45e)
@@ -172,5 +172,5 @@
 
 void DeclarationNode::printList( std::ostream & os, int indent ) const {
-	ParseNode::printList( os, indent );
+	ParseList::printList( os, indent );
 	if ( hasEllipsis ) {
 		os << string( indent, ' ' )  << "and a variable number of other arguments" << endl;
@@ -584,9 +584,9 @@
 	if ( q->type->forall ) {							// forall qualifier ?
 		if ( type->forall ) {							// polymorphic routine ?
-			type->forall->appendList( q->type->forall ); // augment forall qualifier
+			type->forall->set_last( q->type->forall ); // augment forall qualifier
 		} else {
 			if ( type->kind == TypeData::Aggregate ) {	// struct/union ?
 				if ( type->aggregate.params ) {			// polymorphic ?
-					type->aggregate.params->appendList( q->type->forall ); // augment forall qualifier
+					type->aggregate.params->set_last( q->type->forall ); // augment forall qualifier
 				} else {								// not polymorphic
 					type->aggregate.params = q->type->forall; // set forall qualifier
@@ -612,5 +612,5 @@
 	if ( src->forall && dst->kind == TypeData::Function ) {
 		if ( dst->forall ) {
-			dst->forall->appendList( src->forall );
+			dst->forall->set_last( src->forall );
 		} else {
 			dst->forall = src->forall;
@@ -674,5 +674,5 @@
 			default:
 				if ( dst->forall ) {
-					dst->forall->appendList( src->forall );
+					dst->forall->set_last( src->forall );
 				} else {
 					dst->forall = src->forall;
@@ -747,5 +747,5 @@
 	if ( variable.tyClass != ast::TypeDecl::NUMBER_OF_KINDS ) {
 		if ( variable.assertions ) {
-			variable.assertions->appendList( assertions );
+			variable.assertions->set_last( assertions );
 		} else {
 			variable.assertions = assertions;
@@ -758,5 +758,5 @@
 	case TypeData::Symbolic:
 		if ( type->symbolic.assertions ) {
-			type->symbolic.assertions->appendList( assertions );
+			type->symbolic.assertions->set_last( assertions );
 		} else {
 			type->symbolic.assertions = assertions;
@@ -1101,5 +1101,5 @@
 	std::back_insert_iterator<std::vector<ast::ptr<ast::Decl>>> out( outputList );
 
-	for ( const DeclarationNode * cur = firstNode ; cur ; cur = strict_next( cur ) ) {
+	for ( const DeclarationNode * cur = firstNode ; cur ; cur = cur->next ) {
 		try {
 			bool extracted_named = false;
@@ -1169,5 +1169,5 @@
 	std::back_insert_iterator<std::vector<ast::ptr<ast::DeclWithType>>> out( outputList );
 
-	for ( const DeclarationNode * cur = firstNode; cur; cur = strict_next( cur ) ) {
+	for ( const DeclarationNode * cur = firstNode; cur; cur = cur->next ) {
 		try {
 			ast::Decl * decl = cur->build();
@@ -1219,5 +1219,5 @@
 	std::back_insert_iterator<std::vector<ast::ptr<ast::Type>>> out( outputList );
 
-	for ( const DeclarationNode * cur = firstNode ; cur ; cur = strict_next( cur ) ) {
+	for ( const DeclarationNode * cur = firstNode ; cur ; cur = cur->next ) {
 		try {
 			* out++ = cur->buildType();
Index: src/Parser/DeclarationNode.h
===================================================================
--- src/Parser/DeclarationNode.h	(revision 4c0b674ab581090dfc425f4931071a611831ff0d)
+++ src/Parser/DeclarationNode.h	(revision dc3fbe5bd865dbd99791884dd9ea7dbd1bbbb45e)
@@ -19,7 +19,7 @@
 
 struct TypeData;
-class InitializerNode;
-
-struct DeclarationNode : public ParseNode {
+struct InitializerNode;
+
+struct DeclarationNode final : public ParseList<DeclarationNode> {
 	// These enumerations must harmonize with their names in DeclarationNode.cc.
 	enum BasicType {
@@ -108,8 +108,4 @@
 	DeclarationNode * cloneBaseType( DeclarationNode * newdecl, bool = true );
 
-	DeclarationNode * appendList( DeclarationNode * node ) {
-		return (DeclarationNode *)set_last( node );
-	}
-
 	virtual void print( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const override;
 	virtual void printList( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const override;
@@ -128,6 +124,4 @@
 	bool get_inLine() const { return inLine; }
 	DeclarationNode * set_inLine( bool inL ) { inLine = inL; return this; }
-
-	DeclarationNode * get_last() { return (DeclarationNode *)ParseNode::get_last(); }
 
 	const std::string * name = nullptr;
@@ -179,12 +173,4 @@
 }
 
-template<typename NodeType>
-NodeType * strict_next( NodeType * node ) {
-	ParseNode * next = node->get_next();
-	if ( nullptr == next ) return nullptr;
-	if ( NodeType * ret = dynamic_cast<NodeType *>( next ) ) return ret;
-	SemanticError( next->location, "internal error, non-homogeneous nodes founds in buildList processing." );
-}
-
 // This generic buildList is here along side its overloads.
 template<typename AstType, typename NodeType,
@@ -195,5 +181,5 @@
 	std::back_insert_iterator<Container<ast::ptr<AstType>, Args...>> out( output );
 
-	for ( NodeType * cur = firstNode ; cur ; cur = strict_next( cur ) ) {
+	for ( NodeType * cur = firstNode ; cur ; cur = cur->next ) {
 		try {
 			AstType * node = dynamic_cast<AstType *>( maybeBuild( cur ) );
Index: src/Parser/ExpressionNode.h
===================================================================
--- src/Parser/ExpressionNode.h	(revision 4c0b674ab581090dfc425f4931071a611831ff0d)
+++ src/Parser/ExpressionNode.h	(revision dc3fbe5bd865dbd99791884dd9ea7dbd1bbbb45e)
@@ -18,14 +18,14 @@
 #include "ParseNode.h"
 
-class InitializerNode;
+struct InitializerNode;
 
-class ExpressionNode final : public ParseNode {
-public:
+struct ExpressionNode final : public ParseList<ExpressionNode> {
 	ExpressionNode( ast::Expr * expr = nullptr ) : expr( expr ) {}
 	virtual ~ExpressionNode() {}
 	virtual ExpressionNode * clone() const override {
 		if ( nullptr == expr ) return nullptr;
-		return static_cast<ExpressionNode*>(
-			(new ExpressionNode( ast::shallowCopy( expr.get() ) ))->set_next( maybeCopy( get_next() ) ));
+		ExpressionNode * node = new ExpressionNode( ast::shallowCopy( expr.get() ) );
+		node->set_next( maybeCopy( get_next() ) );
+		return node;
 	}
 
Index: src/Parser/InitializerNode.h
===================================================================
--- src/Parser/InitializerNode.h	(revision 4c0b674ab581090dfc425f4931071a611831ff0d)
+++ src/Parser/InitializerNode.h	(revision dc3fbe5bd865dbd99791884dd9ea7dbd1bbbb45e)
@@ -18,6 +18,5 @@
 #include "ParseNode.h"
 
-class InitializerNode : public ParseNode {
-public:
+struct InitializerNode final : public ParseList<InitializerNode> {
 	InitializerNode( ExpressionNode *, bool aggrp = false, ExpressionNode * des = nullptr );
 	InitializerNode( InitializerNode *, bool aggrp = false, ExpressionNode * des = nullptr );
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 4c0b674ab581090dfc425f4931071a611831ff0d)
+++ src/Parser/ParseNode.h	(revision dc3fbe5bd865dbd99791884dd9ea7dbd1bbbb45e)
@@ -33,6 +33,6 @@
 
 struct DeclarationNode;
-class InitializerNode;
-class ExpressionNode;
+struct InitializerNode;
+struct ExpressionNode;
 struct StatementNode;
 
@@ -45,24 +45,36 @@
 extern YYLTYPE yylloc;
 
-class ParseNode {
-  public:
-	ParseNode() {};
-	virtual ~ParseNode() { delete next; };
+struct ParseNode {
+	ParseNode() {}
+	virtual ~ParseNode() {}
 	virtual ParseNode * clone() const = 0;
 
-	ParseNode * get_next() const { return next; }
-	ParseNode * set_next( ParseNode * newlink ) { next = newlink; return this; }
+	virtual void print( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const {}
 
-	ParseNode * get_last() {
-		ParseNode * current;
-		for ( current = this; current->get_next() != nullptr; current = current->get_next() );
+	static int indent_by;
+
+	CodeLocation location = yylloc;
+}; // ParseNode
+
+/// Only ever use in the form `struct NAME final : public ParseList<NAME>`!
+template<typename Next>
+struct ParseList : public ParseNode {
+	ParseList() {}
+	virtual ~ParseList() { delete next; };
+	virtual ParseList<Next> * clone() const = 0;
+
+	Next * get_next() const { return next; }
+	void set_next( Next * newlink ) { next = newlink; }
+
+	Next * get_last() {
+		Next * current = static_cast<Next *>( this );
+		while ( current->next != nullptr ) current = current->next;
 		return current;
 	}
-	ParseNode * set_last( ParseNode * newlast ) {
-		if ( newlast != nullptr ) get_last()->set_next( newlast );
-		return this;
+	Next * set_last( Next * newlast ) {
+		if ( newlast != nullptr ) get_last()->next = newlast;
+		return static_cast<Next *>( this );
 	}
 
-	virtual void print( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const {}
 	virtual void printList( std::ostream & os, int indent = 0 ) const {
 		print( os, indent );
@@ -70,9 +82,6 @@
 	}
 
-	static int indent_by;
-
-	ParseNode * next = nullptr;
-	CodeLocation location = yylloc;
-}; // ParseNode
+	Next * next = nullptr;
+};
 
 // Must harmonize with OperName.
Index: src/Parser/StatementNode.h
===================================================================
--- src/Parser/StatementNode.h	(revision 4c0b674ab581090dfc425f4931071a611831ff0d)
+++ src/Parser/StatementNode.h	(revision dc3fbe5bd865dbd99791884dd9ea7dbd1bbbb45e)
@@ -18,5 +18,5 @@
 #include "ParseNode.h"
 
-struct StatementNode final : public ParseNode {
+struct StatementNode final : public ParseList<StatementNode> {
 	StatementNode() : stmt( nullptr ) {}
 	StatementNode( ast::Stmt * stmt ) : stmt( stmt ) {}
@@ -39,12 +39,7 @@
 }; // StatementNode
 
-struct ClauseNode final : public ParseNode {
+struct ClauseNode final : public ParseList<ClauseNode> {
 	ClauseNode( ast::StmtClause * clause ) : clause( clause ) {}
 	virtual ~ClauseNode() {}
-
-	ClauseNode * set_last( ParseNode * newlast ) {
-		ParseNode::set_last( newlast );
-        return this;
-    }
 
 	virtual ClauseNode * clone() const final { assert( false ); return nullptr; }
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 4c0b674ab581090dfc425f4931071a611831ff0d)
+++ src/Parser/parser.yy	(revision dc3fbe5bd865dbd99791884dd9ea7dbd1bbbb45e)
@@ -1897,5 +1897,5 @@
 declaration_list:
 	declaration
-	| declaration_list declaration		{ $$ = $1->appendList( $2 ); }
+	| declaration_list declaration		{ $$ = $1->set_last( $2 ); }
 	;
 
@@ -1910,5 +1910,5 @@
 		{ $$ = $1; }
 	| KR_parameter_list c_declaration ';'
-		{ $$ = $1->appendList( $2 ); }
+		{ $$ = $1->set_last( $2 ); }
 	;
 
@@ -1968,5 +1968,5 @@
 		{ $$ = $2->addQualifiers( $1 )->addInitializer( $3 ); }
 	| cfa_variable_declaration pop ',' push identifier_or_type_name initializer_opt
-		{ $$ = $1->appendList( $1->cloneType( $5 )->addInitializer( $6 ) ); }
+		{ $$ = $1->set_last( $1->cloneType( $5 )->addInitializer( $6 ) ); }
 	;
 
@@ -1995,5 +1995,5 @@
 			DeclarationNode * ret = new DeclarationNode;
 			ret->type = maybeCopy( $1->type->base );
-			$$ = $1->appendList( DeclarationNode::newFunction( $3, ret, $6, nullptr ) );
+			$$ = $1->set_last( DeclarationNode::newFunction( $3, ret, $6, nullptr ) );
 		}
 	;
@@ -2034,5 +2034,5 @@
 	| '[' push cfa_parameter_list pop ',' push cfa_abstract_parameter_list pop ']'
 		// To obtain LR(1 ), the last cfa_abstract_parameter_list is added into this flattened rule to lookahead to the ']'.
-		{ $$ = DeclarationNode::newTuple( $3->appendList( $7 ) ); }
+		{ $$ = DeclarationNode::newTuple( $3->set_last( $7 ) ); }
 	;
 
@@ -2051,5 +2051,5 @@
 		{
 			typedefTable.addToEnclosingScope( *$5, TYPEDEFname, "cfa_typedef_declaration 3" );
-			$$ = $1->appendList( $1->cloneType( $5 ) );
+			$$ = $1->set_last( $1->cloneType( $5 ) );
 		}
 	;
@@ -2069,5 +2069,5 @@
 		{
 			typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname, "typedef_declaration 2" );
-			$$ = $1->appendList( $1->cloneBaseType( $3 )->addTypedef() );
+			$$ = $1->set_last( $1->cloneBaseType( $3 )->addTypedef() );
 		}
 	| type_qualifier_list TYPEDEF type_specifier declarator // remaining OBSOLESCENT (see 2 )
@@ -2123,5 +2123,5 @@
 
 	| declaring_list ',' attribute_list_opt declarator asm_name_opt initializer_opt
-		{ $$ = $1->appendList( $4->addQualifiers( $3 )->addAsmName( $5 )->addInitializer( $6 ) ); }
+		{ $$ = $1->set_last( $4->addQualifiers( $3 )->addAsmName( $5 )->addInitializer( $6 ) ); }
 	;
 
@@ -2587,5 +2587,5 @@
 		{ $$ = nullptr; }
 	| field_declaration_list_opt field_declaration
-		{ $$ = $1 ? $1->appendList( $2 ) : $2; }
+		{ $$ = $1 ? $1->set_last( $2 ) : $2; }
 	;
 
@@ -2635,5 +2635,5 @@
 	| field_declarator
 	| field_declaring_list_opt ',' attribute_list_opt field_declarator
-		{ $$ = $1->appendList( $4->addQualifiers( $3 ) ); }
+		{ $$ = $1->set_last( $4->addQualifiers( $3 ) ); }
 	;
 
@@ -2657,5 +2657,5 @@
 	| field_abstract
 	| field_abstract_list_opt ',' attribute_list_opt field_abstract
-		{ $$ = $1->appendList( $4->addQualifiers( $3 ) ); }
+		{ $$ = $1->set_last( $4->addQualifiers( $3 ) ); }
 	;
 
@@ -2670,5 +2670,5 @@
 		{ $$ = $1->addName( $2 ); }
 	| cfa_field_declaring_list ',' identifier_or_type_name
-		{ $$ = $1->appendList( $1->cloneType( $3 ) ); }
+		{ $$ = $1->set_last( $1->cloneType( $3 ) ); }
 	;
 
@@ -2677,5 +2677,5 @@
 	cfa_abstract_declarator_tuple
 	| cfa_field_abstract_list ','
-		{ $$ = $1->appendList( $1->cloneType( 0 ) ); }
+		{ $$ = $1->set_last( $1->cloneType( 0 ) ); }
 	;
 
@@ -2769,7 +2769,7 @@
 		{ $$ = DeclarationNode::newEnumInLine( *$2->type->symbolic.name ); }
 	| enumerator_list ',' visible_hide_opt identifier_or_type_name enumerator_value_opt
-		{ $$ = $1->appendList( DeclarationNode::newEnumValueGeneric( $4, $5 ) ); }
+		{ $$ = $1->set_last( DeclarationNode::newEnumValueGeneric( $4, $5 ) ); }
 	| enumerator_list ',' INLINE type_name enumerator_value_opt
-		{ $$ = $1->appendList( DeclarationNode::newEnumValueGeneric( new string("inline"), nullptr ) ); }
+		{ $$ = $1->set_last( DeclarationNode::newEnumValueGeneric( new string("inline"), nullptr ) ); }
 	;
 
@@ -2797,5 +2797,5 @@
 	| cfa_parameter_list
 	| cfa_parameter_list pop ',' push cfa_abstract_parameter_list
-		{ $$ = $1->appendList( $5 ); }
+		{ $$ = $1->set_last( $5 ); }
 	| cfa_abstract_parameter_list pop ',' push ELLIPSIS
 		{ $$ = $1->addVarArgs(); }
@@ -2809,9 +2809,9 @@
 	cfa_parameter_declaration
 	| cfa_abstract_parameter_list pop ',' push cfa_parameter_declaration
-		{ $$ = $1->appendList( $5 ); }
+		{ $$ = $1->set_last( $5 ); }
 	| cfa_parameter_list pop ',' push cfa_parameter_declaration
-		{ $$ = $1->appendList( $5 ); }
+		{ $$ = $1->set_last( $5 ); }
 	| cfa_parameter_list pop ',' push cfa_abstract_parameter_list pop ',' push cfa_parameter_declaration
-		{ $$ = $1->appendList( $5 )->appendList( $9 ); }
+		{ $$ = $1->set_last( $5 )->set_last( $9 ); }
 	;
 
@@ -2819,5 +2819,5 @@
 	cfa_abstract_parameter_declaration
 	| cfa_abstract_parameter_list pop ',' push cfa_abstract_parameter_declaration
-		{ $$ = $1->appendList( $5 ); }
+		{ $$ = $1->set_last( $5 ); }
 	;
 
@@ -2836,7 +2836,7 @@
 	| parameter_declaration
 	| parameter_list ',' abstract_parameter_declaration
-		{ $$ = $1->appendList( $3 ); }
+		{ $$ = $1->set_last( $3 ); }
 	| parameter_list ',' parameter_declaration
-		{ $$ = $1->appendList( $3 ); }
+		{ $$ = $1->set_last( $3 ); }
 	;
 
@@ -2889,5 +2889,5 @@
 		{ $$ = DeclarationNode::newName( $1 ); }
 	| identifier_list ',' identifier
-		{ $$ = $1->appendList( DeclarationNode::newName( $3 ) ); }
+		{ $$ = $1->set_last( DeclarationNode::newName( $3 ) ); }
 	;
 
@@ -2990,5 +2990,5 @@
 	type_parameter
 	| type_parameter_list ',' type_parameter
-		{ $$ = $1->appendList( $3 ); }
+		{ $$ = $1->set_last( $3 ); }
 	;
 
@@ -3063,5 +3063,5 @@
 	assertion
 	| assertion_list assertion
-		{ $$ = $1->appendList( $2 ); }
+		{ $$ = $1->set_last( $2 ); }
 	;
 
@@ -3091,5 +3091,5 @@
 		{ $$ = $3->addQualifiers( $1 ); }
 	| type_declaring_list ',' type_declarator
-		{ $$ = $1->appendList( $3->copySpecifiers( $1 ) ); }
+		{ $$ = $1->set_last( $3->copySpecifiers( $1 ) ); }
 	;
 
@@ -3134,5 +3134,5 @@
 	trait_declaration
 	| trait_declaration_list pop push trait_declaration
-		{ $$ = $1->appendList( $4 ); }
+		{ $$ = $1->set_last( $4 ); }
 	;
 
@@ -3146,5 +3146,5 @@
 	| cfa_function_specifier
 	| cfa_trait_declaring_list pop ',' push identifier_or_type_name
-		{ $$ = $1->appendList( $1->cloneType( $5 ) ); }
+		{ $$ = $1->set_last( $1->cloneType( $5 ) ); }
 	;
 
@@ -3153,5 +3153,5 @@
 		{ $$ = $2->addType( $1 ); }
 	| trait_declaring_list pop ',' push declarator
-		{ $$ = $1->appendList( $1->cloneBaseType( $5 ) ); }
+		{ $$ = $1->set_last( $1->cloneBaseType( $5 ) ); }
 	;
 
@@ -3161,5 +3161,5 @@
 	// empty, input file
 	| external_definition_list
-		{ parseTree = parseTree ? parseTree->appendList( $1 ) : $1;	}
+		{ parseTree = parseTree ? parseTree->set_last( $1 ) : $1;	}
 	;
 
@@ -3168,5 +3168,5 @@
 		{ $$ = $2; }
 	| external_definition_list push external_definition pop
-		{ $$ = $1 ? $1->appendList( $3 ) : $3; }
+		{ $$ = $1 ? $1->set_last( $3 ) : $3; }
 	;
 
