JDevlieghere created this revision.
JDevlieghere added reviewers: aprantl, jingham, davide, labath.

Before this patch, LLDB was not able to evaluate expressions that
resulted in a value with a typeof-type.

  (lldb) p int i; __typeof__(i) j = 1; j
  (typeof (i)) $0 =

This fixes that. The type is still printed as (typeof (i)) but at least
we get a value now.

  (lldb) p int i; __typeof__(i) j = 1; j
  (typeof (i)) $0 = 1

I'm looking into printing this as `int` but will keep that for a follow-up 
commit either way.


https://reviews.llvm.org/D43471

Files:
  packages/Python/lldbsuite/test/expression_command/test/TestExprs.py
  source/Symbol/ClangASTContext.cpp

Index: source/Symbol/ClangASTContext.cpp
===================================================================
--- source/Symbol/ClangASTContext.cpp
+++ source/Symbol/ClangASTContext.cpp
@@ -4046,9 +4046,13 @@
                             ->getUnderlyingType())
                .GetTypeInfo(pointee_or_element_clang_type);
   case clang::Type::TypeOfExpr:
-    return 0;
+    return CompilerType(getASTContext(),
+                        llvm::cast<clang::TypeOfExprType>(qual_type)->getUnderlyingExpr()->getType())
+        .GetTypeInfo(pointee_or_element_clang_type);
   case clang::Type::TypeOf:
-    return 0;
+    return CompilerType(getASTContext(),
+                        llvm::cast<clang::TypeOfType>(qual_type)->getUnderlyingType())
+        .GetTypeInfo(pointee_or_element_clang_type);
   case clang::Type::UnresolvedUsing:
     return 0;
 
@@ -4255,9 +4259,14 @@
     break;
 
   case clang::Type::TypeOfExpr:
-    break;
+    return CompilerType(getASTContext(),
+                        llvm::cast<clang::TypeOfExprType>(qual_type)->getUnderlyingExpr()->getType())
+        .GetTypeClass();
   case clang::Type::TypeOf:
-    break;
+    return CompilerType(getASTContext(),
+                        llvm::cast<clang::TypeOfType>(qual_type)->getUnderlyingType())
+        .GetTypeClass();
+
   case clang::Type::Decltype:
     break;
   case clang::Type::TemplateSpecialization:
@@ -5060,7 +5069,14 @@
     return CompilerType(getASTContext(),
                         llvm::cast<clang::ParenType>(qual_type)->desugar())
         .GetEncoding(count);
-
+  case clang::Type::TypeOfExpr:
+    return CompilerType(getASTContext(),
+                        llvm::cast<clang::TypeOfExprType>(qual_type)->getUnderlyingExpr()->getType())
+        .GetEncoding(count);
+  case clang::Type::TypeOf:
+    return CompilerType(getASTContext(),
+                        llvm::cast<clang::TypeOfType>(qual_type)->getUnderlyingType())
+        .GetEncoding(count);
   case clang::Type::DependentSizedArray:
   case clang::Type::DependentSizedExtVector:
   case clang::Type::UnresolvedUsing:
@@ -5074,8 +5090,6 @@
   case clang::Type::PackExpansion:
   case clang::Type::ObjCObject:
 
-  case clang::Type::TypeOfExpr:
-  case clang::Type::TypeOf:
   case clang::Type::Decltype:
   case clang::Type::TemplateSpecialization:
   case clang::Type::DeducedTemplateSpecialization:
@@ -5214,6 +5228,14 @@
                getASTContext(),
                llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())
         .GetFormat();
+  case clang::Type::TypeOfExpr:
+    return CompilerType(getASTContext(),
+                        llvm::cast<clang::TypeOfExprType>(qual_type)->getUnderlyingExpr()->getType())
+        .GetFormat();
+  case clang::Type::TypeOf:
+    return CompilerType(getASTContext(),
+                        llvm::cast<clang::TypeOfType>(qual_type)->getUnderlyingType())
+        .GetFormat();
   case clang::Type::DependentSizedArray:
   case clang::Type::DependentSizedExtVector:
   case clang::Type::UnresolvedUsing:
@@ -5227,8 +5249,6 @@
   case clang::Type::PackExpansion:
   case clang::Type::ObjCObject:
 
-  case clang::Type::TypeOfExpr:
-  case clang::Type::TypeOf:
   case clang::Type::Decltype:
   case clang::Type::TemplateSpecialization:
   case clang::Type::DeducedTemplateSpecialization:
@@ -6264,9 +6284,11 @@
     return GetNumPointeeChildren(
         llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
   case clang::Type::TypeOfExpr:
-    return 0;
+    return GetNumPointeeChildren(
+        llvm::cast<clang::TypeOfExprType>(qual_type)->getUnderlyingExpr()->getType());
   case clang::Type::TypeOf:
-    return 0;
+    return GetNumPointeeChildren(
+        llvm::cast<clang::TypeOfType>(qual_type)->getUnderlyingType());
   case clang::Type::Decltype:
     return 0;
   case clang::Type::Record:
@@ -10086,4 +10108,3 @@
   lldbassert(m_scratch_ast_source_ap != nullptr);
   return m_scratch_ast_source_ap->GetMergerUnchecked();
 }
-
Index: packages/Python/lldbsuite/test/expression_command/test/TestExprs.py
===================================================================
--- packages/Python/lldbsuite/test/expression_command/test/TestExprs.py
+++ packages/Python/lldbsuite/test/expression_command/test/TestExprs.py
@@ -253,3 +253,20 @@
         self.expect('print_hi',
                     substrs=['(int) $',
                              '6'])
+
+    def test_expr_commands_typeof(self):
+        """Throw typeof expression at lldb."""
+        self.build()
+
+        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
+
+        lldbutil.run_break_set_by_file_and_line(
+            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=False)
+
+        self.runCmd("run", RUN_SUCCEEDED)
+
+        # runCmd: expression p int i; __typeof__(i) j = 1; j
+        # output: (typeof (i)) $0 = 1
+        self.expect("expression p int i; __typeof__(i) j = 1; j",
+                    substrs=['(typeof (i)) $',
+                             "1"])
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to