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

Reply via email to