]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Implement LWG4517 - data_member_spec should throw for cv-qualified unnamed bit...
authorJakub Jelinek <jakub@redhat.com>
Fri, 3 Apr 2026 08:29:51 +0000 (10:29 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 3 Apr 2026 08:29:51 +0000 (10:29 +0200)
As written in https://wg21.link/lwg4517 , unnamed bit-fields shall not
be declared with cv-qualified types, so the following patch rejects it
when trying to create that in data_member_spec.

2026-04-03  Jakub Jelinek  <jakub@redhat.com>

* reflect.cc (eval_data_member_spec): Implement C++26 LWG4517
- data_member_spec should throw for cv-qualified unnamed bit-fields.

* g++.dg/reflect/data_member_spec2.C: Add tests for unnamed bit-fields
with const and/or volatile types.

Reviewed-by: Jason Merrill <jason@redhat.com>
gcc/cp/reflect.cc
gcc/testsuite/g++.dg/reflect/data_member_spec2.C

index 670d84afb67af1cd56ac69e1c28083855070c190..e4cef5228e3ead0a77242abdaa8d78294002e070 100644 (file)
@@ -5910,6 +5910,17 @@ eval_data_member_spec (location_t loc, const constexpr_ctx *ctx,
       if (tree_int_cst_sgn (args[m_bit_width]) < 0)
        return throw_exception (loc, ctx, "bit_width is negative",
                                fun, non_constant_p, jump_target);
+      if (args[m_name] == NULL_TREE)
+       {
+         if (eval_is_const (type, REFLECT_UNDEF) == boolean_true_node)
+           return throw_exception (loc, ctx,
+                                   "name unspecified and type is const",
+                                   fun, non_constant_p, jump_target);
+         if (eval_is_volatile (type, REFLECT_UNDEF) == boolean_true_node)
+           return throw_exception (loc, ctx,
+                                   "name unspecified and type is volatile",
+                                   fun, non_constant_p, jump_target);
+       }
     }
   if (args[m_alignment])
     {
index 3c0043fe314528ffac5dfe9499a51c5629fb8d1e..40914609b3ff3e3352b2960086cb899f43d54e5c 100644 (file)
@@ -86,6 +86,12 @@ static_assert (!valid_data_member_spec (^^Enum_class::A, { .name = "dms" }));
 static_assert (!valid_data_member_spec (^^decomp, { .name = "dms" }));
 static_assert (!valid_data_member_spec (^^decomp_ref, { .name = "dms" }));
 static_assert (!valid_data_member_spec (^^arr, { .name = "dms" }));
+// LWG4517 - data_member_spec should throw for cv-qualified unnamed bit-fields
+static_assert (!valid_data_member_spec (^^const int, { .bit_width = 3 }));
+static_assert (!valid_data_member_spec (^^volatile short, { .bit_width = 7 }));
+static_assert (!valid_data_member_spec (^^const int, { .bit_width = 0 }));
+static_assert (!valid_data_member_spec (^^volatile short, { .bit_width = 0 }));
+static_assert (!valid_data_member_spec (^^const volatile char, { .bit_width = 2 }));
 
 constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
 static_assert (!valid_data_member_spec (dms, { .name = "dms" }));