aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/ASTContext.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-04-07 06:49:41 +0000
committerChris Lattner <sabre@nondot.org>2008-04-07 06:49:41 +0000
commit78eca286b0898e98bb2cee943b4ecbea9cc07dd6 (patch)
tree5e94a71663c7d9148763c5b2f80ed06192935621 /lib/AST/ASTContext.cpp
parentb0489814dcb3cb801eeb0784cc6b6fcf575ff71d (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.cpp21
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;