This is the mail archive of the gcc-patches@gcc.gnu.org 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]

Variadic templates, fourth revision (1/2)


Hello all,

This is the fourth revision of the variadic templates patch. It brings
variadic templates back in sync with mainline GCC, and implements the
semantics of the most recent draft wording for variadic templates:

http://www.generic-programming.org/~dgregor/cpp/lang-variadics.pdf

Tested both the C++ front end and libstdc++ on i686-pc-linux-gnu. No
regressions.

This is part one of two, containing the C++ front end changes and
associated testsuite.
ChangeLog follows.

 Best Regards,
 Doug Gregor
 Open Systems Lab @ Indiana University

2006-12-08 Douglas Gregor <doug.gregor@gmail.com>

	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.def (TYPE_ARGUMENT_PACK): New.
	(NONTYPE_ARGUMENT_PACK): New.
	(TYPE_PACK_EXPANSION): New.
	(EXPR_PACK_EXPANSION): New.
	* cp-objcp-common.c (cp_tree_size): Compute size of
	(NON)TYPE_ARGUMENT_PACK and (TYPE|EXPR)_PACK_EXPANSION.
	* error.c (dump_template_argument): Print template argument packs.
	(dump_template_argument_list): Ditto.
	(dump_template_parameter): Dump `...' for template type parameter
	packs.
	(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.
	* 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
	pack.
	(FUNCTION_PARAMETER_PACK_P): New.
	(PACK_EXPANSION_P): New.
	(PACK_EXPANSION_PATTERN): New.
	(SET_PACK_EXPANSION_PATTERN): New.
	(PACK_EXPANSION_PARAMETER_PACKS): New.
	(ARGUMENT_PACK_P): New.
	(ARGUMENT_PACK_ARGS): New.
	(SET_ARGUMENT_PACK_ARGS): New.
	(ARGUMENT_PACK_INCOMPLETE_P): New.
	(ARGUMENT_PACK_EXPLICIT_ARGS): New.
	(TEMPLATE_PARM_PARAMETER_PACK): New.
	(TEMPLATE_TYPE_PARAMETER_PACK): New.
	(struct cp_declarator): Add parameter_pack_p flag.
	(maybe_warn_variadic_templates): Declare.
	(process_template_parm): Add bool parameter.
	(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
	packs.
	(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
	packs.
	* 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): Visit all arguments in an argument
	pack or visit the pattern of a pack expansion.
	(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): Unpack a type pack expansion into separate
	argument types.
	(tsubst_exception_specification): Handle pack expansions in
	exception specifiers.
	(tsubst): Handle substitutions into argument packs.
	(tsubst_copy): sizeof(X...) returns the number of elements in
	parameter pack X.
	(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
	pack.
	(regenerate_decl_from_template): Expand function parameter packs
	into separate parameters.
	(instantiate_decl): Ditto.
	(tsubst_initializer_list): Handle pack expansions for base-class
	initializers.
	(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
	declarator.
	(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
	expansion.
	(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 expansions.
	(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.

2006-12-08 Douglas Gregor <doug.gregor@gmail.com>

	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/variadic25.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/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.

Attachment: variadic-templates-cp.patch.gz
Description: GNU Zip compressed data

Attachment: variadic-templates-testsuite.patch.gz
Description: GNU Zip compressed data


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