This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Variadic templates, fourth revision [Committed]

On 3/10/07, Doug Gregor <> wrote:
C++ front end and testsuite changes approved and committed. The final
patches, ChangeLogs are attached.

This causes a 15% compile time memory usage regression for tramp3d, DLV and mico sources :/ (which makes it a release-blocker)



2007-03-09 Douglas Gregor <>

        PR c++/20599
        * typeck.c (check_return_expr): Check for bare parameter packs.
        (comptypes): Compare template parameter packs and
        type pack expansions.
        * decl.c (grokdeclarator): Deal with the declaration of function
        parameter packs.
        (grokparms): Verify that the (optional) function parameter pack is
        at the end of the parameter list.
        (xref_basetypes): Handle pack expansions in the base class.
        (cp_tree_node_structure): Handle ARGUMENT_PACK_SELECT.
        * cp-tree.def (TYPE_ARGUMENT_PACK): New.
        * cp-objcp-common.c (cp_tree_size): Compute size of
        * error.c (dump_template_argument): Print template argument packs.
        (dump_template_argument_list): Ditto.
        (dump_template_parameter): Dump `...' for template type parameter
        (dump_type): Dump TYPE_PACK_EXPANSION nodes.
        (dump_parameters): Print function parameter packs.
        (dump_template_parms): Print template argument packs.
        (dump_expr): Dump EXPR_PACK_EXPANSION nodes.
        (maybe_warn_variadic_templates): New.
        * operators.def: Add ellipsis operator for EXPR_PACK_EXPANSION.
        * tree.c (cp_walk_subtrees): Walk BASELINK, TYPE_ARGUMENT_PACK,
        * mangle.c (write_type): Mangle TYPE_PACK_EXPANSION.
        (write_template_arg): Write argument packs as separate arguments.
        * cp-tree.h (struct template_parm_index_s): Add flag that
        indicates that the template parameter is actually a parameter
        (struct tree_argument_pack_select): New.
        (enum cp_tree_node_structure_enum): Add TS_CP_ARGUMENT_PACK_SELECT.
        (union lang_tree_node): Add argument_pack_select.
        (PACK_EXPANSION_P): New.
        (ARGUMENT_PACK_P): New.
        (ARGUMENT_PACK_ARGS): New.
        (struct cp_declarator): Add parameter_pack_p flag.
        (maybe_warn_variadic_templates): Declare.
        (process_template_parm): Add bool parameter IS_PARAMETER_PACK, to
        indicate a template parameter pack.
        (uses_parameter_packs): Declare.
        (template_parameter_pack_p): Declare.
        (template_parms_variadic_p): Declare.
        (make_pack_expansion): Declare.
        (check_for_bare_parameter_packs): Declare.
        * cxx-pretty-print.c (pp_cxx_unary_expression): Print
        sizeof... expressions.
        (pp_cxx_expression): Print pack expansions and non-type argument
        (pp_cxx_exception_specification): Print pack expansions.
        (pp_cxx_direct_declarator): Print ellipsis for parameter packs.
        (pp_cxx_ctor_initializer): Print pack expansions.
        (pp_cxx_type_id): Print pack expansions.
        (pp_cxx_template_argument_list): Print argument packs.
        (pp_cxx_template_parameter): Print ellipsis for template parameter
        * pt.c (comp_template_parms): Compare template parameter packs.
        (template_parameter_pack_p): New.
        (template_parms_variadic_p): New.
        (template_args_variadic_p): New.
        (make_ith_pack_parameter_name): New.
        (struct find_parameter_pack_data): New.
        (find_parameter_packs_r): New.
        (uses_parameter_packs): New.
        (make_pack_expansion): New.
        (check_for_bare_parameter_packs): New.
        (expand_template_argument_pack): New.
        (reduce_template_parm_level): Propagate parameter pack flag.
        (process_template_parm): Add is_parameter_pack parameter to state
        when the parameter is actually a parameter pack. Create template
        parameter packs when is_parameter_pack is true.
        (current_template_args): The argument for a template parameter
        pack is an argument pack containing a single pack expansion.
        (process_partial_specialization): When checking that non-type
        argument expressions do not involve template parameters, loop over
        the arguments in argument packs separately.
        (push_template_decl_real): Check that the type of the declaration
        does not have any bare parameter packs. Check that primary
        templates have no more than one parameter pack, and that it comes
        at the end of the template parameter list.
        (convert_template_argument): Handle coercions for pack expansion
        expressions by coercing the pattern then rebuilding the expansion.
        (coerce_template_parms): When coercing the arguments for a
        variadic template, pack "extra" arguments into an argument pack.
        (coerce_template_template_parms): Cannot coerce between parameter
        packs and non-pack parameters.
        (template_args_equal): Compare PACK_EXPANSION_P expressions.
        (comp_template_args): Expand all template arguments packs before
        comparing template argument lists.
        (mangle_class_name_for_template): Make argument packs as separate
        template arguments.
        (for_each_template_parm_r): No need to handle BASELINK.
        (instantiate_class_template): Handle pack expansions in the base
        class list.
        (tsubst_pack_expansion): New.
        (tsubst_template_args): Handle substitutions of argument packs and
        pack expansion into template argument lists.
        (tsubst_decl): Expand function parameter packs into separate
        function parameters.
        (tsubst_arg_types): Expand a type pack expansion into separate
        argument types.
        (tsubst_exception_specification): Handle pack expansions in
        exception specifiers.
        (tsubst): See through ARGUMENT_PACK_SELECT arguments when
        replacing a template parameter with its argument. If we encounter
        a substitution for an argument pack, just return the parameter
        (tsubst_copy): sizeof(X...) returns the number of elements in
        parameter pack X.  See through ARGUMENT_PACK_SELECT when the
        PARM_DECL is a parameter pack.
        (tsubst_expr): Expression pack expansions and argument packs
        cannot show up here; they will all be handled through function
        calls, sizeof, and template argument lists.
        (tsubst_copy_and_build): sizeof(X...) returns the number of
        elements in parameter pack X.  Handle pack expansions in TREE_LIST
        and CONSTRUCTOR nodes.
        (fn_type_unification): Handle "incomplete" explicit template
        argument lists that specify some of the arguments for a template
        parameter pack.
        (type_unification_real): Unify arguments against pack expansions.
        (template_parm_level_and_index): New, helper function.
        (unify_pack_expansion): New.
        (unify): Unify argument packs on an argument-by-argument basis,
        handling variadic argument packs as well.
        (more_specialized_fn): Handle unification of function parameter
        packs. All things being equal, prefer non-variadic function
        templates to variadic function templates.
        (more_specialized_class): Prefer the variadic class template
        partial specialization that binds fewer arguments to a parameter
        (regenerate_decl_from_template): Expand function parameter packs
        into separate parameters.
        (instantiate_decl): Ditto.
        (tsubst_initializer_list): Handle pack expansions for base-class
        (dependent_type_p_r): Determine dependent types in argument packs
        and pack expansions.
        (value_dependent_expression_p): Determine value-dependence of
        non-type argument packs.
        (dependent_template_arg_p): Handle argument packs.
        * semantics.c (finish_cond): Check for bare parameter packs.
        (finish_expr_stmt): Ditto.
        (finish_for_expr): Ditto.
        (finish_switch_cond): Ditto.
        (finish_mem_initializers): Ditto.
        * name-lookup.c (arg_assoc_type): Handle pack expansions and
        argument packs.
        * decl2.c (cp_build_parm_decl): Mark function parameter packs.
        * parser.c (make_declarator): Declarator is not an expansion.
        (make_pointer_declarator): Transfer parameter pack flag to outer
        (make_reference_declarator): Ditto.
        (make_ptrmem_declarator): Ditto.
        (make_call_declarator): Ditto.
        (make_array_declarator): Ditto.
        (cp_parser_postfix_expression): Allow pack expansion expressions
        in the argument list for a call expression.
        (cp_parser_parenthesized_expression_list): Add new parameter
        ALLOW_EXPANSION_P. When true, parse the ellipsis to mean "expand
        into separate arguments."
        (cp_parser_new_placement): Allow pack expansion expressions.
        (cp_parser_new_initializer): Ditto.
        (cp_parser_mem_initializer_list): Allow ellipsis to create a
        base-class initializer expansion.
        (cp_parser_mem_initializer): Ditto.
        (cp_parser_template_parameter_list): Keep track of whether the
        template parameter is a template parameter pack.
        (cp_parser_template_parameter): Parse the ellipsis to indicate a
        template parameter pack.
        (cp_parser_type_parameter): Ditto.
        (cp_parser_template_argument_list): Parse the ellipsis to indicate
        a pack expansion.
        (cp_parser_direct_declarator): Parse the ellipsis to indicate that
        this declarator is a parameter pack.
        (cp_parser_parameter_declaration): The ellipsis does not end the
        parameter declaration, because it might be a parameter pack. Parse
        the ellipsis to indicate a parameter pack.
        (cp_parser_initializer): Allow pack expansions.
        (cp_parser_initializer_list): Allow ellipsis to create an
        initializer expansion.
        (cp_parser_base_clause): Allow ellipsis to create a base specifier
        (cp_parser_type_id_list): Allow ellipsis to create an exception
        specifier expansion.
        (cp_parser_attribute_list): Don't allow pack expansions.
        (cp_parser_functional_cast): Allow pack esions.
        (cp_parser_sizeof_operand): Allow ellipsis following "sizeof" to
        compute the length of a parameter pack.
        (cp_parser_next_token_ends_template_argument_p): An ellipsis can
        end a template argument.
        * tree.c (cp_walk_subtrees): Walk BASELINK, TYPE_ARGUMENT_PACK,

2007-03-09 Douglas Gregor <>

        PR c++/20599
        * g++.dg/cpp0x/variadic-bind.C: New.
        * g++.dg/cpp0x/variadic-function.C: New.
        * g++.dg/cpp0x/variadic-mem_fn.C: New.
        * g++.dg/cpp0x/variadic-tuple.C: New.
        * g++.dg/cpp0x/variadic1.C: New.
        * g++.dg/cpp0x/variadic2.C: New.
        * g++.dg/cpp0x/variadic3.C: New.
        * g++.dg/cpp0x/variadic4.C: New.
        * g++.dg/cpp0x/variadic5.C: New.
        * g++.dg/cpp0x/variadic6.C: New.
        * g++.dg/cpp0x/variadic7.C: New.
        * g++.dg/cpp0x/variadic8.C: New.
        * g++.dg/cpp0x/variadic9.C: New.
        * g++.dg/cpp0x/variadic10.C: New.
        * g++.dg/cpp0x/variadic11.C: New.
        * g++.dg/cpp0x/variadic12.C: New.
        * g++.dg/cpp0x/variadic13.C: New.
        * g++.dg/cpp0x/variadic14.C: New.
        * g++.dg/cpp0x/variadic15.C: New.
        * g++.dg/cpp0x/variadic16.C: New.
        * g++.dg/cpp0x/variadic17.C: New.
        * g++.dg/cpp0x/variadic18.C: New.
        * g++.dg/cpp0x/variadic19.C: New.
        * g++.dg/cpp0x/variadic20.C: New.
        * g++.dg/cpp0x/variadic21.C: New.
        * g++.dg/cpp0x/variadic22.C: New.
        * g++.dg/cpp0x/variadic23.C: New.
        * g++.dg/cpp0x/variadic24.C: New.
        * g++.dg/cpp0x/variadriadic25.C: New.
        * g++.dg/cpp0x/variadic26.C: New.
        * g++.dg/cpp0x/variadic27.C: New.
        * g++.dg/cpp0x/variadic28.C: New.
        * g++.dg/cpp0x/variadic29.C: New.
        * g++.dg/cpp0x/variadic30.C: New.
        * g++.dg/cpp0x/variadic31.C: New.
        * g++.dg/cpp0x/variadic32.C: New.
        * g++.dg/cpp0x/variadic33.C: New.
        * g++.dg/cpp0x/variadic34.C: New.
        * g++.dg/cpp0x/variadic35.C: New.
        * g++.dg/cpp0x/variadic36.C: New.
        * g++.dg/cpp0x/variadic37.C: New.
        * g++.dg/cpp0x/variadic38.C: New.
        * g++.dg/cpp0x/variadic39.C: New.
        * g++.dg/cpp0x/variadic40.C: New.
        * g++.dg/cpp0x/variadic41.C: New.
        * g++.dg/cpp0x/variadic42.C: New.
        * g++.dg/cpp0x/variadic43.C: New.
        * g++.dg/cpp0x/variadic44.C: New.
        * g++.dg/cpp0x/variadic45.C: New.
        * g++.dg/cpp0x/variadic46.C: New.
        * g++.dg/cpp0x/variadic47.C: New.
        * g++.dg/cpp0x/variadic48.C: New.
        * g++.dg/cpp0x/variadic49.C: New.
        * g++.dg/cpp0x/variadic50.C: New.
        * g++.dg/cpp0x/variadic51.C: New.
        * g++.dg/cpp0x/variadic52.C: New.
        * g++.dg/cpp0x/variadic53.C: New.
        * g++.dg/cpp0x/variadic54.C: New.
        * g++.dg/cpp0x/variadic55.C: New.
        * g++.dg/cpp0x/variadic56.C: New.
        * g++.dg/cpp0x/variadic57.C: New.
        * g++.dg/cpp0x/variadic58.C: New.
        * g++.dg/cpp0x/variadic59.C: New.
        * g++.dg/cpp0x/variadic60.C : New.
        * g++.dg/cpp0x/variadic61.C : New.
        * g++.dg/cpp0x/variadic62.C : New.
        * g++.dg/cpp0x/variadic63.C : New.
        * g++.dg/cpp0x/variadic64.C : New.
        * g++.dg/cpp0x/variadic65.C : New.
        * g++.dg/cpp0x/variadic66.C : New.
        * g++.dg/cpp0x/variadic67.C : New.
        * g++.dg/cpp0x/variadic68.C : New.
        * g++.dg/cpp0x/variadic69.C : New.
        * g++.dg/cpp0x/variadic70.C : New.
        * g++.dg/cpp0x/variadic71.C : New.
        * g++.dg/cpp0x/variadic72.C : New.
        * g++.dg/cpp0x/variadic73.C : New.
        * g++.dg/cpp0x/variadic74.C : New.
        * g++.dg/cpp0x/variadic75.C : New.
        * g++.dg/cpp0x/variadic-ex1.C : New.
        * g++.dg/cpp0x/variadic-ex2.C : New.
        * g++.dg/cpp0x/variadic-ex3.C : New.
        * g++.dg/cpp0x/variadic-ex4.C : New.
        * g++.dg/cpp0x/variadic-ex5.C : New.
        * g++.dg/cpp0x/variadic-ex6.C : New.
        * g++.dg/cpp0x/variadic-ex7.C : New.
        * g++.dg/cpp0x/variadic-ex8.C : New.
        * g++.dg/cpp0x/variadic-ex9.C : New.
        * g++.dg/cpp0x/variadic-ex10.C : New.
        * g++.dg/cpp0x/variadic-ex11.C : New.
        * g++.dg/cpp0x/variadic-ex12.C : New.
        * g++.dg/cpp0x/variadic-ex13.C : New.
        * g++.dg/cpp0x/variadic-ex14.C : New.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]