зеркало из https://github.com/microsoft/clang-1.git
Be a bit stricter about array type compatibility.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46799 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
9eee0f8593
Коммит
4e92acf3b7
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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}}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче