diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2012-01-24 00:40:15 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2012-01-24 00:40:15 +0000 |
commit | 04c4455dd443c67584d59c5d993aaada92233073 (patch) | |
tree | e681219cdbdca040807eeffb17aef5308c00b675 /clang/lib/Sema | |
parent | ed975232bc929251dd1aeda5d609aa40b0372f5f (diff) | |
download | bcm5719-llvm-04c4455dd443c67584d59c5d993aaada92233073.tar.gz bcm5719-llvm-04c4455dd443c67584d59c5d993aaada92233073.zip |
objective-c: Ignore with warning forward class declaration whose name
matches a typedef declaring an object type. // rdar://10733000
llvm-svn: 148760
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index ff92453ca7f..4264b7105a7 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -1776,17 +1776,22 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc, // typedef NSObject < XCElementTogglerP > XCElementToggler; // @class XCElementToggler; // - // FIXME: Make an extension? + // Here we have chosen to ignore the forward class declaration + // with a warning. Since this is the implied behavior. TypedefNameDecl *TDD = dyn_cast<TypedefNameDecl>(PrevDecl); if (!TDD || !TDD->getUnderlyingType()->isObjCObjectType()) { Diag(AtClassLoc, diag::err_redefinition_different_kind) << IdentList[i]; Diag(PrevDecl->getLocation(), diag::note_previous_definition); } else { // a forward class declaration matching a typedef name of a class refers - // to the underlying class. - if (const ObjCObjectType *OI = - TDD->getUnderlyingType()->getAs<ObjCObjectType>()) - PrevDecl = OI->getInterface(); + // to the underlying class. Just ignore the forward class with a warning + // as this will force the intended behavior which is to lookup the typedef + // name. + if (isa<ObjCObjectType>(TDD->getUnderlyingType())) { + Diag(AtClassLoc, diag::warn_forward_class_redefinition) << IdentList[i]; + Diag(PrevDecl->getLocation(), diag::note_previous_definition); + continue; + } } } |