forked from OSchip/llvm-project
Partial fix for struct compatibility; there's still something messy
going on with mixing scopes, though. llvm-svn: 47152
This commit is contained in:
parent
4490ef5b07
commit
a01cfa75eb
|
@ -1555,22 +1555,14 @@ bool ASTContext::vectorTypesAreCompatible(QualType lhs, QualType rhs) {
|
|||
// C99 6.2.7p1: If both are complete types, then the following additional
|
||||
// requirements apply...FIXME (handle compatibility across source files).
|
||||
bool ASTContext::tagTypesAreCompatible(QualType lhs, QualType rhs) {
|
||||
TagDecl *ldecl = cast<TagType>(lhs.getCanonicalType())->getDecl();
|
||||
TagDecl *rdecl = cast<TagType>(rhs.getCanonicalType())->getDecl();
|
||||
|
||||
if (ldecl->getKind() == Decl::Struct && rdecl->getKind() == Decl::Struct) {
|
||||
if (ldecl->getIdentifier() == rdecl->getIdentifier())
|
||||
return true;
|
||||
}
|
||||
if (ldecl->getKind() == Decl::Union && rdecl->getKind() == Decl::Union) {
|
||||
if (ldecl->getIdentifier() == rdecl->getIdentifier())
|
||||
return true;
|
||||
}
|
||||
// "Class" and "id" are compatible built-in structure types.
|
||||
if (isObjCIdType(lhs) && isObjCClassType(rhs) ||
|
||||
isObjCClassType(lhs) && isObjCIdType(rhs))
|
||||
return true;
|
||||
return false;
|
||||
|
||||
// Within a translation unit a tag type is
|
||||
// only compatible with itself.
|
||||
return lhs.getCanonicalType() == rhs.getCanonicalType();
|
||||
}
|
||||
|
||||
bool ASTContext::pointerTypesAreCompatible(QualType lhs, QualType rhs) {
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
/* RUN: clang %s -fsyntax-only -pedantic -verify
|
||||
*/
|
||||
|
||||
extern struct {int a;} x; // expected-error{{previous definition is here}}
|
||||
extern struct {int a;} x; // expected-error{{redefinition of 'x'}}
|
||||
|
||||
struct x;
|
||||
int a(struct x* b) {
|
||||
// FIXME: This test currently fails
|
||||
// Per C99 6.7.2.3, since the outer and inner "struct x"es have different
|
||||
// scopes, they don't refer to the same type, and are therefore incompatible
|
||||
struct x {int a;} *c = b;
|
||||
}
|
||||
|
||||
struct x {int a;} r;
|
||||
int b() {
|
||||
// FIXME: This test currently also fails
|
||||
struct x {char x;} s = r;
|
||||
}
|
Loading…
Reference in New Issue