This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++ PATCH] ambiguous candidate printing
- From: Nathan Sidwell <nathan at acm dot org>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 10 May 2017 16:50:29 -0400
- Subject: [C++ PATCH] ambiguous candidate printing
- Authentication-results: sourceware.org; auth=none
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 <nathan@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