From: Marek Polacek Date: Tue, 3 Feb 2026 03:07:47 +0000 (-0500) Subject: c++: CWG 2229, cv-qualified unnamed bit-fields [PR123935] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e38ac19123b35c6240629266c2c2dbc3bdbeba7b;p=thirdparty%2Fgcc.git c++: CWG 2229, cv-qualified unnamed bit-fields [PR123935] 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): Add pedwarn for cv-qualified unnamed bit-fields. gcc/testsuite/ChangeLog: * g++.dg/DRs/dr2229.C: New test. Reviewed-by: Jason Merrill --- diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc index 351e1c3766f..a0bc57d4a06 100644 --- a/gcc/cp/decl2.cc +++ b/gcc/cp/decl2.cc @@ -1634,6 +1634,12 @@ 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) + pedwarn (DECL_SOURCE_LOCATION (value), 0, + "unnamed bit-field cannot be cv-qualified"); + 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; +};