annotate gcc/testsuite/gcc.dg/format/ms_c90-printf-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 /* Test for printf formats. Formats using C90 features, including cases
kono
parents:
diff changeset
2 where C90 specifies some aspect of the format to be ignored or where
kono
parents:
diff changeset
3 the behavior is undefined.
kono
parents:
diff changeset
4 */
kono
parents:
diff changeset
5 /* Origin: Joseph Myers <jsm28@cam.ac.uk> */
kono
parents:
diff changeset
6 /* { dg-do compile { target { *-*-mingw* } } } */
kono
parents:
diff changeset
7 /* { dg-options "-std=iso9899:1990 -pedantic -Wformat" } */
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 #define USE_SYSTEM_FORMATS
kono
parents:
diff changeset
10 #include "format.h"
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 void
kono
parents:
diff changeset
13 foo (int i, int i1, int i2, unsigned int u, double d, char *s, void *p,
kono
parents:
diff changeset
14 int *n, short int *hn, long int l, unsigned long int ul,
kono
parents:
diff changeset
15 long int *ln, long double ld, wint_t lc, wchar_t *ls, llong ll,
kono
parents:
diff changeset
16 ullong ull, unsigned int *un, const int *cn, signed char *ss,
kono
parents:
diff changeset
17 unsigned char *us, const signed char *css, unsigned int u1,
kono
parents:
diff changeset
18 unsigned int u2)
kono
parents:
diff changeset
19 {
kono
parents:
diff changeset
20 /* See ISO/IEC 9899:1990 (E) subclause 7.9.6.1 (pages 131-134). */
kono
parents:
diff changeset
21 /* Basic sanity checks for the different components of a format. */
kono
parents:
diff changeset
22 printf ("%d\n", i);
kono
parents:
diff changeset
23 printf ("%+d\n", i);
kono
parents:
diff changeset
24 printf ("%3d\n", i);
kono
parents:
diff changeset
25 printf ("%-3d\n", i);
kono
parents:
diff changeset
26 printf ("%*d\n", i1, i);
kono
parents:
diff changeset
27 printf ("%d %lu\n", i, ul);
kono
parents:
diff changeset
28 /* Bogus use of width. */
kono
parents:
diff changeset
29 printf ("%5n\n", n); /* { dg-warning "width" "width with %n" } */
kono
parents:
diff changeset
30 /* Valid and invalid %% constructions. Some of the warning messages
kono
parents:
diff changeset
31 are non-optimal, but they do detect the errorneous nature of the
kono
parents:
diff changeset
32 format string.
kono
parents:
diff changeset
33 */
kono
parents:
diff changeset
34 printf ("%%");
kono
parents:
diff changeset
35 printf ("%-%"); /* { dg-warning "format" "bogus %%" } */
kono
parents:
diff changeset
36 printf ("%-%\n"); /* { dg-warning "format" "bogus %%" } */
kono
parents:
diff changeset
37 printf ("%5%\n"); /* { dg-warning "format" "bogus %%" } */
kono
parents:
diff changeset
38 printf ("%h%\n"); /* { dg-warning "format" "bogus %%" } */
kono
parents:
diff changeset
39 /* Valid and invalid %h, %l, %L constructions. */
kono
parents:
diff changeset
40 printf ("%hd", i);
kono
parents:
diff changeset
41 printf ("%hi", i);
kono
parents:
diff changeset
42 /* Strictly, these parameters should be int or unsigned int according to
kono
parents:
diff changeset
43 what unsigned short promotes to. However, GCC ignores sign
kono
parents:
diff changeset
44 differences in format checking here, and this is relied on to get the
kono
parents:
diff changeset
45 correct checking without print_char_table needing to know whether
kono
parents:
diff changeset
46 int and short are the same size.
kono
parents:
diff changeset
47 */
kono
parents:
diff changeset
48 printf ("%ho%hu%hx%hX", u, u, u, u);
kono
parents:
diff changeset
49 printf ("%hn", hn);
kono
parents:
diff changeset
50 printf ("%hf", d); /* { dg-warning "length" "bad use of %h" } */
kono
parents:
diff changeset
51 printf ("%he", d); /* { dg-warning "length" "bad use of %h" } */
kono
parents:
diff changeset
52 printf ("%hE", d); /* { dg-warning "length" "bad use of %h" } */
kono
parents:
diff changeset
53 printf ("%hg", d); /* { dg-warning "length" "bad use of %h" } */
kono
parents:
diff changeset
54 printf ("%hG", d); /* { dg-warning "length" "bad use of %h" } */
kono
parents:
diff changeset
55 printf ("%hc", i);
kono
parents:
diff changeset
56 printf ("%hs", hn);
kono
parents:
diff changeset
57 printf ("%hp", p); /* { dg-warning "length" "bad use of %h" } */
kono
parents:
diff changeset
58 printf ("%h"); /* { dg-warning "conversion lacks type" "bare %h" } */
kono
parents:
diff changeset
59 printf ("%ld%li%lo%lu%lx%lX", l, l, ul, ul, ul, ul);
kono
parents:
diff changeset
60 printf ("%ln", ln);
kono
parents:
diff changeset
61 printf ("%lf", d); /* { dg-warning "length|C" "bad use of %l" } */
kono
parents:
diff changeset
62 printf ("%le", d); /* { dg-warning "length|C" "bad use of %l" } */
kono
parents:
diff changeset
63 printf ("%lE", d); /* { dg-warning "length|C" "bad use of %l" } */
kono
parents:
diff changeset
64 printf ("%lg", d); /* { dg-warning "length|C" "bad use of %l" } */
kono
parents:
diff changeset
65 printf ("%lG", d); /* { dg-warning "length|C" "bad use of %l" } */
kono
parents:
diff changeset
66 printf ("%lp", p); /* { dg-warning "length|C" "bad use of %l" } */
kono
parents:
diff changeset
67 /* These next two were added in C94, but should be objected to in C90.
kono
parents:
diff changeset
68 For the first one, GCC has wanted wchar_t instead of the correct C94
kono
parents:
diff changeset
69 and C99 wint_t.
kono
parents:
diff changeset
70 */
kono
parents:
diff changeset
71 printf ("%lc", lc); /* { dg-warning "length|C" "C90 bad use of %l" } */
kono
parents:
diff changeset
72 printf ("%ls", ls); /* { dg-warning "length|C" "C90 bad use of %l" } */
kono
parents:
diff changeset
73 /* Valid uses of each bare conversion. */
kono
parents:
diff changeset
74 printf ("%d%i%o%u%x%X%f%e%E%g%G%c%s%p%n%%", i, i, u, u, u, u, d, d, d, d, d,
kono
parents:
diff changeset
75 i, s, p, n);
kono
parents:
diff changeset
76 /* Uses of the - flag (valid on all non-%, non-n conversions). */
kono
parents:
diff changeset
77 printf ("%-d%-i%-o%-u%-x%-X%-f%-e%-E%-g%-G%-c%-s%-p", i, i, u, u, u, u,
kono
parents:
diff changeset
78 d, d, d, d, d, i, s, p);
kono
parents:
diff changeset
79 printf ("%-n", n); /* { dg-warning "flag" "bad use of %-n" } */
kono
parents:
diff changeset
80 /* Uses of the + flag (valid on signed conversions only). */
kono
parents:
diff changeset
81 printf ("%+d%+i%+f%+e%+E%+g%+G\n", i, i, d, d, d, d, d);
kono
parents:
diff changeset
82 printf ("%+o", u); /* { dg-warning "flag" "bad use of + flag" } */
kono
parents:
diff changeset
83 printf ("%+u", u); /* { dg-warning "flag" "bad use of + flag" } */
kono
parents:
diff changeset
84 printf ("%+x", u); /* { dg-warning "flag" "bad use of + flag" } */
kono
parents:
diff changeset
85 printf ("%+X", u); /* { dg-warning "flag" "bad use of + flag" } */
kono
parents:
diff changeset
86 printf ("%+c", i); /* { dg-warning "flag" "bad use of + flag" } */
kono
parents:
diff changeset
87 printf ("%+s", s); /* { dg-warning "flag" "bad use of + flag" } */
kono
parents:
diff changeset
88 printf ("%+p", p); /* { dg-warning "flag" "bad use of + flag" } */
kono
parents:
diff changeset
89 printf ("%+n", n); /* { dg-warning "flag" "bad use of + flag" } */
kono
parents:
diff changeset
90 /* Uses of the space flag (valid on signed conversions only, and ignored
kono
parents:
diff changeset
91 with +).
kono
parents:
diff changeset
92 */
kono
parents:
diff changeset
93 printf ("% +d", i); /* { dg-warning "use of both|ignored" "use of space and + flags" } */
kono
parents:
diff changeset
94 printf ("%+ d", i); /* { dg-warning "use of both|ignored" "use of space and + flags" } */
kono
parents:
diff changeset
95 printf ("% d% i% f% e% E% g% G\n", i, i, d, d, d, d, d);
kono
parents:
diff changeset
96 printf ("% o", u); /* { dg-warning "flag" "bad use of space flag" } */
kono
parents:
diff changeset
97 printf ("% u", u); /* { dg-warning "flag" "bad use of space flag" } */
kono
parents:
diff changeset
98 printf ("% x", u); /* { dg-warning "flag" "bad use of space flag" } */
kono
parents:
diff changeset
99 printf ("% X", u); /* { dg-warning "flag" "bad use of space flag" } */
kono
parents:
diff changeset
100 printf ("% c", i); /* { dg-warning "flag" "bad use of space flag" } */
kono
parents:
diff changeset
101 printf ("% s", s); /* { dg-warning "flag" "bad use of space flag" } */
kono
parents:
diff changeset
102 printf ("% p", p); /* { dg-warning "flag" "bad use of space flag" } */
kono
parents:
diff changeset
103 printf ("% n", n); /* { dg-warning "flag" "bad use of space flag" } */
kono
parents:
diff changeset
104 /* Uses of the # flag. */
kono
parents:
diff changeset
105 printf ("%#o%#x%#X%#e%#E%#f%#g%#G", u, u, u, d, d, d, d, d);
kono
parents:
diff changeset
106 printf ("%#d", i); /* { dg-warning "flag" "bad use of # flag" } */
kono
parents:
diff changeset
107 printf ("%#i", i); /* { dg-warning "flag" "bad use of # flag" } */
kono
parents:
diff changeset
108 printf ("%#u", u); /* { dg-warning "flag" "bad use of # flag" } */
kono
parents:
diff changeset
109 printf ("%#c", i); /* { dg-warning "flag" "bad use of # flag" } */
kono
parents:
diff changeset
110 printf ("%#s", s); /* { dg-warning "flag" "bad use of # flag" } */
kono
parents:
diff changeset
111 printf ("%#p", p); /* { dg-warning "flag" "bad use of # flag" } */
kono
parents:
diff changeset
112 printf ("%#n", n); /* { dg-warning "flag" "bad use of # flag" } */
kono
parents:
diff changeset
113 /* Uses of the 0 flag. */
kono
parents:
diff changeset
114 printf ("%08d%08i%08o%08u%08x%08X%08e%08E%08f%08g%08G", i, i, u, u, u, u,
kono
parents:
diff changeset
115 d, d, d, d, d);
kono
parents:
diff changeset
116 printf ("%0c", i); /* { dg-warning "flag" "bad use of 0 flag" } */
kono
parents:
diff changeset
117 printf ("%0s", s); /* { dg-warning "flag" "bad use of 0 flag" } */
kono
parents:
diff changeset
118 printf ("%0p", p); /* { dg-warning "flag" "bad use of 0 flag" } */
kono
parents:
diff changeset
119 printf ("%0n", n); /* { dg-warning "flag" "bad use of 0 flag" } */
kono
parents:
diff changeset
120 /* 0 flag ignored with - flag. */
kono
parents:
diff changeset
121 printf ("%-08d", i); /* { dg-warning "flags|ignored" "0 flag ignored with - flag" } */
kono
parents:
diff changeset
122 printf ("%-08i", i); /* { dg-warning "flags|ignored" "0 flag ignored with - flag" } */
kono
parents:
diff changeset
123 printf ("%-08o", u); /* { dg-warning "flags|ignored" "0 flag ignored with - flag" } */
kono
parents:
diff changeset
124 printf ("%-08u", u); /* { dg-warning "flags|ignored" "0 flag ignored with - flag" } */
kono
parents:
diff changeset
125 printf ("%-08x", u); /* { dg-warning "flags|ignored" "0 flag ignored with - flag" } */
kono
parents:
diff changeset
126 printf ("%-08X", u); /* { dg-warning "flags|ignored" "0 flag ignored with - flag" } */
kono
parents:
diff changeset
127 printf ("%-08e", d); /* { dg-warning "flags|ignored" "0 flag ignored with - flag" } */
kono
parents:
diff changeset
128 printf ("%-08E", d); /* { dg-warning "flags|ignored" "0 flag ignored with - flag" } */
kono
parents:
diff changeset
129 printf ("%-08f", d); /* { dg-warning "flags|ignored" "0 flag ignored with - flag" } */
kono
parents:
diff changeset
130 printf ("%-08g", d); /* { dg-warning "flags|ignored" "0 flag ignored with - flag" } */
kono
parents:
diff changeset
131 printf ("%-08G", d); /* { dg-warning "flags|ignored" "0 flag ignored with - flag" } */
kono
parents:
diff changeset
132 /* Various tests of bad argument types. */
kono
parents:
diff changeset
133 printf ("%d", l); /* { dg-warning "format" "bad argument types" } */
kono
parents:
diff changeset
134 printf ("%ld", i); /* { dg-warning "format" "bad argument types" } */
kono
parents:
diff changeset
135 printf ("%s", n); /* { dg-warning "format" "bad argument types" } */
kono
parents:
diff changeset
136 printf ("%p", i); /* { dg-warning "format" "bad argument types" } */
kono
parents:
diff changeset
137 printf ("%n", p); /* { dg-warning "format" "bad argument types" } */
kono
parents:
diff changeset
138 /* With -pedantic, we want some further checks for pointer targets:
kono
parents:
diff changeset
139 %p should allow only pointers to void (possibly qualified) and
kono
parents:
diff changeset
140 to character types (possibly qualified), but not function pointers
kono
parents:
diff changeset
141 or pointers to other types. (Whether, in fact, character types are
kono
parents:
diff changeset
142 allowed here is unclear; see thread on comp.std.c, July 2000 for
kono
parents:
diff changeset
143 discussion of the requirements of rules on identical representation,
kono
parents:
diff changeset
144 and of the application of the as if rule with the new va_arg
kono
parents:
diff changeset
145 allowances in C99 to printf.) Likewise, we should warn if
kono
parents:
diff changeset
146 pointer targets differ in signedness, except in some circumstances
kono
parents:
diff changeset
147 for character pointers. (In C99 we should consider warning for
kono
parents:
diff changeset
148 char * or unsigned char * being passed to %hhn, even if strictly
kono
parents:
diff changeset
149 legitimate by the standard.)
kono
parents:
diff changeset
150 */
kono
parents:
diff changeset
151 printf ("%p", foo); /* { dg-warning "format" "bad argument types" } */
kono
parents:
diff changeset
152 printf ("%n", un); /* { dg-warning "format" "bad argument types" } */
kono
parents:
diff changeset
153 printf ("%p", n); /* { dg-warning "format" "bad argument types" } */
kono
parents:
diff changeset
154 /* Allow character pointers with %p. */
kono
parents:
diff changeset
155 printf ("%p%p%p%p", s, ss, us, css);
kono
parents:
diff changeset
156 /* %s allows any character type. */
kono
parents:
diff changeset
157 printf ("%s%s%s%s", s, ss, us, css);
kono
parents:
diff changeset
158 /* Warning for void * arguments for %s is GCC's historical behavior,
kono
parents:
diff changeset
159 and seems useful to keep, even if some standard versions might be
kono
parents:
diff changeset
160 read to permit it.
kono
parents:
diff changeset
161 */
kono
parents:
diff changeset
162 printf ("%s", p); /* { dg-warning "format" "bad argument types" } */
kono
parents:
diff changeset
163 /* The historical behavior is to allow signed / unsigned types
kono
parents:
diff changeset
164 interchangeably as arguments. For values representable in both types,
kono
parents:
diff changeset
165 such usage may be correct. For now preserve the behavior of GCC
kono
parents:
diff changeset
166 in such cases.
kono
parents:
diff changeset
167 */
kono
parents:
diff changeset
168 printf ("%d", u);
kono
parents:
diff changeset
169 /* Wrong number of arguments. */
kono
parents:
diff changeset
170 printf ("%d%d", i); /* { dg-warning "matching" "wrong number of args" } */
kono
parents:
diff changeset
171 printf ("%d", i, i); /* { dg-warning "arguments" "wrong number of args" } */
kono
parents:
diff changeset
172 /* Miscellaneous bogus constructions. */
kono
parents:
diff changeset
173 printf (""); /* { dg-warning "zero-length" "warning for empty format" } */
kono
parents:
diff changeset
174 printf ("\0"); /* { dg-warning "embedded" "warning for embedded NUL" } */
kono
parents:
diff changeset
175 printf ("%d\0", i); /* { dg-warning "embedded" "warning for embedded NUL" } */
kono
parents:
diff changeset
176 printf ("%d\0%d", i, i); /* { dg-warning "embedded|too many" "warning for embedded NUL" } */
kono
parents:
diff changeset
177 printf (NULL); /* { dg-warning "null" "null format string warning" } */
kono
parents:
diff changeset
178 printf ("%"); /* { dg-warning "trailing" "trailing % warning" } */
kono
parents:
diff changeset
179 printf ("%++d", i); /* { dg-warning "repeated" "repeated flag warning" } */
kono
parents:
diff changeset
180 printf ("%n", cn); /* { dg-warning "constant" "%n with const" } */
kono
parents:
diff changeset
181 printf ((const char *)L"foo"); /* { dg-warning "wide" "wide string" } */
kono
parents:
diff changeset
182 printf ("%n", (int *)0); /* { dg-warning "null" "%n with NULL" } */
kono
parents:
diff changeset
183 printf ("%s", (char *)0); /* { dg-warning "null" "%s with NULL" } */
kono
parents:
diff changeset
184 }