diff --git a/packages/cxx-gen-ast/src/new_ast_rewriter_cc.ts b/packages/cxx-gen-ast/src/new_ast_rewriter_cc.ts index 6fd9aafb..a7dc6ef4 100644 --- a/packages/cxx-gen-ast/src/new_ast_rewriter_cc.ts +++ b/packages/cxx-gen-ast/src/new_ast_rewriter_cc.ts @@ -66,6 +66,9 @@ export function new_ast_rewriter_cc({ ` [[nodiscard]] auto translationUnit() const -> TranslationUnit* { return rewrite.unit_; }` ); emit(); + emit( + ` [[nodiscard]] auto control() const -> Control* { return rewrite.control(); }` + ); emit( ` [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); }` ); @@ -77,7 +80,25 @@ export function new_ast_rewriter_cc({ }); const emitRewriterBody = (members: Member[], visitor: string = "rewrite") => { + const blockSymbol = members.find( + (m) => m.kind === "attribute" && m.type === "BlockSymbol" + ); + + if (blockSymbol) { + emit(`auto _ = Binder::ScopeGuard(&rewrite.binder_); + + if (ast->${blockSymbol.name}) { + copy->${blockSymbol.name} = control()->newBlockSymbol(rewrite.binder_.scope(), + ast->${blockSymbol.name}->location()); + + rewrite.binder_.setScope(copy->${blockSymbol.name}); + } +`); + } + members.forEach((m) => { + if (m === blockSymbol) return; + switch (m.kind) { case "node": { if (isBase(m.type)) { @@ -106,11 +127,23 @@ export function new_ast_rewriter_cc({ emit(` auto out = ©->${m.name};`); emit(` for (auto node : ListView{ast->${m.name}}) {`); - emit(` auto value = ${visitor}(node);`); + + switch (m.type) { + case "InitDeclaratorAST": + emit( + ` auto value = ${visitor}(node, declSpecifierListCtx);` + ); + break; + + default: + emit(` auto value = ${visitor}(node);`); + break; + } // switch + if (isBase(m.type)) { - emit(`*out = new (arena()) List(value);`); + emit(`*out = make_list_node(arena(), value);`); } else { - emit(`*out = new (arena()) List(ast_cast<${m.type}>(value));`); + emit(`*out = make_list_node(arena(), ast_cast<${m.type}>(value));`); } emit(` out = &(*out)->next;`); @@ -174,10 +207,20 @@ export function new_ast_rewriter_cc({ by_base.get("AST")?.forEach(({ name, members }) => { emit(); - emit(`auto ${opName}::operator()(${name}* ast) -> ${name}* {`); + switch (name) { + case "InitDeclaratorAST": + emit( + `auto ${opName}::operator()(${name}* ast, const DeclSpecs& declSpecs) -> ${name}* {` + ); + break; + default: + emit(`auto ${opName}::operator()(${name}* ast) -> ${name}* {`); + break; + } // switch + emit(` if (!ast) return {};`); emit(); - emit(` auto copy = new (arena()) ${name}{};`); + emit(` auto copy = make_node<${name}>(arena());`); emit(); emitRewriterBody(members, "operator()"); emit(); @@ -194,7 +237,7 @@ export function new_ast_rewriter_cc({ emit( `auto ${opName}::${className}Visitor::operator()(${name}* ast) -> ${base}* {` ); - emit(` auto copy = new (arena()) ${name}{};`); + emit(` auto copy = make_node<${name}>(arena());`); emit(); ast.baseMembers.get(base)?.forEach((m) => { emit(` copy->${m.name} = ast->${m.name};`); @@ -216,6 +259,10 @@ export function new_ast_rewriter_cc({ #include #include #include +#include +#include +#include +#include namespace cxx { diff --git a/packages/cxx-gen-ast/src/new_ast_rewriter_h.ts b/packages/cxx-gen-ast/src/new_ast_rewriter_h.ts index cf20cab2..8839ffa2 100644 --- a/packages/cxx-gen-ast/src/new_ast_rewriter_h.ts +++ b/packages/cxx-gen-ast/src/new_ast_rewriter_h.ts @@ -52,7 +52,16 @@ export function new_ast_rewriter_h({ emit(); emit(` // run on the misc nodes`); by_base.get("AST")?.forEach(({ name }) => { - emit(` [[nodiscard]] auto operator()(${name}* ast) -> ${name}*;`); + switch (name) { + case "InitDeclaratorAST": + emit( + ` [[nodiscard]] auto operator()(${name}* ast, const DeclSpecs& declSpecs) -> ${name}*;` + ); + break; + default: + emit(` [[nodiscard]] auto operator()(${name}* ast) -> ${name}*;`); + break; + } // switch }); emit(); diff --git a/src/parser/cxx/ast.h b/src/parser/cxx/ast.h index 613b8c5c..5aaf06f0 100644 --- a/src/parser/cxx/ast.h +++ b/src/parser/cxx/ast.h @@ -928,6 +928,7 @@ class IfStatementAST final : public StatementAST { StatementAST* statement = nullptr; SourceLocation elseLoc; StatementAST* elseStatement = nullptr; + BlockSymbol* symbol = nullptr; void accept(ASTVisitor* visitor) override { visitor->visit(this); } @@ -967,6 +968,7 @@ class SwitchStatementAST final : public StatementAST { ExpressionAST* condition = nullptr; SourceLocation rparenLoc; StatementAST* statement = nullptr; + BlockSymbol* symbol = nullptr; void accept(ASTVisitor* visitor) override { visitor->visit(this); } @@ -985,6 +987,7 @@ class WhileStatementAST final : public StatementAST { ExpressionAST* condition = nullptr; SourceLocation rparenLoc; StatementAST* statement = nullptr; + BlockSymbol* symbol = nullptr; void accept(ASTVisitor* visitor) override { visitor->visit(this); } @@ -1026,6 +1029,7 @@ class ForRangeStatementAST final : public StatementAST { ExpressionAST* rangeInitializer = nullptr; SourceLocation rparenLoc; StatementAST* statement = nullptr; + BlockSymbol* symbol = nullptr; void accept(ASTVisitor* visitor) override { visitor->visit(this); } @@ -1047,6 +1051,7 @@ class ForStatementAST final : public StatementAST { ExpressionAST* expression = nullptr; SourceLocation rparenLoc; StatementAST* statement = nullptr; + BlockSymbol* symbol = nullptr; void accept(ASTVisitor* visitor) override { visitor->visit(this); } diff --git a/src/parser/cxx/ast_rewriter.cc b/src/parser/cxx/ast_rewriter.cc index bf40a5de..6dd02df1 100644 --- a/src/parser/cxx/ast_rewriter.cc +++ b/src/parser/cxx/ast_rewriter.cc @@ -22,10 +22,14 @@ // cxx #include +#include #include +#include #include +#include #include #include +#include namespace cxx { @@ -48,6 +52,7 @@ struct ASTRewriter::UnitVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(TranslationUnitAST* ast) -> UnitAST*; @@ -61,6 +66,7 @@ struct ASTRewriter::DeclarationVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(SimpleDeclarationAST* ast) -> DeclarationAST*; @@ -139,6 +145,7 @@ struct ASTRewriter::StatementVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(LabeledStatementAST* ast) -> StatementAST*; @@ -187,6 +194,7 @@ struct ASTRewriter::ExpressionVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(GeneratedLiteralExpressionAST* ast) @@ -335,6 +343,7 @@ struct ASTRewriter::TemplateParameterVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(TemplateTypeParameterAST* ast) @@ -356,6 +365,7 @@ struct ASTRewriter::SpecifierVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(GeneratedTypeSpecifierAST* ast) @@ -442,6 +452,7 @@ struct ASTRewriter::PtrOperatorVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(PointerOperatorAST* ast) -> PtrOperatorAST*; @@ -457,6 +468,7 @@ struct ASTRewriter::CoreDeclaratorVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(BitfieldDeclaratorAST* ast) @@ -475,6 +487,7 @@ struct ASTRewriter::DeclaratorChunkVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(FunctionDeclaratorChunkAST* ast) @@ -490,6 +503,7 @@ struct ASTRewriter::UnqualifiedIdVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(NameIdAST* ast) -> UnqualifiedIdAST*; @@ -521,6 +535,7 @@ struct ASTRewriter::NestedNameSpecifierVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(GlobalNestedNameSpecifierAST* ast) @@ -542,6 +557,7 @@ struct ASTRewriter::FunctionBodyVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(DefaultFunctionBodyAST* ast) @@ -562,6 +578,7 @@ struct ASTRewriter::TemplateArgumentVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(TypeTemplateArgumentAST* ast) @@ -577,6 +594,7 @@ struct ASTRewriter::ExceptionSpecifierVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(ThrowExceptionSpecifierAST* ast) @@ -592,6 +610,7 @@ struct ASTRewriter::RequirementVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(SimpleRequirementAST* ast) -> RequirementAST*; @@ -609,6 +628,7 @@ struct ASTRewriter::NewInitializerVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(NewParenInitializerAST* ast) @@ -624,6 +644,7 @@ struct ASTRewriter::MemInitializerVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(ParenMemInitializerAST* ast) @@ -639,6 +660,7 @@ struct ASTRewriter::LambdaCaptureVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(ThisLambdaCaptureAST* ast) -> LambdaCaptureAST*; @@ -663,6 +685,7 @@ struct ASTRewriter::ExceptionDeclarationVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(EllipsisExceptionDeclarationAST* ast) @@ -678,6 +701,7 @@ struct ASTRewriter::AttributeSpecifierVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(CxxAttributeAST* ast) -> AttributeSpecifierAST*; @@ -699,6 +723,7 @@ struct ASTRewriter::AttributeTokenVisitor { return rewrite.unit_; } + [[nodiscard]] auto control() const -> Control* { return rewrite.control(); } [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } [[nodiscard]] auto operator()(ScopedAttributeTokenAST* ast) @@ -824,7 +849,7 @@ auto ASTRewriter::operator()(AttributeTokenAST* ast) -> AttributeTokenAST* { auto ASTRewriter::operator()(SplicerAST* ast) -> SplicerAST* { if (!ast) return {}; - auto copy = new (arena()) SplicerAST{}; + auto copy = make_node(arena()); copy->lbracketLoc = ast->lbracketLoc; copy->colonLoc = ast->colonLoc; @@ -840,7 +865,7 @@ auto ASTRewriter::operator()(GlobalModuleFragmentAST* ast) -> GlobalModuleFragmentAST* { if (!ast) return {}; - auto copy = new (arena()) GlobalModuleFragmentAST{}; + auto copy = make_node(arena()); copy->moduleLoc = ast->moduleLoc; copy->semicolonLoc = ast->semicolonLoc; @@ -849,7 +874,7 @@ auto ASTRewriter::operator()(GlobalModuleFragmentAST* ast) auto out = ©->declarationList; for (auto node : ListView{ast->declarationList}) { auto value = operator()(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -861,7 +886,7 @@ auto ASTRewriter::operator()(PrivateModuleFragmentAST* ast) -> PrivateModuleFragmentAST* { if (!ast) return {}; - auto copy = new (arena()) PrivateModuleFragmentAST{}; + auto copy = make_node(arena()); copy->moduleLoc = ast->moduleLoc; copy->colonLoc = ast->colonLoc; @@ -872,7 +897,7 @@ auto ASTRewriter::operator()(PrivateModuleFragmentAST* ast) auto out = ©->declarationList; for (auto node : ListView{ast->declarationList}) { auto value = operator()(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -884,7 +909,7 @@ auto ASTRewriter::operator()(ModuleDeclarationAST* ast) -> ModuleDeclarationAST* { if (!ast) return {}; - auto copy = new (arena()) ModuleDeclarationAST{}; + auto copy = make_node(arena()); copy->exportLoc = ast->exportLoc; copy->moduleLoc = ast->moduleLoc; @@ -895,7 +920,7 @@ auto ASTRewriter::operator()(ModuleDeclarationAST* ast) auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = operator()(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -908,7 +933,7 @@ auto ASTRewriter::operator()(ModuleDeclarationAST* ast) auto ASTRewriter::operator()(ModuleNameAST* ast) -> ModuleNameAST* { if (!ast) return {}; - auto copy = new (arena()) ModuleNameAST{}; + auto copy = make_node(arena()); copy->moduleQualifier = operator()(ast->moduleQualifier); copy->identifierLoc = ast->identifierLoc; @@ -920,7 +945,7 @@ auto ASTRewriter::operator()(ModuleNameAST* ast) -> ModuleNameAST* { auto ASTRewriter::operator()(ModuleQualifierAST* ast) -> ModuleQualifierAST* { if (!ast) return {}; - auto copy = new (arena()) ModuleQualifierAST{}; + auto copy = make_node(arena()); copy->moduleQualifier = operator()(ast->moduleQualifier); copy->identifierLoc = ast->identifierLoc; @@ -933,7 +958,7 @@ auto ASTRewriter::operator()(ModuleQualifierAST* ast) -> ModuleQualifierAST* { auto ASTRewriter::operator()(ModulePartitionAST* ast) -> ModulePartitionAST* { if (!ast) return {}; - auto copy = new (arena()) ModulePartitionAST{}; + auto copy = make_node(arena()); copy->colonLoc = ast->colonLoc; copy->moduleName = operator()(ast->moduleName); @@ -944,7 +969,7 @@ auto ASTRewriter::operator()(ModulePartitionAST* ast) -> ModulePartitionAST* { auto ASTRewriter::operator()(ImportNameAST* ast) -> ImportNameAST* { if (!ast) return {}; - auto copy = new (arena()) ImportNameAST{}; + auto copy = make_node(arena()); copy->headerLoc = ast->headerLoc; copy->modulePartition = operator()(ast->modulePartition); @@ -953,10 +978,11 @@ auto ASTRewriter::operator()(ImportNameAST* ast) -> ImportNameAST* { return copy; } -auto ASTRewriter::operator()(InitDeclaratorAST* ast) -> InitDeclaratorAST* { +auto ASTRewriter::operator()(InitDeclaratorAST* ast, const DeclSpecs& declSpecs) + -> InitDeclaratorAST* { if (!ast) return {}; - auto copy = new (arena()) InitDeclaratorAST{}; + auto copy = make_node(arena()); copy->declarator = operator()(ast->declarator); copy->requiresClause = operator()(ast->requiresClause); @@ -969,13 +995,13 @@ auto ASTRewriter::operator()(InitDeclaratorAST* ast) -> InitDeclaratorAST* { auto ASTRewriter::operator()(DeclaratorAST* ast) -> DeclaratorAST* { if (!ast) return {}; - auto copy = new (arena()) DeclaratorAST{}; + auto copy = make_node(arena()); if (auto it = ast->ptrOpList) { auto out = ©->ptrOpList; for (auto node : ListView{ast->ptrOpList}) { auto value = operator()(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -986,7 +1012,7 @@ auto ASTRewriter::operator()(DeclaratorAST* ast) -> DeclaratorAST* { auto out = ©->declaratorChunkList; for (auto node : ListView{ast->declaratorChunkList}) { auto value = operator()(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -997,7 +1023,7 @@ auto ASTRewriter::operator()(DeclaratorAST* ast) -> DeclaratorAST* { auto ASTRewriter::operator()(UsingDeclaratorAST* ast) -> UsingDeclaratorAST* { if (!ast) return {}; - auto copy = new (arena()) UsingDeclaratorAST{}; + auto copy = make_node(arena()); copy->typenameLoc = ast->typenameLoc; copy->nestedNameSpecifier = operator()(ast->nestedNameSpecifier); @@ -1012,7 +1038,7 @@ auto ASTRewriter::operator()(UsingDeclaratorAST* ast) -> UsingDeclaratorAST* { auto ASTRewriter::operator()(EnumeratorAST* ast) -> EnumeratorAST* { if (!ast) return {}; - auto copy = new (arena()) EnumeratorAST{}; + auto copy = make_node(arena()); copy->identifierLoc = ast->identifierLoc; @@ -1020,7 +1046,7 @@ auto ASTRewriter::operator()(EnumeratorAST* ast) -> EnumeratorAST* { auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = operator()(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1036,14 +1062,14 @@ auto ASTRewriter::operator()(EnumeratorAST* ast) -> EnumeratorAST* { auto ASTRewriter::operator()(TypeIdAST* ast) -> TypeIdAST* { if (!ast) return {}; - auto copy = new (arena()) TypeIdAST{}; + auto copy = make_node(arena()); DeclSpecs typeSpecifierListCtx{translationUnit()}; if (auto it = ast->typeSpecifierList) { auto out = ©->typeSpecifierList; for (auto node : ListView{ast->typeSpecifierList}) { auto value = operator()(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; typeSpecifierListCtx.accept(value); } @@ -1058,7 +1084,7 @@ auto ASTRewriter::operator()(TypeIdAST* ast) -> TypeIdAST* { auto ASTRewriter::operator()(HandlerAST* ast) -> HandlerAST* { if (!ast) return {}; - auto copy = new (arena()) HandlerAST{}; + auto copy = make_node(arena()); copy->catchLoc = ast->catchLoc; copy->lparenLoc = ast->lparenLoc; @@ -1072,13 +1098,13 @@ auto ASTRewriter::operator()(HandlerAST* ast) -> HandlerAST* { auto ASTRewriter::operator()(BaseSpecifierAST* ast) -> BaseSpecifierAST* { if (!ast) return {}; - auto copy = new (arena()) BaseSpecifierAST{}; + auto copy = make_node(arena()); if (auto it = ast->attributeList) { auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = operator()(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1097,7 +1123,7 @@ auto ASTRewriter::operator()(BaseSpecifierAST* ast) -> BaseSpecifierAST* { auto ASTRewriter::operator()(RequiresClauseAST* ast) -> RequiresClauseAST* { if (!ast) return {}; - auto copy = new (arena()) RequiresClauseAST{}; + auto copy = make_node(arena()); copy->requiresLoc = ast->requiresLoc; copy->expression = operator()(ast->expression); @@ -1109,13 +1135,13 @@ auto ASTRewriter::operator()(ParameterDeclarationClauseAST* ast) -> ParameterDeclarationClauseAST* { if (!ast) return {}; - auto copy = new (arena()) ParameterDeclarationClauseAST{}; + auto copy = make_node(arena()); if (auto it = ast->parameterDeclarationList) { auto out = ©->parameterDeclarationList; for (auto node : ListView{ast->parameterDeclarationList}) { auto value = operator()(node); - *out = new (arena()) List(ast_cast(value)); + *out = make_list_node(arena(), ast_cast(value)); out = &(*out)->next; } } @@ -1132,7 +1158,7 @@ auto ASTRewriter::operator()(TrailingReturnTypeAST* ast) -> TrailingReturnTypeAST* { if (!ast) return {}; - auto copy = new (arena()) TrailingReturnTypeAST{}; + auto copy = make_node(arena()); copy->minusGreaterLoc = ast->minusGreaterLoc; copy->typeId = operator()(ast->typeId); @@ -1143,7 +1169,7 @@ auto ASTRewriter::operator()(TrailingReturnTypeAST* ast) auto ASTRewriter::operator()(LambdaSpecifierAST* ast) -> LambdaSpecifierAST* { if (!ast) return {}; - auto copy = new (arena()) LambdaSpecifierAST{}; + auto copy = make_node(arena()); copy->specifierLoc = ast->specifierLoc; copy->specifier = ast->specifier; @@ -1154,7 +1180,7 @@ auto ASTRewriter::operator()(LambdaSpecifierAST* ast) -> LambdaSpecifierAST* { auto ASTRewriter::operator()(TypeConstraintAST* ast) -> TypeConstraintAST* { if (!ast) return {}; - auto copy = new (arena()) TypeConstraintAST{}; + auto copy = make_node(arena()); copy->nestedNameSpecifier = operator()(ast->nestedNameSpecifier); copy->identifierLoc = ast->identifierLoc; @@ -1164,7 +1190,7 @@ auto ASTRewriter::operator()(TypeConstraintAST* ast) -> TypeConstraintAST* { auto out = ©->templateArgumentList; for (auto node : ListView{ast->templateArgumentList}) { auto value = operator()(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1179,7 +1205,7 @@ auto ASTRewriter::operator()(AttributeArgumentClauseAST* ast) -> AttributeArgumentClauseAST* { if (!ast) return {}; - auto copy = new (arena()) AttributeArgumentClauseAST{}; + auto copy = make_node(arena()); copy->lparenLoc = ast->lparenLoc; copy->rparenLoc = ast->rparenLoc; @@ -1190,7 +1216,7 @@ auto ASTRewriter::operator()(AttributeArgumentClauseAST* ast) auto ASTRewriter::operator()(AttributeAST* ast) -> AttributeAST* { if (!ast) return {}; - auto copy = new (arena()) AttributeAST{}; + auto copy = make_node(arena()); copy->attributeToken = operator()(ast->attributeToken); copy->attributeArgumentClause = operator()(ast->attributeArgumentClause); @@ -1203,7 +1229,7 @@ auto ASTRewriter::operator()(AttributeUsingPrefixAST* ast) -> AttributeUsingPrefixAST* { if (!ast) return {}; - auto copy = new (arena()) AttributeUsingPrefixAST{}; + auto copy = make_node(arena()); copy->usingLoc = ast->usingLoc; copy->attributeNamespaceLoc = ast->attributeNamespaceLoc; @@ -1215,7 +1241,7 @@ auto ASTRewriter::operator()(AttributeUsingPrefixAST* ast) auto ASTRewriter::operator()(NewPlacementAST* ast) -> NewPlacementAST* { if (!ast) return {}; - auto copy = new (arena()) NewPlacementAST{}; + auto copy = make_node(arena()); copy->lparenLoc = ast->lparenLoc; @@ -1223,7 +1249,7 @@ auto ASTRewriter::operator()(NewPlacementAST* ast) -> NewPlacementAST* { auto out = ©->expressionList; for (auto node : ListView{ast->expressionList}) { auto value = operator()(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1237,7 +1263,7 @@ auto ASTRewriter::operator()(NestedNamespaceSpecifierAST* ast) -> NestedNamespaceSpecifierAST* { if (!ast) return {}; - auto copy = new (arena()) NestedNamespaceSpecifierAST{}; + auto copy = make_node(arena()); copy->inlineLoc = ast->inlineLoc; copy->identifierLoc = ast->identifierLoc; @@ -1249,13 +1275,13 @@ auto ASTRewriter::operator()(NestedNamespaceSpecifierAST* ast) } auto ASTRewriter::UnitVisitor::operator()(TranslationUnitAST* ast) -> UnitAST* { - auto copy = new (arena()) TranslationUnitAST{}; + auto copy = make_node(arena()); if (auto it = ast->declarationList) { auto out = ©->declarationList; for (auto node : ListView{ast->declarationList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1264,7 +1290,7 @@ auto ASTRewriter::UnitVisitor::operator()(TranslationUnitAST* ast) -> UnitAST* { } auto ASTRewriter::UnitVisitor::operator()(ModuleUnitAST* ast) -> UnitAST* { - auto copy = new (arena()) ModuleUnitAST{}; + auto copy = make_node(arena()); copy->globalModuleFragment = rewrite(ast->globalModuleFragment); copy->moduleDeclaration = rewrite(ast->moduleDeclaration); @@ -1273,7 +1299,7 @@ auto ASTRewriter::UnitVisitor::operator()(ModuleUnitAST* ast) -> UnitAST* { auto out = ©->declarationList; for (auto node : ListView{ast->declarationList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1285,13 +1311,13 @@ auto ASTRewriter::UnitVisitor::operator()(ModuleUnitAST* ast) -> UnitAST* { auto ASTRewriter::DeclarationVisitor::operator()(SimpleDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) SimpleDeclarationAST{}; + auto copy = make_node(arena()); if (auto it = ast->attributeList) { auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1301,7 +1327,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(SimpleDeclarationAST* ast) auto out = ©->declSpecifierList; for (auto node : ListView{ast->declSpecifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; declSpecifierListCtx.accept(value); } @@ -1310,8 +1336,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(SimpleDeclarationAST* ast) if (auto it = ast->initDeclaratorList) { auto out = ©->initDeclaratorList; for (auto node : ListView{ast->initDeclaratorList}) { - auto value = rewrite(node); - *out = new (arena()) List(value); + auto value = rewrite(node, declSpecifierListCtx); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1324,13 +1350,13 @@ auto ASTRewriter::DeclarationVisitor::operator()(SimpleDeclarationAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(AsmDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) AsmDeclarationAST{}; + auto copy = make_node(arena()); if (auto it = ast->attributeList) { auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1339,7 +1365,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmDeclarationAST* ast) auto out = ©->asmQualifierList; for (auto node : ListView{ast->asmQualifierList}) { auto value = rewrite(node); - *out = new (arena()) List(ast_cast(value)); + *out = make_list_node(arena(), ast_cast(value)); out = &(*out)->next; } } @@ -1352,7 +1378,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmDeclarationAST* ast) auto out = ©->outputOperandList; for (auto node : ListView{ast->outputOperandList}) { auto value = rewrite(node); - *out = new (arena()) List(ast_cast(value)); + *out = make_list_node(arena(), ast_cast(value)); out = &(*out)->next; } } @@ -1361,7 +1387,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmDeclarationAST* ast) auto out = ©->inputOperandList; for (auto node : ListView{ast->inputOperandList}) { auto value = rewrite(node); - *out = new (arena()) List(ast_cast(value)); + *out = make_list_node(arena(), ast_cast(value)); out = &(*out)->next; } } @@ -1370,7 +1396,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmDeclarationAST* ast) auto out = ©->clobberList; for (auto node : ListView{ast->clobberList}) { auto value = rewrite(node); - *out = new (arena()) List(ast_cast(value)); + *out = make_list_node(arena(), ast_cast(value)); out = &(*out)->next; } } @@ -1379,7 +1405,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmDeclarationAST* ast) auto out = ©->gotoLabelList; for (auto node : ListView{ast->gotoLabelList}) { auto value = rewrite(node); - *out = new (arena()) List(ast_cast(value)); + *out = make_list_node(arena(), ast_cast(value)); out = &(*out)->next; } } @@ -1393,7 +1419,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmDeclarationAST* ast) auto ASTRewriter::DeclarationVisitor::operator()( NamespaceAliasDefinitionAST* ast) -> DeclarationAST* { - auto copy = new (arena()) NamespaceAliasDefinitionAST{}; + auto copy = make_node(arena()); copy->namespaceLoc = ast->namespaceLoc; copy->identifierLoc = ast->identifierLoc; @@ -1408,7 +1434,7 @@ auto ASTRewriter::DeclarationVisitor::operator()( auto ASTRewriter::DeclarationVisitor::operator()(UsingDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) UsingDeclarationAST{}; + auto copy = make_node(arena()); copy->usingLoc = ast->usingLoc; @@ -1416,7 +1442,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(UsingDeclarationAST* ast) auto out = ©->usingDeclaratorList; for (auto node : ListView{ast->usingDeclaratorList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1428,7 +1454,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(UsingDeclarationAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(UsingEnumDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) UsingEnumDeclarationAST{}; + auto copy = make_node(arena()); copy->usingLoc = ast->usingLoc; copy->enumTypeSpecifier = @@ -1440,13 +1466,13 @@ auto ASTRewriter::DeclarationVisitor::operator()(UsingEnumDeclarationAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(UsingDirectiveAST* ast) -> DeclarationAST* { - auto copy = new (arena()) UsingDirectiveAST{}; + auto copy = make_node(arena()); if (auto it = ast->attributeList) { auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1462,7 +1488,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(UsingDirectiveAST* ast) auto ASTRewriter::DeclarationVisitor::operator()( StaticAssertDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) StaticAssertDeclarationAST{}; + auto copy = make_node(arena()); copy->staticAssertLoc = ast->staticAssertLoc; copy->lparenLoc = ast->lparenLoc; @@ -1478,7 +1504,7 @@ auto ASTRewriter::DeclarationVisitor::operator()( auto ASTRewriter::DeclarationVisitor::operator()(AliasDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) AliasDeclarationAST{}; + auto copy = make_node(arena()); copy->usingLoc = ast->usingLoc; copy->identifierLoc = ast->identifierLoc; @@ -1487,7 +1513,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(AliasDeclarationAST* ast) auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1498,7 +1524,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(AliasDeclarationAST* ast) auto out = ©->gnuAttributeList; for (auto node : ListView{ast->gnuAttributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1513,7 +1539,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(AliasDeclarationAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(OpaqueEnumDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) OpaqueEnumDeclarationAST{}; + auto copy = make_node(arena()); copy->enumLoc = ast->enumLoc; copy->classLoc = ast->classLoc; @@ -1522,7 +1548,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(OpaqueEnumDeclarationAST* ast) auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1536,7 +1562,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(OpaqueEnumDeclarationAST* ast) auto out = ©->typeSpecifierList; for (auto node : ListView{ast->typeSpecifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; typeSpecifierListCtx.accept(value); } @@ -1549,13 +1575,13 @@ auto ASTRewriter::DeclarationVisitor::operator()(OpaqueEnumDeclarationAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(FunctionDefinitionAST* ast) -> DeclarationAST* { - auto copy = new (arena()) FunctionDefinitionAST{}; + auto copy = make_node(arena()); if (auto it = ast->attributeList) { auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1565,7 +1591,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(FunctionDefinitionAST* ast) auto out = ©->declSpecifierList; for (auto node : ListView{ast->declSpecifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; declSpecifierListCtx.accept(value); } @@ -1581,7 +1607,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(FunctionDefinitionAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(TemplateDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) TemplateDeclarationAST{}; + auto copy = make_node(arena()); copy->templateLoc = ast->templateLoc; copy->lessLoc = ast->lessLoc; @@ -1590,7 +1616,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(TemplateDeclarationAST* ast) auto out = ©->templateParameterList; for (auto node : ListView{ast->templateParameterList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1605,7 +1631,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(TemplateDeclarationAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(ConceptDefinitionAST* ast) -> DeclarationAST* { - auto copy = new (arena()) ConceptDefinitionAST{}; + auto copy = make_node(arena()); copy->conceptLoc = ast->conceptLoc; copy->identifierLoc = ast->identifierLoc; @@ -1620,7 +1646,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(ConceptDefinitionAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(DeductionGuideAST* ast) -> DeclarationAST* { - auto copy = new (arena()) DeductionGuideAST{}; + auto copy = make_node(arena()); copy->explicitSpecifier = rewrite(ast->explicitSpecifier); copy->identifierLoc = ast->identifierLoc; @@ -1637,7 +1663,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(DeductionGuideAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(ExplicitInstantiationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) ExplicitInstantiationAST{}; + auto copy = make_node(arena()); copy->externLoc = ast->externLoc; copy->templateLoc = ast->templateLoc; @@ -1648,7 +1674,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(ExplicitInstantiationAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(ExportDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) ExportDeclarationAST{}; + auto copy = make_node(arena()); copy->exportLoc = ast->exportLoc; copy->declaration = rewrite(ast->declaration); @@ -1658,7 +1684,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(ExportDeclarationAST* ast) auto ASTRewriter::DeclarationVisitor::operator()( ExportCompoundDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) ExportCompoundDeclarationAST{}; + auto copy = make_node(arena()); copy->exportLoc = ast->exportLoc; copy->lbraceLoc = ast->lbraceLoc; @@ -1667,7 +1693,7 @@ auto ASTRewriter::DeclarationVisitor::operator()( auto out = ©->declarationList; for (auto node : ListView{ast->declarationList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1679,7 +1705,7 @@ auto ASTRewriter::DeclarationVisitor::operator()( auto ASTRewriter::DeclarationVisitor::operator()(LinkageSpecificationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) LinkageSpecificationAST{}; + auto copy = make_node(arena()); copy->externLoc = ast->externLoc; copy->stringliteralLoc = ast->stringliteralLoc; @@ -1689,7 +1715,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(LinkageSpecificationAST* ast) auto out = ©->declarationList; for (auto node : ListView{ast->declarationList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1702,7 +1728,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(LinkageSpecificationAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(NamespaceDefinitionAST* ast) -> DeclarationAST* { - auto copy = new (arena()) NamespaceDefinitionAST{}; + auto copy = make_node(arena()); copy->inlineLoc = ast->inlineLoc; copy->namespaceLoc = ast->namespaceLoc; @@ -1711,7 +1737,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(NamespaceDefinitionAST* ast) auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1720,7 +1746,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(NamespaceDefinitionAST* ast) auto out = ©->nestedNamespaceSpecifierList; for (auto node : ListView{ast->nestedNamespaceSpecifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1731,7 +1757,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(NamespaceDefinitionAST* ast) auto out = ©->extraAttributeList; for (auto node : ListView{ast->extraAttributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1742,7 +1768,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(NamespaceDefinitionAST* ast) auto out = ©->declarationList; for (auto node : ListView{ast->declarationList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1756,7 +1782,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(NamespaceDefinitionAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(EmptyDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) EmptyDeclarationAST{}; + auto copy = make_node(arena()); copy->semicolonLoc = ast->semicolonLoc; @@ -1765,13 +1791,13 @@ auto ASTRewriter::DeclarationVisitor::operator()(EmptyDeclarationAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(AttributeDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) AttributeDeclarationAST{}; + auto copy = make_node(arena()); if (auto it = ast->attributeList) { auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1783,7 +1809,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(AttributeDeclarationAST* ast) auto ASTRewriter::DeclarationVisitor::operator()( ModuleImportDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) ModuleImportDeclarationAST{}; + auto copy = make_node(arena()); copy->importLoc = ast->importLoc; copy->importName = rewrite(ast->importName); @@ -1792,7 +1818,7 @@ auto ASTRewriter::DeclarationVisitor::operator()( auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1804,13 +1830,13 @@ auto ASTRewriter::DeclarationVisitor::operator()( auto ASTRewriter::DeclarationVisitor::operator()(ParameterDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) ParameterDeclarationAST{}; + auto copy = make_node(arena()); if (auto it = ast->attributeList) { auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1822,7 +1848,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(ParameterDeclarationAST* ast) auto out = ©->typeSpecifierList; for (auto node : ListView{ast->typeSpecifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; typeSpecifierListCtx.accept(value); } @@ -1841,7 +1867,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(ParameterDeclarationAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(AccessDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) AccessDeclarationAST{}; + auto copy = make_node(arena()); copy->accessLoc = ast->accessLoc; copy->colonLoc = ast->colonLoc; @@ -1852,20 +1878,20 @@ auto ASTRewriter::DeclarationVisitor::operator()(AccessDeclarationAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(ForRangeDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) ForRangeDeclarationAST{}; + auto copy = make_node(arena()); return copy; } auto ASTRewriter::DeclarationVisitor::operator()( StructuredBindingDeclarationAST* ast) -> DeclarationAST* { - auto copy = new (arena()) StructuredBindingDeclarationAST{}; + auto copy = make_node(arena()); if (auto it = ast->attributeList) { auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -1875,7 +1901,7 @@ auto ASTRewriter::DeclarationVisitor::operator()( auto out = ©->declSpecifierList; for (auto node : ListView{ast->declSpecifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; declSpecifierListCtx.accept(value); } @@ -1888,7 +1914,7 @@ auto ASTRewriter::DeclarationVisitor::operator()( auto out = ©->bindingList; for (auto node : ListView{ast->bindingList}) { auto value = rewrite(node); - *out = new (arena()) List(ast_cast(value)); + *out = make_list_node(arena(), ast_cast(value)); out = &(*out)->next; } } @@ -1902,7 +1928,7 @@ auto ASTRewriter::DeclarationVisitor::operator()( auto ASTRewriter::DeclarationVisitor::operator()(AsmOperandAST* ast) -> DeclarationAST* { - auto copy = new (arena()) AsmOperandAST{}; + auto copy = make_node(arena()); copy->lbracketLoc = ast->lbracketLoc; copy->symbolicNameLoc = ast->symbolicNameLoc; @@ -1919,7 +1945,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmOperandAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(AsmQualifierAST* ast) -> DeclarationAST* { - auto copy = new (arena()) AsmQualifierAST{}; + auto copy = make_node(arena()); copy->qualifierLoc = ast->qualifierLoc; copy->qualifier = ast->qualifier; @@ -1929,7 +1955,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmQualifierAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(AsmClobberAST* ast) -> DeclarationAST* { - auto copy = new (arena()) AsmClobberAST{}; + auto copy = make_node(arena()); copy->literalLoc = ast->literalLoc; copy->literal = ast->literal; @@ -1939,7 +1965,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmClobberAST* ast) auto ASTRewriter::DeclarationVisitor::operator()(AsmGotoLabelAST* ast) -> DeclarationAST* { - auto copy = new (arena()) AsmGotoLabelAST{}; + auto copy = make_node(arena()); copy->identifierLoc = ast->identifierLoc; copy->identifier = ast->identifier; @@ -1949,7 +1975,7 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmGotoLabelAST* ast) auto ASTRewriter::StatementVisitor::operator()(LabeledStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) LabeledStatementAST{}; + auto copy = make_node(arena()); copy->identifierLoc = ast->identifierLoc; copy->colonLoc = ast->colonLoc; @@ -1960,7 +1986,7 @@ auto ASTRewriter::StatementVisitor::operator()(LabeledStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(CaseStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) CaseStatementAST{}; + auto copy = make_node(arena()); copy->caseLoc = ast->caseLoc; copy->expression = rewrite(ast->expression); @@ -1971,7 +1997,7 @@ auto ASTRewriter::StatementVisitor::operator()(CaseStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(DefaultStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) DefaultStatementAST{}; + auto copy = make_node(arena()); copy->defaultLoc = ast->defaultLoc; copy->colonLoc = ast->colonLoc; @@ -1981,7 +2007,7 @@ auto ASTRewriter::StatementVisitor::operator()(DefaultStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(ExpressionStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) ExpressionStatementAST{}; + auto copy = make_node(arena()); copy->expression = rewrite(ast->expression); copy->semicolonLoc = ast->semicolonLoc; @@ -1991,7 +2017,16 @@ auto ASTRewriter::StatementVisitor::operator()(ExpressionStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(CompoundStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) CompoundStatementAST{}; + auto copy = make_node(arena()); + + auto _ = Binder::ScopeGuard(&rewrite.binder_); + + if (ast->symbol) { + copy->symbol = control()->newBlockSymbol(rewrite.binder_.scope(), + ast->symbol->location()); + + rewrite.binder_.setScope(copy->symbol); + } copy->lbraceLoc = ast->lbraceLoc; @@ -1999,20 +2034,28 @@ auto ASTRewriter::StatementVisitor::operator()(CompoundStatementAST* ast) auto out = ©->statementList; for (auto node : ListView{ast->statementList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } copy->rbraceLoc = ast->rbraceLoc; - copy->symbol = ast->symbol; return copy; } auto ASTRewriter::StatementVisitor::operator()(IfStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) IfStatementAST{}; + auto copy = make_node(arena()); + + auto _ = Binder::ScopeGuard(&rewrite.binder_); + + if (ast->symbol) { + copy->symbol = control()->newBlockSymbol(rewrite.binder_.scope(), + ast->symbol->location()); + + rewrite.binder_.setScope(copy->symbol); + } copy->ifLoc = ast->ifLoc; copy->constexprLoc = ast->constexprLoc; @@ -2029,7 +2072,7 @@ auto ASTRewriter::StatementVisitor::operator()(IfStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(ConstevalIfStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) ConstevalIfStatementAST{}; + auto copy = make_node(arena()); copy->ifLoc = ast->ifLoc; copy->exclaimLoc = ast->exclaimLoc; @@ -2044,7 +2087,16 @@ auto ASTRewriter::StatementVisitor::operator()(ConstevalIfStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(SwitchStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) SwitchStatementAST{}; + auto copy = make_node(arena()); + + auto _ = Binder::ScopeGuard(&rewrite.binder_); + + if (ast->symbol) { + copy->symbol = control()->newBlockSymbol(rewrite.binder_.scope(), + ast->symbol->location()); + + rewrite.binder_.setScope(copy->symbol); + } copy->switchLoc = ast->switchLoc; copy->lparenLoc = ast->lparenLoc; @@ -2058,7 +2110,16 @@ auto ASTRewriter::StatementVisitor::operator()(SwitchStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(WhileStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) WhileStatementAST{}; + auto copy = make_node(arena()); + + auto _ = Binder::ScopeGuard(&rewrite.binder_); + + if (ast->symbol) { + copy->symbol = control()->newBlockSymbol(rewrite.binder_.scope(), + ast->symbol->location()); + + rewrite.binder_.setScope(copy->symbol); + } copy->whileLoc = ast->whileLoc; copy->lparenLoc = ast->lparenLoc; @@ -2071,7 +2132,7 @@ auto ASTRewriter::StatementVisitor::operator()(WhileStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(DoStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) DoStatementAST{}; + auto copy = make_node(arena()); copy->doLoc = ast->doLoc; copy->statement = rewrite(ast->statement); @@ -2086,7 +2147,16 @@ auto ASTRewriter::StatementVisitor::operator()(DoStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(ForRangeStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) ForRangeStatementAST{}; + auto copy = make_node(arena()); + + auto _ = Binder::ScopeGuard(&rewrite.binder_); + + if (ast->symbol) { + copy->symbol = control()->newBlockSymbol(rewrite.binder_.scope(), + ast->symbol->location()); + + rewrite.binder_.setScope(copy->symbol); + } copy->forLoc = ast->forLoc; copy->lparenLoc = ast->lparenLoc; @@ -2102,7 +2172,16 @@ auto ASTRewriter::StatementVisitor::operator()(ForRangeStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(ForStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) ForStatementAST{}; + auto copy = make_node(arena()); + + auto _ = Binder::ScopeGuard(&rewrite.binder_); + + if (ast->symbol) { + copy->symbol = control()->newBlockSymbol(rewrite.binder_.scope(), + ast->symbol->location()); + + rewrite.binder_.setScope(copy->symbol); + } copy->forLoc = ast->forLoc; copy->lparenLoc = ast->lparenLoc; @@ -2118,7 +2197,7 @@ auto ASTRewriter::StatementVisitor::operator()(ForStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(BreakStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) BreakStatementAST{}; + auto copy = make_node(arena()); copy->breakLoc = ast->breakLoc; copy->semicolonLoc = ast->semicolonLoc; @@ -2128,7 +2207,7 @@ auto ASTRewriter::StatementVisitor::operator()(BreakStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(ContinueStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) ContinueStatementAST{}; + auto copy = make_node(arena()); copy->continueLoc = ast->continueLoc; copy->semicolonLoc = ast->semicolonLoc; @@ -2138,7 +2217,7 @@ auto ASTRewriter::StatementVisitor::operator()(ContinueStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(ReturnStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) ReturnStatementAST{}; + auto copy = make_node(arena()); copy->returnLoc = ast->returnLoc; copy->expression = rewrite(ast->expression); @@ -2149,7 +2228,7 @@ auto ASTRewriter::StatementVisitor::operator()(ReturnStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(CoroutineReturnStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) CoroutineReturnStatementAST{}; + auto copy = make_node(arena()); copy->coreturnLoc = ast->coreturnLoc; copy->expression = rewrite(ast->expression); @@ -2160,7 +2239,7 @@ auto ASTRewriter::StatementVisitor::operator()(CoroutineReturnStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(GotoStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) GotoStatementAST{}; + auto copy = make_node(arena()); copy->gotoLoc = ast->gotoLoc; copy->identifierLoc = ast->identifierLoc; @@ -2172,7 +2251,7 @@ auto ASTRewriter::StatementVisitor::operator()(GotoStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(DeclarationStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) DeclarationStatementAST{}; + auto copy = make_node(arena()); copy->declaration = rewrite(ast->declaration); @@ -2181,7 +2260,7 @@ auto ASTRewriter::StatementVisitor::operator()(DeclarationStatementAST* ast) auto ASTRewriter::StatementVisitor::operator()(TryBlockStatementAST* ast) -> StatementAST* { - auto copy = new (arena()) TryBlockStatementAST{}; + auto copy = make_node(arena()); copy->tryLoc = ast->tryLoc; copy->statement = ast_cast(rewrite(ast->statement)); @@ -2190,7 +2269,7 @@ auto ASTRewriter::StatementVisitor::operator()(TryBlockStatementAST* ast) auto out = ©->handlerList; for (auto node : ListView{ast->handlerList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -2200,7 +2279,7 @@ auto ASTRewriter::StatementVisitor::operator()(TryBlockStatementAST* ast) auto ASTRewriter::ExpressionVisitor::operator()( GeneratedLiteralExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) GeneratedLiteralExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2212,7 +2291,7 @@ auto ASTRewriter::ExpressionVisitor::operator()( auto ASTRewriter::ExpressionVisitor::operator()(CharLiteralExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) CharLiteralExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2224,7 +2303,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(CharLiteralExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(BoolLiteralExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) BoolLiteralExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2236,7 +2315,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(BoolLiteralExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(IntLiteralExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) IntLiteralExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2248,7 +2327,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(IntLiteralExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(FloatLiteralExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) FloatLiteralExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2260,7 +2339,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(FloatLiteralExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()( NullptrLiteralExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) NullptrLiteralExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2272,7 +2351,7 @@ auto ASTRewriter::ExpressionVisitor::operator()( auto ASTRewriter::ExpressionVisitor::operator()(StringLiteralExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) StringLiteralExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2284,7 +2363,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(StringLiteralExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()( UserDefinedStringLiteralExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) UserDefinedStringLiteralExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2296,7 +2375,7 @@ auto ASTRewriter::ExpressionVisitor::operator()( auto ASTRewriter::ExpressionVisitor::operator()(ThisExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) ThisExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2307,7 +2386,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(ThisExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()( NestedStatementExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) NestedStatementExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2320,7 +2399,7 @@ auto ASTRewriter::ExpressionVisitor::operator()( auto ASTRewriter::ExpressionVisitor::operator()(NestedExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) NestedExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2333,7 +2412,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(NestedExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(IdExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) IdExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2348,7 +2427,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(IdExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(LambdaExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) LambdaExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2359,7 +2438,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(LambdaExpressionAST* ast) auto out = ©->captureList; for (auto node : ListView{ast->captureList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -2371,7 +2450,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(LambdaExpressionAST* ast) auto out = ©->templateParameterList; for (auto node : ListView{ast->templateParameterList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -2386,7 +2465,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(LambdaExpressionAST* ast) auto out = ©->gnuAtributeList; for (auto node : ListView{ast->gnuAtributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -2395,7 +2474,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(LambdaExpressionAST* ast) auto out = ©->lambdaSpecifierList; for (auto node : ListView{ast->lambdaSpecifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -2406,7 +2485,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(LambdaExpressionAST* ast) auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -2422,7 +2501,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(LambdaExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(FoldExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) FoldExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2441,7 +2520,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(FoldExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(RightFoldExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) RightFoldExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2457,7 +2536,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(RightFoldExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(LeftFoldExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) LeftFoldExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2473,7 +2552,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(LeftFoldExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(RequiresExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) RequiresExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2487,7 +2566,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(RequiresExpressionAST* ast) auto out = ©->requirementList; for (auto node : ListView{ast->requirementList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -2499,7 +2578,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(RequiresExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(VaArgExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) VaArgExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2515,7 +2594,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(VaArgExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(SubscriptExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) SubscriptExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2529,7 +2608,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(SubscriptExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(CallExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) CallExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2540,7 +2619,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(CallExpressionAST* ast) auto out = ©->expressionList; for (auto node : ListView{ast->expressionList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -2552,7 +2631,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(CallExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(TypeConstructionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) TypeConstructionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2563,7 +2642,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(TypeConstructionAST* ast) auto out = ©->expressionList; for (auto node : ListView{ast->expressionList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -2575,7 +2654,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(TypeConstructionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(BracedTypeConstructionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) BracedTypeConstructionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2588,7 +2667,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(BracedTypeConstructionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(SpliceMemberExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) SpliceMemberExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2605,7 +2684,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(SpliceMemberExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(MemberExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) MemberExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2623,7 +2702,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(MemberExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(PostIncrExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) PostIncrExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2636,7 +2715,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(PostIncrExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(CppCastExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) CppCastExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2653,7 +2732,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(CppCastExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()( BuiltinBitCastExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) BuiltinBitCastExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2669,7 +2748,7 @@ auto ASTRewriter::ExpressionVisitor::operator()( auto ASTRewriter::ExpressionVisitor::operator()( BuiltinOffsetofExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) BuiltinOffsetofExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2686,7 +2765,7 @@ auto ASTRewriter::ExpressionVisitor::operator()( auto ASTRewriter::ExpressionVisitor::operator()(TypeidExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) TypeidExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2700,7 +2779,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(TypeidExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(TypeidOfTypeExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) TypeidOfTypeExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2714,7 +2793,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(TypeidOfTypeExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(SpliceExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) SpliceExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2725,7 +2804,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(SpliceExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()( GlobalScopeReflectExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) GlobalScopeReflectExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2737,7 +2816,7 @@ auto ASTRewriter::ExpressionVisitor::operator()( auto ASTRewriter::ExpressionVisitor::operator()( NamespaceReflectExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) NamespaceReflectExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2751,7 +2830,7 @@ auto ASTRewriter::ExpressionVisitor::operator()( auto ASTRewriter::ExpressionVisitor::operator()(TypeIdReflectExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) TypeIdReflectExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2763,7 +2842,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(TypeIdReflectExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(ReflectExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) ReflectExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2775,7 +2854,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(ReflectExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(UnaryExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) UnaryExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2788,7 +2867,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(UnaryExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(AwaitExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) AwaitExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2800,7 +2879,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(AwaitExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(SizeofExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) SizeofExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2812,7 +2891,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(SizeofExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(SizeofTypeExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) SizeofTypeExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2826,7 +2905,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(SizeofTypeExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(SizeofPackExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) SizeofPackExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2842,7 +2921,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(SizeofPackExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(AlignofTypeExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) AlignofTypeExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2856,7 +2935,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(AlignofTypeExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(AlignofExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) AlignofExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2868,7 +2947,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(AlignofExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(NoexceptExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) NoexceptExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2882,7 +2961,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(NoexceptExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(NewExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) NewExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2896,7 +2975,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(NewExpressionAST* ast) auto out = ©->typeSpecifierList; for (auto node : ListView{ast->typeSpecifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; typeSpecifierListCtx.accept(value); } @@ -2911,7 +2990,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(NewExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(DeleteExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) DeleteExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2926,7 +3005,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(DeleteExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(CastExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) CastExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2940,7 +3019,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(CastExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(ImplicitCastExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) ImplicitCastExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2952,7 +3031,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(ImplicitCastExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(BinaryExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) BinaryExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2966,7 +3045,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(BinaryExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(ConditionalExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) ConditionalExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2981,7 +3060,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(ConditionalExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(YieldExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) YieldExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -2993,7 +3072,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(YieldExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(ThrowExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) ThrowExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -3005,7 +3084,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(ThrowExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(AssignmentExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) AssignmentExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -3019,7 +3098,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(AssignmentExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(PackExpansionExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) PackExpansionExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -3031,7 +3110,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(PackExpansionExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()( DesignatedInitializerClauseAST* ast) -> ExpressionAST* { - auto copy = new (arena()) DesignatedInitializerClauseAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -3045,7 +3124,7 @@ auto ASTRewriter::ExpressionVisitor::operator()( auto ASTRewriter::ExpressionVisitor::operator()(TypeTraitExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) TypeTraitExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -3056,7 +3135,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(TypeTraitExpressionAST* ast) auto out = ©->typeIdList; for (auto node : ListView{ast->typeIdList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3069,7 +3148,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(TypeTraitExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(ConditionExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) ConditionExpressionAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -3078,7 +3157,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(ConditionExpressionAST* ast) auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3088,7 +3167,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(ConditionExpressionAST* ast) auto out = ©->declSpecifierList; for (auto node : ListView{ast->declSpecifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; declSpecifierListCtx.accept(value); } @@ -3103,7 +3182,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(ConditionExpressionAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(EqualInitializerAST* ast) -> ExpressionAST* { - auto copy = new (arena()) EqualInitializerAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -3115,7 +3194,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(EqualInitializerAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(BracedInitListAST* ast) -> ExpressionAST* { - auto copy = new (arena()) BracedInitListAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -3125,7 +3204,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(BracedInitListAST* ast) auto out = ©->expressionList; for (auto node : ListView{ast->expressionList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3138,7 +3217,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(BracedInitListAST* ast) auto ASTRewriter::ExpressionVisitor::operator()(ParenInitializerAST* ast) -> ExpressionAST* { - auto copy = new (arena()) ParenInitializerAST{}; + auto copy = make_node(arena()); copy->valueCategory = ast->valueCategory; copy->type = ast->type; @@ -3148,7 +3227,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(ParenInitializerAST* ast) auto out = ©->expressionList; for (auto node : ListView{ast->expressionList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3160,7 +3239,7 @@ auto ASTRewriter::ExpressionVisitor::operator()(ParenInitializerAST* ast) auto ASTRewriter::TemplateParameterVisitor::operator()( TemplateTypeParameterAST* ast) -> TemplateParameterAST* { - auto copy = new (arena()) TemplateTypeParameterAST{}; + auto copy = make_node(arena()); copy->symbol = ast->symbol; copy->depth = ast->depth; @@ -3172,7 +3251,7 @@ auto ASTRewriter::TemplateParameterVisitor::operator()( auto out = ©->templateParameterList; for (auto node : ListView{ast->templateParameterList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3192,7 +3271,7 @@ auto ASTRewriter::TemplateParameterVisitor::operator()( auto ASTRewriter::TemplateParameterVisitor::operator()( NonTypeTemplateParameterAST* ast) -> TemplateParameterAST* { - auto copy = new (arena()) NonTypeTemplateParameterAST{}; + auto copy = make_node(arena()); copy->symbol = ast->symbol; copy->depth = ast->depth; @@ -3205,7 +3284,7 @@ auto ASTRewriter::TemplateParameterVisitor::operator()( auto ASTRewriter::TemplateParameterVisitor::operator()( TypenameTypeParameterAST* ast) -> TemplateParameterAST* { - auto copy = new (arena()) TypenameTypeParameterAST{}; + auto copy = make_node(arena()); copy->symbol = ast->symbol; copy->depth = ast->depth; @@ -3223,7 +3302,7 @@ auto ASTRewriter::TemplateParameterVisitor::operator()( auto ASTRewriter::TemplateParameterVisitor::operator()( ConstraintTypeParameterAST* ast) -> TemplateParameterAST* { - auto copy = new (arena()) ConstraintTypeParameterAST{}; + auto copy = make_node(arena()); copy->symbol = ast->symbol; copy->depth = ast->depth; @@ -3240,7 +3319,7 @@ auto ASTRewriter::TemplateParameterVisitor::operator()( auto ASTRewriter::SpecifierVisitor::operator()(GeneratedTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) GeneratedTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->typeLoc = ast->typeLoc; copy->type = ast->type; @@ -3250,7 +3329,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(GeneratedTypeSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(TypedefSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) TypedefSpecifierAST{}; + auto copy = make_node(arena()); copy->typedefLoc = ast->typedefLoc; @@ -3259,7 +3338,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(TypedefSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(FriendSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) FriendSpecifierAST{}; + auto copy = make_node(arena()); copy->friendLoc = ast->friendLoc; @@ -3268,7 +3347,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(FriendSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(ConstevalSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) ConstevalSpecifierAST{}; + auto copy = make_node(arena()); copy->constevalLoc = ast->constevalLoc; @@ -3277,7 +3356,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ConstevalSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(ConstinitSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) ConstinitSpecifierAST{}; + auto copy = make_node(arena()); copy->constinitLoc = ast->constinitLoc; @@ -3286,7 +3365,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ConstinitSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(ConstexprSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) ConstexprSpecifierAST{}; + auto copy = make_node(arena()); copy->constexprLoc = ast->constexprLoc; @@ -3295,7 +3374,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ConstexprSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(InlineSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) InlineSpecifierAST{}; + auto copy = make_node(arena()); copy->inlineLoc = ast->inlineLoc; @@ -3304,7 +3383,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(InlineSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(StaticSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) StaticSpecifierAST{}; + auto copy = make_node(arena()); copy->staticLoc = ast->staticLoc; @@ -3313,7 +3392,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(StaticSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(ExternSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) ExternSpecifierAST{}; + auto copy = make_node(arena()); copy->externLoc = ast->externLoc; @@ -3322,7 +3401,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ExternSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(ThreadLocalSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) ThreadLocalSpecifierAST{}; + auto copy = make_node(arena()); copy->threadLocalLoc = ast->threadLocalLoc; @@ -3331,7 +3410,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ThreadLocalSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(ThreadSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) ThreadSpecifierAST{}; + auto copy = make_node(arena()); copy->threadLoc = ast->threadLoc; @@ -3340,7 +3419,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ThreadSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(MutableSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) MutableSpecifierAST{}; + auto copy = make_node(arena()); copy->mutableLoc = ast->mutableLoc; @@ -3349,7 +3428,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(MutableSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(VirtualSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) VirtualSpecifierAST{}; + auto copy = make_node(arena()); copy->virtualLoc = ast->virtualLoc; @@ -3358,7 +3437,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(VirtualSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(ExplicitSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) ExplicitSpecifierAST{}; + auto copy = make_node(arena()); copy->explicitLoc = ast->explicitLoc; copy->lparenLoc = ast->lparenLoc; @@ -3370,7 +3449,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ExplicitSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(AutoTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) AutoTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->autoLoc = ast->autoLoc; @@ -3379,7 +3458,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(AutoTypeSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(VoidTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) VoidTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->voidLoc = ast->voidLoc; @@ -3388,7 +3467,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(VoidTypeSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(SizeTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) SizeTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->specifierLoc = ast->specifierLoc; copy->specifier = ast->specifier; @@ -3398,7 +3477,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(SizeTypeSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(SignTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) SignTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->specifierLoc = ast->specifierLoc; copy->specifier = ast->specifier; @@ -3408,7 +3487,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(SignTypeSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(VaListTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) VaListTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->specifierLoc = ast->specifierLoc; copy->specifier = ast->specifier; @@ -3418,7 +3497,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(VaListTypeSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(IntegralTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) IntegralTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->specifierLoc = ast->specifierLoc; copy->specifier = ast->specifier; @@ -3428,7 +3507,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(IntegralTypeSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()( FloatingPointTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) FloatingPointTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->specifierLoc = ast->specifierLoc; copy->specifier = ast->specifier; @@ -3438,7 +3517,7 @@ auto ASTRewriter::SpecifierVisitor::operator()( auto ASTRewriter::SpecifierVisitor::operator()(ComplexTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) ComplexTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->complexLoc = ast->complexLoc; @@ -3447,7 +3526,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ComplexTypeSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(NamedTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) NamedTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->nestedNameSpecifier = rewrite(ast->nestedNameSpecifier); copy->templateLoc = ast->templateLoc; @@ -3460,7 +3539,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(NamedTypeSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(AtomicTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) AtomicTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->atomicLoc = ast->atomicLoc; copy->lparenLoc = ast->lparenLoc; @@ -3472,7 +3551,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(AtomicTypeSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(UnderlyingTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) UnderlyingTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->underlyingTypeLoc = ast->underlyingTypeLoc; copy->lparenLoc = ast->lparenLoc; @@ -3484,7 +3563,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(UnderlyingTypeSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(ElaboratedTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) ElaboratedTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->classLoc = ast->classLoc; @@ -3492,7 +3571,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ElaboratedTypeSpecifierAST* ast) auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3509,7 +3588,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ElaboratedTypeSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(DecltypeAutoSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) DecltypeAutoSpecifierAST{}; + auto copy = make_node(arena()); copy->decltypeLoc = ast->decltypeLoc; copy->lparenLoc = ast->lparenLoc; @@ -3521,7 +3600,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(DecltypeAutoSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(DecltypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) DecltypeSpecifierAST{}; + auto copy = make_node(arena()); copy->decltypeLoc = ast->decltypeLoc; copy->lparenLoc = ast->lparenLoc; @@ -3534,7 +3613,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(DecltypeSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(PlaceholderTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) PlaceholderTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->typeConstraint = rewrite(ast->typeConstraint); copy->specifier = rewrite(ast->specifier); @@ -3544,7 +3623,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(PlaceholderTypeSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(ConstQualifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) ConstQualifierAST{}; + auto copy = make_node(arena()); copy->constLoc = ast->constLoc; @@ -3553,7 +3632,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ConstQualifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(VolatileQualifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) VolatileQualifierAST{}; + auto copy = make_node(arena()); copy->volatileLoc = ast->volatileLoc; @@ -3562,7 +3641,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(VolatileQualifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(RestrictQualifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) RestrictQualifierAST{}; + auto copy = make_node(arena()); copy->restrictLoc = ast->restrictLoc; @@ -3571,7 +3650,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(RestrictQualifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(EnumSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) EnumSpecifierAST{}; + auto copy = make_node(arena()); copy->enumLoc = ast->enumLoc; copy->classLoc = ast->classLoc; @@ -3580,7 +3659,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(EnumSpecifierAST* ast) auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3594,7 +3673,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(EnumSpecifierAST* ast) auto out = ©->typeSpecifierList; for (auto node : ListView{ast->typeSpecifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; typeSpecifierListCtx.accept(value); } @@ -3607,7 +3686,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(EnumSpecifierAST* ast) auto out = ©->enumeratorList; for (auto node : ListView{ast->enumeratorList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3620,7 +3699,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(EnumSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(ClassSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) ClassSpecifierAST{}; + auto copy = make_node(arena()); copy->classLoc = ast->classLoc; @@ -3628,7 +3707,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ClassSpecifierAST* ast) auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3642,7 +3721,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ClassSpecifierAST* ast) auto out = ©->baseSpecifierList; for (auto node : ListView{ast->baseSpecifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3653,7 +3732,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ClassSpecifierAST* ast) auto out = ©->declarationList; for (auto node : ListView{ast->declarationList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3668,7 +3747,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ClassSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(TypenameSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) TypenameSpecifierAST{}; + auto copy = make_node(arena()); copy->typenameLoc = ast->typenameLoc; copy->nestedNameSpecifier = rewrite(ast->nestedNameSpecifier); @@ -3679,7 +3758,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(TypenameSpecifierAST* ast) auto ASTRewriter::SpecifierVisitor::operator()(SplicerTypeSpecifierAST* ast) -> SpecifierAST* { - auto copy = new (arena()) SplicerTypeSpecifierAST{}; + auto copy = make_node(arena()); copy->typenameLoc = ast->typenameLoc; copy->splicer = rewrite(ast->splicer); @@ -3689,7 +3768,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(SplicerTypeSpecifierAST* ast) auto ASTRewriter::PtrOperatorVisitor::operator()(PointerOperatorAST* ast) -> PtrOperatorAST* { - auto copy = new (arena()) PointerOperatorAST{}; + auto copy = make_node(arena()); copy->starLoc = ast->starLoc; @@ -3697,7 +3776,7 @@ auto ASTRewriter::PtrOperatorVisitor::operator()(PointerOperatorAST* ast) auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3707,7 +3786,7 @@ auto ASTRewriter::PtrOperatorVisitor::operator()(PointerOperatorAST* ast) auto out = ©->cvQualifierList; for (auto node : ListView{ast->cvQualifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; cvQualifierListCtx.accept(value); } @@ -3718,7 +3797,7 @@ auto ASTRewriter::PtrOperatorVisitor::operator()(PointerOperatorAST* ast) auto ASTRewriter::PtrOperatorVisitor::operator()(ReferenceOperatorAST* ast) -> PtrOperatorAST* { - auto copy = new (arena()) ReferenceOperatorAST{}; + auto copy = make_node(arena()); copy->refLoc = ast->refLoc; @@ -3726,7 +3805,7 @@ auto ASTRewriter::PtrOperatorVisitor::operator()(ReferenceOperatorAST* ast) auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3738,7 +3817,7 @@ auto ASTRewriter::PtrOperatorVisitor::operator()(ReferenceOperatorAST* ast) auto ASTRewriter::PtrOperatorVisitor::operator()(PtrToMemberOperatorAST* ast) -> PtrOperatorAST* { - auto copy = new (arena()) PtrToMemberOperatorAST{}; + auto copy = make_node(arena()); copy->nestedNameSpecifier = rewrite(ast->nestedNameSpecifier); copy->starLoc = ast->starLoc; @@ -3747,7 +3826,7 @@ auto ASTRewriter::PtrOperatorVisitor::operator()(PtrToMemberOperatorAST* ast) auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3757,7 +3836,7 @@ auto ASTRewriter::PtrOperatorVisitor::operator()(PtrToMemberOperatorAST* ast) auto out = ©->cvQualifierList; for (auto node : ListView{ast->cvQualifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; cvQualifierListCtx.accept(value); } @@ -3768,7 +3847,7 @@ auto ASTRewriter::PtrOperatorVisitor::operator()(PtrToMemberOperatorAST* ast) auto ASTRewriter::CoreDeclaratorVisitor::operator()(BitfieldDeclaratorAST* ast) -> CoreDeclaratorAST* { - auto copy = new (arena()) BitfieldDeclaratorAST{}; + auto copy = make_node(arena()); copy->unqualifiedId = ast_cast(rewrite(ast->unqualifiedId)); copy->colonLoc = ast->colonLoc; @@ -3779,7 +3858,7 @@ auto ASTRewriter::CoreDeclaratorVisitor::operator()(BitfieldDeclaratorAST* ast) auto ASTRewriter::CoreDeclaratorVisitor::operator()(ParameterPackAST* ast) -> CoreDeclaratorAST* { - auto copy = new (arena()) ParameterPackAST{}; + auto copy = make_node(arena()); copy->ellipsisLoc = ast->ellipsisLoc; copy->coreDeclarator = rewrite(ast->coreDeclarator); @@ -3789,7 +3868,7 @@ auto ASTRewriter::CoreDeclaratorVisitor::operator()(ParameterPackAST* ast) auto ASTRewriter::CoreDeclaratorVisitor::operator()(IdDeclaratorAST* ast) -> CoreDeclaratorAST* { - auto copy = new (arena()) IdDeclaratorAST{}; + auto copy = make_node(arena()); copy->nestedNameSpecifier = rewrite(ast->nestedNameSpecifier); copy->templateLoc = ast->templateLoc; @@ -3799,7 +3878,7 @@ auto ASTRewriter::CoreDeclaratorVisitor::operator()(IdDeclaratorAST* ast) auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3811,7 +3890,7 @@ auto ASTRewriter::CoreDeclaratorVisitor::operator()(IdDeclaratorAST* ast) auto ASTRewriter::CoreDeclaratorVisitor::operator()(NestedDeclaratorAST* ast) -> CoreDeclaratorAST* { - auto copy = new (arena()) NestedDeclaratorAST{}; + auto copy = make_node(arena()); copy->lparenLoc = ast->lparenLoc; copy->declarator = rewrite(ast->declarator); @@ -3822,7 +3901,7 @@ auto ASTRewriter::CoreDeclaratorVisitor::operator()(NestedDeclaratorAST* ast) auto ASTRewriter::DeclaratorChunkVisitor::operator()( FunctionDeclaratorChunkAST* ast) -> DeclaratorChunkAST* { - auto copy = new (arena()) FunctionDeclaratorChunkAST{}; + auto copy = make_node(arena()); copy->lparenLoc = ast->lparenLoc; copy->parameterDeclarationClause = rewrite(ast->parameterDeclarationClause); @@ -3833,7 +3912,7 @@ auto ASTRewriter::DeclaratorChunkVisitor::operator()( auto out = ©->cvQualifierList; for (auto node : ListView{ast->cvQualifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; cvQualifierListCtx.accept(value); } @@ -3846,7 +3925,7 @@ auto ASTRewriter::DeclaratorChunkVisitor::operator()( auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3861,7 +3940,7 @@ auto ASTRewriter::DeclaratorChunkVisitor::operator()( auto ASTRewriter::DeclaratorChunkVisitor::operator()( ArrayDeclaratorChunkAST* ast) -> DeclaratorChunkAST* { - auto copy = new (arena()) ArrayDeclaratorChunkAST{}; + auto copy = make_node(arena()); copy->lbracketLoc = ast->lbracketLoc; copy->expression = rewrite(ast->expression); @@ -3871,7 +3950,7 @@ auto ASTRewriter::DeclaratorChunkVisitor::operator()( auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3881,7 +3960,7 @@ auto ASTRewriter::DeclaratorChunkVisitor::operator()( auto ASTRewriter::UnqualifiedIdVisitor::operator()(NameIdAST* ast) -> UnqualifiedIdAST* { - auto copy = new (arena()) NameIdAST{}; + auto copy = make_node(arena()); copy->identifierLoc = ast->identifierLoc; copy->identifier = ast->identifier; @@ -3891,7 +3970,7 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()(NameIdAST* ast) auto ASTRewriter::UnqualifiedIdVisitor::operator()(DestructorIdAST* ast) -> UnqualifiedIdAST* { - auto copy = new (arena()) DestructorIdAST{}; + auto copy = make_node(arena()); copy->tildeLoc = ast->tildeLoc; copy->id = rewrite(ast->id); @@ -3901,7 +3980,7 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()(DestructorIdAST* ast) auto ASTRewriter::UnqualifiedIdVisitor::operator()(DecltypeIdAST* ast) -> UnqualifiedIdAST* { - auto copy = new (arena()) DecltypeIdAST{}; + auto copy = make_node(arena()); copy->decltypeSpecifier = ast_cast(rewrite(ast->decltypeSpecifier)); @@ -3911,7 +3990,7 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()(DecltypeIdAST* ast) auto ASTRewriter::UnqualifiedIdVisitor::operator()(OperatorFunctionIdAST* ast) -> UnqualifiedIdAST* { - auto copy = new (arena()) OperatorFunctionIdAST{}; + auto copy = make_node(arena()); copy->operatorLoc = ast->operatorLoc; copy->opLoc = ast->opLoc; @@ -3924,7 +4003,7 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()(OperatorFunctionIdAST* ast) auto ASTRewriter::UnqualifiedIdVisitor::operator()(LiteralOperatorIdAST* ast) -> UnqualifiedIdAST* { - auto copy = new (arena()) LiteralOperatorIdAST{}; + auto copy = make_node(arena()); copy->operatorLoc = ast->operatorLoc; copy->literalLoc = ast->literalLoc; @@ -3937,7 +4016,7 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()(LiteralOperatorIdAST* ast) auto ASTRewriter::UnqualifiedIdVisitor::operator()(ConversionFunctionIdAST* ast) -> UnqualifiedIdAST* { - auto copy = new (arena()) ConversionFunctionIdAST{}; + auto copy = make_node(arena()); copy->operatorLoc = ast->operatorLoc; copy->typeId = rewrite(ast->typeId); @@ -3947,7 +4026,7 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()(ConversionFunctionIdAST* ast) auto ASTRewriter::UnqualifiedIdVisitor::operator()(SimpleTemplateIdAST* ast) -> UnqualifiedIdAST* { - auto copy = new (arena()) SimpleTemplateIdAST{}; + auto copy = make_node(arena()); copy->identifierLoc = ast->identifierLoc; copy->lessLoc = ast->lessLoc; @@ -3956,7 +4035,7 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()(SimpleTemplateIdAST* ast) auto out = ©->templateArgumentList; for (auto node : ListView{ast->templateArgumentList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3970,7 +4049,7 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()(SimpleTemplateIdAST* ast) auto ASTRewriter::UnqualifiedIdVisitor::operator()( LiteralOperatorTemplateIdAST* ast) -> UnqualifiedIdAST* { - auto copy = new (arena()) LiteralOperatorTemplateIdAST{}; + auto copy = make_node(arena()); copy->literalOperatorId = ast_cast(rewrite(ast->literalOperatorId)); @@ -3980,7 +4059,7 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()( auto out = ©->templateArgumentList; for (auto node : ListView{ast->templateArgumentList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -3992,7 +4071,7 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()( auto ASTRewriter::UnqualifiedIdVisitor::operator()( OperatorFunctionTemplateIdAST* ast) -> UnqualifiedIdAST* { - auto copy = new (arena()) OperatorFunctionTemplateIdAST{}; + auto copy = make_node(arena()); copy->operatorFunctionId = ast_cast(rewrite(ast->operatorFunctionId)); @@ -4002,7 +4081,7 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()( auto out = ©->templateArgumentList; for (auto node : ListView{ast->templateArgumentList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -4014,7 +4093,7 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()( auto ASTRewriter::NestedNameSpecifierVisitor::operator()( GlobalNestedNameSpecifierAST* ast) -> NestedNameSpecifierAST* { - auto copy = new (arena()) GlobalNestedNameSpecifierAST{}; + auto copy = make_node(arena()); copy->symbol = ast->symbol; copy->scopeLoc = ast->scopeLoc; @@ -4024,7 +4103,7 @@ auto ASTRewriter::NestedNameSpecifierVisitor::operator()( auto ASTRewriter::NestedNameSpecifierVisitor::operator()( SimpleNestedNameSpecifierAST* ast) -> NestedNameSpecifierAST* { - auto copy = new (arena()) SimpleNestedNameSpecifierAST{}; + auto copy = make_node(arena()); copy->symbol = ast->symbol; copy->nestedNameSpecifier = rewrite(ast->nestedNameSpecifier); @@ -4037,7 +4116,7 @@ auto ASTRewriter::NestedNameSpecifierVisitor::operator()( auto ASTRewriter::NestedNameSpecifierVisitor::operator()( DecltypeNestedNameSpecifierAST* ast) -> NestedNameSpecifierAST* { - auto copy = new (arena()) DecltypeNestedNameSpecifierAST{}; + auto copy = make_node(arena()); copy->symbol = ast->symbol; copy->decltypeSpecifier = @@ -4049,7 +4128,7 @@ auto ASTRewriter::NestedNameSpecifierVisitor::operator()( auto ASTRewriter::NestedNameSpecifierVisitor::operator()( TemplateNestedNameSpecifierAST* ast) -> NestedNameSpecifierAST* { - auto copy = new (arena()) TemplateNestedNameSpecifierAST{}; + auto copy = make_node(arena()); copy->symbol = ast->symbol; copy->nestedNameSpecifier = rewrite(ast->nestedNameSpecifier); @@ -4063,7 +4142,7 @@ auto ASTRewriter::NestedNameSpecifierVisitor::operator()( auto ASTRewriter::FunctionBodyVisitor::operator()(DefaultFunctionBodyAST* ast) -> FunctionBodyAST* { - auto copy = new (arena()) DefaultFunctionBodyAST{}; + auto copy = make_node(arena()); copy->equalLoc = ast->equalLoc; copy->defaultLoc = ast->defaultLoc; @@ -4074,7 +4153,7 @@ auto ASTRewriter::FunctionBodyVisitor::operator()(DefaultFunctionBodyAST* ast) auto ASTRewriter::FunctionBodyVisitor::operator()( CompoundStatementFunctionBodyAST* ast) -> FunctionBodyAST* { - auto copy = new (arena()) CompoundStatementFunctionBodyAST{}; + auto copy = make_node(arena()); copy->colonLoc = ast->colonLoc; @@ -4082,7 +4161,7 @@ auto ASTRewriter::FunctionBodyVisitor::operator()( auto out = ©->memInitializerList; for (auto node : ListView{ast->memInitializerList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -4094,7 +4173,7 @@ auto ASTRewriter::FunctionBodyVisitor::operator()( auto ASTRewriter::FunctionBodyVisitor::operator()( TryStatementFunctionBodyAST* ast) -> FunctionBodyAST* { - auto copy = new (arena()) TryStatementFunctionBodyAST{}; + auto copy = make_node(arena()); copy->tryLoc = ast->tryLoc; copy->colonLoc = ast->colonLoc; @@ -4103,7 +4182,7 @@ auto ASTRewriter::FunctionBodyVisitor::operator()( auto out = ©->memInitializerList; for (auto node : ListView{ast->memInitializerList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -4114,7 +4193,7 @@ auto ASTRewriter::FunctionBodyVisitor::operator()( auto out = ©->handlerList; for (auto node : ListView{ast->handlerList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -4124,7 +4203,7 @@ auto ASTRewriter::FunctionBodyVisitor::operator()( auto ASTRewriter::FunctionBodyVisitor::operator()(DeleteFunctionBodyAST* ast) -> FunctionBodyAST* { - auto copy = new (arena()) DeleteFunctionBodyAST{}; + auto copy = make_node(arena()); copy->equalLoc = ast->equalLoc; copy->deleteLoc = ast->deleteLoc; @@ -4135,7 +4214,7 @@ auto ASTRewriter::FunctionBodyVisitor::operator()(DeleteFunctionBodyAST* ast) auto ASTRewriter::TemplateArgumentVisitor::operator()( TypeTemplateArgumentAST* ast) -> TemplateArgumentAST* { - auto copy = new (arena()) TypeTemplateArgumentAST{}; + auto copy = make_node(arena()); copy->typeId = rewrite(ast->typeId); @@ -4144,7 +4223,7 @@ auto ASTRewriter::TemplateArgumentVisitor::operator()( auto ASTRewriter::TemplateArgumentVisitor::operator()( ExpressionTemplateArgumentAST* ast) -> TemplateArgumentAST* { - auto copy = new (arena()) ExpressionTemplateArgumentAST{}; + auto copy = make_node(arena()); copy->expression = rewrite(ast->expression); @@ -4153,7 +4232,7 @@ auto ASTRewriter::TemplateArgumentVisitor::operator()( auto ASTRewriter::ExceptionSpecifierVisitor::operator()( ThrowExceptionSpecifierAST* ast) -> ExceptionSpecifierAST* { - auto copy = new (arena()) ThrowExceptionSpecifierAST{}; + auto copy = make_node(arena()); copy->throwLoc = ast->throwLoc; copy->lparenLoc = ast->lparenLoc; @@ -4164,7 +4243,7 @@ auto ASTRewriter::ExceptionSpecifierVisitor::operator()( auto ASTRewriter::ExceptionSpecifierVisitor::operator()( NoexceptSpecifierAST* ast) -> ExceptionSpecifierAST* { - auto copy = new (arena()) NoexceptSpecifierAST{}; + auto copy = make_node(arena()); copy->noexceptLoc = ast->noexceptLoc; copy->lparenLoc = ast->lparenLoc; @@ -4176,7 +4255,7 @@ auto ASTRewriter::ExceptionSpecifierVisitor::operator()( auto ASTRewriter::RequirementVisitor::operator()(SimpleRequirementAST* ast) -> RequirementAST* { - auto copy = new (arena()) SimpleRequirementAST{}; + auto copy = make_node(arena()); copy->expression = rewrite(ast->expression); copy->semicolonLoc = ast->semicolonLoc; @@ -4186,7 +4265,7 @@ auto ASTRewriter::RequirementVisitor::operator()(SimpleRequirementAST* ast) auto ASTRewriter::RequirementVisitor::operator()(CompoundRequirementAST* ast) -> RequirementAST* { - auto copy = new (arena()) CompoundRequirementAST{}; + auto copy = make_node(arena()); copy->lbraceLoc = ast->lbraceLoc; copy->expression = rewrite(ast->expression); @@ -4201,7 +4280,7 @@ auto ASTRewriter::RequirementVisitor::operator()(CompoundRequirementAST* ast) auto ASTRewriter::RequirementVisitor::operator()(TypeRequirementAST* ast) -> RequirementAST* { - auto copy = new (arena()) TypeRequirementAST{}; + auto copy = make_node(arena()); copy->typenameLoc = ast->typenameLoc; copy->nestedNameSpecifier = rewrite(ast->nestedNameSpecifier); @@ -4213,7 +4292,7 @@ auto ASTRewriter::RequirementVisitor::operator()(TypeRequirementAST* ast) auto ASTRewriter::RequirementVisitor::operator()(NestedRequirementAST* ast) -> RequirementAST* { - auto copy = new (arena()) NestedRequirementAST{}; + auto copy = make_node(arena()); copy->requiresLoc = ast->requiresLoc; copy->expression = rewrite(ast->expression); @@ -4224,7 +4303,7 @@ auto ASTRewriter::RequirementVisitor::operator()(NestedRequirementAST* ast) auto ASTRewriter::NewInitializerVisitor::operator()(NewParenInitializerAST* ast) -> NewInitializerAST* { - auto copy = new (arena()) NewParenInitializerAST{}; + auto copy = make_node(arena()); copy->lparenLoc = ast->lparenLoc; @@ -4232,7 +4311,7 @@ auto ASTRewriter::NewInitializerVisitor::operator()(NewParenInitializerAST* ast) auto out = ©->expressionList; for (auto node : ListView{ast->expressionList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -4244,7 +4323,7 @@ auto ASTRewriter::NewInitializerVisitor::operator()(NewParenInitializerAST* ast) auto ASTRewriter::NewInitializerVisitor::operator()( NewBracedInitializerAST* ast) -> NewInitializerAST* { - auto copy = new (arena()) NewBracedInitializerAST{}; + auto copy = make_node(arena()); copy->bracedInitList = ast_cast(rewrite(ast->bracedInitList)); @@ -4254,7 +4333,7 @@ auto ASTRewriter::NewInitializerVisitor::operator()( auto ASTRewriter::MemInitializerVisitor::operator()(ParenMemInitializerAST* ast) -> MemInitializerAST* { - auto copy = new (arena()) ParenMemInitializerAST{}; + auto copy = make_node(arena()); copy->nestedNameSpecifier = rewrite(ast->nestedNameSpecifier); copy->unqualifiedId = rewrite(ast->unqualifiedId); @@ -4264,7 +4343,7 @@ auto ASTRewriter::MemInitializerVisitor::operator()(ParenMemInitializerAST* ast) auto out = ©->expressionList; for (auto node : ListView{ast->expressionList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -4277,7 +4356,7 @@ auto ASTRewriter::MemInitializerVisitor::operator()(ParenMemInitializerAST* ast) auto ASTRewriter::MemInitializerVisitor::operator()( BracedMemInitializerAST* ast) -> MemInitializerAST* { - auto copy = new (arena()) BracedMemInitializerAST{}; + auto copy = make_node(arena()); copy->nestedNameSpecifier = rewrite(ast->nestedNameSpecifier); copy->unqualifiedId = rewrite(ast->unqualifiedId); @@ -4290,7 +4369,7 @@ auto ASTRewriter::MemInitializerVisitor::operator()( auto ASTRewriter::LambdaCaptureVisitor::operator()(ThisLambdaCaptureAST* ast) -> LambdaCaptureAST* { - auto copy = new (arena()) ThisLambdaCaptureAST{}; + auto copy = make_node(arena()); copy->thisLoc = ast->thisLoc; @@ -4299,7 +4378,7 @@ auto ASTRewriter::LambdaCaptureVisitor::operator()(ThisLambdaCaptureAST* ast) auto ASTRewriter::LambdaCaptureVisitor::operator()( DerefThisLambdaCaptureAST* ast) -> LambdaCaptureAST* { - auto copy = new (arena()) DerefThisLambdaCaptureAST{}; + auto copy = make_node(arena()); copy->starLoc = ast->starLoc; copy->thisLoc = ast->thisLoc; @@ -4309,7 +4388,7 @@ auto ASTRewriter::LambdaCaptureVisitor::operator()( auto ASTRewriter::LambdaCaptureVisitor::operator()(SimpleLambdaCaptureAST* ast) -> LambdaCaptureAST* { - auto copy = new (arena()) SimpleLambdaCaptureAST{}; + auto copy = make_node(arena()); copy->identifierLoc = ast->identifierLoc; copy->ellipsisLoc = ast->ellipsisLoc; @@ -4320,7 +4399,7 @@ auto ASTRewriter::LambdaCaptureVisitor::operator()(SimpleLambdaCaptureAST* ast) auto ASTRewriter::LambdaCaptureVisitor::operator()(RefLambdaCaptureAST* ast) -> LambdaCaptureAST* { - auto copy = new (arena()) RefLambdaCaptureAST{}; + auto copy = make_node(arena()); copy->ampLoc = ast->ampLoc; copy->identifierLoc = ast->identifierLoc; @@ -4332,7 +4411,7 @@ auto ASTRewriter::LambdaCaptureVisitor::operator()(RefLambdaCaptureAST* ast) auto ASTRewriter::LambdaCaptureVisitor::operator()(RefInitLambdaCaptureAST* ast) -> LambdaCaptureAST* { - auto copy = new (arena()) RefInitLambdaCaptureAST{}; + auto copy = make_node(arena()); copy->ampLoc = ast->ampLoc; copy->ellipsisLoc = ast->ellipsisLoc; @@ -4345,7 +4424,7 @@ auto ASTRewriter::LambdaCaptureVisitor::operator()(RefInitLambdaCaptureAST* ast) auto ASTRewriter::LambdaCaptureVisitor::operator()(InitLambdaCaptureAST* ast) -> LambdaCaptureAST* { - auto copy = new (arena()) InitLambdaCaptureAST{}; + auto copy = make_node(arena()); copy->ellipsisLoc = ast->ellipsisLoc; copy->identifierLoc = ast->identifierLoc; @@ -4357,7 +4436,7 @@ auto ASTRewriter::LambdaCaptureVisitor::operator()(InitLambdaCaptureAST* ast) auto ASTRewriter::ExceptionDeclarationVisitor::operator()( EllipsisExceptionDeclarationAST* ast) -> ExceptionDeclarationAST* { - auto copy = new (arena()) EllipsisExceptionDeclarationAST{}; + auto copy = make_node(arena()); copy->ellipsisLoc = ast->ellipsisLoc; @@ -4366,13 +4445,13 @@ auto ASTRewriter::ExceptionDeclarationVisitor::operator()( auto ASTRewriter::ExceptionDeclarationVisitor::operator()( TypeExceptionDeclarationAST* ast) -> ExceptionDeclarationAST* { - auto copy = new (arena()) TypeExceptionDeclarationAST{}; + auto copy = make_node(arena()); if (auto it = ast->attributeList) { auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -4382,7 +4461,7 @@ auto ASTRewriter::ExceptionDeclarationVisitor::operator()( auto out = ©->typeSpecifierList; for (auto node : ListView{ast->typeSpecifierList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; typeSpecifierListCtx.accept(value); } @@ -4395,7 +4474,7 @@ auto ASTRewriter::ExceptionDeclarationVisitor::operator()( auto ASTRewriter::AttributeSpecifierVisitor::operator()(CxxAttributeAST* ast) -> AttributeSpecifierAST* { - auto copy = new (arena()) CxxAttributeAST{}; + auto copy = make_node(arena()); copy->lbracketLoc = ast->lbracketLoc; copy->lbracket2Loc = ast->lbracket2Loc; @@ -4405,7 +4484,7 @@ auto ASTRewriter::AttributeSpecifierVisitor::operator()(CxxAttributeAST* ast) auto out = ©->attributeList; for (auto node : ListView{ast->attributeList}) { auto value = rewrite(node); - *out = new (arena()) List(value); + *out = make_list_node(arena(), value); out = &(*out)->next; } } @@ -4418,7 +4497,7 @@ auto ASTRewriter::AttributeSpecifierVisitor::operator()(CxxAttributeAST* ast) auto ASTRewriter::AttributeSpecifierVisitor::operator()(GccAttributeAST* ast) -> AttributeSpecifierAST* { - auto copy = new (arena()) GccAttributeAST{}; + auto copy = make_node(arena()); copy->attributeLoc = ast->attributeLoc; copy->lparenLoc = ast->lparenLoc; @@ -4431,7 +4510,7 @@ auto ASTRewriter::AttributeSpecifierVisitor::operator()(GccAttributeAST* ast) auto ASTRewriter::AttributeSpecifierVisitor::operator()( AlignasAttributeAST* ast) -> AttributeSpecifierAST* { - auto copy = new (arena()) AlignasAttributeAST{}; + auto copy = make_node(arena()); copy->alignasLoc = ast->alignasLoc; copy->lparenLoc = ast->lparenLoc; @@ -4445,7 +4524,7 @@ auto ASTRewriter::AttributeSpecifierVisitor::operator()( auto ASTRewriter::AttributeSpecifierVisitor::operator()( AlignasTypeAttributeAST* ast) -> AttributeSpecifierAST* { - auto copy = new (arena()) AlignasTypeAttributeAST{}; + auto copy = make_node(arena()); copy->alignasLoc = ast->alignasLoc; copy->lparenLoc = ast->lparenLoc; @@ -4459,7 +4538,7 @@ auto ASTRewriter::AttributeSpecifierVisitor::operator()( auto ASTRewriter::AttributeSpecifierVisitor::operator()(AsmAttributeAST* ast) -> AttributeSpecifierAST* { - auto copy = new (arena()) AsmAttributeAST{}; + auto copy = make_node(arena()); copy->asmLoc = ast->asmLoc; copy->lparenLoc = ast->lparenLoc; @@ -4472,7 +4551,7 @@ auto ASTRewriter::AttributeSpecifierVisitor::operator()(AsmAttributeAST* ast) auto ASTRewriter::AttributeTokenVisitor::operator()( ScopedAttributeTokenAST* ast) -> AttributeTokenAST* { - auto copy = new (arena()) ScopedAttributeTokenAST{}; + auto copy = make_node(arena()); copy->attributeNamespaceLoc = ast->attributeNamespaceLoc; copy->scopeLoc = ast->scopeLoc; @@ -4485,7 +4564,7 @@ auto ASTRewriter::AttributeTokenVisitor::operator()( auto ASTRewriter::AttributeTokenVisitor::operator()( SimpleAttributeTokenAST* ast) -> AttributeTokenAST* { - auto copy = new (arena()) SimpleAttributeTokenAST{}; + auto copy = make_node(arena()); copy->identifierLoc = ast->identifierLoc; copy->identifier = ast->identifier; diff --git a/src/parser/cxx/ast_rewriter.h b/src/parser/cxx/ast_rewriter.h index 4c16c150..8ae7c989 100644 --- a/src/parser/cxx/ast_rewriter.h +++ b/src/parser/cxx/ast_rewriter.h @@ -87,7 +87,9 @@ class ASTRewriter { [[nodiscard]] auto operator()(ModuleQualifierAST* ast) -> ModuleQualifierAST*; [[nodiscard]] auto operator()(ModulePartitionAST* ast) -> ModulePartitionAST*; [[nodiscard]] auto operator()(ImportNameAST* ast) -> ImportNameAST*; - [[nodiscard]] auto operator()(InitDeclaratorAST* ast) -> InitDeclaratorAST*; + [[nodiscard]] auto operator()(InitDeclaratorAST* ast, + const DeclSpecs& declSpecs) + -> InitDeclaratorAST*; [[nodiscard]] auto operator()(DeclaratorAST* ast) -> DeclaratorAST*; [[nodiscard]] auto operator()(UsingDeclaratorAST* ast) -> UsingDeclaratorAST*; [[nodiscard]] auto operator()(EnumeratorAST* ast) -> EnumeratorAST*; diff --git a/src/parser/cxx/binder.h b/src/parser/cxx/binder.h index ba44f533..31e082d3 100644 --- a/src/parser/cxx/binder.h +++ b/src/parser/cxx/binder.h @@ -18,6 +18,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +#pragma once + #include #include #include diff --git a/src/parser/cxx/parser.cc b/src/parser/cxx/parser.cc index 11045f74..4a7ad862 100644 --- a/src/parser/cxx/parser.cc +++ b/src/parser/cxx/parser.cc @@ -3395,6 +3395,8 @@ auto Parser::parse_if_statement(StatementAST*& yyast) -> bool { parse_statement(ast->elseStatement); + ast->symbol = blockSymbol; + return true; } @@ -3422,6 +3424,8 @@ auto Parser::parse_switch_statement(StatementAST*& yyast) -> bool { parse_statement(ast->statement); + ast->symbol = blockSymbol; + return true; } @@ -3447,6 +3451,8 @@ auto Parser::parse_while_statement(StatementAST*& yyast) -> bool { parse_statement(ast->statement); + ast->symbol = blockSymbol; + return true; } @@ -3524,6 +3530,8 @@ auto Parser::parse_for_statement(StatementAST*& yyast) -> bool { parse_statement(ast->statement); + ast->symbol = blockSymbol; + return true; } @@ -3546,6 +3554,8 @@ auto Parser::parse_for_statement(StatementAST*& yyast) -> bool { parse_statement(ast->statement); + ast->symbol = blockSymbol; + return true; } diff --git a/src/parser/cxx/type_checker.h b/src/parser/cxx/type_checker.h index f4353160..228aad1d 100644 --- a/src/parser/cxx/type_checker.h +++ b/src/parser/cxx/type_checker.h @@ -18,6 +18,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +#pragma once + #include #include #include