Index: gcc/c-family/c-cppbuiltin.c
===================================================================
--- gcc/c-family/c-cppbuiltin.c	(revision 276841)
+++ gcc/c-family/c-cppbuiltin.c	(working copy)
@@ -1151,10 +1151,16 @@ c_cpp_builtins (cpp_reader *pfile)
 				      csuffix, FLOATN_NX_TYPE_NODE (i));
     }
 
-  /* For decfloat.h.  */
-  builtin_define_decimal_float_constants ("DEC32", "DF", dfloat32_type_node);
-  builtin_define_decimal_float_constants ("DEC64", "DD", dfloat64_type_node);
-  builtin_define_decimal_float_constants ("DEC128", "DL", dfloat128_type_node);
+  /* For float.h.  */
+  if (targetm.decimal_float_supported_p ())
+    {
+      builtin_define_decimal_float_constants ("DEC32", "DF",
+					      dfloat32_type_node);
+      builtin_define_decimal_float_constants ("DEC64", "DD",
+					      dfloat64_type_node);
+      builtin_define_decimal_float_constants ("DEC128", "DL",
+					      dfloat128_type_node);
+    }
 
   /* For fixed-point fibt, ibit, max, min, and epsilon.  */
   if (targetm.fixed_point_supported_p ())
Index: gcc/ginclude/float.h
===================================================================
--- gcc/ginclude/float.h	(revision 276841)
+++ gcc/ginclude/float.h	(working copy)
@@ -426,9 +426,13 @@ see the files COPYING3 and COPYING.RUNTIME respect
 
 #endif /* __STDC_WANT_IEC_60559_TYPES_EXT__.  */
 
-#ifdef __STDC_WANT_DEC_FP__
-/* Draft Technical Report 24732, extension for decimal floating-point
-   arithmetic: Characteristic of decimal floating types <float.h>.  */
+#ifdef __DEC32_MANT_DIG__
+#if (defined __STDC_WANT_DEC_FP__ \
+     || defined __STDC_WANT_IEC_60559_DFP_EXT__ \
+     || (defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L))
+/* C2X; formerly Technical Report 24732, extension for decimal
+   floating-point arithmetic: Characteristic of decimal floating types
+   <float.h>, and TS 18661-2.  */
 
 /* Number of base-FLT_RADIX digits in the significand, p.  */
 #undef DEC32_MANT_DIG
@@ -480,14 +484,6 @@ see the files COPYING3 and COPYING.RUNTIME respect
 #define DEC64_MIN	__DEC64_MIN__
 #define DEC128_MIN	__DEC128_MIN__
 
-/* Minimum subnormal positive floating-point number. */
-#undef DEC32_SUBNORMAL_MIN
-#undef DEC64_SUBNORMAL_MIN
-#undef DEC128_SUBNORMAL_MIN
-#define DEC32_SUBNORMAL_MIN       __DEC32_SUBNORMAL_MIN__
-#define DEC64_SUBNORMAL_MIN       __DEC64_SUBNORMAL_MIN__
-#define DEC128_SUBNORMAL_MIN      __DEC128_SUBNORMAL_MIN__
-
 /* The floating-point expression evaluation method.
          -1  indeterminate
          0  evaluate all operations and constants just to the range and
@@ -502,6 +498,33 @@ see the files COPYING3 and COPYING.RUNTIME respect
 #undef DEC_EVAL_METHOD
 #define DEC_EVAL_METHOD	__DEC_EVAL_METHOD__
 
-#endif /* __STDC_WANT_DEC_FP__ */
+#endif /* __STDC_WANT_DEC_FP__ || __STDC_WANT_IEC_60559_DFP_EXT__ || C2X.  */
 
