From: Chris Lattner Date: Mon, 7 Apr 2008 06:56:55 +0000 (+0000) Subject: simplify array compatibility testing. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=acc9972da24df89ea283d6f979ffbd0e4fa0e1a5;p=clang simplify array compatibility testing. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49326 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index 411fba3a16..2f669b131d 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -330,7 +330,6 @@ public: bool pointerTypesAreCompatible(QualType, QualType); // C99 6.7.5.1p2 bool referenceTypesAreCompatible(QualType, QualType); // C++ 5.17p6 bool functionTypesAreCompatible(QualType, QualType); // C99 6.7.5.3p15 - bool arrayTypesAreCompatible(QualType, QualType); // C99 6.7.5.2p6 bool isObjCIdType(QualType T) const { if (!IdStructType) // ObjC isn't enabled diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index e781040172..4de367551f 100644 --- a/lib/AST/ASTContext.cpp +++ b/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