diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index 605c97c486b349f299aadf283ed7e7481689d582..36854c18b20635715d4cfbb3710b215eb8a15a70 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -34,6 +34,8 @@ CPLUSPLUS_BEGIN_NAMESPACE
 SimpleSpecifierAST *SimpleSpecifierAST::clone(MemoryPool *pool) const
 {
     SimpleSpecifierAST *ast = new (pool) SimpleSpecifierAST;
+    // copy SpecifierAST
+    if (next) ast->next = next->clone(pool);
     // copy SimpleSpecifierAST
     ast->specifier_token = specifier_token;
     return ast;
@@ -42,6 +44,8 @@ SimpleSpecifierAST *SimpleSpecifierAST::clone(MemoryPool *pool) const
 AttributeSpecifierAST *AttributeSpecifierAST::clone(MemoryPool *pool) const
 {
     AttributeSpecifierAST *ast = new (pool) AttributeSpecifierAST;
+    // copy SpecifierAST
+    if (next) ast->next = next->clone(pool);
     // copy AttributeSpecifierAST
     ast->attribute_token = attribute_token;
     ast->first_lparen_token = first_lparen_token;
@@ -69,6 +73,8 @@ AttributeAST *AttributeAST::clone(MemoryPool *pool) const
 TypeofSpecifierAST *TypeofSpecifierAST::clone(MemoryPool *pool) const
 {
     TypeofSpecifierAST *ast = new (pool) TypeofSpecifierAST;
+    // copy SpecifierAST
+    if (next) ast->next = next->clone(pool);
     // copy TypeofSpecifierAST
     ast->typeof_token = typeof_token;
     ast->lparen_token = lparen_token;
@@ -93,6 +99,7 @@ DeclaratorAST *DeclaratorAST::clone(MemoryPool *pool) const
 ExpressionListAST *ExpressionListAST::clone(MemoryPool *pool) const
 {
     ExpressionListAST *ast = new (pool) ExpressionListAST;
+    // copy ExpressionAST
     // copy ExpressionListAST
     ast->comma_token = comma_token;
     if (expression) ast->expression = expression->clone(pool);
@@ -103,6 +110,8 @@ ExpressionListAST *ExpressionListAST::clone(MemoryPool *pool) const
 SimpleDeclarationAST *SimpleDeclarationAST::clone(MemoryPool *pool) const
 {
     SimpleDeclarationAST *ast = new (pool) SimpleDeclarationAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy SimpleDeclarationAST
     ast->qt_invokable_token = qt_invokable_token;
     if (decl_specifier_seq) ast->decl_specifier_seq = decl_specifier_seq->clone(pool);
@@ -114,6 +123,8 @@ SimpleDeclarationAST *SimpleDeclarationAST::clone(MemoryPool *pool) const
 EmptyDeclarationAST *EmptyDeclarationAST::clone(MemoryPool *pool) const
 {
     EmptyDeclarationAST *ast = new (pool) EmptyDeclarationAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy EmptyDeclarationAST
     ast->semicolon_token = semicolon_token;
     return ast;
@@ -122,6 +133,8 @@ EmptyDeclarationAST *EmptyDeclarationAST::clone(MemoryPool *pool) const
 AccessDeclarationAST *AccessDeclarationAST::clone(MemoryPool *pool) const
 {
     AccessDeclarationAST *ast = new (pool) AccessDeclarationAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy AccessDeclarationAST
     ast->access_specifier_token = access_specifier_token;
     ast->slots_token = slots_token;
@@ -132,6 +145,8 @@ AccessDeclarationAST *AccessDeclarationAST::clone(MemoryPool *pool) const
 AsmDefinitionAST *AsmDefinitionAST::clone(MemoryPool *pool) const
 {
     AsmDefinitionAST *ast = new (pool) AsmDefinitionAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy AsmDefinitionAST
     ast->asm_token = asm_token;
     ast->volatile_token = volatile_token;
@@ -156,6 +171,7 @@ BaseSpecifierAST *BaseSpecifierAST::clone(MemoryPool *pool) const
 CompoundLiteralAST *CompoundLiteralAST::clone(MemoryPool *pool) const
 {
     CompoundLiteralAST *ast = new (pool) CompoundLiteralAST;
+    // copy ExpressionAST
     // copy CompoundLiteralAST
     ast->lparen_token = lparen_token;
     if (type_id) ast->type_id = type_id->clone(pool);
@@ -167,6 +183,7 @@ CompoundLiteralAST *CompoundLiteralAST::clone(MemoryPool *pool) const
 QtMethodAST *QtMethodAST::clone(MemoryPool *pool) const
 {
     QtMethodAST *ast = new (pool) QtMethodAST;
+    // copy ExpressionAST
     // copy QtMethodAST
     ast->method_token = method_token;
     ast->lparen_token = lparen_token;
@@ -178,6 +195,7 @@ QtMethodAST *QtMethodAST::clone(MemoryPool *pool) const
 BinaryExpressionAST *BinaryExpressionAST::clone(MemoryPool *pool) const
 {
     BinaryExpressionAST *ast = new (pool) BinaryExpressionAST;
+    // copy ExpressionAST
     // copy BinaryExpressionAST
     if (left_expression) ast->left_expression = left_expression->clone(pool);
     ast->binary_op_token = binary_op_token;
@@ -188,6 +206,7 @@ BinaryExpressionAST *BinaryExpressionAST::clone(MemoryPool *pool) const
 CastExpressionAST *CastExpressionAST::clone(MemoryPool *pool) const
 {
     CastExpressionAST *ast = new (pool) CastExpressionAST;
+    // copy ExpressionAST
     // copy CastExpressionAST
     ast->lparen_token = lparen_token;
     if (type_id) ast->type_id = type_id->clone(pool);
@@ -199,6 +218,8 @@ CastExpressionAST *CastExpressionAST::clone(MemoryPool *pool) const
 ClassSpecifierAST *ClassSpecifierAST::clone(MemoryPool *pool) const
 {
     ClassSpecifierAST *ast = new (pool) ClassSpecifierAST;
+    // copy SpecifierAST
+    if (next) ast->next = next->clone(pool);
     // copy ClassSpecifierAST
     ast->classkey_token = classkey_token;
     if (attributes) ast->attributes = attributes->clone(pool);
@@ -214,6 +235,8 @@ ClassSpecifierAST *ClassSpecifierAST::clone(MemoryPool *pool) const
 CaseStatementAST *CaseStatementAST::clone(MemoryPool *pool) const
 {
     CaseStatementAST *ast = new (pool) CaseStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy CaseStatementAST
     ast->case_token = case_token;
     if (expression) ast->expression = expression->clone(pool);
@@ -225,6 +248,8 @@ CaseStatementAST *CaseStatementAST::clone(MemoryPool *pool) const
 CompoundStatementAST *CompoundStatementAST::clone(MemoryPool *pool) const
 {
     CompoundStatementAST *ast = new (pool) CompoundStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy CompoundStatementAST
     ast->lbrace_token = lbrace_token;
     if (statements) ast->statements = statements->clone(pool);
@@ -235,6 +260,7 @@ CompoundStatementAST *CompoundStatementAST::clone(MemoryPool *pool) const
 ConditionAST *ConditionAST::clone(MemoryPool *pool) const
 {
     ConditionAST *ast = new (pool) ConditionAST;
+    // copy ExpressionAST
     // copy ConditionAST
     if (type_specifier) ast->type_specifier = type_specifier->clone(pool);
     if (declarator) ast->declarator = declarator->clone(pool);
@@ -244,6 +270,7 @@ ConditionAST *ConditionAST::clone(MemoryPool *pool) const
 ConditionalExpressionAST *ConditionalExpressionAST::clone(MemoryPool *pool) const
 {
     ConditionalExpressionAST *ast = new (pool) ConditionalExpressionAST;
+    // copy ExpressionAST
     // copy ConditionalExpressionAST
     if (condition) ast->condition = condition->clone(pool);
     ast->question_token = question_token;
@@ -256,6 +283,7 @@ ConditionalExpressionAST *ConditionalExpressionAST::clone(MemoryPool *pool) cons
 CppCastExpressionAST *CppCastExpressionAST::clone(MemoryPool *pool) const
 {
     CppCastExpressionAST *ast = new (pool) CppCastExpressionAST;
+    // copy ExpressionAST
     // copy CppCastExpressionAST
     ast->cast_token = cast_token;
     ast->less_token = less_token;
@@ -279,6 +307,8 @@ CtorInitializerAST *CtorInitializerAST::clone(MemoryPool *pool) const
 DeclarationStatementAST *DeclarationStatementAST::clone(MemoryPool *pool) const
 {
     DeclarationStatementAST *ast = new (pool) DeclarationStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy DeclarationStatementAST
     if (declaration) ast->declaration = declaration->clone(pool);
     return ast;
@@ -287,6 +317,7 @@ DeclarationStatementAST *DeclarationStatementAST::clone(MemoryPool *pool) const
 DeclaratorIdAST *DeclaratorIdAST::clone(MemoryPool *pool) const
 {
     DeclaratorIdAST *ast = new (pool) DeclaratorIdAST;
+    // copy CoreDeclaratorAST
     // copy DeclaratorIdAST
     if (name) ast->name = name->clone(pool);
     return ast;
@@ -295,6 +326,7 @@ DeclaratorIdAST *DeclaratorIdAST::clone(MemoryPool *pool) const
 NestedDeclaratorAST *NestedDeclaratorAST::clone(MemoryPool *pool) const
 {
     NestedDeclaratorAST *ast = new (pool) NestedDeclaratorAST;
+    // copy CoreDeclaratorAST
     // copy NestedDeclaratorAST
     ast->lparen_token = lparen_token;
     if (declarator) ast->declarator = declarator->clone(pool);
@@ -305,6 +337,8 @@ NestedDeclaratorAST *NestedDeclaratorAST::clone(MemoryPool *pool) const
 FunctionDeclaratorAST *FunctionDeclaratorAST::clone(MemoryPool *pool) const
 {
     FunctionDeclaratorAST *ast = new (pool) FunctionDeclaratorAST;
+    // copy PostfixDeclaratorAST
+    if (next) ast->next = next->clone(pool);
     // copy FunctionDeclaratorAST
     ast->lparen_token = lparen_token;
     if (parameters) ast->parameters = parameters->clone(pool);
@@ -318,6 +352,8 @@ FunctionDeclaratorAST *FunctionDeclaratorAST::clone(MemoryPool *pool) const
 ArrayDeclaratorAST *ArrayDeclaratorAST::clone(MemoryPool *pool) const
 {
     ArrayDeclaratorAST *ast = new (pool) ArrayDeclaratorAST;
+    // copy PostfixDeclaratorAST
+    if (next) ast->next = next->clone(pool);
     // copy ArrayDeclaratorAST
     ast->lbracket_token = lbracket_token;
     if (expression) ast->expression = expression->clone(pool);
@@ -338,6 +374,7 @@ DeclaratorListAST *DeclaratorListAST::clone(MemoryPool *pool) const
 DeleteExpressionAST *DeleteExpressionAST::clone(MemoryPool *pool) const
 {
     DeleteExpressionAST *ast = new (pool) DeleteExpressionAST;
+    // copy ExpressionAST
     // copy DeleteExpressionAST
     ast->scope_token = scope_token;
     ast->delete_token = delete_token;
@@ -350,6 +387,8 @@ DeleteExpressionAST *DeleteExpressionAST::clone(MemoryPool *pool) const
 DoStatementAST *DoStatementAST::clone(MemoryPool *pool) const
 {
     DoStatementAST *ast = new (pool) DoStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy DoStatementAST
     ast->do_token = do_token;
     if (statement) ast->statement = statement->clone(pool);
@@ -364,6 +403,8 @@ DoStatementAST *DoStatementAST::clone(MemoryPool *pool) const
 NamedTypeSpecifierAST *NamedTypeSpecifierAST::clone(MemoryPool *pool) const
 {
     NamedTypeSpecifierAST *ast = new (pool) NamedTypeSpecifierAST;
+    // copy SpecifierAST
+    if (next) ast->next = next->clone(pool);
     // copy NamedTypeSpecifierAST
     if (name) ast->name = name->clone(pool);
     return ast;
@@ -372,6 +413,8 @@ NamedTypeSpecifierAST *NamedTypeSpecifierAST::clone(MemoryPool *pool) const
 ElaboratedTypeSpecifierAST *ElaboratedTypeSpecifierAST::clone(MemoryPool *pool) const
 {
     ElaboratedTypeSpecifierAST *ast = new (pool) ElaboratedTypeSpecifierAST;
+    // copy SpecifierAST
+    if (next) ast->next = next->clone(pool);
     // copy ElaboratedTypeSpecifierAST
     ast->classkey_token = classkey_token;
     if (name) ast->name = name->clone(pool);
@@ -381,6 +424,8 @@ ElaboratedTypeSpecifierAST *ElaboratedTypeSpecifierAST::clone(MemoryPool *pool)
 EnumSpecifierAST *EnumSpecifierAST::clone(MemoryPool *pool) const
 {
     EnumSpecifierAST *ast = new (pool) EnumSpecifierAST;
+    // copy SpecifierAST
+    if (next) ast->next = next->clone(pool);
     // copy EnumSpecifierAST
     ast->enum_token = enum_token;
     if (name) ast->name = name->clone(pool);
@@ -405,6 +450,8 @@ EnumeratorAST *EnumeratorAST::clone(MemoryPool *pool) const
 ExceptionDeclarationAST *ExceptionDeclarationAST::clone(MemoryPool *pool) const
 {
     ExceptionDeclarationAST *ast = new (pool) ExceptionDeclarationAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy ExceptionDeclarationAST
     if (type_specifier) ast->type_specifier = type_specifier->clone(pool);
     if (declarator) ast->declarator = declarator->clone(pool);
@@ -427,6 +474,8 @@ ExceptionSpecificationAST *ExceptionSpecificationAST::clone(MemoryPool *pool) co
 ExpressionOrDeclarationStatementAST *ExpressionOrDeclarationStatementAST::clone(MemoryPool *pool) const
 {
     ExpressionOrDeclarationStatementAST *ast = new (pool) ExpressionOrDeclarationStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy ExpressionOrDeclarationStatementAST
     if (expression) ast->expression = expression->clone(pool);
     if (declaration) ast->declaration = declaration->clone(pool);
@@ -436,6 +485,8 @@ ExpressionOrDeclarationStatementAST *ExpressionOrDeclarationStatementAST::clone(
 ExpressionStatementAST *ExpressionStatementAST::clone(MemoryPool *pool) const
 {
     ExpressionStatementAST *ast = new (pool) ExpressionStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy ExpressionStatementAST
     if (expression) ast->expression = expression->clone(pool);
     ast->semicolon_token = semicolon_token;
@@ -445,6 +496,8 @@ ExpressionStatementAST *ExpressionStatementAST::clone(MemoryPool *pool) const
 FunctionDefinitionAST *FunctionDefinitionAST::clone(MemoryPool *pool) const
 {
     FunctionDefinitionAST *ast = new (pool) FunctionDefinitionAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy FunctionDefinitionAST
     ast->qt_invokable_token = qt_invokable_token;
     if (decl_specifier_seq) ast->decl_specifier_seq = decl_specifier_seq->clone(pool);
@@ -457,6 +510,8 @@ FunctionDefinitionAST *FunctionDefinitionAST::clone(MemoryPool *pool) const
 ForStatementAST *ForStatementAST::clone(MemoryPool *pool) const
 {
     ForStatementAST *ast = new (pool) ForStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy ForStatementAST
     ast->for_token = for_token;
     ast->lparen_token = lparen_token;
@@ -472,6 +527,8 @@ ForStatementAST *ForStatementAST::clone(MemoryPool *pool) const
 IfStatementAST *IfStatementAST::clone(MemoryPool *pool) const
 {
     IfStatementAST *ast = new (pool) IfStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy IfStatementAST
     ast->if_token = if_token;
     ast->lparen_token = lparen_token;
@@ -486,6 +543,7 @@ IfStatementAST *IfStatementAST::clone(MemoryPool *pool) const
 ArrayInitializerAST *ArrayInitializerAST::clone(MemoryPool *pool) const
 {
     ArrayInitializerAST *ast = new (pool) ArrayInitializerAST;
+    // copy ExpressionAST
     // copy ArrayInitializerAST
     ast->lbrace_token = lbrace_token;
     if (expression_list) ast->expression_list = expression_list->clone(pool);
@@ -496,6 +554,8 @@ ArrayInitializerAST *ArrayInitializerAST::clone(MemoryPool *pool) const
 LabeledStatementAST *LabeledStatementAST::clone(MemoryPool *pool) const
 {
     LabeledStatementAST *ast = new (pool) LabeledStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy LabeledStatementAST
     ast->label_token = label_token;
     ast->colon_token = colon_token;
@@ -506,6 +566,8 @@ LabeledStatementAST *LabeledStatementAST::clone(MemoryPool *pool) const
 LinkageBodyAST *LinkageBodyAST::clone(MemoryPool *pool) const
 {
     LinkageBodyAST *ast = new (pool) LinkageBodyAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy LinkageBodyAST
     ast->lbrace_token = lbrace_token;
     if (declarations) ast->declarations = declarations->clone(pool);
@@ -516,6 +578,8 @@ LinkageBodyAST *LinkageBodyAST::clone(MemoryPool *pool) const
 LinkageSpecificationAST *LinkageSpecificationAST::clone(MemoryPool *pool) const
 {
     LinkageSpecificationAST *ast = new (pool) LinkageSpecificationAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy LinkageSpecificationAST
     ast->extern_token = extern_token;
     ast->extern_type_token = extern_type_token;
@@ -549,6 +613,8 @@ NestedNameSpecifierAST *NestedNameSpecifierAST::clone(MemoryPool *pool) const
 QualifiedNameAST *QualifiedNameAST::clone(MemoryPool *pool) const
 {
     QualifiedNameAST *ast = new (pool) QualifiedNameAST;
+    // copy ExpressionAST
+    // copy NameAST
     // copy QualifiedNameAST
     ast->global_scope_token = global_scope_token;
     if (nested_name_specifier) ast->nested_name_specifier = nested_name_specifier->clone(pool);
@@ -559,6 +625,8 @@ QualifiedNameAST *QualifiedNameAST::clone(MemoryPool *pool) const
 OperatorFunctionIdAST *OperatorFunctionIdAST::clone(MemoryPool *pool) const
 {
     OperatorFunctionIdAST *ast = new (pool) OperatorFunctionIdAST;
+    // copy ExpressionAST
+    // copy NameAST
     // copy OperatorFunctionIdAST
     ast->operator_token = operator_token;
     if (op) ast->op = op->clone(pool);
@@ -568,6 +636,8 @@ OperatorFunctionIdAST *OperatorFunctionIdAST::clone(MemoryPool *pool) const
 ConversionFunctionIdAST *ConversionFunctionIdAST::clone(MemoryPool *pool) const
 {
     ConversionFunctionIdAST *ast = new (pool) ConversionFunctionIdAST;
+    // copy ExpressionAST
+    // copy NameAST
     // copy ConversionFunctionIdAST
     ast->operator_token = operator_token;
     if (type_specifier) ast->type_specifier = type_specifier->clone(pool);
@@ -578,6 +648,8 @@ ConversionFunctionIdAST *ConversionFunctionIdAST::clone(MemoryPool *pool) const
 SimpleNameAST *SimpleNameAST::clone(MemoryPool *pool) const
 {
     SimpleNameAST *ast = new (pool) SimpleNameAST;
+    // copy ExpressionAST
+    // copy NameAST
     // copy SimpleNameAST
     ast->identifier_token = identifier_token;
     return ast;
@@ -586,6 +658,8 @@ SimpleNameAST *SimpleNameAST::clone(MemoryPool *pool) const
 DestructorNameAST *DestructorNameAST::clone(MemoryPool *pool) const
 {
     DestructorNameAST *ast = new (pool) DestructorNameAST;
+    // copy ExpressionAST
+    // copy NameAST
     // copy DestructorNameAST
     ast->tilde_token = tilde_token;
     ast->identifier_token = identifier_token;
@@ -595,6 +669,8 @@ DestructorNameAST *DestructorNameAST::clone(MemoryPool *pool) const
 TemplateIdAST *TemplateIdAST::clone(MemoryPool *pool) const
 {
     TemplateIdAST *ast = new (pool) TemplateIdAST;
+    // copy ExpressionAST
+    // copy NameAST
     // copy TemplateIdAST
     ast->identifier_token = identifier_token;
     ast->less_token = less_token;
@@ -606,6 +682,8 @@ TemplateIdAST *TemplateIdAST::clone(MemoryPool *pool) const
 NamespaceAST *NamespaceAST::clone(MemoryPool *pool) const
 {
     NamespaceAST *ast = new (pool) NamespaceAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy NamespaceAST
     ast->namespace_token = namespace_token;
     ast->identifier_token = identifier_token;
@@ -617,6 +695,8 @@ NamespaceAST *NamespaceAST::clone(MemoryPool *pool) const
 NamespaceAliasDefinitionAST *NamespaceAliasDefinitionAST::clone(MemoryPool *pool) const
 {
     NamespaceAliasDefinitionAST *ast = new (pool) NamespaceAliasDefinitionAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy NamespaceAliasDefinitionAST
     ast->namespace_token = namespace_token;
     ast->namespace_name_token = namespace_name_token;
@@ -650,6 +730,7 @@ NewArrayDeclaratorAST *NewArrayDeclaratorAST::clone(MemoryPool *pool) const
 NewExpressionAST *NewExpressionAST::clone(MemoryPool *pool) const
 {
     NewExpressionAST *ast = new (pool) NewExpressionAST;
+    // copy ExpressionAST
     // copy NewExpressionAST
     ast->scope_token = scope_token;
     ast->new_token = new_token;
@@ -695,6 +776,8 @@ OperatorAST *OperatorAST::clone(MemoryPool *pool) const
 ParameterDeclarationAST *ParameterDeclarationAST::clone(MemoryPool *pool) const
 {
     ParameterDeclarationAST *ast = new (pool) ParameterDeclarationAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy ParameterDeclarationAST
     if (type_specifier) ast->type_specifier = type_specifier->clone(pool);
     if (declarator) ast->declarator = declarator->clone(pool);
@@ -715,6 +798,8 @@ ParameterDeclarationClauseAST *ParameterDeclarationClauseAST::clone(MemoryPool *
 CallAST *CallAST::clone(MemoryPool *pool) const
 {
     CallAST *ast = new (pool) CallAST;
+    // copy PostfixAST
+    if (next) ast->next = next->clone(pool);
     // copy CallAST
     ast->lparen_token = lparen_token;
     if (expression_list) ast->expression_list = expression_list->clone(pool);
@@ -725,6 +810,8 @@ CallAST *CallAST::clone(MemoryPool *pool) const
 ArrayAccessAST *ArrayAccessAST::clone(MemoryPool *pool) const
 {
     ArrayAccessAST *ast = new (pool) ArrayAccessAST;
+    // copy PostfixAST
+    if (next) ast->next = next->clone(pool);
     // copy ArrayAccessAST
     ast->lbracket_token = lbracket_token;
     if (expression) ast->expression = expression->clone(pool);
@@ -735,6 +822,8 @@ ArrayAccessAST *ArrayAccessAST::clone(MemoryPool *pool) const
 PostIncrDecrAST *PostIncrDecrAST::clone(MemoryPool *pool) const
 {
     PostIncrDecrAST *ast = new (pool) PostIncrDecrAST;
+    // copy PostfixAST
+    if (next) ast->next = next->clone(pool);
     // copy PostIncrDecrAST
     ast->incr_decr_token = incr_decr_token;
     return ast;
@@ -743,6 +832,8 @@ PostIncrDecrAST *PostIncrDecrAST::clone(MemoryPool *pool) const
 MemberAccessAST *MemberAccessAST::clone(MemoryPool *pool) const
 {
     MemberAccessAST *ast = new (pool) MemberAccessAST;
+    // copy PostfixAST
+    if (next) ast->next = next->clone(pool);
     // copy MemberAccessAST
     ast->access_token = access_token;
     ast->template_token = template_token;
@@ -753,6 +844,7 @@ MemberAccessAST *MemberAccessAST::clone(MemoryPool *pool) const
 TypeidExpressionAST *TypeidExpressionAST::clone(MemoryPool *pool) const
 {
     TypeidExpressionAST *ast = new (pool) TypeidExpressionAST;
+    // copy ExpressionAST
     // copy TypeidExpressionAST
     ast->typeid_token = typeid_token;
     ast->lparen_token = lparen_token;
@@ -764,6 +856,7 @@ TypeidExpressionAST *TypeidExpressionAST::clone(MemoryPool *pool) const
 TypenameCallExpressionAST *TypenameCallExpressionAST::clone(MemoryPool *pool) const
 {
     TypenameCallExpressionAST *ast = new (pool) TypenameCallExpressionAST;
+    // copy ExpressionAST
     // copy TypenameCallExpressionAST
     ast->typename_token = typename_token;
     if (name) ast->name = name->clone(pool);
@@ -776,6 +869,7 @@ TypenameCallExpressionAST *TypenameCallExpressionAST::clone(MemoryPool *pool) co
 TypeConstructorCallAST *TypeConstructorCallAST::clone(MemoryPool *pool) const
 {
     TypeConstructorCallAST *ast = new (pool) TypeConstructorCallAST;
+    // copy ExpressionAST
     // copy TypeConstructorCallAST
     if (type_specifier) ast->type_specifier = type_specifier->clone(pool);
     ast->lparen_token = lparen_token;
@@ -787,6 +881,7 @@ TypeConstructorCallAST *TypeConstructorCallAST::clone(MemoryPool *pool) const
 PostfixExpressionAST *PostfixExpressionAST::clone(MemoryPool *pool) const
 {
     PostfixExpressionAST *ast = new (pool) PostfixExpressionAST;
+    // copy ExpressionAST
     // copy PostfixExpressionAST
     if (base_expression) ast->base_expression = base_expression->clone(pool);
     if (postfix_expressions) ast->postfix_expressions = postfix_expressions->clone(pool);
@@ -796,6 +891,8 @@ PostfixExpressionAST *PostfixExpressionAST::clone(MemoryPool *pool) const
 PointerToMemberAST *PointerToMemberAST::clone(MemoryPool *pool) const
 {
     PointerToMemberAST *ast = new (pool) PointerToMemberAST;
+    // copy PtrOperatorAST
+    if (next) ast->next = next->clone(pool);
     // copy PointerToMemberAST
     ast->global_scope_token = global_scope_token;
     if (nested_name_specifier) ast->nested_name_specifier = nested_name_specifier->clone(pool);
@@ -807,6 +904,8 @@ PointerToMemberAST *PointerToMemberAST::clone(MemoryPool *pool) const
 PointerAST *PointerAST::clone(MemoryPool *pool) const
 {
     PointerAST *ast = new (pool) PointerAST;
+    // copy PtrOperatorAST
+    if (next) ast->next = next->clone(pool);
     // copy PointerAST
     ast->star_token = star_token;
     if (cv_qualifier_seq) ast->cv_qualifier_seq = cv_qualifier_seq->clone(pool);
@@ -816,6 +915,8 @@ PointerAST *PointerAST::clone(MemoryPool *pool) const
 ReferenceAST *ReferenceAST::clone(MemoryPool *pool) const
 {
     ReferenceAST *ast = new (pool) ReferenceAST;
+    // copy PtrOperatorAST
+    if (next) ast->next = next->clone(pool);
     // copy ReferenceAST
     ast->amp_token = amp_token;
     return ast;
@@ -824,6 +925,8 @@ ReferenceAST *ReferenceAST::clone(MemoryPool *pool) const
 BreakStatementAST *BreakStatementAST::clone(MemoryPool *pool) const
 {
     BreakStatementAST *ast = new (pool) BreakStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy BreakStatementAST
     ast->break_token = break_token;
     ast->semicolon_token = semicolon_token;
@@ -833,6 +936,8 @@ BreakStatementAST *BreakStatementAST::clone(MemoryPool *pool) const
 ContinueStatementAST *ContinueStatementAST::clone(MemoryPool *pool) const
 {
     ContinueStatementAST *ast = new (pool) ContinueStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy ContinueStatementAST
     ast->continue_token = continue_token;
     ast->semicolon_token = semicolon_token;
@@ -842,6 +947,8 @@ ContinueStatementAST *ContinueStatementAST::clone(MemoryPool *pool) const
 GotoStatementAST *GotoStatementAST::clone(MemoryPool *pool) const
 {
     GotoStatementAST *ast = new (pool) GotoStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy GotoStatementAST
     ast->goto_token = goto_token;
     ast->identifier_token = identifier_token;
@@ -852,6 +959,8 @@ GotoStatementAST *GotoStatementAST::clone(MemoryPool *pool) const
 ReturnStatementAST *ReturnStatementAST::clone(MemoryPool *pool) const
 {
     ReturnStatementAST *ast = new (pool) ReturnStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy ReturnStatementAST
     ast->return_token = return_token;
     if (expression) ast->expression = expression->clone(pool);
@@ -862,6 +971,7 @@ ReturnStatementAST *ReturnStatementAST::clone(MemoryPool *pool) const
 SizeofExpressionAST *SizeofExpressionAST::clone(MemoryPool *pool) const
 {
     SizeofExpressionAST *ast = new (pool) SizeofExpressionAST;
+    // copy ExpressionAST
     // copy SizeofExpressionAST
     ast->sizeof_token = sizeof_token;
     if (expression) ast->expression = expression->clone(pool);
@@ -871,6 +981,7 @@ SizeofExpressionAST *SizeofExpressionAST::clone(MemoryPool *pool) const
 NumericLiteralAST *NumericLiteralAST::clone(MemoryPool *pool) const
 {
     NumericLiteralAST *ast = new (pool) NumericLiteralAST;
+    // copy ExpressionAST
     // copy NumericLiteralAST
     ast->literal_token = literal_token;
     return ast;
@@ -879,6 +990,7 @@ NumericLiteralAST *NumericLiteralAST::clone(MemoryPool *pool) const
 BoolLiteralAST *BoolLiteralAST::clone(MemoryPool *pool) const
 {
     BoolLiteralAST *ast = new (pool) BoolLiteralAST;
+    // copy ExpressionAST
     // copy BoolLiteralAST
     ast->literal_token = literal_token;
     return ast;
@@ -887,6 +999,7 @@ BoolLiteralAST *BoolLiteralAST::clone(MemoryPool *pool) const
 ThisExpressionAST *ThisExpressionAST::clone(MemoryPool *pool) const
 {
     ThisExpressionAST *ast = new (pool) ThisExpressionAST;
+    // copy ExpressionAST
     // copy ThisExpressionAST
     ast->this_token = this_token;
     return ast;
@@ -895,6 +1008,7 @@ ThisExpressionAST *ThisExpressionAST::clone(MemoryPool *pool) const
 NestedExpressionAST *NestedExpressionAST::clone(MemoryPool *pool) const
 {
     NestedExpressionAST *ast = new (pool) NestedExpressionAST;
+    // copy ExpressionAST
     // copy NestedExpressionAST
     ast->lparen_token = lparen_token;
     if (expression) ast->expression = expression->clone(pool);
@@ -905,6 +1019,7 @@ NestedExpressionAST *NestedExpressionAST::clone(MemoryPool *pool) const
 StringLiteralAST *StringLiteralAST::clone(MemoryPool *pool) const
 {
     StringLiteralAST *ast = new (pool) StringLiteralAST;
+    // copy ExpressionAST
     // copy StringLiteralAST
     ast->literal_token = literal_token;
     if (next) ast->next = next->clone(pool);
@@ -914,6 +1029,8 @@ StringLiteralAST *StringLiteralAST::clone(MemoryPool *pool) const
 SwitchStatementAST *SwitchStatementAST::clone(MemoryPool *pool) const
 {
     SwitchStatementAST *ast = new (pool) SwitchStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy SwitchStatementAST
     ast->switch_token = switch_token;
     ast->lparen_token = lparen_token;
@@ -936,6 +1053,8 @@ TemplateArgumentListAST *TemplateArgumentListAST::clone(MemoryPool *pool) const
 TemplateDeclarationAST *TemplateDeclarationAST::clone(MemoryPool *pool) const
 {
     TemplateDeclarationAST *ast = new (pool) TemplateDeclarationAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy TemplateDeclarationAST
     ast->export_token = export_token;
     ast->template_token = template_token;
@@ -949,6 +1068,7 @@ TemplateDeclarationAST *TemplateDeclarationAST::clone(MemoryPool *pool) const
 ThrowExpressionAST *ThrowExpressionAST::clone(MemoryPool *pool) const
 {
     ThrowExpressionAST *ast = new (pool) ThrowExpressionAST;
+    // copy ExpressionAST
     // copy ThrowExpressionAST
     ast->throw_token = throw_token;
     if (expression) ast->expression = expression->clone(pool);
@@ -966,6 +1086,8 @@ TranslationUnitAST *TranslationUnitAST::clone(MemoryPool *pool) const
 TryBlockStatementAST *TryBlockStatementAST::clone(MemoryPool *pool) const
 {
     TryBlockStatementAST *ast = new (pool) TryBlockStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy TryBlockStatementAST
     ast->try_token = try_token;
     if (statement) ast->statement = statement->clone(pool);
@@ -976,6 +1098,8 @@ TryBlockStatementAST *TryBlockStatementAST::clone(MemoryPool *pool) const
 CatchClauseAST *CatchClauseAST::clone(MemoryPool *pool) const
 {
     CatchClauseAST *ast = new (pool) CatchClauseAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy CatchClauseAST
     ast->catch_token = catch_token;
     ast->lparen_token = lparen_token;
@@ -989,6 +1113,7 @@ CatchClauseAST *CatchClauseAST::clone(MemoryPool *pool) const
 TypeIdAST *TypeIdAST::clone(MemoryPool *pool) const
 {
     TypeIdAST *ast = new (pool) TypeIdAST;
+    // copy ExpressionAST
     // copy TypeIdAST
     if (type_specifier) ast->type_specifier = type_specifier->clone(pool);
     if (declarator) ast->declarator = declarator->clone(pool);
@@ -998,6 +1123,8 @@ TypeIdAST *TypeIdAST::clone(MemoryPool *pool) const
 TypenameTypeParameterAST *TypenameTypeParameterAST::clone(MemoryPool *pool) const
 {
     TypenameTypeParameterAST *ast = new (pool) TypenameTypeParameterAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy TypenameTypeParameterAST
     ast->classkey_token = classkey_token;
     if (name) ast->name = name->clone(pool);
@@ -1009,6 +1136,8 @@ TypenameTypeParameterAST *TypenameTypeParameterAST::clone(MemoryPool *pool) cons
 TemplateTypeParameterAST *TemplateTypeParameterAST::clone(MemoryPool *pool) const
 {
     TemplateTypeParameterAST *ast = new (pool) TemplateTypeParameterAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy TemplateTypeParameterAST
     ast->template_token = template_token;
     ast->less_token = less_token;
@@ -1024,6 +1153,7 @@ TemplateTypeParameterAST *TemplateTypeParameterAST::clone(MemoryPool *pool) cons
 UnaryExpressionAST *UnaryExpressionAST::clone(MemoryPool *pool) const
 {
     UnaryExpressionAST *ast = new (pool) UnaryExpressionAST;
+    // copy ExpressionAST
     // copy UnaryExpressionAST
     ast->unary_op_token = unary_op_token;
     if (expression) ast->expression = expression->clone(pool);
@@ -1033,6 +1163,8 @@ UnaryExpressionAST *UnaryExpressionAST::clone(MemoryPool *pool) const
 UsingAST *UsingAST::clone(MemoryPool *pool) const
 {
     UsingAST *ast = new (pool) UsingAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy UsingAST
     ast->using_token = using_token;
     ast->typename_token = typename_token;
@@ -1044,6 +1176,8 @@ UsingAST *UsingAST::clone(MemoryPool *pool) const
 UsingDirectiveAST *UsingDirectiveAST::clone(MemoryPool *pool) const
 {
     UsingDirectiveAST *ast = new (pool) UsingDirectiveAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy UsingDirectiveAST
     ast->using_token = using_token;
     ast->namespace_token = namespace_token;
@@ -1055,6 +1189,8 @@ UsingDirectiveAST *UsingDirectiveAST::clone(MemoryPool *pool) const
 WhileStatementAST *WhileStatementAST::clone(MemoryPool *pool) const
 {
     WhileStatementAST *ast = new (pool) WhileStatementAST;
+    // copy StatementAST
+    if (next) ast->next = next->clone(pool);
     // copy WhileStatementAST
     ast->while_token = while_token;
     ast->lparen_token = lparen_token;
@@ -1076,6 +1212,8 @@ IdentifierListAST *IdentifierListAST::clone(MemoryPool *pool) const
 ObjCClassDeclarationAST *ObjCClassDeclarationAST::clone(MemoryPool *pool) const
 {
     ObjCClassDeclarationAST *ast = new (pool) ObjCClassDeclarationAST;
+    // copy DeclarationAST
+    if (next) ast->next = next->clone(pool);
     // copy ObjCClassDeclarationAST
     if (attributes) ast->attributes = attributes->clone(pool);
     ast->class_token = class_token;