diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2008-02-15 06:03:44 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2008-02-15 06:03:44 +0000 |
commit | a01cfa75eb31c91f4f4ecb668add350eccd143fb (patch) | |
tree | cc0ba992043586a40fc585c5f8d4c8e2c03c585f | |
parent | 4490ef5b07870f879d36c6a99b4075703835100a (diff) | |
download | bcm5719-llvm-a01cfa75eb31c91f4f4ecb668add350eccd143fb.tar.gz bcm5719-llvm-a01cfa75eb31c91f4f4ecb668add350eccd143fb.zip |
Partial fix for struct compatibility; there's still something messy
going on with mixing scopes, though.
llvm-svn: 47152
-rw-r--r-- | clang/AST/ASTContext.cpp | 16 | ||||
-rw-r--r-- | clang/test/Sema/struct-compat.c | 19 |
2 files changed, 23 insertions, 12 deletions
diff --git a/clang/AST/ASTContext.cpp b/clang/AST/ASTContext.cpp index d01de2b3a9c..d4a689cb2d4 100644 --- a/clang/AST/ASTContext.cpp +++ b/clang/AST/ASTContext.cpp @@ -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) { diff --git a/clang/test/Sema/struct-compat.c b/clang/test/Sema/struct-compat.c new file mode 100644 index 00000000000..d63f9cd97c4 --- /dev/null +++ b/clang/test/Sema/struct-compat.c @@ -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; +} |