https://gcc.gnu.org/g:eb45d151fa1780d01533d9fc9545fec50bfd7152

commit r15-5189-geb45d151fa1780d01533d9fc9545fec50bfd7152
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Wed Nov 13 09:41:41 2024 +0100

    c: Implement C2Y N3298 - Introduce complex literals [PR117029]
    
    The following patch implements the C2Y N3298 paper Introduce complex 
literals
    by providing different (or no) diagnostics on imaginary constants (except
    for integer ones).
    For _DecimalN constants we don't support _Complex _DecimalN and error on any
    i/j suffixes mixed with DD/DL/DF, so nothing changed there.
    
    2024-11-13  Jakub Jelinek  <ja...@redhat.com>
    
            PR c/117029
    libcpp/
            * include/cpplib.h (struct cpp_options): Add imaginary_constants
            member.
            * init.cc (struct lang_flags): Add imaginary_constants bitfield.
            (lang_defaults): Add column for imaginary_constants.
            (cpp_set_lang): Copy over imaginary_constants.
            * expr.cc (cpp_classify_number): Diagnose CPP_N_IMAGINARY
            non-CPP_N_FLOATING constants differently for C.
    gcc/testsuite/
            * gcc.dg/cpp/pr7263-3.c: Adjust expected diagnostic wording.
            * gcc.dg/c23-imaginary-constants-1.c: New test.
            * gcc.dg/c23-imaginary-constants-2.c: New test.
            * gcc.dg/c23-imaginary-constants-3.c: New test.
            * gcc.dg/c23-imaginary-constants-4.c: New test.
            * gcc.dg/c23-imaginary-constants-5.c: New test.
            * gcc.dg/c23-imaginary-constants-6.c: New test.
            * gcc.dg/c23-imaginary-constants-7.c: New test.
            * gcc.dg/c23-imaginary-constants-8.c: New test.
            * gcc.dg/c23-imaginary-constants-9.c: New test.
            * gcc.dg/c23-imaginary-constants-10.c: New test.
            * gcc.dg/c2y-imaginary-constants-1.c: New test.
            * gcc.dg/c2y-imaginary-constants-2.c: New test.
            * gcc.dg/c2y-imaginary-constants-3.c: New test.
            * gcc.dg/c2y-imaginary-constants-4.c: New test.
            * gcc.dg/c2y-imaginary-constants-5.c: New test.
            * gcc.dg/c2y-imaginary-constants-6.c: New test.
            * gcc.dg/c2y-imaginary-constants-7.c: New test.
            * gcc.dg/c2y-imaginary-constants-8.c: New test.
            * gcc.dg/c2y-imaginary-constants-9.c: New test.
            * gcc.dg/c2y-imaginary-constants-10.c: New test.
            * gcc.dg/c2y-imaginary-constants-11.c: New test.
            * gcc.dg/c2y-imaginary-constants-12.c: New test.

Diff:
---
 gcc/testsuite/gcc.dg/c23-imaginary-constants-1.c  | 58 ++++++++++++++++++++
 gcc/testsuite/gcc.dg/c23-imaginary-constants-10.c | 14 +++++
 gcc/testsuite/gcc.dg/c23-imaginary-constants-2.c  | 28 ++++++++++
 gcc/testsuite/gcc.dg/c23-imaginary-constants-3.c  | 64 ++++++++++++++++++++++
 gcc/testsuite/gcc.dg/c23-imaginary-constants-4.c  | 34 ++++++++++++
 gcc/testsuite/gcc.dg/c23-imaginary-constants-5.c  | 28 ++++++++++
 gcc/testsuite/gcc.dg/c23-imaginary-constants-6.c  | 14 +++++
 gcc/testsuite/gcc.dg/c23-imaginary-constants-7.c  | 28 ++++++++++
 gcc/testsuite/gcc.dg/c23-imaginary-constants-8.c  | 14 +++++
 gcc/testsuite/gcc.dg/c23-imaginary-constants-9.c  | 28 ++++++++++
 gcc/testsuite/gcc.dg/c2y-imaginary-constants-1.c  |  5 ++
 gcc/testsuite/gcc.dg/c2y-imaginary-constants-10.c | 14 +++++
 gcc/testsuite/gcc.dg/c2y-imaginary-constants-11.c | 58 ++++++++++++++++++++
 gcc/testsuite/gcc.dg/c2y-imaginary-constants-12.c | 28 ++++++++++
 gcc/testsuite/gcc.dg/c2y-imaginary-constants-2.c  | 28 ++++++++++
 gcc/testsuite/gcc.dg/c2y-imaginary-constants-3.c  | 11 ++++
 gcc/testsuite/gcc.dg/c2y-imaginary-constants-4.c  | 34 ++++++++++++
 gcc/testsuite/gcc.dg/c2y-imaginary-constants-5.c  |  7 +++
 gcc/testsuite/gcc.dg/c2y-imaginary-constants-6.c  | 14 +++++
 gcc/testsuite/gcc.dg/c2y-imaginary-constants-7.c  |  7 +++
 gcc/testsuite/gcc.dg/c2y-imaginary-constants-8.c  | 14 +++++
 gcc/testsuite/gcc.dg/c2y-imaginary-constants-9.c  |  7 +++
 gcc/testsuite/gcc.dg/cpp/pr7263-3.c               |  2 +-
 libcpp/expr.cc                                    | 21 +++++++-
 libcpp/include/cpplib.h                           |  3 ++
 libcpp/init.cc                                    | 66 ++++++++++++-----------
 26 files changed, 594 insertions(+), 35 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/c23-imaginary-constants-1.c 
