/* PR tree-optimization/83075 - Invalid strncpy optimization */ /* { dg-do run } */ /* { dg-options "-O2 -Wstringop-truncation" } */ typedef __SIZE_TYPE__ size_t; __attribute__((noipa)) size_t foo (char *p, char *q, size_t *r) { size_t n0 = __builtin_strlen (p); __builtin_strncpy (q, p, n0); /* { dg-warning "\\\[-Wstringop-truncation" } */ size_t n1 = __builtin_strlen (p); *r = n0; return n1; } int main () { char a[8] = ""; __builtin_strcpy (a, "123"); size_t n0 = __builtin_strlen (a); __builtin_strncpy (a + 3, a, n0); /* { dg-warning "specified bound depends on the length" } */ size_t n1 = __builtin_strlen (a); if (n1 == n0) __builtin_abort (); a[6] = '7'; __builtin_strcpy (a, "456"); size_t n2; if (foo (a, a + 3, &n2) != 7 || n2 != 3) __builtin_abort (); if (__builtin_memcmp (a, "4564567", sizeof "4564567")) __builtin_abort (); return 0; }