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 static bool
IsFunctionPointerType (lldb::clang_type_t clang_type); 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 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 // Typedefs

View File

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