+#ifdef __STDC_WANT_DEC_FP__
+
+/* Minimum subnormal positive floating-point number. */
+#undef DEC32_SUBNORMAL_MIN
+#undef DEC64_SUBNORMAL_MIN
+#undef DEC128_SUBNORMAL_MIN
+#define DEC32_SUBNORMAL_MIN       __DEC32_SUBNORMAL_MIN__
+#define DEC64_SUBNORMAL_MIN       __DEC64_SUBNORMAL_MIN__
+#define DEC128_SUBNORMAL_MIN      __DEC128_SUBNORMAL_MIN__
+
+#endif /* __STDC_WANT_DEC_FP__.  */
+
+#if (defined __STDC_WANT_IEC_60559_DFP_EXT__ \
+     || (defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L))
+
+/* Minimum subnormal positive floating-point number. */
+#undef DEC32_TRUE_MIN
+#undef DEC64_TRUE_MIN
+#undef DEC128_TRUE_MIN
+#define DEC32_TRUE_MIN       __DEC32_SUBNORMAL_MIN__
+#define DEC64_TRUE_MIN       __DEC64_SUBNORMAL_MIN__
+#define DEC128_TRUE_MIN      __DEC128_SUBNORMAL_MIN__
+
+#endif /* __STDC_WANT_IEC_60559_DFP_EXT__ || C2X.  */
+
+#endif /* __DEC32_MANT_DIG__ */
+
 #endif /* _FLOAT_H___ */
