Skip to content

Commit 505d4a1

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

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
@@ -3997,9 +3997,9 @@ TypeSystemClang::GetTypeInfo(lldb::opaque_compiler_type_t type,
39973997
if (complex_type) {
39983998
clang::QualType complex_element_type(complex_type->getElementType());
39993999
if (complex_element_type->isIntegerType())
4000-
complex_type_flags |= eTypeIsFloat;
4001-
else if (complex_element_type->isFloatingType())
40024000
complex_type_flags |= eTypeIsInteger;
4001+
else if (complex_element_type->isFloatingType())
4002+
complex_type_flags |= eTypeIsFloat;
40034003
}
40044004
return complex_type_flags;
40054005
} break;
@@ -4095,12 +4095,17 @@ TypeSystemClang::GetTypeInfo(lldb::opaque_compiler_type_t type,
40954095
uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
40964096
const clang::VectorType *vector_type = llvm::dyn_cast<clang::VectorType>(
40974097
qual_type->getCanonicalTypeInternal());
4098-
if (vector_type) {
4099-
if (vector_type->isIntegerType())
4100-
vector_type_flags |= eTypeIsFloat;
4101-
else if (vector_type->isFloatingType())
4102-
vector_type_flags |= eTypeIsInteger;
4103-
}
4098+
if (!vector_type)
4099+
return 0;
4100+
4101+
QualType element_type = vector_type->getElementType();
4102+
if (element_type.isNull())
4103+
return 0;
4104+
4105+
if (element_type->isIntegerType())
4106+
vector_type_flags |= eTypeIsInteger;
4107+
else if (element_type->isFloatingType())
4108+
vector_type_flags |= eTypeIsFloat;
41044109
return vector_type_flags;
41054110
}
41064111
default:

lldb/unittests/Symbol/TestTypeSystemClang.cpp

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

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

0 commit comments

Comments
 (0)