Index: clang/include/clang/AST/DeclarationName.h =================================================================== --- clang/include/clang/AST/DeclarationName.h +++ clang/include/clang/AST/DeclarationName.h @@ -27,6 +27,7 @@ #include #include #include +#include namespace clang { @@ -192,6 +193,13 @@ "The various classes that DeclarationName::Ptr can point to" " must be at least aligned to 8 bytes!"); + static_assert( + std::is_same, + std::underlying_type_t< + detail::DeclarationNameExtra::ExtraKind>>::value, + "The various enums used to compute values for NameKind should all have " + "the same underlying type"); + public: /// The kind of the name stored in this DeclarationName. /// The first 7 enumeration values are stored inline and correspond @@ -205,15 +213,30 @@ CXXDestructorName = StoredCXXDestructorName, CXXConversionFunctionName = StoredCXXConversionFunctionName, CXXOperatorName = StoredCXXOperatorName, - CXXDeductionGuideName = UncommonNameKindOffset + - detail::DeclarationNameExtra::CXXDeductionGuideName, + CXXDeductionGuideName = + static_cast>( + UncommonNameKindOffset) + + static_cast< + std::underlying_type_t>( + detail::DeclarationNameExtra::CXXDeductionGuideName), CXXLiteralOperatorName = - UncommonNameKindOffset + - detail::DeclarationNameExtra::CXXLiteralOperatorName, - CXXUsingDirective = UncommonNameKindOffset + - detail::DeclarationNameExtra::CXXUsingDirective, - ObjCMultiArgSelector = UncommonNameKindOffset + - detail::DeclarationNameExtra::ObjCMultiArgSelector + static_cast>( + UncommonNameKindOffset) + + static_cast< + std::underlying_type_t>( + detail::DeclarationNameExtra::CXXLiteralOperatorName), + CXXUsingDirective = + static_cast>( + UncommonNameKindOffset) + + static_cast< + std::underlying_type_t>( + detail::DeclarationNameExtra::CXXUsingDirective), + ObjCMultiArgSelector = + static_cast>( + UncommonNameKindOffset) + + static_cast< + std::underlying_type_t>( + detail::DeclarationNameExtra::ObjCMultiArgSelector), }; private: