Ambiguous lookups return a tree list that can contain embedded overload
lists. This patch separates the printing somewhat more, so that the
overload iterator I'll be introduce will slot in better.
It'd be nice for ambiguous lookups to return a specially marked
overload, but that's a change for another day (I don't have such a
change handy).
Applied to trunk.
nathan
--
Nathan Sidwell
2017-05-10 Nathan Sidwell <nat...@acm.org>
* pt.c (print_candidates_1): Separate TREE_LIST and OVERLOAD
printing.
(print_candidates): Adjust.
Index: gcc/cp/pt.c
===================================================================
--- gcc/cp/pt.c (revision 247860)
+++ gcc/cp/pt.c (working copy)
@@ -1922,43 +1922,28 @@ explicit_class_specialization_p (tree ty
in *STR when it ends. */
static void
-print_candidates_1 (tree fns, bool more, const char **str)
+print_candidates_1 (tree fns, char **str, bool more = false)
{
- tree fn, fn2;
- char *spaces = NULL;
-
- for (fn = fns; fn; fn = OVL_NEXT (fn))
- if (TREE_CODE (fn) == TREE_LIST)
- {
- for (fn2 = fn; fn2 != NULL_TREE; fn2 = TREE_CHAIN (fn2))
- print_candidates_1 (TREE_VALUE (fn2),
- TREE_CHAIN (fn2) || more, str);
- }
- else
+ if (TREE_CODE (fns) == TREE_LIST)
+ for (; fns; fns = TREE_CHAIN (fns))
+ print_candidates_1 (TREE_VALUE (fns), str, more || TREE_CHAIN (fns));
+ else
+ while (fns)
{
- tree cand = OVL_CURRENT (fn);
- if (!*str)
- {
- /* Pick the prefix string. */
- if (!more && !OVL_NEXT (fns))
- {
- inform (DECL_SOURCE_LOCATION (cand),
- "candidate is: %#qD", cand);
- continue;
- }
+ tree cand = OVL_CURRENT (fns);
- *str = _("candidates are:");
- spaces = get_spaces (*str);
- }
- inform (DECL_SOURCE_LOCATION (cand), "%s %#qD", *str, cand);
- *str = spaces ? spaces : *str;
+ fns = OVL_NEXT (fns);
+ const char *pfx = *str;
+ if (!pfx)
+ {
+ if (more || fns)
+ pfx = _("candidates are:");
+ else
+ pfx = _("candidate is:");
+ *str = get_spaces (pfx);
+ }
+ inform (DECL_SOURCE_LOCATION (cand), "%s %#qD", pfx, cand);
}
-
- if (!more)
- {
- free (spaces);
- *str = NULL;
- }
}
/* Print the list of candidate FNS in an error message. FNS can also
@@ -1967,9 +1952,9 @@ print_candidates_1 (tree fns, bool more,
void
print_candidates (tree fns)
{
- const char *str = NULL;
- print_candidates_1 (fns, false, &str);
- gcc_assert (str == NULL);
+ char *str = NULL;
+ print_candidates_1 (fns, &str);
+ free (str);
}
/* Get a (possibly) constrained template declaration for the