Made IsArrayOfScalarType handle typedefs correctly.

We should ultimately introduce GetAs...Type
functions in all cases where we have Is...Type
functions that know how to look inside typedefs.

llvm-svn: 148512
This commit is contained in:
Sean Callanan 2012-01-19 23:54:24 +00:00
parent 21fa1887e0
commit 0caa21cb25
2 changed files with 28 additions and 16 deletions

View File

@ -782,8 +782,18 @@ public:
static bool
IsFunctionPointerType (lldb::clang_type_t clang_type);
static lldb::clang_type_t
GetAsArrayType (lldb::clang_type_t clang_type,
lldb::clang_type_t *member_type = NULL,
uint64_t *size = NULL);
static bool
IsArrayType (lldb::clang_type_t clang_type, lldb::clang_type_t *member_type = NULL, uint64_t *size = NULL);
IsArrayType (lldb::clang_type_t clang_type,
lldb::clang_type_t *member_type = NULL,
uint64_t *size = NULL)
{
return GetAsArrayType(clang_type, member_type, size) != 0;
}
//------------------------------------------------------------------
// Typedefs

View File

@ -5537,7 +5537,9 @@ ClangASTContext::IsPointerToScalarType (lldb::clang_type_t clang_type)
bool
ClangASTContext::IsArrayOfScalarType (lldb::clang_type_t clang_type)
{
if (!IsArrayType(clang_type))
clang_type = GetAsArrayType(clang_type);
if (clang_type == 0)
return false;
QualType qual_type (QualType::getFromOpaquePtr(clang_type));
@ -5708,11 +5710,11 @@ ClangASTContext::GetArraySize (clang_type_t clang_type)
return 0;
}
bool
ClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
clang_type_t
ClangASTContext::GetAsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
{
if (!clang_type)
return false;
return 0;
QualType qual_type (QualType::getFromOpaquePtr(clang_type));
@ -5727,40 +5729,40 @@ ClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type,
*member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
if (size)
*size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
return true;
return clang_type;
case clang::Type::IncompleteArray:
if (member_type)
*member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
if (size)
*size = 0;
return true;
return clang_type;
case clang::Type::VariableArray:
if (member_type)
*member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
if (size)
*size = 0;
return true;
return clang_type;
case clang::Type::DependentSizedArray:
if (member_type)
*member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
if (size)
*size = 0;
return true;
return clang_type;
case clang::Type::Typedef:
return ClangASTContext::IsArrayType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
member_type,
size);
return ClangASTContext::GetAsArrayType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
member_type,
size);
case clang::Type::Elaborated:
return ClangASTContext::IsArrayType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
member_type,
size);
return ClangASTContext::GetAsArrayType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
member_type,
size);
}
return false;
return 0;
}