Be a bit stricter about array type compatibility.

llvm-svn: 46799
This commit is contained in:
Eli Friedman 2008-02-06 04:53:22 +00:00
parent a5e4d30942
commit d49a720d52
2 changed files with 16 additions and 7 deletions

View 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;
}

View 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}}
}