This revision was automatically updated to reflect the committed changes. Closed by commit rG84c398d375d9: [lldb][TypeSystemClang] Desugar an elaborated type before checking if it's a… (authored by aleksandr.urakov).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D78697/new/ https://reviews.llvm.org/D78697 Files: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp lldb/test/API/lang/cpp/typedef/Makefile lldb/test/API/lang/cpp/typedef/TestCppTypedef.py lldb/test/API/lang/cpp/typedef/main.cpp
Index: lldb/test/API/lang/cpp/typedef/main.cpp =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/typedef/main.cpp @@ -0,0 +1,13 @@ +template<typename T> +struct S { + typedef T V; + + V value; +}; + +typedef S<float> SF; + +int main (int argc, char const *argv[]) { + SF s{ .5 }; + return 0; // Set a breakpoint here +} Index: lldb/test/API/lang/cpp/typedef/TestCppTypedef.py =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/typedef/TestCppTypedef.py @@ -0,0 +1,55 @@ +""" +Test that we can retrieve typedefed types correctly +""" + + + +import lldb +import lldbsuite.test.lldbutil as lldbutil +from lldbsuite.test.lldbtest import * +from lldbsuite.test import decorators + +class TestCppTypedef(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def test_typedef(self): + """ + Test that we retrieve typedefed types correctly + """ + + # Build and run until the breakpoint + self.build() + self.main_source_file = lldb.SBFileSpec("main.cpp") + (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( + self, "Set a breakpoint here", self.main_source_file) + + # Get the current frame + frame = thread.GetSelectedFrame() + + # First of all, check that we can get a typedefed type correctly in a simple case + + expr_result = frame.EvaluateExpression("(SF)s") + self.assertTrue(expr_result.IsValid(), "Expression failed with: " + str(expr_result.GetError())) + + typedef_type = expr_result.GetType(); + self.assertTrue(typedef_type.IsValid(), "Can't get `SF` type of evaluated expression") + self.assertTrue(typedef_type.IsTypedefType(), "Type `SF` should be a typedef") + + typedefed_type = typedef_type.GetTypedefedType() + self.assertTrue(typedefed_type.IsValid(), "Can't get `SF` typedefed type") + self.assertEqual(typedefed_type.GetName(), "S<float>", "Got invalid `SF` typedefed type") + + # Check that we can get a typedefed type correctly in the case + # when an elaborated type is created during the parsing + + expr_result = frame.EvaluateExpression("(SF::V)s.value") + self.assertTrue(expr_result.IsValid(), "Expression failed with: " + str(expr_result.GetError())) + + typedef_type = expr_result.GetType(); + self.assertTrue(typedef_type.IsValid(), "Can't get `SF::V` type of evaluated expression") + self.assertTrue(typedef_type.IsTypedefType(), "Type `SF::V` should be a typedef") + + typedefed_type = typedef_type.GetTypedefedType() + self.assertTrue(typedefed_type.IsValid(), "Can't get `SF::V` typedefed type") + self.assertEqual(typedefed_type.GetName(), "float", "Got invalid `SF::V` typedefed type") Index: lldb/test/API/lang/cpp/typedef/Makefile =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/typedef/Makefile @@ -0,0 +1,2 @@ +CXX_SOURCES := main.cpp +include Makefile.rules Index: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp =================================================================== --- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -3541,7 +3541,8 @@ bool TypeSystemClang::IsTypedefType(lldb::opaque_compiler_type_t type) { if (!type) return false; - return GetQualType(type)->getTypeClass() == clang::Type::Typedef; + return RemoveWrappingTypes(GetQualType(type), {clang::Type::Typedef}) + ->getTypeClass() == clang::Type::Typedef; } bool TypeSystemClang::IsVoidType(lldb::opaque_compiler_type_t type) { @@ -4525,8 +4526,8 @@ CompilerType TypeSystemClang::GetTypedefedType(lldb::opaque_compiler_type_t type) { if (type) { - const clang::TypedefType *typedef_type = - llvm::dyn_cast<clang::TypedefType>(GetQualType(type)); + const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>( + RemoveWrappingTypes(GetQualType(type), {clang::Type::Typedef})); if (typedef_type) return GetType(typedef_type->getDecl()->getUnderlyingType()); }
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits