diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -2499,9 +2499,12 @@ type = cast(type)->getValueType(); break; case clang::Type::Auto: + case clang::Type::Decltype: case clang::Type::Elaborated: case clang::Type::Paren: case clang::Type::Typedef: + case clang::Type::TypeOf: + case clang::Type::TypeOfExpr: type = type->getLocallyUnqualifiedSingleStepDesugaredType(); break; default: @@ -3765,11 +3768,6 @@ return eTypeHasChildren | eTypeIsVector; case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate; - case clang::Type::Decltype: - return CompilerType(this, llvm::cast(qual_type) - ->getUnderlyingType() - .getAsOpaquePtr()) - .GetTypeInfo(pointee_or_element_clang_type); case clang::Type::Enum: if (pointee_or_element_clang_type) @@ -3837,17 +3835,6 @@ ->getUnderlyingType() .getAsOpaquePtr()) .GetTypeInfo(pointee_or_element_clang_type); - case clang::Type::TypeOfExpr: - return CompilerType(this, llvm::cast(qual_type) - ->getUnderlyingExpr() - ->getType() - .getAsOpaquePtr()) - .GetTypeInfo(pointee_or_element_clang_type); - case clang::Type::TypeOf: - return CompilerType(this, llvm::cast(qual_type) - ->getUnderlyingType() - .getAsOpaquePtr()) - .GetTypeInfo(pointee_or_element_clang_type); case clang::Type::UnresolvedUsing: return 0; @@ -3966,8 +3953,11 @@ switch (qual_type->getTypeClass()) { case clang::Type::Atomic: case clang::Type::Auto: + case clang::Type::Decltype: case clang::Type::Elaborated: case clang::Type::Paren: + case clang::Type::TypeOf: + case clang::Type::TypeOfExpr: llvm_unreachable("Handled in RemoveWrappingTypes!"); case clang::Type::UnaryTransform: break; @@ -4049,22 +4039,6 @@ case clang::Type::PackExpansion: break; - case clang::Type::TypeOfExpr: - return CompilerType(this, llvm::cast(qual_type) - ->getUnderlyingExpr() - ->getType() - .getAsOpaquePtr()) - .GetTypeClass(); - case clang::Type::TypeOf: - return CompilerType(this, llvm::cast(qual_type) - ->getUnderlyingType() - .getAsOpaquePtr()) - .GetTypeClass(); - case clang::Type::Decltype: - return CompilerType(this, llvm::cast(qual_type) - ->getUnderlyingType() - .getAsOpaquePtr()) - .GetTypeClass(); case clang::Type::TemplateSpecialization: break; case clang::Type::DeducedTemplateSpecialization: @@ -4678,9 +4652,12 @@ switch (qual_type->getTypeClass()) { case clang::Type::Atomic: case clang::Type::Auto: + case clang::Type::Decltype: case clang::Type::Elaborated: case clang::Type::Paren: case clang::Type::Typedef: + case clang::Type::TypeOf: + case clang::Type::TypeOfExpr: llvm_unreachable("Handled in RemoveWrappingTypes!"); case clang::Type::UnaryTransform: @@ -4888,22 +4865,6 @@ break; case clang::Type::Enum: return lldb::eEncodingSint; - case clang::Type::TypeOfExpr: - return CompilerType(this, llvm::cast(qual_type) - ->getUnderlyingExpr() - ->getType() - .getAsOpaquePtr()) - .GetEncoding(count); - case clang::Type::TypeOf: - return CompilerType(this, llvm::cast(qual_type) - ->getUnderlyingType() - .getAsOpaquePtr()) - .GetEncoding(count); - case clang::Type::Decltype: - return CompilerType(this, llvm::cast(qual_type) - ->getUnderlyingType() - .getAsOpaquePtr()) - .GetEncoding(count); case clang::Type::DependentSizedArray: case clang::Type::DependentSizedExtVector: case clang::Type::UnresolvedUsing: @@ -4947,9 +4908,12 @@ switch (qual_type->getTypeClass()) { case clang::Type::Atomic: case clang::Type::Auto: + case clang::Type::Decltype: case clang::Type::Elaborated: case clang::Type::Paren: case clang::Type::Typedef: + case clang::Type::TypeOf: + case clang::Type::TypeOfExpr: llvm_unreachable("Handled in RemoveWrappingTypes!"); case clang::Type::UnaryTransform: break; @@ -5043,22 +5007,6 @@ break; case clang::Type::Enum: return lldb::eFormatEnum; - case clang::Type::TypeOfExpr: - return CompilerType(this, llvm::cast(qual_type) - ->getUnderlyingExpr() - ->getType() - .getAsOpaquePtr()) - .GetFormat(); - case clang::Type::TypeOf: - return CompilerType(this, llvm::cast(qual_type) - ->getUnderlyingType() - .getAsOpaquePtr()) - .GetFormat(); - case clang::Type::Decltype: - return CompilerType(this, llvm::cast(qual_type) - ->getUnderlyingType() - .getAsOpaquePtr()) - .GetFormat(); case clang::Type::DependentSizedArray: case clang::Type::DependentSizedExtVector: case clang::Type::UnresolvedUsing: @@ -5930,16 +5878,6 @@ return 0; // When we function pointers, they have no children... case clang::Type::UnresolvedUsing: return 0; - case clang::Type::TypeOfExpr: - return GetNumPointeeChildren(llvm::cast(qual_type) - ->getUnderlyingExpr() - ->getType()); - case clang::Type::TypeOf: - return GetNumPointeeChildren( - llvm::cast(qual_type)->getUnderlyingType()); - case clang::Type::Decltype: - return GetNumPointeeChildren( - llvm::cast(qual_type)->getUnderlyingType()); case clang::Type::Record: return 0; case clang::Type::Enum: diff --git a/lldb/unittests/Symbol/TestClangASTContext.cpp b/lldb/unittests/Symbol/TestClangASTContext.cpp --- a/lldb/unittests/Symbol/TestClangASTContext.cpp +++ b/lldb/unittests/Symbol/TestClangASTContext.cpp @@ -6,15 +6,14 @@ // //===----------------------------------------------------------------------===// -#include "gtest/gtest.h" - -#include "clang/AST/DeclCXX.h" - #include "lldb/Host/FileSystem.h" #include "lldb/Host/HostInfo.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/ClangUtil.h" #include "lldb/Symbol/Declaration.h" +#include "clang/AST/DeclCXX.h" +#include "clang/AST/ExprCXX.h" +#include "gtest/gtest.h" using namespace clang; using namespace lldb; @@ -447,3 +446,36 @@ EXPECT_EQ(int_type, result->type); } } + +static QualType makeConstInt(clang::ASTContext &ctxt) { + QualType result(ctxt.IntTy); + result.addConst(); + return result; +} + +TEST_F(TestClangASTContext, TestGetTypeClassDeclType) { + clang::ASTContext &ctxt = *m_ast->getASTContext(); + auto *nullptr_expr = new (ctxt) CXXNullPtrLiteralExpr(ctxt.NullPtrTy, SourceLocation()); + QualType t = ctxt.getDecltypeType(nullptr_expr, makeConstInt(ctxt)); + EXPECT_EQ(lldb::eTypeClassBuiltin, m_ast->GetTypeClass(t.getAsOpaquePtr())); +} + +TEST_F(TestClangASTContext, TestGetTypeClassTypeOf) { + clang::ASTContext &ctxt = *m_ast->getASTContext(); + QualType t = ctxt.getTypeOfType(makeConstInt(ctxt)); + EXPECT_EQ(lldb::eTypeClassBuiltin, m_ast->GetTypeClass(t.getAsOpaquePtr())); +} + +TEST_F(TestClangASTContext, TestGetTypeClassTypeOfExpr) { + clang::ASTContext &ctxt = *m_ast->getASTContext(); + auto *nullptr_expr = new (ctxt) CXXNullPtrLiteralExpr(ctxt.NullPtrTy, SourceLocation()); + QualType t = ctxt.getTypeOfExprType(nullptr_expr); + EXPECT_EQ(lldb::eTypeClassBuiltin, m_ast->GetTypeClass(t.getAsOpaquePtr())); +} + +TEST_F(TestClangASTContext, TestGetTypeClassNested) { + clang::ASTContext &ctxt = *m_ast->getASTContext(); + QualType t_base = ctxt.getTypeOfType(makeConstInt(ctxt)); + QualType t = ctxt.getTypeOfType(t_base); + EXPECT_EQ(lldb::eTypeClassBuiltin, m_ast->GetTypeClass(t.getAsOpaquePtr())); +}