OSDN Git Service

Restore canonical type comparison for dependent type(def)s
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Nov 2010 12:44:19 +0000 (12:44 +0000)
committerdodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Nov 2010 12:44:19 +0000 (12:44 +0000)
commit0d432ee0d0d07e9c17b69e06afc1be9d65f57546
treeebd70402d2077b3f75d086daf709eb562d85e72a
parentcec8fd061b14c5d0231f16867205ab4c7671ccf4
Restore canonical type comparison for dependent type(def)s

This patch restores canonical type comparison for dependent types and
then dependent typedefs. After this patch, two template type
parameters T are equal if they have the same index, level, *and*
number of sibling parameters. The novelty is to take in account the
number of sibling parameters.

To do this we first build the template parameters w/o taking in
account their number of siblings. When we know the number of template
parameters we fix up each template parameter with the number of
slibling parameters and we build the appropriate canonical types
accordingly. The patch fixes the fallouts deemed necessary.

This fixes PR c++/45606 but actually fixes all the previous bugs
related to dependent typedef comparison we had since we started to
properly representing dependent typedefs.

gcc/cp/ChangeLog:
PR c++/45606
* cp-tree.h (TEMPLATE_TYPE_PARM_SIBLING_PARMS): Remove.
(struct template_parm_index_s)<num_siblings>: New field.
(TEMPLATE_PARM_NUM_SIBLINGS): New accessor.
(process_template_parm): Extend the API to accept the number of
template parms in argument.
(cp_set_underlying_type): Remove this.
* class.c (build_self_reference): Require canonical type equality
back on the self reference of class.
* decl2.c (grokfield): Require canonical type equality back on
typedef class fields.
* name-lookup.c (pushdecl_maybe_friend): Require canonical type
equality back on typedefs.
* parser.c (cp_parser_template_parameter_list): Do not require
canonical type equality on dependent types created during
template parameters parsing.
* pt.c (fixup_template_type_parm_type, fixup_template_parm_index)
(fixup_template_parm, fixup_template_parms): New private
functions.
(current_template_args): Declare this.
(process_template_parm): Pass the total number of template parms
to canonical_type_parameter.
(build_template_parm_index): Add a new argument to carry the total
number of template parms.
(reduce_template_parm_level, process_template_parm, make_auto): Adjust.
(current_template_args): Fix this for template template
parameters.
(tsubst_template_parm): Split out of ...
(tsubst_template_parms): ... this.
(reduce_template_parm_level): Don't loose
TEMPLATE_PARM_NUM_SIBLINGS when cloning a TEMPLATE_PARM_INDEX.
(template_parm_to_arg): Extracted this function from
current_template_args. Make it represent invalid template parms
with an error_mark_node instead of a LIST_TREE containing an
error_mark_node.
(current_template_args): Use template_parm_to_arg.
(dependent_template_arg_p): Consider an invalid template argument
as dependent.
(end_template_parm_list): Do not update template sibling parms
here anymore. Use fixup_template_parms instead.
(process_template_parm): Pass the number of template parms to
canonical_type_parameter.
(make_auto): Require structural equality on auto
TEMPLATE_TYPE_PARM for now.
(unify)<BOUND_TEMPLATE_TEMPLATE_PARM>: Coerce template parameters
using all the arguments deduced so far.
(tsubst)<TEMPLATE_TYPE_PARM>: Pass the number of sibling parms to
canonical_type_parameter.
* tree.c (cp_set_underlying_type): Remove.
* typeck.c (get_template_parms_of_dependent_type)
(incompatible_dependent_types_p): Remove.
(structural_comptypes): Do not call incompatible_dependent_types_p
anymore.
(comp_template_parms_position): Re-organized. Take the length of
template parms list in account.

gcc/testsuite/ChangeLog:
PR c++/45606
* g++.dg/template/typedef36.C: New test.
* gcc/testsuite/g++.dg/template/canon-type-9.C: Likewise.
* g++.dg/template/canon-type-10.C: Likewise.
* g++.dg/template/canon-type-11.C: Likewise.
* g++.dg/template/canon-type-12.C: Likewise.
* g++.dg/template/canon-type-13.C: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166179 138bc75d-0d04-0410-961f-82ee72b054a4
16 files changed:
gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/decl2.c
gcc/cp/name-lookup.c
gcc/cp/parser.c
gcc/cp/pt.c
gcc/cp/tree.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/canon-type-10.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/canon-type-11.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/canon-type-12.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/canon-type-13.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/canon-type-9.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/typedef36.C [new file with mode: 0644]