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]

[C++ PATCH] ambiguous candidate printing


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

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