aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.dg/format/ext-1.c
diff options
context:
space:
mode:
authorBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
committerBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
commit1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch)
treec607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/testsuite/gcc.dg/format/ext-1.c
parent283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff)
downloadtoolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.dg/format/ext-1.c')
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.dg/format/ext-1.c126
1 files changed, 126 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.dg/format/ext-1.c b/gcc-4.9/gcc/testsuite/gcc.dg/format/ext-1.c
new file mode 100644
index 000000000..3b020892a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.dg/format/ext-1.c
@@ -0,0 +1,126 @@
+/* Test for format extensions beyond the C standard and X/Open standard.
+ Test for printf formats.
+*/
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -Wformat" } */
+
+#include "format.h"
+
+void
+foo (quad_t q, u_quad_t uq, quad_t *qn, size_t z, size_t *zn, long long int ll,
+ unsigned long long int ull, int i, unsigned int u, double d,
+ char *s, void *p, wchar_t *ls, wint_t lc, int *n, long int l)
+{
+ /* As an extension, GCC allows the BSD length "q" for integer formats.
+ This is largely obsoleted in C99 by %j, %ll and PRId64.
+ */
+ printf ("%qd%qi%qo%qu%qx%qX%qn", q, q, uq, uq, uq, uq, qn);
+ printf ("%qf", d); /* { dg-warning "length" "bad use of %q" } */
+ printf ("%qF", d); /* { dg-warning "length" "bad use of %q" } */
+ printf ("%qe", d); /* { dg-warning "length" "bad use of %q" } */
+ printf ("%qE", d); /* { dg-warning "length" "bad use of %q" } */
+ printf ("%qg", d); /* { dg-warning "length" "bad use of %q" } */
+ printf ("%qG", d); /* { dg-warning "length" "bad use of %q" } */
+ printf ("%qa", d); /* { dg-warning "length" "bad use of %q" } */
+ printf ("%qA", d); /* { dg-warning "length" "bad use of %q" } */
+ printf ("%qc", i); /* { dg-warning "length" "bad use of %q" } */
+ printf ("%qs", s); /* { dg-warning "length" "bad use of %q" } */
+ printf ("%qp", p); /* { dg-warning "length" "bad use of %q" } */
+ printf ("%qC", lc); /* { dg-warning "length" "bad use of %q" } */
+ printf ("%qS", ls); /* { dg-warning "length" "bad use of %q" } */
+ /* With a bad length GCC wants some argument, any argument,
+ to devour with the format conversion, as a synchronisation heuristic.
+ This may get improved later.
+ */
+ printf ("%qm", i); /* { dg-warning "length" "bad use of %q" } */
+ /* As an extension, GCC allows the length "Z" as a synonym for "z".
+ This was an extension predating C99 which should now be considered
+ deprecated; use the standard "z" instead.
+ */
+ printf ("%Zd%Zi%Zo%Zu%Zx%ZX", z, z, z, z, z, z);
+ printf ("%Zn", zn);
+ printf ("%Zf", d); /* { dg-warning "length" "bad use of %Z" } */
+ printf ("%ZF", d); /* { dg-warning "length" "bad use of %Z" } */
+ printf ("%Ze", d); /* { dg-warning "length" "bad use of %Z" } */
+ printf ("%ZE", d); /* { dg-warning "length" "bad use of %Z" } */
+ printf ("%Zg", d); /* { dg-warning "length" "bad use of %Z" } */
+ printf ("%ZG", d); /* { dg-warning "length" "bad use of %Z" } */
+ printf ("%Za", d); /* { dg-warning "length" "bad use of %Z" } */
+ printf ("%ZA", d); /* { dg-warning "length" "bad use of %Z" } */
+ printf ("%Zc", i); /* { dg-warning "length" "bad use of %Z" } */
+ printf ("%Zs", s); /* { dg-warning "length" "bad use of %Z" } */
+ printf ("%Zp", p); /* { dg-warning "length" "bad use of %Z" } */
+ printf ("%ZC", lc); /* { dg-warning "length" "bad use of %Z" } */
+ printf ("%ZS", ls); /* { dg-warning "length" "bad use of %Z" } */
+ printf ("%Zm", i); /* { dg-warning "length" "bad use of %Z" } */
+ /* As an extension, GCC allows the length "L" on integer formats
+ (but not %n) as a synonym for "ll".
+ This should be considered deprecated.
+ */
+ printf ("%Ld%Li%Lo%Lu%Lx%LX", ll, ll, ull, ull, ull, ull);
+ /* As an extension, derived from syslog, GCC allows the conversion
+ specifier "m" for formatting strerror(errno). This may be used
+ with width, precision and the "-" flag, the same as %s.
+ */
+ printf ("%m%3m%.4m%5.6m");
+ printf ("%*m", i);
+ printf ("%.*m", i);
+ printf ("%*.*m", i, i);
+ printf ("%3.*m", i);
+ printf ("%*.4m", i);
+ printf ("%-m");
+ printf ("%+m"); /* { dg-warning "flag" "bad %+m" } */
+ printf ("% m"); /* { dg-warning "flag" "bad % m" } */
+ printf ("%#m"); /* { dg-warning "flag" "bad %#m" } */
+ printf ("%0m"); /* { dg-warning "flag" "bad %0m" } */
+ printf ("%'m"); /* { dg-warning "flag" "bad %'m" } */
+ printf ("%hm", i); /* { dg-warning "length" "bad %hm" } */
+ printf ("%hhm", i); /* { dg-warning "length" "bad %hhm" } */
+ printf ("%lm", i); /* { dg-warning "length" "bad %lm" } */
+ printf ("%llm", i); /* { dg-warning "length" "bad %llm" } */
+ printf ("%jm", i); /* { dg-warning "length" "bad %jm" } */
+ printf ("%zm", i); /* { dg-warning "length" "bad %zm" } */
+ printf ("%tm", i); /* { dg-warning "length" "bad %tm" } */
+ printf ("%Lm", i); /* { dg-warning "length" "bad %Lm" } */
+ printf ("%qm", i); /* { dg-warning "length" "bad %qm" } */
+ printf ("%Zm", i); /* { dg-warning "length" "bad %Zm" } */
+ /* It should be OK to mix %m formats with $ operand number formats. */
+ printf ("%2$ld%m%1$d", i, l);
+ /* Likewise, %m formats with width and precision should not have an
+ operand number for the %m itself.
+ */
+ printf ("%*2$.*1$m", i, i);
+ printf ("%1$*2$.*1$m", i, i); /* { dg-warning "no argument" "printf %1\$m" } */
+ /* As an extension, glibc includes the "I" flag for decimal
+ formats, to output using the locale's digits (e.g. in Arabic).
+ In GCC, we require this to be in the standard place for flags, though
+ glibc allows it also after width or precision.
+ */
+ printf ("%Id%Ii%Iu", i, i, u);
+ printf ("%Io", u); /* { dg-warning "flag" "bad use of I flag" } */
+ printf ("%Ix", u); /* { dg-warning "flag" "bad use of I flag" } */
+ printf ("%IX", u); /* { dg-warning "flag" "bad use of I flag" } */
+ printf ("%In", n); /* { dg-warning "flag" "bad use of I flag" } */
+ printf ("%If", d);
+ printf ("%IF", d);
+ printf ("%Ie", d);
+ printf ("%IE", d);
+ printf ("%Ig", d);
+ printf ("%IG", d);
+ printf ("%Ia", d); /* { dg-warning "flag" "bad use of I flag" } */
+ printf ("%IA", d); /* { dg-warning "flag" "bad use of I flag" } */
+ printf ("%Ic", i); /* { dg-warning "flag" "bad use of I flag" } */
+ printf ("%Is", s); /* { dg-warning "flag" "bad use of I flag" } */
+ printf ("%Ip", p); /* { dg-warning "flag" "bad use of I flag" } */
+ printf ("%IC", lc); /* { dg-warning "flag" "bad use of I flag" } */
+ printf ("%IS", ls); /* { dg-warning "flag" "bad use of I flag" } */
+ printf ("%Im"); /* { dg-warning "flag" "bad use of I flag" } */
+
+ /* As an extension, GCC does format checking on "unlocked"
+ i.e. thread unsafe versions of these functions. */
+ fprintf_unlocked (stdout, "%d", i);
+ fprintf_unlocked (stdout, "%ld", i); /* { dg-warning "format" "fprintf_unlocked" } */
+ printf_unlocked ("%d", i);
+ printf_unlocked ("%ld", i); /* { dg-warning "format" "printf_unlocked" } */
+}