On Tue, Feb 03, 2026 at 02:16:34PM -0800, Andrew Pinski wrote:
> On Tue, Feb 3, 2026 at 2:12 PM Marek Polacek <[email protected]> wrote:
> >
> > Bootstrapped/regtested on ppc64le-pc-linux-gnu, ok for 17.0?
> >
> > -- >8 --
> > This implements [class.bit]/2: An unnamed bit-field shall not be
> > declared with a cv-qualified type. This was clarified in DR 2229.
> >
> > DR 2229
> > PR c++/123935
> >
> > gcc/cp/ChangeLog:
> >
> > * decl2.cc (grokbitfield): Disallow cv-qualified unnamed bit-fields.
> >
> > gcc/testsuite/ChangeLog:
> >
> > * g++.dg/DRs/dr2229.C: New test.
> > ---
> > gcc/cp/decl2.cc | 9 +++++++++
> > gcc/testsuite/g++.dg/DRs/dr2229.C | 12 ++++++++++++
> > 2 files changed, 21 insertions(+)
> > create mode 100644 gcc/testsuite/g++.dg/DRs/dr2229.C
> >
> > diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc
> > index 20ee662eea2..eb2294fffd0 100644
> > --- a/gcc/cp/decl2.cc
> > +++ b/gcc/cp/decl2.cc
> > @@ -1635,6 +1635,15 @@ grokbitfield (const cp_declarator *declarator,
> > return NULL_TREE;
> > }
> >
> > + /* [class.bit]/2 "An unnamed bit-field shall not be declared with
> > + a cv-qualified type." */
> > + if (!DECL_NAME (value) && TYPE_QUALS (type) != TYPE_UNQUALIFIED)
> > + {
> > + error_at (DECL_SOURCE_LOCATION (value),
> > + "unnamed bit-field cannot be cv-qualified");
> > + return NULL_TREE;
> > + }
> > +
> > int flags = LOOKUP_IMPLICIT;
> > if (init && DIRECT_LIST_INIT_P (init))
> > flags = LOOKUP_NORMAL;
> > diff --git a/gcc/testsuite/g++.dg/DRs/dr2229.C
> > b/gcc/testsuite/g++.dg/DRs/dr2229.C
> > new file mode 100644
> > index 00000000000..32548071090
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/DRs/dr2229.C
> > @@ -0,0 +1,12 @@
> > +// DR 2229, Volatile unnamed bit-fields
> > +// PR c++/123935
> > +
> > +struct S {
> > + const unsigned : 1; // { dg-error "unnamed bit-field cannot be
> > cv-qualified" }
> > + volatile unsigned : 1; // { dg-error "unnamed bit-field cannot be
> > cv-qualified" }
> > + const volatile unsigned : 1; // { dg-error "unnamed bit-field cannot be
> > cv-qualified" }
> > + unsigned : 1;
> > + const unsigned i1 : 1;
> > + volatile unsigned i2 : 1;
> > + const volatile unsigned i3 : 1;
> > +};
>
> Maybe one more test would be a typedef to a qualifier type.
> Like:
> ```
> typedef const int ci;
> struct S1 {
> ci : 1; // { dg-error "unnamed bit-field cannot be cv-qualified" }
> ci ci1 : 1;
> };
Sure, why not.
-- >8 --
This implements [class.bit]/2: An unnamed bit-field shall not be
declared with a cv-qualified type. This was clarified in DR 2229.
DR 2229
PR c++/123935
gcc/cp/ChangeLog:
* decl2.cc (grokbitfield): Disallow cv-qualified unnamed bit-fields.
gcc/testsuite/ChangeLog:
* g++.dg/DRs/dr2229.C: New test.
---
gcc/cp/decl2.cc | 9 +++++++++
gcc/testsuite/g++.dg/DRs/dr2229.C | 23 +++++++++++++++++++++++
2 files changed, 32 insertions(+)
create mode 100644 gcc/testsuite/g++.dg/DRs/dr2229.C
diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc
index 20ee662eea2..eb2294fffd0 100644
--- a/gcc/cp/decl2.cc
+++ b/gcc/cp/decl2.cc
@@ -1635,6 +1635,15 @@ grokbitfield (const cp_declarator *declarator,
return NULL_TREE;
}
+ /* [class.bit]/2 "An unnamed bit-field shall not be declared with
+ a cv-qualified type." */
+ if (!DECL_NAME (value) && TYPE_QUALS (type) != TYPE_UNQUALIFIED)
+ {
+ error_at (DECL_SOURCE_LOCATION (value),
+ "unnamed bit-field cannot be cv-qualified");
+ return NULL_TREE;
+ }
+
int flags = LOOKUP_IMPLICIT;
if (init && DIRECT_LIST_INIT_P (init))
flags = LOOKUP_NORMAL;
diff --git a/gcc/testsuite/g++.dg/DRs/dr2229.C
b/gcc/testsuite/g++.dg/DRs/dr2229.C
new file mode 100644
index 00000000000..a55604bf8a9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/DRs/dr2229.C
@@ -0,0 +1,23 @@
+// DR 2229, Volatile unnamed bit-fields
+// PR c++/123935
+
+typedef const unsigned cu;
+typedef volatile unsigned vu;
+typedef const volatile unsigned cvu;
+
+struct S {
+ const unsigned : 1; // { dg-error "unnamed bit-field cannot be cv-qualified"
}
+ volatile unsigned : 1; // { dg-error "unnamed bit-field cannot be
cv-qualified" }
+ const volatile unsigned : 1; // { dg-error "unnamed bit-field cannot be
cv-qualified" }
+ unsigned : 1;
+ const unsigned i1 : 1;
+ volatile unsigned i2 : 1;
+ const volatile unsigned i3 : 1;
+
+ cu : 1; // { dg-error "unnamed bit-field cannot be cv-qualified" }
+ vu : 1; // { dg-error "unnamed bit-field cannot be cv-qualified" }
+ cvu : 1; // { dg-error "unnamed bit-field cannot be cv-qualified" }
+ cu i4: 1;
+ vu i5 : 1;
+ cvu i6 : 1;
+};
base-commit: 9d9663ea1533942e041e184947b19f94eb63b934
--
2.52.0