Index: gcc/testsuite/gcc.dg/c11-float-dfp-1.c
===================================================================
--- gcc/testsuite/gcc.dg/c11-float-dfp-1.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/c11-float-dfp-1.c	(working copy)
@@ -0,0 +1,5 @@
+/* Test DFP macros not defined in <float.h> for C11.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c11" } */
+
+#include "c2x-float-no-dfp-1.c"
Index: gcc/testsuite/gcc.dg/c2x-float-no-dfp-1.c
===================================================================
--- gcc/testsuite/gcc.dg/c2x-float-no-dfp-1.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/c2x-float-no-dfp-1.c	(working copy)
@@ -0,0 +1,101 @@
+/* Test DFP macros not defined in <float.h> if no DFP support.  */
+/* { dg-do compile { target { ! dfp } } } */
+/* { dg-options "-std=c2x" } */
+
+#include <float.h>
+
+#ifdef DEC32_MANT_DIG
+# error "DEC32_MANT_DIG defined"
+#endif
+
+#ifdef DEC64_MANT_DIG
+# error "DEC64_MANT_DIG defined"
+#endif
+
+#ifdef DEC128_MANT_DIG
+# error "DEC128_MANT_DIG defined"
+#endif
+
+#ifdef DEC32_MIN_EXP
+# error "DEC32_MIN_EXP defined"
+#endif
+
+#ifdef DEC64_MIN_EXP
+# error "DEC64_MIN_EXP defined"
+#endif
+
+#ifdef DEC128_MIN_EXP
+# error "DEC128_MIN_EXP defined"
+#endif
+
+#ifdef DEC32_MAX_EXP
+# error "DEC32_MAX_EXP defined"
+#endif
+
+#ifdef DEC64_MAX_EXP
+# error "DEC64_MAX_EXP defined"
+#endif
+
+#ifdef DEC128_MAX_EXP
+# error "DEC128_MAX_EXP defined"
+#endif
+
+#ifdef DEC32_MAX
+# error "DEC32_MAX defined"
+#endif
+
+#ifdef DEC64_MAX
+# error "DEC64_MAX defined"
+#endif
+
+#ifdef DEC128_MAX
+# error "DEC128_MAX defined"
+#endif
+
+#ifdef DEC32_EPSILON
+# error "DEC32_EPSILON defined"
+#endif
+
+#ifdef DEC64_EPSILON
+# error "DEC64_EPSILON defined"
+#endif
+
+#ifdef DEC128_EPSILON
+# error "DEC128_EPSILON defined"
+#endif
+
+#ifdef DEC32_MIN
+# error "DEC32_MIN defined"
+#endif
+
+#ifdef DEC64_MIN
+# error "DEC64_MIN defined"
+#endif
+
+#ifdef DEC128_MIN
+# error "DEC128_MIN defined"
+#endif
+
+#ifdef DEC32_TRUE_MIN
+# error "DEC32_TRUE_MIN defined"
+#endif
+
+#ifdef DEC64_TRUE_MIN
+# error "DEC64_TRUE_MIN defined"
+#endif
+
+#ifdef DEC128_TRUE_MIN
+# error "DEC128_TRUE_MIN defined"
+#endif
+
+#ifdef DEC32_SUBNORMAL_MIN
+# error "DEC32_SUBNORMAL_MIN defined"
+#endif
+
+#ifdef DEC64_SUBNORMAL_MIN
+# error "DEC64_SUBNORMAL_MIN defined"
+#endif
+
+#ifdef DEC128_SUBNORMAL_MIN
+# error "DEC128_SUBNORMAL_MIN defined"
+#endif
Index: gcc/testsuite/gcc.dg/c2x-float-no-dfp-2.c
===================================================================
--- gcc/testsuite/gcc.dg/c2x-float-no-dfp-2.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/c2x-float-no-dfp-2.c	(working copy)
@@ -0,0 +1,9 @@
+/* Test DFP macros not defined in <float.h> if no DFP support.  Test
+   with feature test macros defined.  */
+/* { dg-do compile { target { ! dfp } } } */
+/* { dg-options "-std=c2x" } */
+
+#define __STDC_WANT_DEC_FP__
+#define __STDC_WANT_IEC_60559_DFP_EXT__
+
+#include "c2x-float-no-dfp-1.c"
Index: gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-1.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-1.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-1.c	(working copy)
@@ -0,0 +1,103 @@
+/* Test DFP macros defined in <float.h> with DFP support.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2x" } */
+
+#include <float.h>
+
+#ifndef DEC32_MANT_DIG
+# error "DEC32_MANT_DIG not defined"
+#endif
+
+#ifndef DEC64_MANT_DIG
+# error "DEC64_MANT_DIG not defined"
+#endif
+
+#ifndef DEC128_MANT_DIG
+# error "DEC128_MANT_DIG not defined"
+#endif
+
+#ifndef DEC32_MIN_EXP
+# error "DEC32_MIN_EXP not defined"
+#endif
+
+#ifndef DEC64_MIN_EXP
+# error "DEC64_MIN_EXP not defined"
+#endif
+
+#ifndef DEC128_MIN_EXP
+# error "DEC128_MIN_EXP not defined"
+#endif
+
+#ifndef DEC32_MAX_EXP
+# error "DEC32_MAX_EXP not defined"
+#endif
+
+#ifndef DEC64_MAX_EXP
+# error "DEC64_MAX_EXP not defined"
+#endif
+
+#ifndef DEC128_MAX_EXP
+# error "DEC128_MAX_EXP not defined"
+#endif
+
+#ifndef DEC32_MAX
+# error "DEC32_MAX not defined"
+#endif
+
+#ifndef DEC64_MAX
+# error "DEC64_MAX not defined"
+#endif
+
+#ifndef DEC128_MAX
+# error "DEC128_MAX not defined"
+#endif
+
+#ifndef DEC32_EPSILON
+# error "DEC32_EPSILON not defined"
+#endif
+
+#ifndef DEC64_EPSILON
+# error "DEC64_EPSILON not defined"
+#endif
+
+#ifndef DEC128_EPSILON
+# error "DEC128_EPSILON not defined"
+#endif
+
+#ifndef DEC32_MIN
+# error "DEC32_MIN not defined"
+#endif
+
+#ifndef DEC64_MIN
+# error "DEC64_MIN not defined"
+#endif
+
+#ifndef DEC128_MIN
+# error "DEC128_MIN not defined"
+#endif
+
+#ifndef DEC32_TRUE_MIN
+# error "DEC32_TRUE_MIN not defined"
+#endif
+
+#ifndef DEC64_TRUE_MIN
+# error "DEC64_TRUE_MIN not defined"
+#endif
+
+#ifndef DEC128_TRUE_MIN
+# error "DEC128_TRUE_MIN not defined"
+#endif
+
+/* These macros from TR 24732 should not be defined.  */
+
+#ifdef DEC32_SUBNORMAL_MIN
+# error "DEC32_SUBNORMAL_MIN defined"
+#endif
+
+#ifdef DEC64_SUBNORMAL_MIN
+# error "DEC64_SUBNORMAL_MIN defined"
+#endif
+
+#ifdef DEC128_SUBNORMAL_MIN
+# error "DEC128_SUBNORMAL_MIN defined"
+#endif
Index: gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-2.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-2.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-2.c	(working copy)
@@ -0,0 +1,8 @@
+/* Test DFP macros defined in <float.h> with DFP support.  TS 18661-2
+   feature test macro does not change what is defined.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2x" } */
+
+#define __STDC_WANT_IEC_60559_DFP_EXT__
+
+#include "c2x-float-dfp-1.c"
Index: gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-3.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-3.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-3.c	(working copy)
@@ -0,0 +1,103 @@
+/* Test DFP macros defined in <float.h> with DFP support.  TR 24732
+   feature test macro causes *_SUBNORMAL_MIN macros to be defined.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2x" } */
+
+#define __STDC_WANT_DEC_FP__
+#include <float.h>
+
+#ifndef DEC32_MANT_DIG
+# error "DEC32_MANT_DIG not defined"
+#endif
+
+#ifndef DEC64_MANT_DIG
+# error "DEC64_MANT_DIG not defined"
+#endif
+
+#ifndef DEC128_MANT_DIG
+# error "DEC128_MANT_DIG not defined"
+#endif
+
+#ifndef DEC32_MIN_EXP
+# error "DEC32_MIN_EXP not defined"
+#endif
+
+#ifndef DEC64_MIN_EXP
+# error "DEC64_MIN_EXP not defined"
+#endif
+
+#ifndef DEC128_MIN_EXP
+# error "DEC128_MIN_EXP not defined"
+#endif
+
+#ifndef DEC32_MAX_EXP
+# error "DEC32_MAX_EXP not defined"
+#endif
+
+#ifndef DEC64_MAX_EXP
+# error "DEC64_MAX_EXP not defined"
+#endif
+
+#ifndef DEC128_MAX_EXP
+# error "DEC128_MAX_EXP not defined"
+#endif
+
+#ifndef DEC32_MAX
+# error "DEC32_MAX not defined"
+#endif
+
+#ifndef DEC64_MAX
+# error "DEC64_MAX not defined"
+#endif
+
+#ifndef DEC128_MAX
+# error "DEC128_MAX not defined"
+#endif
+
+#ifndef DEC32_EPSILON
+# error "DEC32_EPSILON not defined"
+#endif
+
+#ifndef DEC64_EPSILON
+# error "DEC64_EPSILON not defined"
+#endif
+
+#ifndef DEC128_EPSILON
+# error "DEC128_EPSILON not defined"
+#endif
+
+#ifndef DEC32_MIN
+# error "DEC32_MIN not defined"
+#endif
+
+#ifndef DEC64_MIN
+# error "DEC64_MIN not defined"
+#endif
+
+#ifndef DEC128_MIN
+# error "DEC128_MIN not defined"
+#endif
+
+#ifndef DEC32_TRUE_MIN
+# error "DEC32_TRUE_MIN not defined"
+#endif
+
+#ifndef DEC64_TRUE_MIN
+# error "DEC64_TRUE_MIN not defined"
+#endif
+
+#ifndef DEC128_TRUE_MIN
+# error "DEC128_TRUE_MIN not defined"
+#endif
+
+#ifndef DEC32_SUBNORMAL_MIN
+# error "DEC32_SUBNORMAL_MIN not defined"
+#endif
+
+#ifndef DEC64_SUBNORMAL_MIN
+# error "DEC64_SUBNORMAL_MIN not defined"
+#endif
+
+#ifndef DEC128_SUBNORMAL_MIN
+# error "DEC128_SUBNORMAL_MIN not defined"
+#endif
Index: gcc/testsuite/gcc.dg/dfp/tr24732-float-dfp-1.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/tr24732-float-dfp-1.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/dfp/tr24732-float-dfp-1.c	(working copy)
@@ -0,0 +1,106 @@
+/* Test DFP macros defined in <float.h> with DFP support.  TR 24732
+   feature test macro causes SUBNORMAL_MIN macros to be defined but
+   not TRUE_MIN ones.  */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+
+#define __STDC_WANT_DEC_FP__
+#include <float.h>
+
+#ifndef DEC32_MANT_DIG
+# error "DEC32_MANT_DIG not defined"
+#endif
+
+#ifndef DEC64_MANT_DIG
+# error "DEC64_MANT_DIG not defined"
+#endif
+
+#ifndef DEC128_MANT_DIG
+# error "DEC128_MANT_DIG not defined"
+#endif
+
+#ifndef DEC32_MIN_EXP
+# error "DEC32_MIN_EXP not defined"
+#endif
+
+#ifndef DEC64_MIN_EXP
+# error "DEC64_MIN_EXP not defined"
+#endif
+
+#ifndef DEC128_MIN_EXP
+# error "DEC128_MIN_EXP not defined"
+#endif
+
+#ifndef DEC32_MAX_EXP
+# error "DEC32_MAX_EXP not defined"
+#endif
+
+#ifndef DEC64_MAX_EXP
+# error "DEC64_MAX_EXP not defined"
+#endif
+
+#ifndef DEC128_MAX_EXP
+# error "DEC128_MAX_EXP not defined"
+#endif
+
+#ifndef DEC32_MAX
+# error "DEC32_MAX not defined"
+#endif
+
+#ifndef DEC64_MAX
+# error "DEC64_MAX not defined"
+#endif
+
+#ifndef DEC128_MAX
+# error "DEC128_MAX not defined"
+#endif
+
+#ifndef DEC32_EPSILON
+# error "DEC32_EPSILON not defined"
+#endif
+
+#ifndef DEC64_EPSILON
+# error "DEC64_EPSILON not defined"
+#endif
+
+#ifndef DEC128_EPSILON
+# error "DEC128_EPSILON not defined"
+#endif
+
+#ifndef DEC32_MIN
+# error "DEC32_MIN not defined"
+#endif
+
+#ifndef DEC64_MIN
+# error "DEC64_MIN not defined"
+#endif
+
+#ifndef DEC128_MIN
+# error "DEC128_MIN not defined"
+#endif
+
+#ifndef DEC32_SUBNORMAL_MIN
+# error "DEC32_SUBNORMAL_MIN not defined"
+#endif
+
+#ifndef DEC64_SUBNORMAL_MIN
+# error "DEC64_SUBNORMAL_MIN not defined"
+#endif
+
+#ifndef DEC128_SUBNORMAL_MIN
+# error "DEC128_SUBNORMAL_MIN not defined"
+#endif
+
+/* These macros from C2X should not be defined.  */
+
+#ifdef DEC32_TRUE_MIN
+# error "DEC32_TRUE_MIN defined"
+#endif
+
+#ifdef DEC64_TRUE_MIN
+# error "DEC64_TRUE_MIN defined"
+#endif
+
+#ifdef DEC128_TRUE_MIN
+# error "DEC128_TRUE_MIN defined"
+#endif
Index: gcc/testsuite/gcc.dg/dfp/ts18661-2-float-dfp-1.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/ts18661-2-float-dfp-1.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/dfp/ts18661-2-float-dfp-1.c	(working copy)
@@ -0,0 +1,8 @@
+/* Test DFP macros defined in <float.h> with DFP support.  TS 18661-2
+   feature test macro causes same macros to be defined as for C2X.  */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+
+#define __STDC_WANT_IEC_60559_DFP_EXT__
+
+#include "c2x-float-dfp-1.c"
