From e6b27c6ecdd57c12f70c133fdaa8d3fbe63e1a43 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 7 Apr 2008 06:56:55 +0000 Subject: simplify array compatibility testing. llvm-svn: 49326 --- clang/lib/AST/ASTContext.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'clang/lib/AST/ASTContext.cpp') diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index e781040172c..4de367551f0 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -1513,20 +1513,19 @@ bool ASTContext::functionTypesAreCompatible(QualType lhs, QualType rhs) { return true; } -bool ASTContext::arrayTypesAreCompatible(QualType lhs, QualType rhs) { +// C99 6.7.5.2p6 +static bool areCompatArrayTypes(ArrayType *LHS, ArrayType *RHS, ASTContext &C) { // Compatible arrays must have compatible element types - QualType ltype = lhs->getAsArrayType()->getElementType(); - QualType rtype = rhs->getAsArrayType()->getElementType(); + QualType ltype = LHS->getElementType(); + QualType rtype = RHS->getElementType(); - if (!typesAreCompatible(ltype, rtype)) - return false; - - // Compatible arrays must be the same size - if (const ConstantArrayType* LCAT = lhs->getAsConstantArrayType()) - if (const ConstantArrayType* RCAT = rhs->getAsConstantArrayType()) - return RCAT->getSize() == LCAT->getSize(); + // Constant arrays must be the same size to be compatible. + if (const ConstantArrayType* LCAT = dyn_cast(LHS)) + if (const ConstantArrayType* RCAT = dyn_cast(RHS)) + if (RCAT->getSize() != LCAT->getSize()) + return false; - return true; + return C.typesAreCompatible(QualType(LHS, 0), QualType(RHS, 0)); } /// areCompatVectorTypes - Return true if the two specified vector types are @@ -1681,7 +1680,8 @@ bool ASTContext::typesAreCompatible(QualType LHS_NC, QualType RHS_NC) { case Type::Pointer: return pointerTypesAreCompatible(LHS, RHS); case Type::ConstantArray: - return arrayTypesAreCompatible(LHS, RHS); + return areCompatArrayTypes(cast(LHS), cast(RHS), + *this); case Type::FunctionNoProto: return functionTypesAreCompatible(LHS, RHS); case Type::Tagged: // handle structures, unions -- cgit v1.2.3