]>
Commit | Line | Data |
---|---|---|
8b57bfeb JJ |
1 | /* { dg-do run } */ |
2 | /* { dg-options "-O2 -fdump-tree-strlen" } */ | |
3 | ||
4 | #include "strlenopt.h" | |
5 | ||
6 | /* Yes, there are people who write code like this. */ | |
7 | ||
8 | __attribute__((noinline, noclone)) char * | |
9 | foo (int r) | |
10 | { | |
11 | char buf[10] = ""; | |
12 | strcat (buf, r ? "r" : "w"); | |
13 | strcat (buf, "b"); | |
14 | return strdup (buf); | |
15 | } | |
16 | ||
17 | __attribute__((noinline, noclone)) char * | |
18 | bar (int r) | |
19 | { | |
20 | char buf[10] = {}; | |
21 | strcat (buf, r ? "r" : "w"); | |
22 | strcat (buf, "b"); | |
23 | return strdup (buf); | |
24 | } | |
25 | ||
26 | int | |
27 | main () | |
28 | { | |
29 | char *q = foo (1); | |
30 | if (q != NULL) | |
31 | { | |
32 | if (strcmp (q, "rb")) | |
33 | abort (); | |
34 | free (q); | |
35 | } | |
36 | q = bar (0); | |
37 | if (q != NULL) | |
38 | { | |
39 | if (strcmp (q, "wb")) | |
40 | abort (); | |
41 | free (q); | |
42 | } | |
43 | return 0; | |
44 | } | |
45 | ||
fef5a0d9 RB |
46 | /* { dg-final { scan-tree-dump-times "strlen \\(" 0 "strlen" } } */ |
47 | /* { dg-final { scan-tree-dump-times "memcpy \\(" 4 "strlen" } } */ | |
8b57bfeb JJ |
48 | /* { dg-final { scan-tree-dump-times "strcpy \\(" 0 "strlen" } } */ |
49 | /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen" } } */ | |
50 | /* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen" } } */ | |
51 | /* { dg-final { scan-tree-dump-times "stpcpy \\(" 0 "strlen" } } */ | |
52 | /* { dg-final { cleanup-tree-dump "strlen" } } */ |