1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
/* Test for scanf formats. Formats using C99 features, including cases
where C99 specifies some aspect of the format to be ignored or where
the behavior is undefined.
*/
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
/* { dg-do compile } */
/* { dg-options "-std=iso9899:1999 -pedantic -Wformat" } */
#include "format.h"
void
foo (int *ip, unsigned int *uip, short int *hp, unsigned short int *uhp,
signed char *hhp, unsigned char *uhhp, long int *lp,
unsigned long int *ulp, float *fp, double *dp, long double *ldp, char *s,
void **pp, int *n, long long *llp, unsigned long long *ullp, wchar_t *ls,
short int *hn, signed char *hhn, long int *ln, long long int *lln,
intmax_t *jp, uintmax_t *ujp, intmax_t *jn, size_t *zp,
signed_size_t *szp, signed_size_t *zn, ptrdiff_t *tp,
unsigned_ptrdiff_t *utp, ptrdiff_t *tn)
{
/* See ISO/IEC 9899:1999 (E) subclause 7.19.6.2 (pages 281-288).
We do not repeat here most of the checks for correct C90 formats
or completely broken formats.
*/
/* Valid, invalid and silly assignment-suppression
and width constructions.
*/
scanf ("%*d%*i%*o%*u%*x%*X%*a%*A%*e%*E%*f%*F%*g%*G%*s%*[abc]%*c%*p");
scanf ("%*2d%*8s%*3c");
scanf ("%*n", n); /* { dg-warning "suppress" "suppression of %n" } */
scanf ("%*hd"); /* { dg-warning "together" "suppression with length" } */
scanf ("%2d%3i%4o%5u%6x%7X%8a%9A%10e%11E%12f%13F%14g%15G%16s%3[abc]%4c%5p",
ip, ip, uip, uip, uip, uip, fp, fp, fp, fp, fp, fp, fp, fp,
s, s, s, pp);
scanf ("%0d", ip); /* { dg-warning "width" "warning for zero width" } */
scanf ("%3n", n); /* { dg-warning "width" "width with %n" } */
/* Valid and invalid %h, %hh, %l, %ll, %j, %z, %t, %L constructions. */
scanf ("%hd%hi%ho%hu%hx%hX%hn", hp, hp, uhp, uhp, uhp, uhp, hn);
scanf ("%ha", fp); /* { dg-warning "length" "bad use of %h" } */
scanf ("%hA", fp); /* { dg-warning "length" "bad use of %h" } */
scanf ("%he", fp); /* { dg-warning "length" "bad use of %h" } */
scanf ("%hE", fp); /* { dg-warning "length" "bad use of %h" } */
scanf ("%hf", fp); /* { dg-warning "length" "bad use of %h" } */
scanf ("%hF", fp); /* { dg-warning "length" "bad use of %h" } */
scanf ("%hg", fp); /* { dg-warning "length" "bad use of %h" } */
scanf ("%hG", fp); /* { dg-warning "length" "bad use of %h" } */
scanf ("%hs", s); /* { dg-warning "length" "bad use of %h" } */
scanf ("%h[ac]", s); /* { dg-warning "length" "bad use of %h" } */
scanf ("%hc", s); /* { dg-warning "length" "bad use of %h" } */
scanf ("%hp", pp); /* { dg-warning "length" "bad use of %h" } */
scanf ("%hhd%hhi%hho%hhu%hhx%hhX%hhn", hhp, hhp, uhhp, uhhp, uhhp, uhhp,
hhn);
scanf ("%hha", fp); /* { dg-warning "length" "bad use of %hh" } */
scanf ("%hhA", fp); /* { dg-warning "length" "bad use of %hh" } */
scanf ("%hhe", fp); /* { dg-warning "length" "bad use of %hh" } */
scanf ("%hhE", fp); /* { dg-warning "length" "bad use of %hh" } */
scanf ("%hhf", fp); /* { dg-warning "length" "bad use of %hh" } */
scanf ("%hhF", fp); /* { dg-warning "length" "bad use of %hh" } */
scanf ("%hhg", fp); /* { dg-warning "length" "bad use of %hh" } */
scanf ("%hhG", fp); /* { dg-warning "length" "bad use of %hh" } */
scanf ("%hhs", s); /* { dg-warning "length" "bad use of %hh" } */
scanf ("%hh[ac]", s); /* { dg-warning "length" "bad use of %hh" } */
scanf ("%hhc", s); /* { dg-warning "length" "bad use of %hh" } */
scanf ("%hhp", pp); /* { dg-warning "length" "bad use of %hh" } */
scanf ("%ld%li%lo%lu%lx%lX%ln", lp, lp, ulp, ulp, ulp, ulp, ln);
scanf ("%la%lA%le%lE%lf%lF%lg%lG", dp, dp, dp, dp, dp, dp, dp, dp);
scanf ("%lp", pp); /* { dg-warning "length" "bad use of %l" } */
scanf ("%ls", ls);
scanf ("%l[ac]", ls);
scanf ("%lc", ls);
scanf ("%lld%lli%llo%llu%llx%llX%lln", llp, llp, ullp, ullp, ullp, ullp,
lln);
scanf ("%lla", fp); /* { dg-warning "length" "bad use of %ll" } */
scanf ("%llA", fp); /* { dg-warning "length" "bad use of %ll" } */
scanf ("%lle", fp); /* { dg-warning "length" "bad use of %ll" } */
scanf ("%llE", fp); /* { dg-warning "length" "bad use of %ll" } */
scanf ("%llf", fp); /* { dg-warning "length" "bad use of %ll" } */
scanf ("%llF", fp); /* { dg-warning "length" "bad use of %ll" } */
scanf ("%llg", fp); /* { dg-warning "length" "bad use of %ll" } */
scanf ("%llG", fp); /* { dg-warning "length" "bad use of %ll" } */
scanf ("%lls", s); /* { dg-warning "length" "bad use of %ll" } */
scanf ("%ll[ac]", s); /* { dg-warning "length" "bad use of %ll" } */
scanf ("%llc", s); /* { dg-warning "length" "bad use of %ll" } */
scanf ("%llp", pp); /* { dg-warning "length" "bad use of %ll" } */
scanf ("%jd%ji%jo%ju%jx%jX%jn", jp, jp, ujp, ujp, ujp, ujp, jn); /* { dg-bogus "length" "bogus %j warning" } */
scanf ("%ja", fp); /* { dg-warning "length" "bad use of %j" } */
scanf ("%jA", fp); /* { dg-warning "length" "bad use of %j" } */
scanf ("%je", fp); /* { dg-warning "length" "bad use of %j" } */
scanf ("%jE", fp); /* { dg-warning "length" "bad use of %j" } */
scanf ("%jf", fp); /* { dg-warning "length" "bad use of %j" } */
scanf ("%jF", fp); /* { dg-warning "length" "bad use of %j" } */
scanf ("%jg", fp); /* { dg-warning "length" "bad use of %j" } */
scanf ("%jG", fp); /* { dg-warning "length" "bad use of %j" } */
scanf ("%js", s); /* { dg-warning "length" "bad use of %j" } */
scanf ("%j[ac]", s); /* { dg-warning "length" "bad use of %j" } */
scanf ("%jc", s); /* { dg-warning "length" "bad use of %j" } */
scanf ("%jp", pp); /* { dg-warning "length" "bad use of %j" } */
scanf ("%zd%zi%zo%zu%zx%zX%zn", szp, szp, zp, zp, zp, zp, zn);
scanf ("%za", fp); /* { dg-warning "length" "bad use of %z" } */
scanf ("%zA", fp); /* { dg-warning "length" "bad use of %z" } */
scanf ("%ze", fp); /* { dg-warning "length" "bad use of %z" } */
scanf ("%zE", fp); /* { dg-warning "length" "bad use of %z" } */
scanf ("%zf", fp); /* { dg-warning "length" "bad use of %z" } */
scanf ("%zF", fp); /* { dg-warning "length" "bad use of %z" } */
scanf ("%zg", fp); /* { dg-warning "length" "bad use of %z" } */
scanf ("%zG", fp); /* { dg-warning "length" "bad use of %z" } */
scanf ("%zs", s); /* { dg-warning "length" "bad use of %z" } */
scanf ("%z[ac]", s); /* { dg-warning "length" "bad use of %z" } */
scanf ("%zc", s); /* { dg-warning "length" "bad use of %z" } */
scanf ("%zp", pp); /* { dg-warning "length" "bad use of %z" } */
scanf ("%td%ti%to%tu%tx%tX%tn", tp, tp, utp, utp, utp, utp, tn);
scanf ("%ta", fp); /* { dg-warning "length" "bad use of %t" } */
scanf ("%tA", fp); /* { dg-warning "length" "bad use of %t" } */
scanf ("%te", fp); /* { dg-warning "length" "bad use of %t" } */
scanf ("%tE", fp); /* { dg-warning "length" "bad use of %t" } */
scanf ("%tf", fp); /* { dg-warning "length" "bad use of %t" } */
scanf ("%tF", fp); /* { dg-warning "length" "bad use of %t" } */
scanf ("%tg", fp); /* { dg-warning "length" "bad use of %t" } */
scanf ("%tG", fp); /* { dg-warning "length" "bad use of %t" } */
scanf ("%ts", s); /* { dg-warning "length" "bad use of %t" } */
scanf ("%t[ac]", s); /* { dg-warning "length" "bad use of %t" } */
scanf ("%tc", s); /* { dg-warning "length" "bad use of %t" } */
scanf ("%tp", pp); /* { dg-warning "length" "bad use of %t" } */
scanf ("%La%LA%Le%LE%Lf%LF%Lg%LG", ldp, ldp, ldp, ldp, ldp, ldp, ldp, ldp);
scanf ("%Ld", llp); /* { dg-warning "does not support" "bad use of %L" } */
scanf ("%Li", llp); /* { dg-warning "does not support" "bad use of %L" } */
scanf ("%Lo", ullp); /* { dg-warning "does not support" "bad use of %L" } */
scanf ("%Lu", ullp); /* { dg-warning "does not support" "bad use of %L" } */
scanf ("%Lx", ullp); /* { dg-warning "does not support" "bad use of %L" } */
scanf ("%LX", ullp); /* { dg-warning "does not support" "bad use of %L" } */
scanf ("%Ls", s); /* { dg-warning "length" "bad use of %L" } */
scanf ("%L[ac]", s); /* { dg-warning "length" "bad use of %L" } */
scanf ("%Lc", s); /* { dg-warning "length" "bad use of %L" } */
scanf ("%Lp", pp); /* { dg-warning "length" "bad use of %L" } */
scanf ("%Ln", n); /* { dg-warning "length" "bad use of %L" } */
/* Valid uses of each bare conversion. */
scanf ("%d%i%o%u%x%X%a%A%e%E%f%F%g%G%s%[abc]%c%p%n%%", ip, ip, uip, uip, uip,
uip, fp, fp, fp, fp, fp, fp, fp, fp, s, s, s, pp, n);
/* Assert that %as is not treated as an extension in C99 mode. */
scanf ("%as", fp);
scanf ("%a[", fp);
/* Tests for bad argument types: pointer target sign with %hh. */
scanf ("%hhd", uhhp); /* { dg-warning "format" "%hhd sign" } */
scanf ("%hhu", hhp); /* { dg-warning "format" "%hhu sign" } */
}
|