annotate gcc/testsuite/gcc.dg/va-arg-pack-len-1.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* { dg-do run } */
kono
parents:
diff changeset
2 /* { dg-options "-O2" } */
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 #include <stdarg.h>
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 extern int error_open_missing_mode (void)
kono
parents:
diff changeset
7 __attribute__((__error__ ("open with O_CREAT needs 3 arguments, only 2 were given")));
kono
parents:
diff changeset
8 extern int warn_open_too_many_arguments (void)
kono
parents:
diff changeset
9 __attribute__((__warning__ ("open called with more than 3 arguments")));
kono
parents:
diff changeset
10 extern void abort (void);
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 char expected_char;
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 __attribute__((noinline)) int
kono
parents:
diff changeset
15 myopen2 (const char *path, int oflag)
kono
parents:
diff changeset
16 {
kono
parents:
diff changeset
17 if (expected_char++ != path[0] || path[1] != '\0')
kono
parents:
diff changeset
18 abort ();
kono
parents:
diff changeset
19 switch (path[0])
kono
parents:
diff changeset
20 {
kono
parents:
diff changeset
21 case 'f':
kono
parents:
diff changeset
22 if (oflag != 0x2)
kono
parents:
diff changeset
23 abort ();
kono
parents:
diff changeset
24 break;
kono
parents:
diff changeset
25 case 'g':
kono
parents:
diff changeset
26 if (oflag != 0x43)
kono
parents:
diff changeset
27 abort ();
kono
parents:
diff changeset
28 /* In real __open_2 this would terminate the program:
kono
parents:
diff changeset
29 open with O_CREAT without third argument. */
kono
parents:
diff changeset
30 return -6;
kono
parents:
diff changeset
31 default:
kono
parents:
diff changeset
32 abort ();
kono
parents:
diff changeset
33 }
kono
parents:
diff changeset
34 return 0;
kono
parents:
diff changeset
35 }
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 __attribute__((noinline)) int
kono
parents:
diff changeset
38 myopenva (const char *path, int oflag, ...)
kono
parents:
diff changeset
39 {
kono
parents:
diff changeset
40 int mode = 0;
kono
parents:
diff changeset
41 va_list ap;
kono
parents:
diff changeset
42 if ((oflag & 0x40) != 0)
kono
parents:
diff changeset
43 {
kono
parents:
diff changeset
44 va_start (ap, oflag);
kono
parents:
diff changeset
45 mode = va_arg (ap, int);
kono
parents:
diff changeset
46 va_end (ap);
kono
parents:
diff changeset
47 }
kono
parents:
diff changeset
48 if (expected_char++ != path[0] || path[1] != '\0')
kono
parents:
diff changeset
49 abort ();
kono
parents:
diff changeset
50 switch (path[0])
kono
parents:
diff changeset
51 {
kono
parents:
diff changeset
52 case 'a':
kono
parents:
diff changeset
53 if (oflag != 0x43 || mode != 0644)
kono
parents:
diff changeset
54 abort ();
kono
parents:
diff changeset
55 break;
kono
parents:
diff changeset
56 case 'b':
kono
parents:
diff changeset
57 if (oflag != 0x3)
kono
parents:
diff changeset
58 abort ();
kono
parents:
diff changeset
59 break;
kono
parents:
diff changeset
60 case 'c':
kono
parents:
diff changeset
61 if (oflag != 0x2)
kono
parents:
diff changeset
62 abort ();
kono
parents:
diff changeset
63 break;
kono
parents:
diff changeset
64 case 'd':
kono
parents:
diff changeset
65 if (oflag != 0x43 || mode != 0600)
kono
parents:
diff changeset
66 abort ();
kono
parents:
diff changeset
67 break;
kono
parents:
diff changeset
68 case 'e':
kono
parents:
diff changeset
69 if (oflag != 0x3)
kono
parents:
diff changeset
70 abort ();
kono
parents:
diff changeset
71 break;
kono
parents:
diff changeset
72 default:
kono
parents:
diff changeset
73 abort ();
kono
parents:
diff changeset
74 }
kono
parents:
diff changeset
75 return 0;
kono
parents:
diff changeset
76 }
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 extern inline __attribute__((always_inline, gnu_inline)) int
kono
parents:
diff changeset
79 myopen (const char *path, int oflag, ...)
kono
parents:
diff changeset
80 {
kono
parents:
diff changeset
81 if (__builtin_va_arg_pack_len () > 1)
kono
parents:
diff changeset
82 warn_open_too_many_arguments ();
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 if (__builtin_constant_p (oflag))
kono
parents:
diff changeset
85 {
kono
parents:
diff changeset
86 if ((oflag & 0x40) != 0 && __builtin_va_arg_pack_len () < 1)
kono
parents:
diff changeset
87 {
kono
parents:
diff changeset
88 error_open_missing_mode ();
kono
parents:
diff changeset
89 return myopen2 (path, oflag);
kono
parents:
diff changeset
90 }
kono
parents:
diff changeset
91 return myopenva (path, oflag, __builtin_va_arg_pack ());
kono
parents:
diff changeset
92 }
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 if (__builtin_va_arg_pack_len () < 1)
kono
parents:
diff changeset
95 return myopen2 (path, oflag);
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 return myopenva (path, oflag, __builtin_va_arg_pack ());
kono
parents:
diff changeset
98 }
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 volatile int l0;
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 int
kono
parents:
diff changeset
103 main (void)
kono
parents:
diff changeset
104 {
kono
parents:
diff changeset
105 expected_char = 'a';
kono
parents:
diff changeset
106 if (myopen ("a", 0x43, 0644))
kono
parents:
diff changeset
107 abort ();
kono
parents:
diff changeset
108 if (myopen ("b", 0x3, 0755))
kono
parents:
diff changeset
109 abort ();
kono
parents:
diff changeset
110 if (myopen ("c", 0x2))
kono
parents:
diff changeset
111 abort ();
kono
parents:
diff changeset
112 if (myopen ("d", l0 + 0x43, 0600))
kono
parents:
diff changeset
113 abort ();
kono
parents:
diff changeset
114 if (myopen ("e", l0 + 0x3, 0700))
kono
parents:
diff changeset
115 abort ();
kono
parents:
diff changeset
116 if (myopen ("f", l0 + 0x2))
kono
parents:
diff changeset
117 abort ();
kono
parents:
diff changeset
118 /* Invalid use of myopen, but only detectable at runtime. */
kono
parents:
diff changeset
119 if (myopen ("g", l0 + 0x43) != -6)
kono
parents:
diff changeset
120 abort ();
kono
parents:
diff changeset
121 return 0;
kono
parents:
diff changeset
122 }