aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2020-12-07 17:21:47 -0500
committerJason Merrill <jason@redhat.com>2020-12-08 15:11:46 -0500
commita988a398d6daef3072cd2d07a21980911d8f93fc (patch)
tree1bea0109feb54d7acc3e67c0630da2d2e4dcca03
parent447f99b3b8baabbfb33b29123113637e54c5e652 (diff)
downloadgcc-a988a398d6daef3072cd2d07a21980911d8f93fc.zip
gcc-a988a398d6daef3072cd2d07a21980911d8f93fc.tar.gz
gcc-a988a398d6daef3072cd2d07a21980911d8f93fc.tar.bz2
c++: Distinguish ambiguity from no valid candidate
Several recent C++ features are specified to try overload resolution, and if no viable candidate is found, do something else. But our error return doesn't distinguish between that situation and finding multiple viable candidates that end up being ambiguous. We're already trying to separately return the single function we found even if it ends up being ill-formed for some reason; for ambiguity let's pass back error_mark_node, to be distinguished from NULL_TREE meaning no viable candidate. gcc/cp/ChangeLog: * call.c (build_new_op_1): Set *overload for ambiguity. (build_new_method_call_1): Likewise.
-rw-r--r--gcc/cp/call.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index f1e0bcb..221e3de 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -6357,6 +6357,8 @@ build_new_op_1 (const op_location_t &loc, enum tree_code code, int flags,
print_z_candidates (loc, candidates);
}
result = error_mark_node;
+ if (overload)
+ *overload = error_mark_node;
}
else if (TREE_CODE (cand->fn) == FUNCTION_DECL)
{
@@ -10438,6 +10440,8 @@ build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
free (pretty_name);
}
call = error_mark_node;
+ if (fn_p)
+ *fn_p = error_mark_node;
}
else
{