diff --git a/dtool/src/cppparser/cppBison.yxx b/dtool/src/cppparser/cppBison.yxx index a9ac210d46..7a9797148e 100644 --- a/dtool/src/cppparser/cppBison.yxx +++ b/dtool/src/cppparser/cppBison.yxx @@ -1891,7 +1891,7 @@ instance_identifier_and_maybe_trailing_return_type: } $$ = $1; } - | instance_identifier ':' INTEGER + | instance_identifier ':' const_expr { // Bitfield definition. $1->_bit_width = $3; diff --git a/dtool/src/cppparser/cppInstance.cxx b/dtool/src/cppparser/cppInstance.cxx index cb59e9a048..3bb3bb725a 100644 --- a/dtool/src/cppparser/cppInstance.cxx +++ b/dtool/src/cppparser/cppInstance.cxx @@ -74,7 +74,17 @@ CPPInstance(CPPType *type, CPPInstanceIdentifier *ii, int storage_class, ii->_ident = nullptr; _storage_class = storage_class; _initializer = nullptr; - _bit_width = ii->_bit_width; + + if (ii->_bit_width != nullptr) { + CPPExpression::Result result = ii->_bit_width->evaluate(); + if (result._type != CPPExpression::RT_error) { + _bit_width = ii->_bit_width->evaluate().as_integer(); + } else { + _bit_width = -1; + } + } else { + _bit_width = -1; + } CPPParameterList *params = ii->get_initializer(); if (params != nullptr) { diff --git a/dtool/src/cppparser/cppInstanceIdentifier.cxx b/dtool/src/cppparser/cppInstanceIdentifier.cxx index 878d751285..891383cacc 100644 --- a/dtool/src/cppparser/cppInstanceIdentifier.cxx +++ b/dtool/src/cppparser/cppInstanceIdentifier.cxx @@ -82,7 +82,7 @@ initializer_type(CPPParameterList *params) { CPPInstanceIdentifier:: CPPInstanceIdentifier(CPPIdentifier *ident) : _ident(ident), - _bit_width(-1), + _bit_width(nullptr), _packed(false) { } diff --git a/dtool/src/cppparser/cppInstanceIdentifier.h b/dtool/src/cppparser/cppInstanceIdentifier.h index 6a2951d9cb..9cf7a3edbe 100644 --- a/dtool/src/cppparser/cppInstanceIdentifier.h +++ b/dtool/src/cppparser/cppInstanceIdentifier.h @@ -86,8 +86,8 @@ public: typedef std::vector Modifiers; Modifiers _modifiers; - // If not -1, indicates a bitfield - int _bit_width; + // If not null, indicates a bitfield + CPPExpression *_bit_width; // Indicates a parameter pack bool _packed;