diff options
Diffstat (limited to 'gcc/cp/call.c')
-rw-r--r-- | gcc/cp/call.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/gcc/cp/call.c b/gcc/cp/call.c index cb07c82f1ab..2f6767388da 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -201,8 +201,7 @@ static void add_candidates (tree, tree, tree, bool, tree, tree, int, struct z_candidate **); static conversion *merge_conversion_sequences (conversion *, conversion *); static bool magic_varargs_p (tree); -typedef void (*diagnostic_fn_t) (const char *, ...) ATTRIBUTE_GCC_CXXDIAG(1,2); -static tree build_temp (tree, tree, int, diagnostic_fn_t *); +static tree build_temp (tree, tree, int, diagnostic_t *); /* Returns nonzero iff the destructor name specified in NAME matches BASETYPE. NAME can take many forms... */ @@ -4445,7 +4444,7 @@ enforce_access (tree basetype_path, tree decl, tree diag_decl) static tree build_temp (tree expr, tree type, int flags, - diagnostic_fn_t *diagnostic_fn) + diagnostic_t *diagnostic_kind) { int savew, savee; @@ -4455,11 +4454,11 @@ build_temp (tree expr, tree type, int flags, build_tree_list (NULL_TREE, expr), type, flags, tf_warning_or_error); if (warningcount > savew) - *diagnostic_fn = warning0; + *diagnostic_kind = DK_WARNING; else if (errorcount > savee) - *diagnostic_fn = error; + *diagnostic_kind = DK_ERROR; else - *diagnostic_fn = NULL; + *diagnostic_kind = 0; return expr; } @@ -4505,7 +4504,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, bool c_cast_p, tsubst_flags_t complain) { tree totype = convs->type; - diagnostic_fn_t diagnostic_fn; + diagnostic_t diag_kind; int flags; if (convs->bad_p @@ -4682,12 +4681,13 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, conversion (i.e. the second step of copy-initialization), so don't allow any more. */ flags |= LOOKUP_NO_CONVERSION; - expr = build_temp (expr, totype, flags, &diagnostic_fn); - if (diagnostic_fn && fn) + expr = build_temp (expr, totype, flags, &diag_kind); + if (diag_kind && fn) { if ((complain & tf_error)) - diagnostic_fn (" initializing argument %P of %qD", argnum, fn); - else if (diagnostic_fn == error) + emit_diagnostic (diag_kind, input_location, 0, + " initializing argument %P of %qD", argnum, fn); + else if (diag_kind == DK_ERROR) return error_mark_node; } return build_cplus_new (totype, expr); @@ -6647,10 +6647,12 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn) tree source = source_type (w->convs[0]); if (! DECL_CONSTRUCTOR_P (w->fn)) source = TREE_TYPE (source); - warning (OPT_Wconversion, "choosing %qD over %qD", w->fn, l->fn); - warning (OPT_Wconversion, " for conversion from %qT to %qT", - source, w->second_conv->type); - inform (" because conversion sequence for the argument is better"); + if (warning (OPT_Wconversion, "choosing %qD over %qD", w->fn, l->fn) + && warning (OPT_Wconversion, " for conversion from %qT to %qT", + source, w->second_conv->type)) + { + inform (" because conversion sequence for the argument is better"); + } } else add_warning (w, l); |