diff --git a/regression-tests/test-results/gcc-13/pure2-bugfix-for-non-local-function-expression.cpp.output b/regression-tests/test-results/gcc-13/pure2-bugfix-for-non-local-function-expression.cpp.output deleted file mode 100644 index 2e0819f63..000000000 --- a/regression-tests/test-results/gcc-13/pure2-bugfix-for-non-local-function-expression.cpp.output +++ /dev/null @@ -1 +0,0 @@ -pure2-bugfix-for-non-local-function-expression.cpp2:9:7: warning: ‘t’ has a base ‘t::’ which has no linkage [-Wsubobject-linkage] diff --git a/source/cppfront.cpp b/source/cppfront.cpp index 34e8a410f..33773d1c9 100644 --- a/source/cppfront.cpp +++ b/source/cppfront.cpp @@ -4904,6 +4904,30 @@ class cppfront ) -> void { + // Helper for declarations with parent *template-head*s. + auto const emit_parent_template_parameters = [&]() { + auto parent_template_parameters = std::string{}; + auto parent = n.parent_declaration; + while ( + parent + && parent->is_type() + ) + { + if (parent->requires_clause_expression) { + parent_template_parameters = + "requires( " + print_to_string(*parent->requires_clause_expression) + " )\n" + + parent_template_parameters; + } + if (parent->template_parameters) { + parent_template_parameters = + "template " + print_to_string( *parent->template_parameters, false, true ) + + " " + parent_template_parameters; + } + parent = parent->parent_declaration; + } + printer.print_cpp2(parent_template_parameters, n.position()); + }; + // Helper for declarations that can have requires-clauses auto const emit_requires_clause = [&]() { if ( @@ -5097,46 +5121,12 @@ class cppfront return; } - auto parent_template_params = std::string{}; - auto parent_template_args = std::string{}; - auto parent_qualifier = std::string{}; - - auto parent = n.parent_declaration; - while (parent && parent->is_type()) - { - if (!parent_qualifier.empty()) { - parent_qualifier.insert(0, "::"); - } - parent_qualifier.insert(0, parent->name()->to_string()); - - if (parent->template_parameters) { - parent_template_params.insert(0, "template" + print_to_string(*parent->template_parameters)); - for (auto const& param : parent->template_parameters->parameters) { - assert(param->name()); - if (parent_template_args.empty()) { - parent_template_args = "<>"; - } - else { - parent_template_args.insert(parent_template_args.size()-1, ","); - } - parent_template_args.insert(parent_template_args.size()-1, param->name()->as_string_view()); - } - } - - parent = parent->parent_declaration; - } - - if (!parent_template_params.empty()) { - parent_template_params += " "; - } - + emit_parent_template_parameters(); printer.print_cpp2( - parent_template_params - + "inline CPP2_CONSTEXPR " + "inline CPP2_CONSTEXPR " + type - + parent_template_args - + " " + parent_qualifier - + parent_template_args + "::" + + " " + + type_qualification_if_any_for(n) + print_to_string(*n.identifier) + " = " + print_to_string( *std::get(a->initializer) ) @@ -5304,26 +5294,7 @@ class cppfront && n.initializer // only if the function has a definition (is not abstract) ) { - auto parent_template_parameters = std::string{}; - auto parent = n.parent_declaration; - while ( - parent - && parent->is_type() - ) - { - if (parent->requires_clause_expression) { - parent_template_parameters = - "requires( " + print_to_string(*parent->requires_clause_expression) + " )\n" - + parent_template_parameters; - } - if (parent->template_parameters) { - parent_template_parameters = - "template " + print_to_string( *parent->template_parameters, false, true ) - + " " + parent_template_parameters; - } - parent = parent->parent_declaration; - } - printer.print_cpp2(parent_template_parameters, n.position()); + emit_parent_template_parameters(); } // Now, emit our own template parameters