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.
This commit is contained in:
Patrick Palka 2022-10-07 12:01:58 -04:00
parent f8ba88b6a8
commit f7f4628054
2 changed files with 13 additions and 1 deletions

View File

@ -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. */

View File

@ -0,0 +1,8 @@
// { dg-additional-options -fmodule-header }
// { dg-module-cmi {} }
template<int N>
struct A {
int x : 1;
int y : N;
};