Support decimal floating-point constants in C2x.
authorJoseph Myers <joseph@codesourcery.com>
Fri, 11 Oct 2019 22:22:52 +0000 (23:22 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Fri, 11 Oct 2019 22:22:52 +0000 (23:22 +0100)
ISO C2x adds decimal floating point as an optional standard feature.
This patch accordingly makes GCC accept DFP constants (DF, DD, DL, df,
dd, dl suffixes) in strict C2X mode, with a pedwarn-if-pedantic for
older standards and a warning with -Wc11-c2x-compat even in C2x mode
(which in turn requires -Wc11-c2x-compat to be newly passed through to
libcpp).

Bootstrapped with no regressions on x86_64-pc-linux-gnu.

gcc/c-family:
* c.opt (Wc11-c2x-compat): Add CPP(cpp_warn_c11_c2x_compat)
CppReason(CPP_W_C11_C2X_COMPAT).

gcc/testsuite:
* gcc.dg/dfp/c11-constants-1.c, gcc.dg/dfp/c11-constants-2.c,
gcc.dg/dfp/c2x-constants-1.c, gcc.dg/dfp/c2x-constants-2.c: New
tests.
* gcc.dg/dfp/constants-pedantic.c: Use -std=gnu17 explicitly.
Update expected diagnostics.

libcpp:
* include/cpplib.h (struct cpp_options): Add dfp_constants and
cpp_warn_c11_c2x_compat.
(enum cpp_warning_reason): Add CPP_W_C11_C2X_COMPAT.
* init.c (struct lang_flags): Add dfp_constants.
(lang_defaults): Set dfp_constants to 1 for GNUC2X and STDC2X and
0 for other languages.
(cpp_set_lang): Set dfp_constants from language.
(cpp_create_reader): Set cpp_warn_c11_c2x_compat to -1.
* expr.c (interpret_float_suffix): Mention DFP constants as C2X in
comment.
(cpp_classify_number): Do not diagnose DFP constants for languages
setting dfp_constants, unless cpp_warn_c11_c2x_compat.

From-SVN: r276908

12 files changed:
gcc/c-family/ChangeLog
gcc/c-family/c.opt
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/dfp/c11-constants-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/dfp/c11-constants-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/dfp/c2x-constants-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/dfp/c2x-constants-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/dfp/constants-pedantic.c
libcpp/ChangeLog
libcpp/expr.c
libcpp/include/cpplib.h
libcpp/init.c

index a0ce54b485870241d30728af55a431e6176e14b1..fea97bb434f969f58b6e63dae764cc0308d71fa3 100644 (file)
@@ -1,3 +1,8 @@
+2019-10-11  Joseph Myers  <joseph@codesourcery.com>
+
+       * c.opt (Wc11-c2x-compat): Add CPP(cpp_warn_c11_c2x_compat)
+       CppReason(CPP_W_C11_C2X_COMPAT).
+
 2019-10-11  Joseph Myers  <joseph@codesourcery.com>
 
        * c-common.c (c_common_reswords): Do not use D_EXT for _Decimal32,
index a1360ba01c2fc2459a7e24aab2c1228eda666888..495eb16a58a2bbe3c257cea84435de8d23a00bd4 100644 (file)
@@ -367,7 +367,7 @@ C ObjC C++ ObjC++ CPP(warn_builtin_macro_redefined) CppReason(CPP_W_BUILTIN_MACR
 Warn when a built-in preprocessor macro is undefined or redefined.
 
 Wc11-c2x-compat
-C ObjC Var(warn_c11_c2x_compat) Init(-1) Warning
+C ObjC CPP(cpp_warn_c11_c2x_compat) CppReason(CPP_W_C11_C2X_COMPAT) Var(warn_c11_c2x_compat) Init(-1) Warning
 Warn about features not present in ISO C11, but present in ISO C2X.
 
 Wc90-c99-compat
index dadb4425cc9102189c69e020a131f9d403b51140..9b31f3536423869ba2b318f5210410aae77c35d0 100644 (file)
@@ -1,3 +1,11 @@
+2019-10-11  Joseph Myers  <joseph@codesourcery.com>
+
+       * gcc.dg/dfp/c11-constants-1.c, gcc.dg/dfp/c11-constants-2.c,
+       gcc.dg/dfp/c2x-constants-1.c, gcc.dg/dfp/c2x-constants-2.c: New
+       tests.
+       * gcc.dg/dfp/constants-pedantic.c: Use -std=gnu17 explicitly.
+       Update expected diagnostics.
+
 2019-10-11  Marek Polacek  <polacek@redhat.com>
 
        PR c++/92070 - bogus error with -fchecking=2.
diff --git a/gcc/testsuite/gcc.dg/dfp/c11-constants-1.c b/gcc/testsuite/gcc.dg/dfp/c11-constants-1.c
new file mode 100644 (file)
index 0000000..472ed25
--- /dev/null
@@ -0,0 +1,13 @@
+/* Test that DFP constants are diagnosed in C11 mode: -pedantic.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c11 -pedantic" } */
+
+int a = (int) 1.1DF; /* { dg-warning "C2X feature" } */
+int b = (int) 2.df; /* { dg-warning "C2X feature" } */
+int c = (int) .33DD; /* { dg-warning "C2X feature" } */
+int d = (int) 2e1dd; /* { dg-warning "C2X feature" } */
+int e = (int) .3e2DL; /* { dg-warning "C2X feature" } */
+int f = (int) 4.5e3dl; /* { dg-warning "C2X feature" } */
+int g = (int) 5.e0DF; /* { dg-warning "C2X feature" } */
+int h = (int) 1e+2df; /* { dg-warning "C2X feature" } */
+int i = (int) 1000e-3DL; /* { dg-warning "C2X feature" } */
diff --git a/gcc/testsuite/gcc.dg/dfp/c11-constants-2.c b/gcc/testsuite/gcc.dg/dfp/c11-constants-2.c
new file mode 100644 (file)
index 0000000..79b20a2
--- /dev/null
@@ -0,0 +1,13 @@
+/* Test that DFP constants are diagnosed in C11 mode: -pedantic-errors.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c11 -pedantic-errors" } */
+
+int a = (int) 1.1DF; /* { dg-error "C2X feature" } */
+int b = (int) 2.df; /* { dg-error "C2X feature" } */
+int c = (int) .33DD; /* { dg-error "C2X feature" } */
+int d = (int) 2e1dd; /* { dg-error "C2X feature" } */
+int e = (int) .3e2DL; /* { dg-error "C2X feature" } */
+int f = (int) 4.5e3dl; /* { dg-error "C2X feature" } */
+int g = (int) 5.e0DF; /* { dg-error "C2X feature" } */
+int h = (int) 1e+2df; /* { dg-error "C2X feature" } */
+int i = (int) 1000e-3DL; /* { dg-error "C2X feature" } */
diff --git a/gcc/testsuite/gcc.dg/dfp/c2x-constants-1.c b/gcc/testsuite/gcc.dg/dfp/c2x-constants-1.c
new file mode 100644 (file)
index 0000000..3375506
--- /dev/null
@@ -0,0 +1,13 @@
+/* Test that DFP constants are accepted in C2X mode.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2x -pedantic-errors" } */
+
+int a = (int) 1.1DF;
+int b = (int) 2.df;
+int c = (int) .33DD;
+int d = (int) 2e1dd;
+int e = (int) .3e2DL;
+int f = (int) 4.5e3dl;
+int g = (int) 5.e0DF;
+int h = (int) 1e+2df;
+int i = (int) 1000e-3DL;
diff --git a/gcc/testsuite/gcc.dg/dfp/c2x-constants-2.c b/gcc/testsuite/gcc.dg/dfp/c2x-constants-2.c
new file mode 100644 (file)
index 0000000..eed35f2
--- /dev/null
@@ -0,0 +1,13 @@
+/* Test that DFP constants are accepted in C2X mode: compat warnings.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2x -Wc11-c2x-compat" } */
+
+int a = (int) 1.1DF; /* { dg-warning "C2X feature" } */
+int b = (int) 2.df; /* { dg-warning "C2X feature" } */
+int c = (int) .33DD; /* { dg-warning "C2X feature" } */
+int d = (int) 2e1dd; /* { dg-warning "C2X feature" } */
+int e = (int) .3e2DL; /* { dg-warning "C2X feature" } */
+int f = (int) 4.5e3dl; /* { dg-warning "C2X feature" } */
+int g = (int) 5.e0DF; /* { dg-warning "C2X feature" } */
+int h = (int) 1e+2df; /* { dg-warning "C2X feature" } */
+int i = (int) 1000e-3DL; /* { dg-warning "C2X feature" } */
index be81b0fc44a5236a38e43c0ca546cc69c1127606..1d85fedad73b62f75f5db06f3f294e6486199acd 100644 (file)
@@ -1,14 +1,14 @@
 /* { dg-do compile } */
-/* { dg-options "-pedantic" } */
+/* { dg-options "-std=gnu17 -pedantic" } */
 
 /* N1150 6: Constants.
    C99 6.4.4.2: Floating constants.  */
 
 #include "dfp-dbg.h"
 
-_Decimal32 a = 1.1df;          /* { dg-warning "GCC extension|ISO C" } */
-_Decimal32 b = -.003DF;                /* { dg-warning "GCC extension|ISO C" } */
-_Decimal64 c = 11e-1dl;                /* { dg-warning "GCC extension|ISO C" } */
-_Decimal64 d = -.3DL;          /* { dg-warning "GCC extension|ISO C" } */
-_Decimal128 e = 000.3e0dl;     /* { dg-warning "GCC extension|ISO C" } */
-_Decimal128 f = 3000300030003e0DL;  /* { dg-warning "GCC extension|ISO C" } */
+_Decimal32 a = 1.1df;          /* { dg-warning "C2X feature|ISO C" } */
+_Decimal32 b = -.003DF;                /* { dg-warning "C2X feature|ISO C" } */
+_Decimal64 c = 11e-1dl;                /* { dg-warning "C2X feature|ISO C" } */
+_Decimal64 d = -.3DL;          /* { dg-warning "C2X feature|ISO C" } */
+_Decimal128 e = 000.3e0dl;     /* { dg-warning "C2X feature|ISO C" } */
+_Decimal128 f = 3000300030003e0DL;  /* { dg-warning "C2X feature|ISO C" } */
index f3237fbd38f2d97757adcd29e48d9c0ceb0f5fc1..e8d2e488588543d427abea1006968c10fb38d4e0 100644 (file)
@@ -1,3 +1,18 @@
+2019-10-11  Joseph Myers  <joseph@codesourcery.com>
+
+       * include/cpplib.h (struct cpp_options): Add dfp_constants and
+       cpp_warn_c11_c2x_compat.
+       (enum cpp_warning_reason): Add CPP_W_C11_C2X_COMPAT.
+       * init.c (struct lang_flags): Add dfp_constants.
+       (lang_defaults): Set dfp_constants to 1 for GNUC2X and STDC2X and
+       0 for other languages.
+       (cpp_set_lang): Set dfp_constants from language.
+       (cpp_create_reader): Set cpp_warn_c11_c2x_compat to -1.
+       * expr.c (interpret_float_suffix): Mention DFP constants as C2X in
+       comment.
+       (cpp_classify_number): Do not diagnose DFP constants for languages
+       setting dfp_constants, unless cpp_warn_c11_c2x_compat.
+
 2019-10-04  Nathan Sidwell  <nathan@acm.org>
 
        PR preprocessor/91991
index 4b514b17d9c237c3757285f8c749ce82318a3d18..65baafe3f1e1e1d24c77afdd16f8d7212ffc45d8 100644 (file)
@@ -98,8 +98,8 @@ interpret_float_suffix (cpp_reader *pfile, const uchar *s, size_t len)
   flags = 0;
   f = d = l = w = q = i = fn = fnx = fn_bits = 0;
 
-  /* The following decimal float suffixes, from TR 24732:2009 and TS
-     18661-2:2015, are supported:
+  /* The following decimal float suffixes, from TR 24732:2009, TS
+     18661-2:2015 and C2X, are supported:
 
      df, DF - _Decimal32.
      dd, DD - _Decimal64.
@@ -744,9 +744,16 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
        cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
                             "fixed-point constants are a GCC extension");
 
-      if ((result & CPP_N_DFLOAT) && CPP_PEDANTIC (pfile))
-       cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
-                            "decimal float constants are a GCC extension");
+      if (result & CPP_N_DFLOAT)
+       {
+         if (CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, dfp_constants))
+           cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
+                                "decimal float constants are a C2X feature");
+         else if (CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) > 0)
+           cpp_warning_with_line (pfile, CPP_W_C11_C2X_COMPAT,
+                                  virtual_location, 0,
+                                  "decimal float constants are a C2X feature");
+       }
 
       result |= CPP_N_FLOATING;
     }
index ccbcfde6dc452cf59da63dbab023315ee7e0be38..224369b93ad9bdc60b5941e7c78dd3dde7ec2ceb 100644 (file)
@@ -480,6 +480,9 @@ struct cpp_options
   /* Nonzero for C++ 2014 Standard digit separators.  */
   unsigned char digit_separators;
 
+  /* Nonzero for C2X decimal floating-point constants.  */
+  unsigned char dfp_constants;
+
   /* Nonzero for C++2a __VA_OPT__ feature.  */
   unsigned char va_opt;
 
@@ -508,6 +511,9 @@ struct cpp_options
   /* True if warn about differences between C90 and C99.  */
   signed char cpp_warn_c90_c99_compat;
 
+  /* True if warn about differences between C11 and C2X.  */
+  signed char cpp_warn_c11_c2x_compat;
+
   /* True if warn about differences between C++98 and C++11.  */
   bool cpp_warn_cxx11_compat;
 
@@ -607,6 +613,7 @@ enum cpp_warning_reason {
   CPP_W_DATE_TIME,
   CPP_W_PEDANTIC,
   CPP_W_C90_C99_COMPAT,
+  CPP_W_C11_C2X_COMPAT,
   CPP_W_CXX11_COMPAT,
   CPP_W_EXPANSION_TO_DEFINED
 };
index c932598b5fbad0543be014ec59e693c564456889..4bcec7be3e555f2ba8969abca0142a660cd0c15c 100644 (file)
@@ -93,32 +93,33 @@ struct lang_flags
   char utf8_char_literals;
   char va_opt;
   char scope;
+  char dfp_constants;
 };
 
 static const struct lang_flags lang_defaults[] =
-{ /*              c99 c++ xnum xid c11 std digr ulit rlit udlit bincst digsep trig u8chlit vaopt scope*/
-  /* GNUC89   */  { 0,  0,  1,  0,  0,  0,  1,   0,   0,   0,    0,     0,     0,   0,      1,   1 },
-  /* GNUC99   */  { 1,  0,  1,  1,  0,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1 },
-  /* GNUC11   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1 },
-  /* GNUC17   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1 },
-  /* GNUC2X   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1 },
-  /* STDC89   */  { 0,  0,  0,  0,  0,  1,  0,   0,   0,   0,    0,     0,     1,   0,      0,   0 },
-  /* STDC94   */  { 0,  0,  0,  0,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   0 },
-  /* STDC99   */  { 1,  0,  1,  1,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   0 },
-  /* STDC11   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   0 },
-  /* STDC17   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   0 },
-  /* STDC2X   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   1 },
-  /* GNUCXX   */  { 0,  1,  1,  1,  0,  0,  1,   0,   0,   0,    0,     0,     0,   0,      1,   1 },
-  /* CXX98    */  { 0,  1,  0,  1,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   1 },
-  /* GNUCXX11 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    0,     0,     0,   0,      1,   1 },
-  /* CXX11    */  { 1,  1,  0,  1,  1,  1,  1,   1,   1,   1,    0,     0,     1,   0,      0,   1 },
-  /* GNUCXX14 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   0,      1,   1 },
-  /* CXX14    */  { 1,  1,  0,  1,  1,  1,  1,   1,   1,   1,    1,     1,     1,   0,      0,   1 },
-  /* GNUCXX17 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1 },
-  /* CXX17    */  { 1,  1,  1,  1,  1,  1,  1,   1,   1,   1,    1,     1,     0,   1,      0,   1 },
-  /* GNUCXX2A */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1 },
-  /* CXX2A    */  { 1,  1,  1,  1,  1,  1,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1 },
-  /* ASM      */  { 0,  0,  1,  0,  0,  0,  0,   0,   0,   0,    0,     0,     0,   0,      0,   0 }
+{ /*              c99 c++ xnum xid c11 std digr ulit rlit udlit bincst digsep trig u8chlit vaopt scope dfp */
+  /* GNUC89   */  { 0,  0,  1,  0,  0,  0,  1,   0,   0,   0,    0,     0,     0,   0,      1,   1,     0 },
+  /* GNUC99   */  { 1,  0,  1,  1,  0,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0 },
+  /* GNUC11   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0 },
+  /* GNUC17   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     0 },
+  /* GNUC2X   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1,   1,     1 },
+  /* STDC89   */  { 0,  0,  0,  0,  0,  1,  0,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0 },
+  /* STDC94   */  { 0,  0,  0,  0,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0 },
+  /* STDC99   */  { 1,  0,  1,  1,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   0,     0 },
+  /* STDC11   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   0,     0 },
+  /* STDC17   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   0,     0 },
+  /* STDC2X   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0,   1,     1 },
+  /* GNUCXX   */  { 0,  1,  1,  1,  0,  0,  1,   0,   0,   0,    0,     0,     0,   0,      1,   1,     0 },
+  /* CXX98    */  { 0,  1,  0,  1,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0,   1,     0 },
+  /* GNUCXX11 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    0,     0,     0,   0,      1,   1,     0 },
+  /* CXX11    */  { 1,  1,  0,  1,  1,  1,  1,   1,   1,   1,    0,     0,     1,   0,      0,   1,     0 },
+  /* GNUCXX14 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   0,      1,   1,     0 },
+  /* CXX14    */  { 1,  1,  0,  1,  1,  1,  1,   1,   1,   1,    1,     1,     1,   0,      0,   1,     0 },
+  /* GNUCXX17 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0 },
+  /* CXX17    */  { 1,  1,  1,  1,  1,  1,  1,   1,   1,   1,    1,     1,     0,   1,      0,   1,     0 },
+  /* GNUCXX2A */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0 },
+  /* CXX2A    */  { 1,  1,  1,  1,  1,  1,  1,   1,   1,   1,    1,     1,     0,   1,      1,   1,     0 },
+  /* ASM      */  { 0,  0,  1,  0,  0,  0,  0,   0,   0,   0,    0,     0,     0,   0,      0,   0,     0 }
 };
 
 /* Sets internal flags correctly for a given language.  */
@@ -145,6 +146,7 @@ cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
   CPP_OPTION (pfile, utf8_char_literals)        = l->utf8_char_literals;
   CPP_OPTION (pfile, va_opt)                    = l->va_opt;
   CPP_OPTION (pfile, scope)                     = l->scope;
+  CPP_OPTION (pfile, dfp_constants)             = l->dfp_constants;
 }
 
 /* Initialize library global state.  */
@@ -193,6 +195,7 @@ cpp_create_reader (enum c_lang lang, cpp_hash_table *table,
   CPP_OPTION (pfile, warn_trigraphs) = 2;
   CPP_OPTION (pfile, warn_endif_labels) = 1;
   CPP_OPTION (pfile, cpp_warn_c90_c99_compat) = -1;
+  CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) = -1;
   CPP_OPTION (pfile, cpp_warn_cxx11_compat) = 0;
   CPP_OPTION (pfile, cpp_warn_deprecated) = 1;
   CPP_OPTION (pfile, cpp_warn_long_long) = 0;