]> granicus.if.org Git - clang/commitdiff
Be a bit stricter about array type compatibility.
authorEli Friedman <eli.friedman@gmail.com>
Wed, 6 Feb 2008 04:53:22 +0000 (04:53 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Wed, 6 Feb 2008 04:53:22 +0000 (04:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46799 91177308-0d34-0410-b5e6-96231b3b80d8

AST/ASTContext.cpp
test/Sema/compare.c

index 823a20bb03da2f437cd98d2fad6ca3a23dfb7991..535f69271f0d28f2b000177c34c82f18cf4bfcc3 100644 (file)
@@ -1627,14 +1627,18 @@ bool ASTContext::functionTypesAreCompatible(QualType lhs, QualType rhs) {
 }
 
 bool ASTContext::arrayTypesAreCompatible(QualType lhs, QualType rhs) {
-  QualType ltype = cast<ArrayType>(lhs.getCanonicalType())->getElementType();
-  QualType rtype = cast<ArrayType>(rhs.getCanonicalType())->getElementType();
-  
+  // Compatible arrays must have compatible element types
+  QualType ltype = lhs->getAsArrayType()->getElementType();
+  QualType rtype = rhs->getAsArrayType()->getElementType();
+
   if (!typesAreCompatible(ltype, rtype))
     return false;
-    
-  // FIXME: If both types specify constant sizes, then the sizes must also be 
-  // the same. Even if the sizes are the same, GCC produces an error.
+
+  // Compatible arrays must be the same size
+  if (const ConstantArrayType* LCAT = lhs->getAsConstantArrayType())
+    if (const ConstantArrayType* RCAT = rhs->getAsConstantArrayType())
+      return RCAT->getSize() == LCAT->getSize();
+
   return true;
 }
 
index 25d7a9169b94ba64deef9ac382e7cefeced615c5..e1ebf575ac629cab4e50d07ce49c3fc10432ffec 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -pedantic -verify %s
 
 int test(char *C) { // nothing here should warn.
   return C != ((void*)0);
@@ -10,3 +10,8 @@ int equal(char *a, const char *b)
 {
     return a == b;
 }
+
+int arrays(char (*a)[5], char(*b)[10], char(*c)[5]) {
+  int d = (a == c);
+  return a == b; // expected-warning {{comparison of distinct pointer types}}
+}