PR 85369 notes that the c-c++-common/attr-nonstring-3.c fails
on IBM Z (and other similar targets) whose back-end provides
the movstr expander.  The failure is cause by an expected
warning failing to trigger because the strcpy call is expanded
early and the checker never runs.

The attached patch adjusts the code to make sure the warning
is not bypassed on these targets.

I've verified the patch with an s390-linux cross-compiler and
with a full x86_64-linux native build and regression run.

Martin
PR middle-end/85369 - no -Wstringop-overflow for a strcpy / stpcpy call with a nonstring pointer when providing movstr pattern

gcc/ChangeLog:

	PR middle-end/85369
	* builtins.c (expand_builtin_strcpy_1): New function.
	(expand_builtin_stpcpy): Call it, and call maybe_warn_nonstring_arg
	only if the former succeeds.

diff --git a/gcc/builtins.c b/gcc/builtins.c
index b751a4b..f681488 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -3808,7 +3808,7 @@ expand_builtin_strcpy_args (tree dest, tree src, rtx target)
    mode MODE if that's convenient).  */
 
 static rtx
-expand_builtin_stpcpy (tree exp, rtx target, machine_mode mode)
+expand_builtin_stpcpy_1 (tree exp, rtx target, machine_mode mode)
 {
   tree dst, src;
   location_t loc = EXPR_LOCATION (exp);
@@ -3885,6 +3885,25 @@ expand_builtin_stpcpy (tree exp, rtx target, machine_mode mode)
     }
 }
 
+/* Expand a call EXP to the stpcpy builtin and diagnose uses of nonstring
+   arguments while being careful to avoid duplicate warnings (which could
+   be issued if the expander were to expand the call, resulting in it
+   being emitted in expand_call().  */
+
+static rtx
+expand_builtin_stpcpy (tree exp, rtx target, machine_mode mode)
+{
+  if (rtx ret = expand_builtin_stpcpy_1 (exp, target, mode))
+    {
+      /* The call has been successfully expanded.  Check for nonstring
+	 arguments and issue warnings as appropriate.  */
+      maybe_warn_nonstring_arg (get_callee_fndecl (exp), exp);
+      return ret;
+    }
+
+  return NULL_RTX;
+}
+
 /* Check a call EXP to the stpncpy built-in for validity.
    Return NULL_RTX on both success and failure.  */
 

Reply via email to