| /* Test for printf formats for Decimal Floating Point types. */ |
| |
| /* { dg-do compile } */ |
| /* { dg-require-effective-target dfp } */ |
| /* { dg-options "-Wformat" } */ |
| |
| extern int printf (const char *restrict, ...); |
| |
| void |
| foo (_Decimal32 x, _Decimal64 y, _Decimal128 z, int i, unsigned int j, |
| double d, char *p) |
| { |
| /* See ISO/IEC DTR 24732 subclause 9.3 (currently Working Draft 5 from |
| 2005-03-06). */ |
| /* Formatted input/output specifiers. */ |
| |
| /* Check lack of warnings for valid usage. */ |
| |
| printf ("%Hf\n", x); |
| printf ("%HF\n", x); |
| printf ("%He\n", x); |
| printf ("%HE\n", x); |
| printf ("%Hg\n", x); |
| printf ("%HG\n", x); |
| |
| printf ("%Df\n", y); |
| printf ("%DF\n", y); |
| printf ("%De\n", y); |
| printf ("%DE\n", y); |
| printf ("%Dg\n", y); |
| printf ("%DG\n", y); |
| |
| printf ("%DDf\n", z); |
| printf ("%DDF\n", z); |
| printf ("%DDe\n", z); |
| printf ("%DDE\n", z); |
| printf ("%DDg\n", z); |
| printf ("%DDG\n", z); |
| |
| printf ("%DG%DDE%HF%DDe%He%HE%DF%DDF%De%DDG%HG%Df%Hg%DE%DDf%Dg%DDg%Hf\n", |
| y, z, x, z, x, x, y, z, y, z, x, y, x, y, z, y, z, x); |
| |
| /* Check warnings for type mismatches. */ |
| |
| printf ("%Hf\n", y); /* { dg-warning "expects type" "bad use of %H" } */ |
| printf ("%HF\n", y); /* { dg-warning "expects type" "bad use of %H" } */ |
| printf ("%He\n", y); /* { dg-warning "expects type" "bad use of %H" } */ |
| printf ("%HE\n", y); /* { dg-warning "expects type" "bad use of %H" } */ |
| printf ("%Hg\n", y); /* { dg-warning "expects type" "bad use of %H" } */ |
| printf ("%HG\n", y); /* { dg-warning "expects type" "bad use of %H" } */ |
| printf ("%Hf\n", z); /* { dg-warning "expects type" "bad use of %H" } */ |
| printf ("%HF\n", z); /* { dg-warning "expects type" "bad use of %H" } */ |
| printf ("%He\n", z); /* { dg-warning "expects type" "bad use of %H" } */ |
| printf ("%HE\n", z); /* { dg-warning "expects type" "bad use of %H" } */ |
| printf ("%Hg\n", z); /* { dg-warning "expects type" "bad use of %H" } */ |
| printf ("%HG\n", z); /* { dg-warning "expects type" "bad use of %H" } */ |
| |
| printf ("%Df\n", x); /* { dg-warning "expects type" "bad use of %D" } */ |
| printf ("%DF\n", x); /* { dg-warning "expects type" "bad use of %D" } */ |
| printf ("%De\n", x); /* { dg-warning "expects type" "bad use of %D" } */ |
| printf ("%DE\n", x); /* { dg-warning "expects type" "bad use of %D" } */ |
| printf ("%Dg\n", x); /* { dg-warning "expects type" "bad use of %D" } */ |
| printf ("%DG\n", x); /* { dg-warning "expects type" "bad use of %D" } */ |
| printf ("%Df\n", z); /* { dg-warning "expects type" "bad use of %D" } */ |
| printf ("%DF\n", z); /* { dg-warning "expects type" "bad use of %D" } */ |
| printf ("%De\n", z); /* { dg-warning "expects type" "bad use of %D" } */ |
| printf ("%DE\n", z); /* { dg-warning "expects type" "bad use of %D" } */ |
| printf ("%Dg\n", z); /* { dg-warning "expects type" "bad use of %D" } */ |
| printf ("%DG\n", z); /* { dg-warning "expects type" "bad use of %D" } */ |
| |
| printf ("%DDf\n", x); /* { dg-warning "expects type" "bad use of %DD" } */ |
| printf ("%DDF\n", x); /* { dg-warning "expects type" "bad use of %DD" } */ |
| printf ("%DDe\n", x); /* { dg-warning "expects type" "bad use of %DD" } */ |
| printf ("%DDE\n", x); /* { dg-warning "expects type" "bad use of %DD" } */ |
| printf ("%DDg\n", x); /* { dg-warning "expects type" "bad use of %DD" } */ |
| printf ("%DDG\n", x); /* { dg-warning "expects type" "bad use of %DD" } */ |
| printf ("%DDf\n", y); /* { dg-warning "expects type" "bad use of %DD" } */ |
| printf ("%DDF\n", y); /* { dg-warning "expects type" "bad use of %DD" } */ |
| printf ("%DDe\n", y); /* { dg-warning "expects type" "bad use of %DD" } */ |
| printf ("%DDE\n", y); /* { dg-warning "expects type" "bad use of %DD" } */ |
| printf ("%DDg\n", y); /* { dg-warning "expects type" "bad use of %DD" } */ |
| printf ("%DDG\n", y); /* { dg-warning "expects type" "bad use of %DD" } */ |
| |
| /* Check for warnings for bad use of H, D, and DD length specifiers. */ |
| |
| printf ("%Hd\n", i); /* { dg-warning "length" "bad use of %H" } */ |
| printf ("%Hi\n", i); /* { dg-warning "length" "bad use of %H" } */ |
| printf ("%Ho\n", j); /* { dg-warning "length" "bad use of %H" } */ |
| printf ("%Hu\n", j); /* { dg-warning "length" "bad use of %H" } */ |
| printf ("%Hx\n", j); /* { dg-warning "length" "bad use of %H" } */ |
| printf ("%HX\n", j); /* { dg-warning "length" "bad use of %H" } */ |
| printf ("%Ha\n", d); /* { dg-warning "length" "bad use of %H" } */ |
| printf ("%HA\n", d); /* { dg-warning "length" "bad use of %H" } */ |
| printf ("%Hc\n", i); /* { dg-warning "length" "bad use of %H" } */ |
| printf ("%Hs\n", p); /* { dg-warning "length" "bad use of %H" } */ |
| printf ("%Hp\n", p); /* { dg-warning "length" "bad use of %H" } */ |
| printf ("%Hn\n", p); /* { dg-warning "length" "bad use of %H" } */ |
| |
| /* Sanity checks for flags, field width, and precision in formats for |
| DFP types. */ |
| |
| printf ("%-Hf\n", x); |
| printf ("%+HF\n", x); |
| printf ("% He\n", x); |
| printf ("%#HE\n", x); |
| printf ("%0Hg\n", x); |
| printf ("%#0HG\n", x); |
| |
| printf ("%0#Df\n", y); |
| printf ("%0DF\n", y); |
| printf ("%#De\n", y); |
| printf ("%-#DE\n", y); |
| printf ("%-#0Dg\n", y); /* { dg-warning "flag ignored" "ignore flag" } */ |
| printf ("%0+ DG\n", y); /* { dg-warning "flag ignored" "ignore flag" } */ |
| |
| printf ("%DDf\n", z); |
| printf ("%0DDF\n", z); |
| printf ("%#0DDe\n", z); |
| printf ("%+DDE\n", z); |
| printf ("%0-#DDg\n", z); /* { dg-warning "flag ignored" "ignore flag" } */ |
| printf ("% DDG\n", z); |
| } |