On Thu, Jun 11, 2020 at 03:32:14PM -0400, Jason Merrill wrote: > On 6/10/20 5:11 PM, Marek Polacek wrote: > > Another indication that perhaps this warning is emitted too early. We > > crash because same_type_p gets a null type: we have an enumerator > > without a fixed underlying type and finish_enum_value_list hasn't yet > > run. So check if the type is null before calling same_type_p. > > Hmm, I wonder why we use NULL_TREE for the type of uninitialized enumerators > in a template; why not give them integer_type_node temporarily?
That breaks enum22.C: template <class T> struct A { enum e_ : unsigned char { Z_, E_=sizeof(Z_) }; }; static_assert ( A<double>::E_ == 1, "E_ should be 1"); If we give 'Z_' a type, it's no longer instantiation-dependent, so sizeof(Z_) immediately evaluates to 4. Whereas if it doesn't have a type, in the template we create a SIZEOF_EXPR and only evaluate when instantiating (to 1). This sounded like a problem big enough for me not to pursue this any further. Do you want me to try anything else or is the original patch ok? Marek