diff options
-rw-r--r-- | include/clang/AST/ASTContext.h | 1 | ||||
-rw-r--r-- | lib/AST/ASTContext.cpp | 24 |
2 files changed, 12 insertions, 13 deletions
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<ConstantArrayType>(LHS)) + if (const ConstantArrayType* RCAT = dyn_cast<ConstantArrayType>(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<ArrayType>(LHS), cast<ArrayType>(RHS), + *this); case Type::FunctionNoProto: return functionTypesAreCompatible(LHS, RHS); case Type::Tagged: // handle structures, unions |