diff mbox series

Support _Decimal* keywords for C2x

Message ID alpine.DEB.2.21.1910111732490.26290@digraph.polyomino.org.uk
State New
Headers show
Series Support _Decimal* keywords for C2x | expand

Commit Message

Joseph Myers Oct. 11, 2019, 5:33 p.m. UTC
ISO C2x adds decimal floating point as an optional standard feature.
This patch accordingly makes GCC accept the _Decimal* keywords in
strict C2x mode, using pedwarn_c11 to get a warning for
-Wc11-c2x-compat.  (Constants, where the pedwarn is in libcpp, will be
dealt with separately.)

The _Decimal* keywords are marked with D_EXT, meaning they are not
considered keywords at all in strict conformance modes.  This is
contrary to the normal practice for most implementation-namespace
keywords, which are accepted in all standards modes but with
appropriate pedwarns for older standards.  This patch removes D_EXT
from those keywords so they are accepted as keywords for all
standards, consequently removing the gcc.dg/dfp/keywords-ignored-c99.c
test that is no longer valid.

(A new D_C2X for keywords will still be needed if any new keywords get
added that aren't in the implementation namespace for older standards;
there are proposals for such keywords, albeit as predefined macros
that might not actually need new keywords in the compiler in all
cases.  If the DFP keywords end up as decimal32 etc., of course
appropriate compiler and testcase changes will be needed, and a
version of keywords-ignored-c99.c would make sense again with such
spellings.)

Bootstrapped with no regressions on x86_64-pc-linux-gnu.  Applied to 
mainline.

gcc/c:
2019-10-11  Joseph Myers  <joseph@codesourcery.com>

	* c-decl.c (declspecs_add_type): Use pedwarn_c11 for DFP types.

gcc/c-family:
2019-10-11  Joseph Myers  <joseph@codesourcery.com>

	* c-common.c (c_common_reswords): Do not use D_EXT for _Decimal32,
	_Decimal64 and _Decimal128.

gcc/testsuite:
2019-10-11  Joseph Myers  <joseph@codesourcery.com>

	* gcc.dg/dfp/c11-keywords-1.c, gcc.dg/dfp/c11-keywords-2.c,
	gcc.dg/dfp/c2x-keywords-1.c, gcc.dg/dfp/c2x-keywords-2.c: New
	tests.
	* gcc.dg/dfp/keywords-ignored-c99.c: Remove test.
	* gcc.dg/dfp/constants-c99.c, gcc.dg/dfp/keywords-c89.c,
	gcc.dg/dfp/keywords-c99.c: Use -pedantic-errors.
diff mbox series

Patch

Index: gcc/c/c-decl.c
===================================================================
--- gcc/c/c-decl.c	(revision 276895)
+++ gcc/c/c-decl.c	(working copy)
@@ -10959,8 +10959,9 @@  declspecs_add_type (location_t loc, struct c_decls
 		error_at (loc,
 			  ("decimal floating-point not supported "
 			   "for this target"));
-	      pedwarn (loc, OPT_Wpedantic,
-		       "ISO C does not support decimal floating-point");
+	      pedwarn_c11 (loc, OPT_Wpedantic,
+			   "ISO C does not support decimal floating-point "
+			   "before C2X");
 	      return specs;
 	    case RID_FRACT:
 	    case RID_ACCUM:
Index: gcc/c-family/c-common.c
===================================================================
--- gcc/c-family/c-common.c	(revision 276895)
+++ gcc/c-family/c-common.c	(working copy)
@@ -351,9 +351,9 @@  const struct c_common_resword c_common_reswords[]
   { "_Float32x",        RID_FLOAT32X,  D_CONLY },
   { "_Float64x",        RID_FLOAT64X,  D_CONLY },
   { "_Float128x",       RID_FLOAT128X, D_CONLY },
-  { "_Decimal32",       RID_DFLOAT32,  D_CONLY | D_EXT },
-  { "_Decimal64",       RID_DFLOAT64,  D_CONLY | D_EXT },
-  { "_Decimal128",      RID_DFLOAT128, D_CONLY | D_EXT },
+  { "_Decimal32",       RID_DFLOAT32,  D_CONLY },
+  { "_Decimal64",       RID_DFLOAT64,  D_CONLY },
+  { "_Decimal128",      RID_DFLOAT128, D_CONLY },
   { "_Fract",           RID_FRACT,     D_CONLY | D_EXT },
   { "_Accum",           RID_ACCUM,     D_CONLY | D_EXT },
   { "_Sat",             RID_SAT,       D_CONLY | D_EXT },
Index: gcc/testsuite/gcc.dg/dfp/c11-keywords-1.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/c11-keywords-1.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/dfp/c11-keywords-1.c	(working copy)
@@ -0,0 +1,7 @@ 
+/* Test that _Decimal* keywords diagnosed in C11 mode: -pedantic.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c11 -pedantic" } */
+
+_Decimal32 d32; /* { dg-warning "ISO C does not support" } */
+_Decimal64 d64; /* { dg-warning "ISO C does not support" } */
+_Decimal128 d128; /* { dg-warning "ISO C does not support" } */
Index: gcc/testsuite/gcc.dg/dfp/c11-keywords-2.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/c11-keywords-2.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/dfp/c11-keywords-2.c	(working copy)
@@ -0,0 +1,7 @@ 
+/* Test that _Decimal* keywords diagnosed in C11 mode: -pedantic-errors.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c11 -pedantic-errors" } */
+
+_Decimal32 d32; /* { dg-error "ISO C does not support" } */
+_Decimal64 d64; /* { dg-error "ISO C does not support" } */
+_Decimal128 d128; /* { dg-error "ISO C does not support" } */
Index: gcc/testsuite/gcc.dg/dfp/c2x-keywords-1.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/c2x-keywords-1.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/dfp/c2x-keywords-1.c	(working copy)
@@ -0,0 +1,7 @@ 
+/* Test that _Decimal* keywords are accepted in C2X mode.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2x -pedantic-errors" } */
+
+_Decimal32 d32;
+_Decimal64 d64;
+_Decimal128 d128;
Index: gcc/testsuite/gcc.dg/dfp/c2x-keywords-2.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/c2x-keywords-2.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/dfp/c2x-keywords-2.c	(working copy)
@@ -0,0 +1,7 @@ 
+/* Test that _Decimal* keywords are accepted in C2X mode: compat warnings.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2x -Wc11-c2x-compat" } */
+
+_Decimal32 d32; /* { dg-warning "ISO C does not support" } */
+_Decimal64 d64; /* { dg-warning "ISO C does not support" } */
+_Decimal128 d128; /* { dg-warning "ISO C does not support" } */
Index: gcc/testsuite/gcc.dg/dfp/constants-c99.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/constants-c99.c	(revision 276895)
+++ gcc/testsuite/gcc.dg/dfp/constants-c99.c	(working copy)
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-std=c99 -Wno-overflow" } */
+/* { dg-options "-std=c99 -Wno-overflow -pedantic-errors" } */
 
 /* N1150 6: Constants.
    C99 6.4.4.2: Floating constants.  */
Index: gcc/testsuite/gcc.dg/dfp/keywords-c89.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/keywords-c89.c	(revision 276895)
+++ gcc/testsuite/gcc.dg/dfp/keywords-c89.c	(working copy)
@@ -1,7 +1,7 @@ 
 /* { dg-do compile } */
-/* { dg-options "-std=c89" } */
+/* { dg-options "-std=c89 -pedantic-errors" } */
 
-/* Decimal float keywords are not recognized in C89 mode.  */
+/* Decimal float keywords are diagnosed in pedantic C89 mode.  */
 
 _Decimal32 x;		/* { dg-error "" } */
 _Decimal64 y;		/* { dg-error "" } */
Index: gcc/testsuite/gcc.dg/dfp/keywords-c99.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/keywords-c99.c	(revision 276895)
+++ gcc/testsuite/gcc.dg/dfp/keywords-c99.c	(working copy)
@@ -1,7 +1,7 @@ 
 /* { dg-do compile } */
-/* { dg-options "-std=c99" } */
+/* { dg-options "-std=c99 -pedantic-errors" } */
 
-/* Decimal float keywords are not recognized in C99 mode.  */
+/* Decimal float keywords are diagnosed in pedantic C99 mode.  */
 
 _Decimal32 x;		/* { dg-error "" } */
 _Decimal64 y;		/* { dg-error "" } */
Index: gcc/testsuite/gcc.dg/dfp/keywords-ignored-c99.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/keywords-ignored-c99.c	(revision 276895)
+++ gcc/testsuite/gcc.dg/dfp/keywords-ignored-c99.c	(nonexistent)
@@ -1,15 +0,0 @@ 
-/* { dg-do compile } */
-/* { dg-options "-std=c99" } */
-
-/* Decimal float keywords are not reserved for c99.  */
-
-int _Decimal32 (void)
-{
-  return 0;
-}
-
-int foo (int i)
-{
-  int _Decimal64 = i * 2;
-  return _Decimal64;
-}