diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2011-02-17 01:26:14 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2011-02-17 01:26:14 +0000 |
commit | 05d389f407d039f65d6e16e2002e9620550636fc (patch) | |
tree | ad091f6bf117608b73e4809c25d6331207ba044c | |
parent | 669a25aec3a815850a1587d345f6617fff9794c1 (diff) | |
download | bcm5719-llvm-05d389f407d039f65d6e16e2002e9620550636fc.tar.gz bcm5719-llvm-05d389f407d039f65d6e16e2002e9620550636fc.zip |
Improve diagnostics when property names an object type of
a forward class. // rdar://8851803
llvm-svn: 125699
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 16 | ||||
-rw-r--r-- | clang/test/SemaObjC/property-missing.m | 12 |
3 files changed, 30 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 9ccbf1e1f49..644b509e40e 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -2567,6 +2567,8 @@ def err_getter_not_found : Error< "expected getter method not found on object of type %0">; def err_property_not_found_forward_class : Error< "property %0 cannot be found in forward class object %1">; +def err_property_not_as_forward_class : Error< + "property %0 names an object of forward class type in class object %1">; def note_forward_class : Note< "forward class is declared here">; def err_duplicate_property : Error< diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 11fa9eb0b42..c41327e2846 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -520,6 +520,22 @@ HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT, return HandleExprPropertyRefExpr(OPT, BaseExpr, TypoResult, MemberLoc, SuperLoc, SuperType, Super); } + ObjCInterfaceDecl *ClassDeclared; + if (ObjCIvarDecl *Ivar = + IFace->lookupInstanceVariable(Member, ClassDeclared)) { + QualType T = Ivar->getType(); + if (const ObjCObjectPointerType * OBJPT = + T->getAsObjCInterfacePointerType()) { + const ObjCInterfaceType *IFaceT = OBJPT->getInterfaceType(); + if (ObjCInterfaceDecl *IFace = IFaceT->getDecl()) + if (IFace->isForwardDecl()) { + Diag(MemberLoc, diag::err_property_not_as_forward_class) + << MemberName << QualType(OPT, 0); + Diag(IFace->getLocation(), diag::note_forward_class); + return ExprError(); + } + } + } Diag(MemberLoc, diag::err_property_not_found) << MemberName << QualType(OPT, 0); diff --git a/clang/test/SemaObjC/property-missing.m b/clang/test/SemaObjC/property-missing.m index 6ce0beac51c..6b794fb02f3 100644 --- a/clang/test/SemaObjC/property-missing.m +++ b/clang/test/SemaObjC/property-missing.m @@ -20,3 +20,15 @@ void f3(id o) o.foo; // expected-error{{property 'foo' not found on object of type 'id'}} } +// rdar://8851803 +@class SomeOtherClass; // expected-note {{forward class is declared here}} + +@interface MyClass { + SomeOtherClass *someOtherObject; +} +@end + +void foo(MyClass *myObject) { + myObject.someOtherObject.someProperty = 0; // expected-error {{property 'someOtherObject' names an object of forward class type in class object 'MyClass *'}} +} + |