1 /* { dg-do run { target *-*-linux* *-*-gnu* } } */ 2 /* { dg-options "-O2 -fdump-tree-strlen" } */ 3 4 #define USE_GNU 5 #include "strlenopt.h" 6 7 volatile int v; 8 9 size_t __attribute__ ((noinline, noclone)) f1(char * b)10f1 (char *b) 11 { 12 char a[30]; 13 v += 1; 14 // Should be converted to stpcpy. 15 strcpy (a, b); 16 int len1 = strlen (a); 17 a[0] = '_'; 18 a[1] = 0; 19 return len1 + strlen (a); 20 } 21 22 size_t __attribute__ ((noinline, noclone)) f2(char * a,char * b)23f2 (char *a, char *b) 24 { 25 v += 2; 26 // Should be converted to stpcpy. 27 strcpy (a, b); 28 int len1 = strlen (a); 29 a[0] = '_'; 30 a[1] = 0; 31 return len1 + strlen (a); 32 } 33 34 int main()35main () 36 { 37 char a[30]; 38 if (f1 ("foo") != 4 || f2 (a, "foobar") != 7) 39 abort (); 40 return 0; 41 } 42 43 /* { dg-final { scan-tree-dump-times "strlen \\(" 0 "strlen" } } */ 44 /* { dg-final { scan-tree-dump-times "stpcpy \\(" 2 "strlen" } } */ 45