Skip to content

Commit e3299ab

Browse files
authored
[lldb][TypeSystem] Fix GetTypeInfo for vector and complex types (#165837)
We were setting these bits inverted. Not sure how this bug actually manifests, I just noticed when working on #165707. I suspect these types just aren't very frequently used.
1 parent 94f3eee commit e3299ab

File tree

2 files changed

+37
-8
lines changed

2 files changed

+37
-8
lines changed

lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3965,9 +3965,9 @@ TypeSystemClang::GetTypeInfo(lldb::opaque_compiler_type_t type,
39653965
if (complex_type) {
39663966
clang::QualType complex_element_type(complex_type->getElementType());
39673967
if (complex_element_type->isIntegerType())
3968-
complex_type_flags |= eTypeIsFloat;
3969-
else if (complex_element_type->isFloatingType())
39703968
complex_type_flags |= eTypeIsInteger;
3969+
else if (complex_element_type->isFloatingType())
3970+
complex_type_flags |= eTypeIsFloat;
39713971
}
39723972
return complex_type_flags;
39733973
} break;
@@ -4062,12 +4062,17 @@ TypeSystemClang::GetTypeInfo(lldb::opaque_compiler_type_t type,
40624062
uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
40634063
const clang::VectorType *vector_type = llvm::dyn_cast<clang::VectorType>(
40644064
qual_type->getCanonicalTypeInternal());
4065-
if (vector_type) {
4066-
if (vector_type->isIntegerType())
4067-
vector_type_flags |= eTypeIsFloat;
4068-
else if (vector_type->isFloatingType())
4069-
vector_type_flags |= eTypeIsInteger;
4070-
}
4065+
if (!vector_type)
4066+
return 0;
4067+
4068+
QualType element_type = vector_type->getElementType();
4069+
if (element_type.isNull())
4070+
return 0;
4071+
4072+
if (element_type->isIntegerType())
4073+
vector_type_flags |= eTypeIsInteger;
4074+
else if (element_type->isFloatingType())
4075+
vector_type_flags |= eTypeIsFloat;
40714076
return vector_type_flags;
40724077
}
40734078
default:

lldb/unittests/Symbol/TestTypeSystemClang.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,6 +1123,30 @@ TEST_F(TestTypeSystemClang, AddMethodToCXXRecordType_ParmVarDecls) {
11231123
EXPECT_EQ(method_it->getParamDecl(1)->getDeclContext(), *method_it);
11241124
}
11251125

1126+
TEST_F(TestTypeSystemClang, TestGetTypeInfo) {
1127+
// Tests TypeSystemClang::GetTypeInfo
1128+
1129+
const ASTContext &ast = m_ast->getASTContext();
1130+
1131+
CompilerType complex_int = m_ast->GetType(ast.getComplexType(ast.IntTy));
1132+
EXPECT_EQ(complex_int.GetTypeInfo(),
1133+
(eTypeIsInteger | eTypeIsComplex | eTypeIsBuiltIn | eTypeHasValue));
1134+
1135+
CompilerType complex_float = m_ast->GetType(ast.getComplexType(ast.FloatTy));
1136+
EXPECT_EQ(complex_float.GetTypeInfo(),
1137+
(eTypeIsFloat | eTypeIsComplex | eTypeIsBuiltIn | eTypeHasValue));
1138+
1139+
CompilerType vector_of_int =
1140+
m_ast->GetType(ast.getVectorType(ast.IntTy, 1, VectorKind::Generic));
1141+
EXPECT_EQ(vector_of_int.GetTypeInfo(),
1142+
(eTypeIsInteger | eTypeIsVector | eTypeHasChildren));
1143+
1144+
CompilerType vector_of_float =
1145+
m_ast->GetType(ast.getVectorType(ast.FloatTy, 1, VectorKind::Generic));
1146+
EXPECT_EQ(vector_of_float.GetTypeInfo(),
1147+
(eTypeIsFloat | eTypeIsVector | eTypeHasChildren));
1148+
}
1149+
11261150
TEST_F(TestTypeSystemClang, AsmLabel_CtorDtor) {
11271151
// Tests TypeSystemClang::DeclGetMangledName for constructors/destructors
11281152
// with and without AsmLabels.

0 commit comments

Comments
 (0)