aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2022-10-07 12:01:58 -0400
committerPatrick Palka <ppalka@redhat.com>2022-10-07 12:01:58 -0400
commitf7f4628054358a92a55d52645cf107aa26ff6765 (patch)
tree156cf9103fca664022bdde817e6c4a2b7ec39da1 /gcc
parentf8ba88b6a811ca9bb4b8411d3f65c329fb480ee1 (diff)
downloadgcc-f7f4628054358a92a55d52645cf107aa26ff6765.zip
gcc-f7f4628054358a92a55d52645cf107aa26ff6765.tar.gz
gcc-f7f4628054358a92a55d52645cf107aa26ff6765.tar.bz2
c++ modules: ICE with bitfield in class template
According to grokbitfield, DECL_BIT_FIELD_REPRESENTATIVE contains the width of the bitfield until we layout the class type (after which it'll contain a decl). Thus for a bitfield in a class template it'll always be the width, and this patch makes us avoid ICEing from mark_class_def in this case. gcc/cp/ChangeLog: * module.cc (trees_out::mark_class_def): Guard against DECL_BIT_FIELD_REPRESENTATIVE not being a decl. gcc/testsuite/ChangeLog: * g++.dg/modules/bfield-3.H: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/module.cc6
-rw-r--r--gcc/testsuite/g++.dg/modules/bfield-3.H8
2 files changed, 13 insertions, 1 deletions
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index cb1929b..94fbee8 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -11919,7 +11919,11 @@ trees_out::mark_class_def (tree defn)
mark_class_member (member);
if (TREE_CODE (member) == FIELD_DECL)
if (tree repr = DECL_BIT_FIELD_REPRESENTATIVE (member))
- mark_declaration (repr, false);
+ /* If we're marking a class template definition, then
+ this'll contain the width (as set by grokbitfield)
+ instead of a decl. */
+ if (DECL_P (repr))
+ mark_declaration (repr, false);
}
/* Mark the binfo hierarchy. */
diff --git a/gcc/testsuite/g++.dg/modules/bfield-3.H b/gcc/testsuite/g++.dg/modules/bfield-3.H
new file mode 100644
index 0000000..4fd4db7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/bfield-3.H
@@ -0,0 +1,8 @@
+// { dg-additional-options -fmodule-header }
+// { dg-module-cmi {} }
+
+template<int N>
+struct A {
+ int x : 1;
+ int y : N;
+};