b/gcc/testsuite/gcc.dg/c23-imaginary-constants-1.c
new file mode 100644
index 000000000000..afebc21edab8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c23-imaginary-constants-1.c
@@ -0,0 +1,58 @@
+/* Test that imaginary constants are diagnosed in C23 mode: -pedantic.  */
+/* { dg-do run } */
+/* { dg-options "-std=c23 -pedantic" } */
+
+_Complex float a = 1.if;       /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex float b = 2.Fj;       /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex float c = 3.fI;       /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex float d = 4.JF;       /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex double e = 1.i;       /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex double f = 2.j;       /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex double g = 3.I;       /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex double h = 4.J;       /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex long double i = 1.il; /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex long double j = 2.Lj; /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex long double k = 3.lI; /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex long double l = 4.JL; /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+__extension__ _Complex float m = 1.if;
+__extension__ _Complex float n = 2.Fj;
+__extension__ _Complex float o = 3.fI;
+__extension__ _Complex float p = 4.JF;
+__extension__ _Complex double q = 1.i;
+__extension__ _Complex double r = 2.j;
+__extension__ _Complex double s = 3.I;
+__extension__ _Complex double t = 4.J;
+__extension__ _Complex long double u = 1.il;
+__extension__ _Complex long double v = 2.Lj;
+__extension__ _Complex long double w = 3.lI;
+__extension__ _Complex long double x = 4.JL;
+
+int
+main ()
+{
+  if (a * a != -1.f
+      || b * b != -4.f
+      || c * c != -9.f
+      || d * d != -16.f
+      || e * e != -1.
+      || f * f != -4.
+      || g * g != -9.
+      || h * h != -16.
+      || i * i != -1.L
+      || j * j != -4.L
+      || k * k != -9.L
+      || l * l != -16.L
+      || m * m != -1.f
+      || n * n != -4.f
+      || o * o != -9.f
+      || p * p != -16.f
+      || q * q != -1.
+      || r * r != -4.
+      || s * s != -9.
+      || t * t != -16.
+      || u * u != -1.L
+      || v * v != -4.L
+      || w * w != -9.L
+      || x * x != -16.L)
+    __builtin_abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/c23-imaginary-constants-10.c 
b/gcc/testsuite/gcc.dg/c23-imaginary-constants-10.c
new file mode 100644
index 000000000000..90165c1c56f7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c23-imaginary-constants-10.c
@@ -0,0 +1,14 @@
+/* Test that imaginary constants are diagnosed in C23 mode: -pedantic-errors.  
*/
+/* { dg-do compile } */
+/* { dg-options "-std=c23 -pedantic-errors" } */
+/* { dg-add-options float64x } */
+/* { dg-require-effective-target float64x } */
+
+_Complex _Float64x a = 1.if64x;        /* { dg-error "imaginary constants are 
a C2Y feature or GCC extension" } */
+_Complex _Float64x b = 2.F64xj;        /* { dg-error "imaginary constants are 
a C2Y feature or GCC extension" } */
+_Complex _Float64x c = 3.f64xi;        /* { dg-error "imaginary constants are 
a C2Y feature or GCC extension" } */
+_Complex _Float64x d = 4.JF64x;        /* { dg-error "imaginary constants are 
a C2Y feature or GCC extension" } */
+__extension__ _Complex _Float64x e = 1.if64x;
+__extension__ _Complex _Float64x f = 2.F64xj;
+__extension__ _Complex _Float64x g = 3.f64xi;
+__extension__ _Complex _Float64x h = 4.JF64x;
diff --git a/gcc/testsuite/gcc.dg/c23-imaginary-constants-2.c 
b/gcc/testsuite/gcc.dg/c23-imaginary-constants-2.c
new file mode 100644
index 000000000000..4d23ff314247
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c23-imaginary-constants-2.c
@@ -0,0 +1,28 @@
+/* Test that imaginary constants are diagnosed in C23 mode: -pedantic-errors.  
*/
+/* { dg-do compile } */
+/* { dg-options "-std=c23 -pedantic-errors" } */
+
+_Complex float a = 1.if;       /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex float b = 2.Fj;       /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex float c = 3.fI;       /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex float d = 4.JF;       /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex double e = 1.i;       /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex double f = 2.j;       /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex double g = 3.I;       /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex double h = 4.J;       /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex long double i = 1.il; /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex long double j = 2.Lj; /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex long double k = 3.lI; /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex long double l = 4.JL; /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+__extension__ _Complex float m = 1.if;
+__extension__ _Complex float n = 2.Fj;
+__extension__ _Complex float o = 3.fI;
+__extension__ _Complex float p = 4.JF;
+__extension__ _Complex double q = 1.i;
+__extension__ _Complex double r = 2.j;
+__extension__ _Complex double s = 3.I;
+__extension__ _Complex double t = 4.J;
+__extension__ _Complex long double u = 1.il;
+__extension__ _Complex long double v = 2.Lj;
+__extension__ _Complex long double w = 3.lI;
+__extension__ _Complex long double x = 4.JL;
diff --git a/gcc/testsuite/gcc.dg/c23-imaginary-constants-3.c 
b/gcc/testsuite/gcc.dg/c23-imaginary-constants-3.c
new file mode 100644
index 000000000000..ee003b2c1053
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c23-imaginary-constants-3.c
@@ -0,0 +1,64 @@
+/* Test that imaginary constants are diagnosed in C23 mode: -pedantic.  */
+/* { dg-do run } */
+/* { dg-options "-std=c23 -pedantic" } */
+/* { dg-add-options float32 } */
+/* { dg-add-options float64 } */
+/* { dg-add-options float32x } */
+/* { dg-require-effective-target float32 } */
+/* { dg-require-effective-target float32x } */
+/* { dg-require-effective-target float64 } */
+
+_Complex _Float32 a = 1.if32;  /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float32 b = 2.F32j;  /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float32 c = 3.f32i;  /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float32 d = 4.JF32;  /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float64 e = 1.if64;  /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float64 f = 2.F64j;  /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float64 g = 3.f64i;  /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float64 h = 4.JF64;  /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float32x i = 1.if32x;        /* { dg-warning "imaginary constants 
are a C2Y feature or GCC extension" } */
+_Complex _Float32x j = 2.F32xj;        /* { dg-warning "imaginary constants 
are a C2Y feature or GCC extension" } */
+_Complex _Float32x k = 3.f32xI;        /* { dg-warning "imaginary constants 
are a C2Y feature or GCC extension" } */
+_Complex _Float32x l = 4.JF32x;        /* { dg-warning "imaginary constants 
are a C2Y feature or GCC extension" } */
+__extension__ _Complex _Float32 m = 1.if32;
+__extension__ _Complex _Float32 n = 2.F32j;
+__extension__ _Complex _Float32 o = 3.f32i;
+__extension__ _Complex _Float32 p = 4.JF32;
+__extension__ _Complex _Float64 q = 1.if64;
+__extension__ _Complex _Float64 r = 2.F64j;
+__extension__ _Complex _Float64 s = 3.f64i;
+__extension__ _Complex _Float64 t = 4.JF64;
+__extension__ _Complex _Float32x u = 1.if32x;
+__extension__ _Complex _Float32x v = 2.F32xj;
+__extension__ _Complex _Float32x w = 3.f32xI;
+__extension__ _Complex _Float32x x = 4.JF32x;
+
+int
+main ()
+{
+  if (a * a != -1.f32
+      || b * b != -4.f32
+      || c * c != -9.f32
+      || d * d != -16.f32
+      || e * e != -1.f64
+      || f * f != -4.f64
+      || g * g != -9.f64
+      || h * h != -16.f64
+      || i * i != -1.f32x
+      || j * j != -4.f32x
+      || k * k != -9.f32x
+      || l * l != -16.f32x
+      || m * m != -1.f32
+      || n * n != -4.f32
+      || o * o != -9.f32
+      || p * p != -16.f32
+      || q * q != -1.f64
+      || r * r != -4.f64
+      || s * s != -9.f64
+      || t * t != -16.f64
+      || u * u != -1.f32x
+      || v * v != -4.f32x
+      || w * w != -9.f32x
+      || x * x != -16.f32x)
+    __builtin_abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/c23-imaginary-constants-4.c 
b/gcc/testsuite/gcc.dg/c23-imaginary-constants-4.c
new file mode 100644
index 000000000000..cdc51d524b5a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c23-imaginary-constants-4.c
@@ -0,0 +1,34 @@
+/* Test that imaginary constants are diagnosed in C23 mode: -pedantic-errors.  
*/
+/* { dg-do compile } */
+/* { dg-options "-std=c23 -pedantic-errors" } */
+/* { dg-add-options float32 } */
+/* { dg-add-options float64 } */
+/* { dg-add-options float32x } */
+/* { dg-require-effective-target float32 } */
+/* { dg-require-effective-target float32x } */
+/* { dg-require-effective-target float64 } */
+
+_Complex _Float32 a = 1.if32;  /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float32 b = 2.F32j;  /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float32 c = 3.f32i;  /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float32 d = 4.JF32;  /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float64 e = 1.if64;  /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float64 f = 2.F64j;  /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float64 g = 3.f64i;  /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float64 h = 4.JF64;  /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float32x i = 1.if32x;        /* { dg-error "imaginary constants are 
a C2Y feature or GCC extension" } */
+_Complex _Float32x j = 2.F32xj;        /* { dg-error "imaginary constants are 
a C2Y feature or GCC extension" } */
+_Complex _Float32x k = 3.f32xI;        /* { dg-error "imaginary constants are 
a C2Y feature or GCC extension" } */
+_Complex _Float32x l = 4.JF32x;        /* { dg-error "imaginary constants are 
a C2Y feature or GCC extension" } */
+__extension__ _Complex _Float32 m = 1.if32;
+__extension__ _Complex _Float32 n = 2.F32j;
+__extension__ _Complex _Float32 o = 3.f32i;
+__extension__ _Complex _Float32 p = 4.JF32;
+__extension__ _Complex _Float64 q = 1.if64;
+__extension__ _Complex _Float64 r = 2.F64j;
+__extension__ _Complex _Float64 s = 3.f64i;
+__extension__ _Complex _Float64 t = 4.JF64;
+__extension__ _Complex _Float32x u = 1.if32x;
+__extension__ _Complex _Float32x v = 2.F32xj;
+__extension__ _Complex _Float32x w = 3.f32xI;
+__extension__ _Complex _Float32x x = 4.JF32x;
diff --git a/gcc/testsuite/gcc.dg/c23-imaginary-constants-5.c 
b/gcc/testsuite/gcc.dg/c23-imaginary-constants-5.c
new file mode 100644
index 000000000000..82b5fbe41032
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c23-imaginary-constants-5.c
@@ -0,0 +1,28 @@
+/* Test that imaginary constants are diagnosed in C23 mode: -pedantic.  */
+/* { dg-do run } */
+/* { dg-options "-std=c23 -pedantic" } */
+/* { dg-add-options float128 } */
+/* { dg-require-effective-target float128 } */
+
+_Complex _Float128 a = 1.if128;        /* { dg-warning "imaginary constants 
are a C2Y feature or GCC extension" } */
+_Complex _Float128 b = 2.F128j;        /* { dg-warning "imaginary constants 
are a C2Y feature or GCC extension" } */
+_Complex _Float128 c = 3.f128i;        /* { dg-warning "imaginary constants 
are a C2Y feature or GCC extension" } */
+_Complex _Float128 d = 4.JF128;        /* { dg-warning "imaginary constants 
are a C2Y feature or GCC extension" } */
+__extension__ _Complex _Float128 e = 1.if128;
+__extension__ _Complex _Float128 f = 2.F128j;
+__extension__ _Complex _Float128 g = 3.f128i;
+__extension__ _Complex _Float128 h = 4.JF128;
+
+int
+main ()
+{
+  if (a * a != -1.f128
+      || b * b != -4.f128
+      || c * c != -9.f128
+      || d * d != -16.f128
+      || e * e != -1.f128
+      || f * f != -4.f128
+      || g * g != -9.f128
+      || h * h != -16.f128)
+    __builtin_abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/c23-imaginary-constants-6.c 
b/gcc/testsuite/gcc.dg/c23-imaginary-constants-6.c
new file mode 100644
index 000000000000..7e9736db1ff1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c23-imaginary-constants-6.c
@@ -0,0 +1,14 @@
+/* Test that imaginary constants are diagnosed in C23 mode: -pedantic-errors.  
*/
+/* { dg-do compile } */
+/* { dg-options "-std=c23 -pedantic-errors" } */
+/* { dg-add-options float128 } */
+/* { dg-require-effective-target float128 } */
+
+_Complex _Float128 a = 1.if128;        /* { dg-error "imaginary constants are 
a C2Y feature or GCC extension" } */
+_Complex _Float128 b = 2.F128j;        /* { dg-error "imaginary constants are 
a C2Y feature or GCC extension" } */
+_Complex _Float128 c = 3.f128i;        /* { dg-error "imaginary constants are 
a C2Y feature or GCC extension" } */
+_Complex _Float128 d = 4.JF128;        /* { dg-error "imaginary constants are 
a C2Y feature or GCC extension" } */
+__extension__ _Complex _Float128 e = 1.if128;
+__extension__ _Complex _Float128 f = 2.F128j;
+__extension__ _Complex _Float128 g = 3.f128i;
+__extension__ _Complex _Float128 h = 4.JF128;
diff --git a/gcc/testsuite/gcc.dg/c23-imaginary-constants-7.c 
b/gcc/testsuite/gcc.dg/c23-imaginary-constants-7.c
new file mode 100644
index 000000000000..d5975f82ac5e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c23-imaginary-constants-7.c
@@ -0,0 +1,28 @@
+/* Test that imaginary constants are diagnosed in C23 mode: -pedantic.  */
+/* { dg-do run } */
+/* { dg-options "-std=c23 -pedantic" } */
+/* { dg-add-options float16 } */
+/* { dg-require-effective-target float16 } */
+
+_Complex _Float16 a = 1.if16;  /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float16 b = 2.F16j;  /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float16 c = 3.f16i;  /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float16 d = 4.JF16;  /* { dg-warning "imaginary constants are a C2Y 
feature or GCC extension" } */
+__extension__ _Complex _Float16 e = 1.if16;
+__extension__ _Complex _Float16 f = 2.F16j;
+__extension__ _Complex _Float16 g = 3.f16i;
+__extension__ _Complex _Float16 h = 4.JF16;
+
+int
+main ()
+{
+  if (a * a != -1.f16
+      || b * b != -4.f16
+      || c * c != -9.f16
+      || d * d != -16.f16
+      || e * e != -1.f16
+      || f * f != -4.f16
+      || g * g != -9.f16
+      || h * h != -16.f16)
+    __builtin_abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/c23-imaginary-constants-8.c 
b/gcc/testsuite/gcc.dg/c23-imaginary-constants-8.c
new file mode 100644
index 000000000000..5539f2ec8241
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c23-imaginary-constants-8.c
@@ -0,0 +1,14 @@
+/* Test that imaginary constants are diagnosed in C23 mode: -pedantic-errors.  
*/
+/* { dg-do compile } */
+/* { dg-options "-std=c23 -pedantic-errors" } */
+/* { dg-add-options float16 } */
+/* { dg-require-effective-target float16 } */
+
+_Complex _Float16 a = 1.if16;  /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float16 b = 2.F16j;  /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float16 c = 3.f16i;  /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+_Complex _Float16 d = 4.JF16;  /* { dg-error "imaginary constants are a C2Y 
feature or GCC extension" } */
+__extension__ _Complex _Float16 e = 1.if16;
+__extension__ _Complex _Float16 f = 2.F16j;
+__extension__ _Complex _Float16 g = 3.f16i;
+__extension__ _Complex _Float16 h = 4.JF16;
diff --git a/gcc/testsuite/gcc.dg/c23-imaginary-constants-9.c 
b/gcc/testsuite/gcc.dg/c23-imaginary-constants-9.c
new file mode 100644
index 000000000000..8b5a53ddf2f0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c23-imaginary-constants-9.c
@@ -0,0 +1,28 @@
+/* Test that imaginary constants are diagnosed in C23 mode: -pedantic.  */
+/* { dg-do run } */
+/* { dg-options "-std=c23 -pedantic" } */
+/* { dg-add-options float64x } */
+/* { dg-require-effective-target float64x } */
+
+_Complex _Float64x a = 1.if64x;        /* { dg-warning "imaginary constants 
are a C2Y feature or GCC extension" } */
+_Complex _Float64x b = 2.F64xj;        /* { dg-warning "imaginary constants 
are a C2Y feature or GCC extension" } */
+_Complex _Float64x c = 3.f64xi;        /* { dg-warning "imaginary constants 
are a C2Y feature or GCC extension" } */
+_Complex _Float64x d = 4.JF64x;        /* { dg-warning "imaginary constants 
are a C2Y feature or GCC extension" } */
+__extension__ _Complex _Float64x e = 1.if64x;
+__extension__ _Complex _Float64x f = 2.F64xj;
+__extension__ _Complex _Float64x g = 3.f64xi;
+__extension__ _Complex _Float64x h = 4.JF64x;
+
+int
+main ()
+{
+  if (a * a != -1.f64x
+      || b * b != -4.f64x
+      || c * c != -9.f64x
+      || d * d != -16.f64x
+      || e * e != -1.f64x
+      || f * f != -4.f64x
+      || g * g != -9.f64x
+      || h * h != -16.f64x)
+    __builtin_abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/c2y-imaginary-constants-1.c 
b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-1.c
new file mode 100644
index 000000000000..8248f8624212
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-1.c
@@ -0,0 +1,5 @@
+/* Test that imaginary constants are accepted in C2Y mode: -pedantic.  */
+/* { dg-do run } */
+/* { dg-options "-std=c2y -pedantic" } */
+
+#include "c23-imaginary-constants-1.c"
diff --git a/gcc/testsuite/gcc.dg/c2y-imaginary-constants-10.c 
b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-10.c
new file mode 100644
index 000000000000..2b939321d389
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-10.c
@@ -0,0 +1,14 @@
+/* Test that imaginary constants are accepted in C2Y mode: compat warnings.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2y -Wc23-c2y-compat" } */
+/* { dg-add-options float64x } */
+/* { dg-require-effective-target float64x } */
+
+_Complex _Float64x a = 1.if64x;        /* { dg-warning "imaginary constants 
are a C2Y feature" } */
+_Complex _Float64x b = 2.F64xj;        /* { dg-warning "imaginary constants 
are a C2Y feature" } */
+_Complex _Float64x c = 3.f64xi;        /* { dg-warning "imaginary constants 
are a C2Y feature" } */
+_Complex _Float64x d = 4.JF64x;        /* { dg-warning "imaginary constants 
are a C2Y feature" } */
+__extension__ _Complex _Float64x e = 1.if64x;
+__extension__ _Complex _Float64x f = 2.F64xj;
+__extension__ _Complex _Float64x g = 3.f64xi;
+__extension__ _Complex _Float64x h = 4.JF64x;
diff --git a/gcc/testsuite/gcc.dg/c2y-imaginary-constants-11.c 
b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-11.c
new file mode 100644
index 000000000000..f3ca28483da8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-11.c
@@ -0,0 +1,58 @@
+/* Test that integral imaginary constants are diagnosed in C2Y mode: 
-pedantic.  */
+/* { dg-do run } */
+/* { dg-options "-std=gnu2y -pedantic" } */
+
+_Complex float a = 1i;         /* { dg-warning "imaginary constants are a GCC 
extension" } */
+_Complex float b = 2j;         /* { dg-warning "imaginary constants are a GCC 
extension" } */
+_Complex float c = 3I;         /* { dg-warning "imaginary constants are a GCC 
extension" } */
+_Complex float d = 4J;         /* { dg-warning "imaginary constants are a GCC 
extension" } */
+_Complex double e = 1il;       /* { dg-warning "imaginary constants are a GCC 
extension" } */
+_Complex double f = 2Lj;       /* { dg-warning "imaginary constants are a GCC 
extension" } */
+_Complex double g = 3lI;       /* { dg-warning "imaginary constants are a GCC 
extension" } */
+_Complex double h = 4JL;       /* { dg-warning "imaginary constants are a GCC 
extension" } */
+_Complex long double i = 1ill; /* { dg-warning "imaginary constants are a GCC 
extension" } */
+_Complex long double j = 2LLj; /* { dg-warning "imaginary constants are a GCC 
extension" } */
+_Complex long double k = 3llI; /* { dg-warning "imaginary constants are a GCC 
extension" } */
+_Complex long double l = 4JLL; /* { dg-warning "imaginary constants are a GCC 
extension" } */
+__extension__ _Complex float m = 1i;
+__extension__ _Complex float n = 2j;
+__extension__ _Complex float o = 3I;
+__extension__ _Complex float p = 4J;
+__extension__ _Complex double q = 1il;
+__extension__ _Complex double r = 2Lj;
+__extension__ _Complex double s = 3lI;
+__extension__ _Complex double t = 4JL;
+__extension__ _Complex long double u = 1ill;
+__extension__ _Complex long double v = 2LLj;
+__extension__ _Complex long double w = 3llI;
+__extension__ _Complex long double x = 4JLL;
+
+int
+main ()
+{
+  if (a * a != -1.f
+      || b * b != -4.f
+      || c * c != -9.f
+      || d * d != -16.f
+      || e * e != -1.
+      || f * f != -4.
+      || g * g != -9.
+      || h * h != -16.
+      || i * i != -1.L
+      || j * j != -4.L
+      || k * k != -9.L
+      || l * l != -16.L
+      || m * m != -1.f
+      || n * n != -4.f
+      || o * o != -9.f
+      || p * p != -16.f
+      || q * q != -1.
+      || r * r != -4.
+      || s * s != -9.
+      || t * t != -16.
+      || u * u != -1.L
+      || v * v != -4.L
+      || w * w != -9.L
+      || x * x != -16.L)
+    __builtin_abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/c2y-imaginary-constants-12.c 
b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-12.c
new file mode 100644
index 000000000000..4c425113c027
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-12.c
@@ -0,0 +1,28 @@
+/* Test that integral imaginary constants are diagnosed in C2Y mode: 
-pedantic-errors.  */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu2y -pedantic-errors" } */
+
+_Complex float a = 1i;         /* { dg-error "imaginary constants are a GCC 
extension" } */
+_Complex float b = 2j;         /* { dg-error "imaginary constants are a GCC 
extension" } */
+_Complex float c = 3I;         /* { dg-error "imaginary constants are a GCC 
extension" } */
+_Complex float d = 4J;         /* { dg-error "imaginary constants are a GCC 
extension" } */
+_Complex double e = 1il;       /* { dg-error "imaginary constants are a GCC 
extension" } */
+_Complex double f = 2Lj;       /* { dg-error "imaginary constants are a GCC 
extension" } */
+_Complex double g = 3lI;       /* { dg-error "imaginary constants are a GCC 
extension" } */
+_Complex double h = 4JL;       /* { dg-error "imaginary constants are a GCC 
extension" } */
+_Complex long double i = 1ill; /* { dg-error "imaginary constants are a GCC 
extension" } */
+_Complex long double j = 2LLj; /* { dg-error "imaginary constants are a GCC 
extension" } */
+_Complex long double k = 3llI; /* { dg-error "imaginary constants are a GCC 
extension" } */
+_Complex long double l = 4JLL; /* { dg-error "imaginary constants are a GCC 
extension" } */
+__extension__ _Complex float m = 1i;
+__extension__ _Complex float n = 2j;
+__extension__ _Complex float o = 3I;
+__extension__ _Complex float p = 4J;
+__extension__ _Complex double q = 1il;
+__extension__ _Complex double r = 2Lj;
+__extension__ _Complex double s = 3lI;
+__extension__ _Complex double t = 4JL;
+__extension__ _Complex long double u = 1ill;
+__extension__ _Complex long double v = 2LLj;
+__extension__ _Complex long double w = 3llI;
+__extension__ _Complex long double x = 4JLL;
diff --git a/gcc/testsuite/gcc.dg/c2y-imaginary-constants-2.c 
b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-2.c
new file mode 100644
index 000000000000..dd9350bf37d0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-2.c
@@ -0,0 +1,28 @@
+/* Test that imaginary constants are accepted in C2Y mode: compat warnings.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2y -Wc23-c2y-compat" } */
+
+_Complex float a = 1.if;       /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex float b = 2.Fj;       /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex float c = 3.fI;       /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex float d = 4.JF;       /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex double e = 1.i;       /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex double f = 2.j;       /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex double g = 3.I;       /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex double h = 4.J;       /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex long double i = 1.il; /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex long double j = 2.Lj; /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex long double k = 3.lI; /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex long double l = 4.JL; /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+__extension__ _Complex float m = 1.if;
+__extension__ _Complex float n = 2.Fj;
+__extension__ _Complex float o = 3.fI;
+__extension__ _Complex float p = 4.JF;
+__extension__ _Complex double q = 1.i;
+__extension__ _Complex double r = 2.j;
+__extension__ _Complex double s = 3.I;
+__extension__ _Complex double t = 4.J;
+__extension__ _Complex long double u = 1.il;
+__extension__ _Complex long double v = 2.Lj;
+__extension__ _Complex long double w = 3.lI;
+__extension__ _Complex long double x = 4.JL;
diff --git a/gcc/testsuite/gcc.dg/c2y-imaginary-constants-3.c 
b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-3.c
new file mode 100644
index 000000000000..216380c25c1e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-3.c
@@ -0,0 +1,11 @@
+/* Test that imaginary constants are accepted in C2Y mode: -pedantic.  */
+/* { dg-do run } */
+/* { dg-options "-std=c2y -pedantic" } */
+/* { dg-add-options float32 } */
+/* { dg-add-options float64 } */
+/* { dg-add-options float32x } */
+/* { dg-require-effective-target float32 } */
+/* { dg-require-effective-target float32x } */
+/* { dg-require-effective-target float64 } */
+
+#include "c23-imaginary-constants-3.c"
diff --git a/gcc/testsuite/gcc.dg/c2y-imaginary-constants-4.c 
b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-4.c
new file mode 100644
index 000000000000..dc096fb1e8e9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-4.c
@@ -0,0 +1,34 @@
+/* Test that imaginary constants are accepted in C2Y mode: compat warnings.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2y -Wc23-c2y-compat" } */
+/* { dg-add-options float32 } */
+/* { dg-add-options float64 } */
+/* { dg-add-options float32x } */
+/* { dg-require-effective-target float32 } */
+/* { dg-require-effective-target float32x } */
+/* { dg-require-effective-target float64 } */
+
+_Complex _Float32 a = 1.if32;  /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex _Float32 b = 2.F32j;  /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex _Float32 c = 3.f32i;  /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex _Float32 d = 4.JF32;  /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex _Float64 e = 1.if64;  /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex _Float64 f = 2.F64j;  /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex _Float64 g = 3.f64i;  /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex _Float64 h = 4.JF64;  /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex _Float32x i = 1.if32x;        /* { dg-warning "imaginary constants 
are a C2Y feature" } */
+_Complex _Float32x j = 2.F32xj;        /* { dg-warning "imaginary constants 
are a C2Y feature" } */
+_Complex _Float32x k = 3.f32xI;        /* { dg-warning "imaginary constants 
are a C2Y feature" } */
+_Complex _Float32x l = 4.JF32x;        /* { dg-warning "imaginary constants 
are a C2Y feature" } */
+__extension__ _Complex _Float32 m = 1.if32;
+__extension__ _Complex _Float32 n = 2.F32j;
+__extension__ _Complex _Float32 o = 3.f32i;
+__extension__ _Complex _Float32 p = 4.JF32;
+__extension__ _Complex _Float64 q = 1.if64;
+__extension__ _Complex _Float64 r = 2.F64j;
+__extension__ _Complex _Float64 s = 3.f64i;
+__extension__ _Complex _Float64 t = 4.JF64;
+__extension__ _Complex _Float32x u = 1.if32x;
+__extension__ _Complex _Float32x v = 2.F32xj;
+__extension__ _Complex _Float32x w = 3.f32xI;
+__extension__ _Complex _Float32x x = 4.JF32x;
diff --git a/gcc/testsuite/gcc.dg/c2y-imaginary-constants-5.c 
b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-5.c
new file mode 100644
index 000000000000..4e9ceafc73a6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-5.c
@@ -0,0 +1,7 @@
+/* Test that imaginary constants are accepted in C2Y mode: -pedantic.  */
+/* { dg-do run } */
+/* { dg-options "-std=c2y -pedantic" } */
+/* { dg-add-options float128 } */
+/* { dg-require-effective-target float128 } */
+
+#include "c23-imaginary-constants-5.c"
diff --git a/gcc/testsuite/gcc.dg/c2y-imaginary-constants-6.c 
b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-6.c
new file mode 100644
index 000000000000..2654fba83b0f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-6.c
@@ -0,0 +1,14 @@
+/* Test that imaginary constants are accepted in C2Y mode: compat warnings.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2y -Wc23-c2y-compat" } */
+/* { dg-add-options float128 } */
+/* { dg-require-effective-target float128 } */
+
+_Complex _Float128 a = 1.if128;        /* { dg-warning "imaginary constants 
are a C2Y feature" } */
+_Complex _Float128 b = 2.F128j;        /* { dg-warning "imaginary constants 
are a C2Y feature" } */
+_Complex _Float128 c = 3.f128i;        /* { dg-warning "imaginary constants 
are a C2Y feature" } */
+_Complex _Float128 d = 4.JF128;        /* { dg-warning "imaginary constants 
are a C2Y feature" } */
+__extension__ _Complex _Float128 e = 1.if128;
+__extension__ _Complex _Float128 f = 2.F128j;
+__extension__ _Complex _Float128 g = 3.f128i;
+__extension__ _Complex _Float128 h = 4.JF128;
diff --git a/gcc/testsuite/gcc.dg/c2y-imaginary-constants-7.c 
b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-7.c
new file mode 100644
index 000000000000..b31eba9ee796
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-7.c
@@ -0,0 +1,7 @@
+/* Test that imaginary constants are accepted in C2Y mode: -pedantic.  */
+/* { dg-do run } */
+/* { dg-options "-std=c2y -pedantic" } */
+/* { dg-add-options float16 } */
+/* { dg-require-effective-target float16 } */
+
+#include "c23-imaginary-constants-7.c"
diff --git a/gcc/testsuite/gcc.dg/c2y-imaginary-constants-8.c 
b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-8.c
new file mode 100644
index 000000000000..cf603dfd5745
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-8.c
@@ -0,0 +1,14 @@
+/* Test that imaginary constants are accepted in C2Y mode: compat warnings.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2y -Wc23-c2y-compat" } */
+/* { dg-add-options float16 } */
+/* { dg-require-effective-target float16 } */
+
+_Complex _Float16 a = 1.if16;  /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex _Float16 b = 2.F16j;  /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex _Float16 c = 3.f16i;  /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+_Complex _Float16 d = 4.JF16;  /* { dg-warning "imaginary constants are a C2Y 
feature" } */
+__extension__ _Complex _Float16 e = 1.if16;
+__extension__ _Complex _Float16 f = 2.F16j;
+__extension__ _Complex _Float16 g = 3.f16i;
+__extension__ _Complex _Float16 h = 4.JF16;
diff --git a/gcc/testsuite/gcc.dg/c2y-imaginary-constants-9.c 
b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-9.c
new file mode 100644
index 000000000000..02c1beba7212
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c2y-imaginary-constants-9.c
@@ -0,0 +1,7 @@
+/* Test that imaginary constants are accepted in C2Y mode: -pedantic.  */
+/* { dg-do run } */
+/* { dg-options "-std=c2y -pedantic" } */
+/* { dg-add-options float64x } */
+/* { dg-require-effective-target float64x } */
+
+#include "c23-imaginary-constants-9.c"
diff --git a/gcc/testsuite/gcc.dg/cpp/pr7263-3.c 
b/gcc/testsuite/gcc.dg/cpp/pr7263-3.c
index 225b659754c2..84a423167814 100644
--- a/gcc/testsuite/gcc.dg/cpp/pr7263-3.c
+++ b/gcc/testsuite/gcc.dg/cpp/pr7263-3.c
@@ -15,5 +15,5 @@ bar2 ()
 
 __complex__ bar3 () /* { dg-error "ISO C does not support plain .complex. 
meaning .double complex." } */
 {
-  return _Complex_I; /* { dg-error "imaginary constants are a GCC extension" } 
*/
+  return _Complex_I; /* { dg-error "imaginary constants are a C2Y feature or 
GCC extension" } */
 }
diff --git a/libcpp/expr.cc b/libcpp/expr.cc
index 53980f485020..bbf21b8fb1c3 100644
--- a/libcpp/expr.cc
+++ b/libcpp/expr.cc
@@ -911,8 +911,25 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token 
*token,
 
  syntax_ok:
   if (result & CPP_N_IMAGINARY)
-    cpp_pedwarning_with_line (pfile, CPP_W_PEDANTIC, virtual_location, 0,
-                             "imaginary constants are a GCC extension");
+    {
+      if (CPP_OPTION (pfile, cplusplus) || (result & CPP_N_FLOATING) == 0)
+       cpp_pedwarning_with_line (pfile, CPP_W_PEDANTIC, virtual_location, 0,
+                                 "imaginary constants are a GCC extension");
+      else
+       {
+         bool warned = false;
+         if (!CPP_OPTION (pfile, imaginary_constants) && CPP_PEDANTIC (pfile))
+           warned
+             = cpp_pedwarning_with_line (pfile, CPP_W_PEDANTIC,
+                                         virtual_location, 0,
+                                         "imaginary constants are a C2Y "
+                                         "feature or GCC extension");
+         if (!warned && CPP_OPTION (pfile, cpp_warn_c23_c2y_compat) > 0)
+           cpp_warning_with_line (pfile, CPP_W_C23_C2Y_COMPAT,
+                                  virtual_location, 0,
+                                  "imaginary constants are a C2Y feature");
+       }
+    }
   if (radix == 2)
     {
       bool warned = false;
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index 267d28147abb..e73f77e67d86 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -524,6 +524,9 @@ struct cpp_options
   /* Nonzero for C++ 2014 Standard binary constants.  */
   unsigned char binary_constants;
 
+  /* Nonzero for C2Y imaginary (floating) constants.  */
+  unsigned char imaginary_constants;
+
   /* Nonzero for C++ 2014 Standard digit separators.  */
   unsigned char digit_separators;
 
diff --git a/libcpp/init.cc b/libcpp/init.cc
index c8c466dd31a7..355e5017649e 100644
--- a/libcpp/init.cc
+++ b/libcpp/init.cc
@@ -112,44 +112,45 @@ struct lang_flags
   unsigned int octal_constants : 1;
   unsigned int true_false : 1;
   unsigned int embed : 1;
+  unsigned int imaginary_constants : 1;
 };
 
 static const struct lang_flags lang_defaults[] = {
   /*                                          u         e w   n
                                         b d   8         l a   a   t
                             x         u i i   c v s   s i r d m o r e
-                      x     i   d u r d n g t h a c   z f n e e c u m
-                  c c n x c d s i l l l c s r l o o d l d d l d t f b
-                  9 + u i 1 i t g i i i s e i i p p f i e i i u a a e
-                  9 + m d 1 d d r t t t t p g t t e p t f r m c l l d  */
-  /* GNUC89   */ { 0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
-  /* GNUC99   */ { 1,0,1,1,0,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
-  /* GNUC11   */ { 1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
-  /* GNUC17   */ { 1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
-  /* GNUC23   */ { 1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,0,1,1,0,0,0,1,1 },
-  /* GNUC2Y   */ { 1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1 },
-  /* STDC89   */ { 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
-  /* STDC94   */ { 0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
-  /* STDC99   */ { 1,0,1,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
-  /* STDC11   */ { 1,0,1,1,1,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
-  /* STDC17   */ { 1,0,1,1,1,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
-  /* STDC23   */ { 1,0,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,1,1,0,0,0,1,1 },
-  /* STDC2Y   */ { 1,0,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1 },
-  /* GNUCXX   */ { 0,1,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0 },
-  /* CXX98    */ { 0,1,0,1,0,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0 },
-  /* GNUCXX11 */ { 1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0 },
-  /* CXX11    */ { 1,1,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0 },
-  /* GNUCXX14 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,1,0 },
-  /* CXX14    */ { 1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,1,0 },
-  /* GNUCXX17 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,1,0 },
-  /* CXX17    */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,0,0,0,0,0,0,1,0 },
-  /* GNUCXX20 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,1,0 },
-  /* CXX20    */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,1,0 },
-  /* GNUCXX23 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,0 },
-  /* CXX23    */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,0 },
-  /* GNUCXX26 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,0 },
-  /* CXX26    */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,0 },
-  /* ASM      */ { 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+                      x     i   d u r d n g t h a c   z f n e e c u m i
+                  c c n x c d s i l l l c s r l o o d l d d l d t f b m
+                  9 + u i 1 i t g i i i s e i i p p f i e i i u a a e a
+                  9 + m d 1 d d r t t t t p g t t e p t f r m c l l d g */
+  /* GNUC89   */ { 0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
+  /* GNUC99   */ { 1,0,1,1,0,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
+  /* GNUC11   */ { 1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
+  /* GNUC17   */ { 1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0 },
+  /* GNUC23   */ { 1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,0,1,1,0,0,0,1,1,0 },
+  /* GNUC2Y   */ { 1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1,1 },
+  /* STDC89   */ { 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+  /* STDC94   */ { 0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+  /* STDC99   */ { 1,0,1,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+  /* STDC11   */ { 1,0,1,1,1,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+  /* STDC17   */ { 1,0,1,1,1,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+  /* STDC23   */ { 1,0,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,1,1,0,0,0,1,1,0 },
+  /* STDC2Y   */ { 1,0,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1,1 },
+  /* GNUCXX   */ { 0,1,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0 },
+  /* CXX98    */ { 0,1,0,1,0,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0 },
+  /* GNUCXX11 */ { 1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0 },
+  /* CXX11    */ { 1,1,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0 },
+  /* GNUCXX14 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,1,0,0 },
+  /* CXX14    */ { 1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,1,0,0 },
+  /* GNUCXX17 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,1,0,0 },
+  /* CXX17    */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,0,0,0,0,0,0,1,0,0 },
+  /* GNUCXX20 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,1,0,0 },
+  /* CXX20    */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,1,0,0 },
+  /* GNUCXX23 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,0,0 },
+  /* CXX23    */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,0,0 },
+  /* GNUCXX26 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,0,0 },
+  /* CXX26    */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,0,0 },
+  /* ASM      */ { 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
 };
 
 /* Sets internal flags correctly for a given language.  */
@@ -186,6 +187,7 @@ cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
   CPP_OPTION (pfile, octal_constants)           = l->octal_constants;
   CPP_OPTION (pfile, true_false)                = l->true_false;
   CPP_OPTION (pfile, embed)                     = l->embed;
+  CPP_OPTION (pfile, imaginary_constants)       = l->imaginary_constants;
 }
 
 /* Initialize library global state.  */

Reply via email to