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.
(cherry picked from commit
e5180fbcbcc356c71154413588288cbd30e5198d)
/* Check for errors in format strings and inappropriately
null parameters. */
- bool warned_p = check_function_arguments (input_location, fndecl, fntype,
- nargs, argarray, NULL);
+ bool warned_p
+ = ((complain & tf_warning)
+ && check_function_arguments (input_location, fndecl, fntype,
+ nargs, argarray, NULL));
ret = build_cxx_call (function, nargs, argarray, complain, orig_fndecl);
--- /dev/null
+// 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!");
+}