Author: Michael Buch Date: 2022-07-21T14:23:41+01:00 New Revision: 140bcd369b0fd61f19cdeabf4be2fe68d5f9804b
URL: https://github.com/llvm/llvm-project/commit/140bcd369b0fd61f19cdeabf4be2fe68d5f9804b DIFF: https://github.com/llvm/llvm-project/commit/140bcd369b0fd61f19cdeabf4be2fe68d5f9804b.diff LOG: [LLDB][ClangExpression] Fix initialization of static enum alias members `IntegerLiteral::Create` operates on integer types. For that reason when we parse DWARF into an AST, when we encounter a constant initialized enum member variable, we try to determine the underlying integer type before creating the `IntegerLiteral`. However, we currently don't desugar the type and for enum typedefs `dyn_cast<EnumType>` fails. In debug builds this triggers following assert: ``` Assertion failed: (type->isIntegerType() && "Illegal type in IntegerLiteral"), function IntegerLiteral, file Expr.cpp, line 892 ``` This patch turns the `dyn_cast<EnumType>` into a `getAs<EnumType>` which `dyn_cast`s the canonical type, allowing us to get to the underlying integer type. **Testing** * API test * Manual repro is fixed Differential Revision: https://reviews.llvm.org/D130213 Added: Modified: 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 Removed: ################################################################################ diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index e0f646b15641..c6eb693bba6b 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -7538,7 +7538,7 @@ void TypeSystemClang::SetIntegerInitializerForVariable( "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(); } 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 index c2bf1fe2a717..09345b98b16b 100644 --- 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,12 @@ def test(self): 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 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 index 9762424f2345..b26251336371 100644 --- 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,15 @@ struct ClassWithConstexprs { 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 @@ int main() { 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 } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits