public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-4417] c-family: Support DFP printf/scanf formats for C2X
@ 2021-10-14 20:57 Joseph Myers
  0 siblings, 0 replies; only message in thread
From: Joseph Myers @ 2021-10-14 20:57 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:04a9b8d2f38573d0527edeea9e4fd9b7dfdc7983

commit r12-4417-g04a9b8d2f38573d0527edeea9e4fd9b7dfdc7983
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Thu Oct 14 20:56:29 2021 +0000

    c-family: Support DFP printf/scanf formats for C2X
    
    When I enabled various decimal floating-point features for C2X /
    stopped them being diagnosed with -pedantic for C2X, I missed the
    format checking support.  The DFP printf and scanf formats are
    included in C2X.  Thus, adjust the data for those formats so that they
    are no longer diagnosed with -std=c2x -Wformat -pedantic.
    
    Bootstrapped with no regressions for x86_64-pc-linux-gnu.
    
    gcc/c-family/
            * c-format.c (printf_length_specs, scanf_length_specs)
            (print_char_table, scan_char_table): Support DFP formats for C2X.
            * c-format.h (TEX_D32, TEX_D64, TEX_D128): Remove.
            (T2X_D32, T2X_D64, T2X_D128): New macros.
    
    gcc/testsuite/
            * gcc.dg/format/c11-dfp-printf-1.c,
            gcc.dg/format/c11-dfp-scanf-1.c, gcc.dg/format/c2x-dfp-printf-1.c,
            gcc.dg/format/c2x-dfp-scanf-1.c: New tests.

Diff:
---
 gcc/c-family/c-format.c                        | 22 ++++++++--------
 gcc/c-family/c-format.h                        |  6 ++---
 gcc/testsuite/gcc.dg/format/c11-dfp-printf-1.c | 35 ++++++++++++++++++++++++++
 gcc/testsuite/gcc.dg/format/c11-dfp-scanf-1.c  | 35 ++++++++++++++++++++++++++
 gcc/testsuite/gcc.dg/format/c2x-dfp-printf-1.c | 35 ++++++++++++++++++++++++++
 gcc/testsuite/gcc.dg/format/c2x-dfp-scanf-1.c  | 35 ++++++++++++++++++++++++++
 6 files changed, 154 insertions(+), 14 deletions(-)

diff --git a/gcc/c-family/c-format.c b/gcc/c-family/c-format.c
index c27faf71676..e735e092043 100644
--- a/gcc/c-family/c-format.c
+++ b/gcc/c-family/c-format.c
@@ -493,8 +493,8 @@ static const format_length_info printf_length_specs[] =
   { "Z", FMT_LEN_z, STD_EXT, NO_FMT, 0 },
   { "t", FMT_LEN_t, STD_C99, NO_FMT, 0 },
   { "j", FMT_LEN_j, STD_C99, NO_FMT, 0 },
-  { "H", FMT_LEN_H, STD_EXT, NO_FMT, 0 },
-  { "D", FMT_LEN_D, STD_EXT, "DD", FMT_LEN_DD, STD_EXT, 0 },
+  { "H", FMT_LEN_H, STD_C2X, NO_FMT, 0 },
+  { "D", FMT_LEN_D, STD_C2X, "DD", FMT_LEN_DD, STD_C2X, 0 },
   { NO_FMT, NO_FMT, 0 }
 };
 
@@ -530,8 +530,8 @@ static const format_length_info scanf_length_specs[] =
   { "z", FMT_LEN_z, STD_C99, NO_FMT, 0 },
   { "t", FMT_LEN_t, STD_C99, NO_FMT, 0 },
   { "j", FMT_LEN_j, STD_C99, NO_FMT, 0 },
-  { "H", FMT_LEN_H, STD_EXT, NO_FMT, 0 },
-  { "D", FMT_LEN_D, STD_EXT, "DD", FMT_LEN_DD, STD_EXT, 0 },
+  { "H", FMT_LEN_H, STD_C2X, NO_FMT, 0 },
+  { "D", FMT_LEN_D, STD_C2X, "DD", FMT_LEN_DD, STD_C2X, 0 },
   { NO_FMT, NO_FMT, 0 }
 };
 
@@ -703,15 +703,15 @@ static const format_char_info print_char_table[] =
   { "di",  0, STD_C89, { T89_I,   T99_SC,  T89_S,   T89_L,   T9L_LL,  TEX_LL,  T99_SST, T99_PD,  T99_IM,  BADLEN,  BADLEN,  BADLEN  }, "-wp0 +'I",  "i",  NULL },
   { "oxX", 0, STD_C89, { T89_UI,  T99_UC,  T89_US,  T89_UL,  T9L_ULL, TEX_ULL, T99_ST,  T99_UPD, T99_UIM, BADLEN,  BADLEN,  BADLEN }, "-wp0#",     "i",  NULL },
   { "u",   0, STD_C89, { T89_UI,  T99_UC,  T89_US,  T89_UL,  T9L_ULL, TEX_ULL, T99_ST,  T99_UPD, T99_UIM, BADLEN,  BADLEN,  BADLEN }, "-wp0'I",    "i",  NULL },
-  { "fgG", 0, STD_C89, { T89_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T89_LD,  BADLEN,  BADLEN,  BADLEN,  TEX_D32, TEX_D64, TEX_D128 }, "-wp0 +#'I", "",   NULL },
-  { "eE",  0, STD_C89, { T89_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T89_LD,  BADLEN,  BADLEN,  BADLEN,  TEX_D32, TEX_D64, TEX_D128 }, "-wp0 +#I",  "",   NULL },
+  { "fgG", 0, STD_C89, { T89_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T89_LD,  BADLEN,  BADLEN,  BADLEN,  T2X_D32, T2X_D64, T2X_D128 }, "-wp0 +#'I", "",   NULL },
+  { "eE",  0, STD_C89, { T89_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T89_LD,  BADLEN,  BADLEN,  BADLEN,  T2X_D32, T2X_D64, T2X_D128 }, "-wp0 +#I",  "",   NULL },
   { "c",   0, STD_C89, { T89_I,   BADLEN,  BADLEN,  T94_WI,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "-w",        "",   NULL },
   { "s",   1, STD_C89, { T89_C,   BADLEN,  BADLEN,  T94_W,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "-wp",       "cR", NULL },
   { "p",   1, STD_C89, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "-w",        "c",  NULL },
   { "n",   1, STD_C89, { T89_I,   T99_SC,  T89_S,   T89_L,   T9L_LL,  BADLEN,  T99_SST, T99_PD,  T99_IM,  BADLEN,  BADLEN,  BADLEN }, "",          "W",  NULL },
   /* C99 conversion specifiers.  */
-  { "F",   0, STD_C99, { T99_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T99_LD,  BADLEN,  BADLEN,  BADLEN,  TEX_D32, TEX_D64, TEX_D128 }, "-wp0 +#'I", "",   NULL },
-  { "aA",  0, STD_C99, { T99_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T99_LD,  BADLEN,  BADLEN,  BADLEN,  TEX_D32, TEX_D64,  TEX_D128 }, "-wp0 +#",   "",   NULL },
+  { "F",   0, STD_C99, { T99_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T99_LD,  BADLEN,  BADLEN,  BADLEN,  T2X_D32, T2X_D64, T2X_D128 }, "-wp0 +#'I", "",   NULL },
+  { "aA",  0, STD_C99, { T99_D,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T99_LD,  BADLEN,  BADLEN,  BADLEN,  T2X_D32, T2X_D64,  T2X_D128 }, "-wp0 +#",   "",   NULL },
   /* C2X conversion specifiers.  */
   { "b",   0, STD_C2X, { T2X_UI,  T2X_UC,  T2X_US,  T2X_UL,  T2X_ULL, TEX_ULL, T2X_ST,  T2X_UPD, T2X_UIM, BADLEN,  BADLEN,  BADLEN }, "-wp0#",     "i",  NULL },
   /* X/Open conversion specifiers.  */
@@ -870,15 +870,15 @@ static const format_char_info scan_char_table[] =
   { "di",    1, STD_C89, { T89_I,   T99_SC,  T89_S,   T89_L,   T9L_LL,  TEX_LL,  T99_SST, T99_PD,  T99_IM,  BADLEN,  BADLEN,  BADLEN }, "*w'I", "W",   NULL },
   { "u",     1, STD_C89, { T89_UI,  T99_UC,  T89_US,  T89_UL,  T9L_ULL, TEX_ULL, T99_ST,  T99_UPD, T99_UIM, BADLEN,  BADLEN,  BADLEN }, "*w'I", "W",   NULL },
   { "oxX",   1, STD_C89, { T89_UI,  T99_UC,  T89_US,  T89_UL,  T9L_ULL, TEX_ULL, T99_ST,  T99_UPD, T99_UIM, BADLEN,  BADLEN,  BADLEN }, "*w",   "W",   NULL },
-  { "efgEG", 1, STD_C89, { T89_F,   BADLEN,  BADLEN,  T89_D,   BADLEN,  T89_LD,  BADLEN,  BADLEN,  BADLEN,  TEX_D32, TEX_D64, TEX_D128 }, "*w'",  "W",   NULL },
+  { "efgEG", 1, STD_C89, { T89_F,   BADLEN,  BADLEN,  T89_D,   BADLEN,  T89_LD,  BADLEN,  BADLEN,  BADLEN,  T2X_D32, T2X_D64, T2X_D128 }, "*w'",  "W",   NULL },
   { "c",     1, STD_C89, { T89_C,   BADLEN,  BADLEN,  T94_W,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "*mw",   "cW",  NULL },
   { "s",     1, STD_C89, { T89_C,   BADLEN,  BADLEN,  T94_W,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "*amw",  "cW",  NULL },
   { "[",     1, STD_C89, { T89_C,   BADLEN,  BADLEN,  T94_W,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "*amw",  "cW[", NULL },
   { "p",     2, STD_C89, { T89_V,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN }, "*w",   "W",   NULL },
   { "n",     1, STD_C89, { T89_I,   T99_SC,  T89_S,   T89_L,   T9L_LL,  BADLEN,  T99_SST, T99_PD,  T99_IM,  BADLEN,  BADLEN,  BADLEN }, "",     "W",   NULL },
   /* C99 conversion specifiers.  */
-  { "F",   1, STD_C99, { T99_F,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T99_LD,  BADLEN,  BADLEN,  BADLEN,  TEX_D32, TEX_D64, TEX_D128 }, "*w'",  "W",   NULL },
-  { "aA",   1, STD_C99, { T99_F,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T99_LD,  BADLEN,  BADLEN,  BADLEN,  TEX_D32,  TEX_D64,  TEX_D128 }, "*w'",  "W",   NULL },
+  { "F",   1, STD_C99, { T99_F,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T99_LD,  BADLEN,  BADLEN,  BADLEN,  T2X_D32, T2X_D64, T2X_D128 }, "*w'",  "W",   NULL },
+  { "aA",   1, STD_C99, { T99_F,   BADLEN,  BADLEN,  T99_D,   BADLEN,  T99_LD,  BADLEN,  BADLEN,  BADLEN,  T2X_D32,  T2X_D64,  T2X_D128 }, "*w'",  "W",   NULL },
   /* C2X conversion specifiers.  */
   { "b",     1, STD_C2X, { T2X_UI,  T2X_UC,  T2X_US,  T2X_UL,  T2X_ULL, TEX_ULL, T2X_ST,  T2X_UPD, T2X_UIM, BADLEN,  BADLEN,  BADLEN }, "*w",   "W",   NULL },
   /* X/Open conversion specifiers.  */
diff --git a/gcc/c-family/c-format.h b/gcc/c-family/c-format.h
index 2b5012ee3a9..dfa1e11a003 100644
--- a/gcc/c-family/c-format.h
+++ b/gcc/c-family/c-format.h
@@ -333,11 +333,11 @@ struct format_kind_info
 #define T99_UIM	{ STD_C99, "uintmax_t", T_UIM }
 #define T2X_UIM	{ STD_C2X, "uintmax_t", T_UIM }
 #define T_D32   &dfloat32_type_node
-#define TEX_D32 { STD_EXT, "_Decimal32", T_D32 }
+#define T2X_D32 { STD_C2X, "_Decimal32", T_D32 }
 #define T_D64   &dfloat64_type_node
-#define TEX_D64 { STD_EXT, "_Decimal64", T_D64 }
+#define T2X_D64 { STD_C2X, "_Decimal64", T_D64 }
 #define T_D128  &dfloat128_type_node
-#define TEX_D128 { STD_EXT, "_Decimal128", T_D128 }
+#define T2X_D128 { STD_C2X, "_Decimal128", T_D128 }
 
 /* Structure describing how format attributes such as "printf" are
    interpreted as "gnu_printf" or "ms_printf" on a particular system.
diff --git a/gcc/testsuite/gcc.dg/format/c11-dfp-printf-1.c b/gcc/testsuite/gcc.dg/format/c11-dfp-printf-1.c
new file mode 100644
index 00000000000..356a23efed0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/format/c11-dfp-printf-1.c
@@ -0,0 +1,35 @@
+/* Test for printf formats: rejection of DFP formats in pedantic mode.  */
+/* { dg-do compile } */
+/* { dg-require-effective-target dfp } */
+/* { dg-options "-std=gnu11 -pedantic -Wformat" } */
+
+#include "format.h"
+
+void
+foo (_Decimal32 d32, _Decimal64 d64, _Decimal128 d128) /* { dg-warning "ISO C" } */
+{
+  printf ("%Ha", d32); /* { dg-warning "C" } */
+  printf ("%HA", d32); /* { dg-warning "C" } */
+  printf ("%He", d32); /* { dg-warning "C" } */
+  printf ("%HE", d32); /* { dg-warning "C" } */
+  printf ("%Hf", d32); /* { dg-warning "C" } */
+  printf ("%HF", d32); /* { dg-warning "C" } */
+  printf ("%Hg", d32); /* { dg-warning "C" } */
+  printf ("%HG", d32); /* { dg-warning "C" } */
+  printf ("%Da", d64); /* { dg-warning "C" } */
+  printf ("%DA", d64); /* { dg-warning "C" } */
+  printf ("%De", d64); /* { dg-warning "C" } */
+  printf ("%DE", d64); /* { dg-warning "C" } */
+  printf ("%Df", d64); /* { dg-warning "C" } */
+  printf ("%DF", d64); /* { dg-warning "C" } */
+  printf ("%Dg", d64); /* { dg-warning "C" } */
+  printf ("%DG", d64); /* { dg-warning "C" } */
+  printf ("%DDa", d128); /* { dg-warning "C" } */
+  printf ("%DDA", d128); /* { dg-warning "C" } */
+  printf ("%DDe", d128); /* { dg-warning "C" } */
+  printf ("%DDE", d128); /* { dg-warning "C" } */
+  printf ("%DDf", d128); /* { dg-warning "C" } */
+  printf ("%DDF", d128); /* { dg-warning "C" } */
+  printf ("%DDg", d128); /* { dg-warning "C" } */
+  printf ("%DDG", d128); /* { dg-warning "C" } */
+}
diff --git a/gcc/testsuite/gcc.dg/format/c11-dfp-scanf-1.c b/gcc/testsuite/gcc.dg/format/c11-dfp-scanf-1.c
new file mode 100644
index 00000000000..35bd631d53b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/format/c11-dfp-scanf-1.c
@@ -0,0 +1,35 @@
+/* Test for scanf formats: rejection of DFP formats in pedantic mode.  */
+/* { dg-do compile } */
+/* { dg-require-effective-target dfp } */
+/* { dg-options "-std=gnu11 -pedantic -Wformat" } */
+
+#include "format.h"
+
+void
+foo (_Decimal32 *d32, _Decimal64 *d64, _Decimal128 *d128) /* { dg-warning "ISO C" } */
+{
+  scanf ("%Ha", d32); /* { dg-warning "C" } */
+  scanf ("%HA", d32); /* { dg-warning "C" } */
+  scanf ("%He", d32); /* { dg-warning "C" } */
+  scanf ("%HE", d32); /* { dg-warning "C" } */
+  scanf ("%Hf", d32); /* { dg-warning "C" } */
+  scanf ("%HF", d32); /* { dg-warning "C" } */
+  scanf ("%Hg", d32); /* { dg-warning "C" } */
+  scanf ("%HG", d32); /* { dg-warning "C" } */
+  scanf ("%Da", d64); /* { dg-warning "C" } */
+  scanf ("%DA", d64); /* { dg-warning "C" } */
+  scanf ("%De", d64); /* { dg-warning "C" } */
+  scanf ("%DE", d64); /* { dg-warning "C" } */
+  scanf ("%Df", d64); /* { dg-warning "C" } */
+  scanf ("%DF", d64); /* { dg-warning "C" } */
+  scanf ("%Dg", d64); /* { dg-warning "C" } */
+  scanf ("%DG", d64); /* { dg-warning "C" } */
+  scanf ("%DDa", d128); /* { dg-warning "C" } */
+  scanf ("%DDA", d128); /* { dg-warning "C" } */
+  scanf ("%DDe", d128); /* { dg-warning "C" } */
+  scanf ("%DDE", d128); /* { dg-warning "C" } */
+  scanf ("%DDf", d128); /* { dg-warning "C" } */
+  scanf ("%DDF", d128); /* { dg-warning "C" } */
+  scanf ("%DDg", d128); /* { dg-warning "C" } */
+  scanf ("%DDG", d128); /* { dg-warning "C" } */
+}
diff --git a/gcc/testsuite/gcc.dg/format/c2x-dfp-printf-1.c b/gcc/testsuite/gcc.dg/format/c2x-dfp-printf-1.c
new file mode 100644
index 00000000000..dc40f99bc75
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/format/c2x-dfp-printf-1.c
@@ -0,0 +1,35 @@
+/* Test for printf formats: acceptance of DFP formats in pedantic mode.  */
+/* { dg-do compile } */
+/* { dg-require-effective-target dfp } */
+/* { dg-options "-std=c2x -pedantic -Wformat" } */
+
+#include "format.h"
+
+void
+foo (_Decimal32 d32, _Decimal64 d64, _Decimal128 d128)
+{
+  printf ("%Ha", d32);
+  printf ("%HA", d32);
+  printf ("%He", d32);
+  printf ("%HE", d32);
+  printf ("%Hf", d32);
+  printf ("%HF", d32);
+  printf ("%Hg", d32);
+  printf ("%HG", d32);
+  printf ("%Da", d64);
+  printf ("%DA", d64);
+  printf ("%De", d64);
+  printf ("%DE", d64);
+  printf ("%Df", d64);
+  printf ("%DF", d64);
+  printf ("%Dg", d64);
+  printf ("%DG", d64);
+  printf ("%DDa", d128);
+  printf ("%DDA", d128);
+  printf ("%DDe", d128);
+  printf ("%DDE", d128);
+  printf ("%DDf", d128);
+  printf ("%DDF", d128);
+  printf ("%DDg", d128);
+  printf ("%DDG", d128);
+}
diff --git a/gcc/testsuite/gcc.dg/format/c2x-dfp-scanf-1.c b/gcc/testsuite/gcc.dg/format/c2x-dfp-scanf-1.c
new file mode 100644
index 00000000000..81e39a97ff8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/format/c2x-dfp-scanf-1.c
@@ -0,0 +1,35 @@
+/* Test for scanf formats: acceptance of DFP formats in pedantic mode.  */
+/* { dg-do compile } */
+/* { dg-require-effective-target dfp } */
+/* { dg-options "-std=c2x -pedantic -Wformat" } */
+
+#include "format.h"
+
+void
+foo (_Decimal32 *d32, _Decimal64 *d64, _Decimal128 *d128)
+{
+  scanf ("%Ha", d32);
+  scanf ("%HA", d32);
+  scanf ("%He", d32);
+  scanf ("%HE", d32);
+  scanf ("%Hf", d32);
+  scanf ("%HF", d32);
+  scanf ("%Hg", d32);
+  scanf ("%HG", d32);
+  scanf ("%Da", d64);
+  scanf ("%DA", d64);
+  scanf ("%De", d64);
+  scanf ("%DE", d64);
+  scanf ("%Df", d64);
+  scanf ("%DF", d64);
+  scanf ("%Dg", d64);
+  scanf ("%DG", d64);
+  scanf ("%DDa", d128);
+  scanf ("%DDA", d128);
+  scanf ("%DDe", d128);
+  scanf ("%DDE", d128);
+  scanf ("%DDf", d128);
+  scanf ("%DDF", d128);
+  scanf ("%DDg", d128);
+  scanf ("%DDG", d128);
+}


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-10-14 20:57 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-14 20:57 [gcc r12-4417] c-family: Support DFP printf/scanf formats for C2X Joseph Myers

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).