OSDN Git Service

* gcc.c-torture/execute/20040208-2.c: Move ...
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.c-torture / execute / stdio-opt-3.c
1 /* Copyright (C) 2001  Free Software Foundation.
2
3    Ensure all expected transformations of builtin fprintf occur and
4    that we honor side effects in the arguments.
5
6    Written by Kaveh R. Ghazi, 1/7/2001.  */
7
8 #include <stdio.h>
9 extern int fprintf (FILE *, const char *, ...);
10 extern void abort(void);
11
12 int main()
13 {
14   FILE *s_array[] = {stdout, NULL}, **s_ptr = s_array;
15   const char *const s1 = "hello world";
16   const char *const s2[] = { s1, 0 }, *const*s3;
17   
18   fprintf (*s_ptr, "%s", "hello");
19   fprintf (*s_ptr, "%s", "\n");
20   fprintf (*s_ptr, "%s", *s2);
21   s3 = s2;
22   fprintf (*s_ptr, "%s", *s3++);
23   if (s3 != s2+1 || *s3 != 0)
24     abort();
25   s3 = s2;
26   fprintf (*s_ptr++, "%s", *s3++);
27   if (s3 != s2+1 || *s3 != 0 || s_ptr != s_array+1 || *s_ptr != 0)
28     abort();
29   
30   s_ptr = s_array;
31   fprintf (*s_ptr, "%c", '\n');
32   fprintf (*s_ptr, "%c", **s2);
33   s3 = s2;
34   fprintf (*s_ptr, "%c", **s3++);
35   if (s3 != s2+1 || *s3 != 0)
36     abort();
37   s3 = s2;
38   fprintf (*s_ptr++, "%c", **s3++);
39   if (s3 != s2+1 || *s3 != 0 || s_ptr != s_array+1 || *s_ptr != 0)
40     abort();
41   
42   s_ptr = s_array;
43   fprintf (*s_ptr++, "hello world");
44   if (s_ptr != s_array+1 || *s_ptr != 0)
45     abort();
46   s_ptr = s_array;
47   fprintf (*s_ptr, "\n");
48     
49   /* Test at least one instance of the __builtin_ style.  We do this
50      to ensure that it works and that the prototype is correct.  */
51   __builtin_fprintf (*s_ptr, "%s", "hello world\n");
52
53   return 0;
54 }
55
56 #ifdef __OPTIMIZE__
57 /* When optimizing, all the above cases should be transformed into
58    something else.  So any remaining calls to the original function
59    should abort.  */
60 __attribute__ ((noinline))
61 static int
62 fprintf (FILE *stream, const char *string, ...)
63 {
64   abort();
65 }
66 #endif