Index: gcc/c-family/c.opt
===================================================================
--- gcc/c-family/c.opt	(revision 276896)
+++ gcc/c-family/c.opt	(working copy)
@@ -367,7 +367,7 @@ C ObjC C++ ObjC++ CPP(warn_builtin_macro_redefined
 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: gcc/testsuite/gcc.dg/dfp/c11-constants-1.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/c11-constants-1.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/dfp/c11-constants-1.c	(working copy)
@@ -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" } */
Index: gcc/testsuite/gcc.dg/dfp/c11-constants-2.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/c11-constants-2.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/dfp/c11-constants-2.c	(working copy)
@@ -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" } */
Index: gcc/testsuite/gcc.dg/dfp/c2x-constants-1.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/c2x-constants-1.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/dfp/c2x-constants-1.c	(working copy)
@@ -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;
Index: gcc/testsuite/gcc.dg/dfp/c2x-constants-2.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/c2x-constants-2.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/dfp/c2x-constants-2.c	(working copy)
@@ -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: gcc/testsuite/gcc.dg/dfp/constants-pedantic.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/constants-pedantic.c	(revision 276896)
+++ gcc/testsuite/gcc.dg/dfp/constants-pedantic.c	(working copy)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-pedantic" } */
+/* { dg-options "-std=gnu17 -pedantic" } */
 
 /* N1150 6: Constants.
    C99 6.4.4.2: Floating constants.  */
@@ -6,9 +6,9 @@
 
 #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: libcpp/expr.c
===================================================================
--- libcpp/expr.c	(revision 276896)
+++ libcpp/expr.c	(working copy)
@@ -98,8 +98,8 @@ interpret_float_suffix (cpp_reader *pfile, const u
   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_
 	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: libcpp/include/cpplib.h
===================================================================
--- libcpp/include/cpplib.h	(revision 276896)
+++ libcpp/include/cpplib.h	(working copy)
@@ -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: libcpp/init.c
===================================================================
--- libcpp/init.c	(revision 276896)
+++ libcpp/init.c	(working copy)
@@ -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_tabl
   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;
