[Lldb-commits] [lldb] 140bcd3 - [LLDB][ClangExpression] Fix initialization of static enum alias members
Michael Buch via lldb-commits
lldb-commits at lists.llvm.org
Thu Jul 21 06:24:34 PDT 2022
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
}
More information about the lldb-commits
mailing list