From: Fariborz Jahanian Date: Thu, 17 Feb 2011 01:26:14 +0000 (+0000) Subject: Improve diagnostics when property names an object type of X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=41aadbc530f071fe5ccbfc2560899a4a2e74c057;p=clang Improve diagnostics when property names an object type of a forward class. // rdar://8851803 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125699 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 9ccbf1e1f4..644b509e40 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/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/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index 11fa9eb0b4..c41327e284 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/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/test/SemaObjC/property-missing.m b/test/SemaObjC/property-missing.m index 6ce0beac51..6b794fb02f 100644 --- a/test/SemaObjC/property-missing.m +++ b/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 *'}} +} +