diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -7538,10 +7538,11 @@ "only integer or enum types supported"); // If the variable is an enum type, take the underlying integer type as // the type of the integer literal. - if (const EnumType *enum_type = llvm::dyn_cast(qt.getTypePtr())) { + if (const EnumType *enum_type = qt->getAs()) { const EnumDecl *enum_decl = enum_type->getDecl(); qt = enum_decl->getIntegerType(); } + var->setInit(IntegerLiteral::Create(ast, init_value, qt.getUnqualifiedType(), SourceLocation())); } diff --git a/lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py b/lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py --- a/lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py +++ b/lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py @@ -66,6 +66,9 @@ self.expect_expr("A::scoped_ll_enum_val_neg", result_value="case0") self.expect_expr("A::scoped_ll_enum_val", result_value="case2") + # Test an aliased enum with fixed underlying type. + self.expect_expr("ClassWithEnumAlias::enum_alias", result_value="scoped_enum_case2") + # Test taking address. if lldbplatformutil.getPlatform() == "windows": # On Windows data members without the out-of-class definitions still have diff --git a/lldb/test/API/lang/cpp/const_static_integral_member/main.cpp b/lldb/test/API/lang/cpp/const_static_integral_member/main.cpp --- a/lldb/test/API/lang/cpp/const_static_integral_member/main.cpp +++ b/lldb/test/API/lang/cpp/const_static_integral_member/main.cpp @@ -69,6 +69,11 @@ constexpr static ScopedEnum scoped_enum_val = ScopedEnum::scoped_enum_case2; } cwc; +struct ClassWithEnumAlias { + using EnumAlias = ScopedEnum; + static constexpr EnumAlias enum_alias = ScopedEnum::scoped_enum_case2; +}; + int main() { A a; @@ -98,5 +103,8 @@ se = A::invalid_scoped_enum_val; ScopedCharEnum sce = A::scoped_char_enum_val; ScopedLongLongEnum sle = A::scoped_ll_enum_val; + + auto enum_alias_val = ClassWithEnumAlias::enum_alias; + return 0; // break here }