diff options
author | Chris Lattner <sabre@nondot.org> | 2008-04-07 06:49:41 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-04-07 06:49:41 +0000 |
commit | 78eca286b0898e98bb2cee943b4ecbea9cc07dd6 (patch) | |
tree | 5e94a71663c7d9148763c5b2f80ed06192935621 /lib/AST/ASTContext.cpp | |
parent | b0489814dcb3cb801eeb0784cc6b6fcf575ff71d (diff) |
simplify compatibility testing for tag types.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49323 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/ASTContext.cpp')
-rw-r--r-- | lib/AST/ASTContext.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index f6330f67ab..4d0fa755b3 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -1499,17 +1499,20 @@ static bool areCompatVectorTypes(const VectorType *LHS, LHS->getNumElements() == RHS->getNumElements(); } -// C99 6.2.7p1: If both are complete types, then the following additional -// requirements apply...FIXME (handle compatibility across source files). -bool ASTContext::tagTypesAreCompatible(QualType lhs, QualType rhs) { +/// C99 6.2.7p1: If both are complete types, then the following additional +/// requirements apply. +/// FIXME (handle compatibility across source files). +static bool areCompatTagTypes(TagType *LHS, TagType *RHS, + const ASTContext &C) { // "Class" and "id" are compatible built-in structure types. - if (isObjCIdType(lhs) && isObjCClassType(rhs) || - isObjCClassType(lhs) && isObjCIdType(rhs)) + if (C.isObjCIdType(QualType(LHS, 0)) && C.isObjCClassType(QualType(RHS, 0)) || + C.isObjCClassType(QualType(LHS, 0)) && C.isObjCIdType(QualType(RHS, 0))) return true; - // Within a translation unit a tag type is - // only compatible with itself. - return lhs.getCanonicalType() == rhs.getCanonicalType(); + // Within a translation unit a tag type is only compatible with itself. Self + // equality is already handled by the time we get here. + assert(LHS != RHS && "Self equality not handled!"); + return false; } bool ASTContext::pointerTypesAreCompatible(QualType lhs, QualType rhs) { @@ -1695,7 +1698,7 @@ bool ASTContext::typesAreCompatible(QualType LHS_NC, QualType RHS_NC) { case Type::FunctionNoProto: return functionTypesAreCompatible(LHS, RHS); case Type::Tagged: // handle structures, unions - return tagTypesAreCompatible(LHS, RHS); + return areCompatTagTypes(cast<TagType>(LHS), cast<TagType>(RHS), *this); case Type::Builtin: // Only exactly equal builtin types are compatible, which is tested above. return false; |