]> granicus.if.org Git - clang/commitdiff
simplify array compatibility testing.
authorChris Lattner <sabre@nondot.org>
Mon, 7 Apr 2008 06:56:55 +0000 (06:56 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 7 Apr 2008 06:56:55 +0000 (06:56 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49326 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ASTContext.h
lib/AST/ASTContext.cpp

index 411fba3a1648d9c2226692bee4d8307d37fd5285..2f669b131de4816ebf09378d23429f477ade4cda 100644 (file)
@@ -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
index e781040172c0b1d23ce0c8eb809580b1b7b1a475..4de367551f0bf34b34fb85f068e4bbbc6b0c9295 100644 (file)
@@ -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