c++: Honor complain in cp_build_function_call_vec for check_function_arguments warnings [PR117825]

The following testcase ICEs due to re-entering diagnostics.
When diagnosing -Wformat-security warning, we try to print instantiation
context, which calls tsubst with tf_none, but that in the end calls
cp_build_function_call_vec which calls check_function_arguments which
diagnoses another warning (again -Wformat-security).

The other check_function_arguments caller, build_over_call, doesn't call
that function if !(complain & tf_warning), so I think the best fix is
to do it the same in cp_build_function_call_vec as well.

2025-01-08  Jakub Jelinek  <jakub@redhat.com>

	PR c++/117825
	* typeck.cc (cp_build_function_call_vec): Don't call
	check_function_arguments if complain doesn't have tf_warning bit set.

	* g++.dg/warn/pr117825.C: New test.
This commit is contained in:
Jakub Jelinek 2025-01-08 23:12:02 +01:00 committed by Jakub Jelinek
parent dcbd260a1d
commit e5180fbcbc
2 changed files with 23 additions and 3 deletions

View file

@ -4513,9 +4513,11 @@ cp_build_function_call_vec (tree function, vec<tree, va_gc> **params,
/* Check for errors in format strings and inappropriately
null parameters. */
bool warned_p = check_function_arguments (input_location, fndecl, fntype,
nargs, argarray, NULL,
cp_comp_parm_types);
bool warned_p
= ((complain & tf_warning)
&& check_function_arguments (input_location, fndecl, fntype,
nargs, argarray, NULL,
cp_comp_parm_types));
ret = build_cxx_call (function, nargs, argarray, complain, orig_fndecl);

View file

@ -0,0 +1,18 @@
// PR c++/117825
// { dg-do compile { target c++17 } }
// { dg-options "-Wformat -Wformat-security" }
__attribute__((format (printf, 1, 2)))
int fails (const char *, ...) { return 0; }
template <auto func, typename... Args>
auto wrap (Args... args) -> decltype (func (args...))
{
return func (args...); // { dg-warning "format not a string literal and no format arguments" }
}
int
main ()
{
wrap<fails> ("Test!");
}