Author: jdevlieghere Date: Tue Feb 20 02:15:08 2018 New Revision: 325568 URL: http://llvm.org/viewvc/llvm-project?rev=325568&view=rev Log: Handle typeof() expressions
Before this patch, LLDB was not able to evaluate expressions that resulted in a value with a typeof- or decltype-type. This patch fixes that. Before: (lldb) p int i; __typeof__(i) j = 1; j (typeof (i)) $0 = After: (lldb) p int i; __typeof__(i) j = 1; j (typeof (i)) $0 = 1 Differential revision: https://reviews.llvm.org/D43471 rdar://37461520 Added: lldb/trunk/lit/Expr/TestTypeOfDeclTypeExpr.test Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp Added: lldb/trunk/lit/Expr/TestTypeOfDeclTypeExpr.test URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Expr/TestTypeOfDeclTypeExpr.test?rev=325568&view=auto ============================================================================== --- lldb/trunk/lit/Expr/TestTypeOfDeclTypeExpr.test (added) +++ lldb/trunk/lit/Expr/TestTypeOfDeclTypeExpr.test Tue Feb 20 02:15:08 2018 @@ -0,0 +1,13 @@ +# RUN: %lldb -b -s %s | FileCheck %s + +expression int i; __typeof__(i) j = 1; j +# CHECK: (lldb) expression int i; __typeof__(i) j = 1; j +# CHECK-NEXT: (typeof (i)) {{.*}} = 1 + +expression int i; typeof(i) j = 1; j +# CHECK: (lldb) expression int i; typeof(i) j = 1; j +# CHECK-NEXT: (typeof (i)) {{.*}} = 1 + +expression int i; decltype(i) j = 1; j +# CHECK: (lldb) expression int i; decltype(i) j = 1; j +# CHECK-NEXT: (decltype(i)) {{.*}} = 1 Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=325568&r1=325567&r2=325568&view=diff ============================================================================== --- lldb/trunk/source/Symbol/ClangASTContext.cpp (original) +++ lldb/trunk/source/Symbol/ClangASTContext.cpp Tue Feb 20 02:15:08 2018 @@ -3964,7 +3964,10 @@ ClangASTContext::GetTypeInfo(lldb::opaqu case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate; case clang::Type::Decltype: - return 0; + return CompilerType( + getASTContext(), + llvm::cast<clang::DecltypeType>(qual_type)->getUnderlyingType()) + .GetTypeInfo(pointee_or_element_clang_type); case clang::Type::Enum: if (pointee_or_element_clang_type) @@ -4046,9 +4049,16 @@ ClangASTContext::GetTypeInfo(lldb::opaqu ->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,11 +4265,21 @@ ClangASTContext::GetTypeClass(lldb::opaq 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; + return CompilerType( + getASTContext(), + llvm::cast<clang::TypeOfType>(qual_type)->getUnderlyingType()) + .GetTypeClass(); case clang::Type::TemplateSpecialization: break; case clang::Type::DeducedTemplateSpecialization: @@ -5060,7 +5080,22 @@ lldb::Encoding ClangASTContext::GetEncod 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::Decltype: + return CompilerType( + getASTContext(), + llvm::cast<clang::DecltypeType>(qual_type)->getUnderlyingType()) + .GetEncoding(count); case clang::Type::DependentSizedArray: case clang::Type::DependentSizedExtVector: case clang::Type::UnresolvedUsing: @@ -5074,9 +5109,6 @@ lldb::Encoding ClangASTContext::GetEncod 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: case clang::Type::Atomic: @@ -5214,6 +5246,22 @@ lldb::Format ClangASTContext::GetFormat( 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::Decltype: + return CompilerType( + getASTContext(), + llvm::cast<clang::DecltypeType>(qual_type)->getUnderlyingType()) + .GetFormat(); case clang::Type::DependentSizedArray: case clang::Type::DependentSizedExtVector: case clang::Type::UnresolvedUsing: @@ -5227,9 +5275,6 @@ lldb::Format ClangASTContext::GetFormat( 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: case clang::Type::Atomic: @@ -6264,11 +6309,15 @@ uint32_t ClangASTContext::GetNumPointeeC 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; + return GetNumPointeeChildren( + llvm::cast<clang::DecltypeType>(qual_type)->getUnderlyingType()); case clang::Type::Record: return 0; case clang::Type::Enum: @@ -10086,4 +10135,3 @@ ClangASTContextForExpressions::GetMerger lldbassert(m_scratch_ast_source_ap != nullptr); return m_scratch_ast_source_ap->GetMergerUnchecked(); } - _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits