On 22.09.2013 18:57, Adam Butcher wrote:
The following solves the canonical type issue in the general case
(pointers and refs) and makes it equivalent to the explicit template
case -- in terms of canonical type at least.
for (tree t = TREE_TYPE (TREE_VALUE (p)); t; t = TREE_CHAIN
(t))
TYPE_CANONICAL (t) = t;
The above is insufficient; the traversal doesn't handle function
pointers. Currently, to get my local testcases passing, I have the
following workaround that abuses find_type_usage. I intend for this to
be replaced with a better solution but it will at least mean that people
can start experimenting with this feature now (as they appear to be
doing http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58500). This supports
that testcase also.
Cheers,
Adam
Workaround implicit function template parameter canonical type
issue.
* parser.c (add_implicit_template_parms): Workaround to fix up
canonical
type references left over from before substation of 'auto'.
Better
solution needed but this makes test cases functional.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index f3133f3..4171476 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -28987,6 +28987,25 @@ add_implicit_template_parms (cp_parser
*parser, size_t expect_count,
if (!generic_type_ptr)
continue;
+ /* Make the canonical type of each part of the parameter
distinct.
+ FIXME: A better solution is needed for this. Not least the
abuse of
+ find_type_usage. Need foreach_type or similar for proper
mutable
+ access. If something like this does turn out to be necessary
then the
+ find_type_usage loop above can be replaced by a foreach_type
that fixes
+ up the canonical types on the way to finding the 'auto'. */
+
+ struct helper { static bool fixup_canonical_types (tree t) {
+ t = TREE_TYPE (t);
+ if (!t)
+ return false;
+ if (is_auto_or_concept (t))
+ return true;
+ TYPE_CANONICAL (t) = t;
+ return false;
+ }};
+ find_type_usage (TREE_VALUE (p), (bool (*)(const_tree))
+ helper::fixup_canonical_types);
+
++synth_count;
tree synth_id = make_generic_type_name ();