From 554fd8c5195424bdbcabf5de30fdc183aba391bd Mon Sep 17 00:00:00 2001 From: upstream source tree Date: Sun, 15 Mar 2015 20:14:05 -0400 Subject: obtained gcc-4.6.4.tar.bz2 from upstream website; verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository. --- gcc/testsuite/gcc.dg/format/ext-1.c | 126 ++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/format/ext-1.c (limited to 'gcc/testsuite/gcc.dg/format/ext-1.c') diff --git a/gcc/testsuite/gcc.dg/format/ext-1.c b/gcc/testsuite/gcc.dg/format/ext-1.c new file mode 100644 index 000000000..3b020892a --- /dev/null +++ b/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 */ +/* { 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" } */ +} -- cgit v1.2.3