This revision was automatically updated to reflect the committed changes. Closed by commit rG140bcd369b0f: [LLDB][ClangExpression] Fix initialization of static enum alias members (authored by Michael137).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D130213/new/ https://reviews.llvm.org/D130213 Files: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py lldb/test/API/lang/cpp/const_static_integral_member/main.cpp Index: lldb/test/API/lang/cpp/const_static_integral_member/main.cpp =================================================================== --- lldb/test/API/lang/cpp/const_static_integral_member/main.cpp +++ lldb/test/API/lang/cpp/const_static_integral_member/main.cpp @@ -69,6 +69,15 @@ 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; + + using EnumAliasAlias = EnumAlias; + static constexpr EnumAliasAlias enum_alias_alias = + ScopedEnum::scoped_enum_case1; +}; + int main() { A a; @@ -98,5 +107,9 @@ 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; + auto enum_alias_alias_val = ClassWithEnumAlias::enum_alias_alias; + return 0; // break here } Index: lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py =================================================================== --- lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py +++ lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py @@ -66,6 +66,12 @@ 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") + self.expect_expr("ClassWithEnumAlias::enum_alias_alias", + result_value="scoped_enum_case1") + # Test taking address. if lldbplatformutil.getPlatform() == "windows": # On Windows data members without the out-of-class definitions still have Index: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp =================================================================== --- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -7538,7 +7538,7 @@ "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<EnumType>(qt.getTypePtr())) { + if (const EnumType *enum_type = qt->getAs<EnumType>()) { const EnumDecl *enum_decl = enum_type->getDecl(); qt = enum_decl->getIntegerType(); }
Index: lldb/test/API/lang/cpp/const_static_integral_member/main.cpp =================================================================== --- lldb/test/API/lang/cpp/const_static_integral_member/main.cpp +++ lldb/test/API/lang/cpp/const_static_integral_member/main.cpp @@ -69,6 +69,15 @@ 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; + + using EnumAliasAlias = EnumAlias; + static constexpr EnumAliasAlias enum_alias_alias = + ScopedEnum::scoped_enum_case1; +}; + int main() { A a; @@ -98,5 +107,9 @@ 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; + auto enum_alias_alias_val = ClassWithEnumAlias::enum_alias_alias; + return 0; // break here } Index: lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py =================================================================== --- lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py +++ lldb/test/API/lang/cpp/const_static_integral_member/TestConstStaticIntegralMember.py @@ -66,6 +66,12 @@ 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") + self.expect_expr("ClassWithEnumAlias::enum_alias_alias", + result_value="scoped_enum_case1") + # Test taking address. if lldbplatformutil.getPlatform() == "windows": # On Windows data members without the out-of-class definitions still have Index: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp =================================================================== --- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -7538,7 +7538,7 @@ "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<EnumType>(qt.getTypePtr())) { + if (const EnumType *enum_type = qt->getAs<EnumType>()) { const EnumDecl *enum_decl = enum_type->getDecl(); qt = enum_decl->getIntegerType(); }
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits