]> granicus.if.org Git - clang/commitdiff
Improve diagnostics when property being looked up
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 16 Dec 2010 00:56:28 +0000 (00:56 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 16 Dec 2010 00:56:28 +0000 (00:56 +0000)
in a forward @class object. // rdar://8774513

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@121933 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExprObjC.cpp
test/SemaObjC/property-9.m

index e9617a2f11fe5c0b02338968230f6a6dacd83cff..8095b946565ed9e98b31f90e0c61b8898b60ccc0 100644 (file)
@@ -2416,6 +2416,10 @@ def err_ref_array_type : Error<
   "cannot refer to declaration with an array type inside block">;
 def err_property_not_found : Error<
   "property %0 not found on object of type %1">;
+def err_property_not_found_forward_class : Error<
+  "property %0 cannot be found in forward class object %1">;
+def note_forward_class : Note<
+  "forward class is declared here">;
 def err_duplicate_property : Error<
   "property has a previous declaration">;
 def ext_gnu_void_ptr : Extension<
index 5d5e8a528bb690aa105d465bf5c503ba7e7565c2..baa34f9ce8db60cac8ebac89cc32d39ddacc4b9a 100644 (file)
@@ -353,6 +353,12 @@ HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT,
   ObjCInterfaceDecl *IFace = IFaceT->getDecl();
   IdentifierInfo *Member = MemberName.getAsIdentifierInfo();
 
+  if (IFace->isForwardDecl()) {
+    Diag(MemberLoc, diag::err_property_not_found_forward_class)
+         << MemberName << QualType(OPT, 0);
+    Diag(IFace->getLocation(), diag::note_forward_class);
+    return ExprError();
+  }
   // Search for a declared property first.
   if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration(Member)) {
     // Check whether we can reference this property.
index 669f9c0e4bd07e47651fd8d1ddb02c0f7d11492c..2b6564d2959399b187bf0221a9c45c85eafdc79e 100644 (file)
@@ -96,3 +96,14 @@ typedef signed char BOOL;
 - (float)setMyStyle:(int)style;
 @end
 
+// rdar://8774513
+@class MDAInstance; // expected-note {{forward class is declared here}}
+
+@interface MDATestDocument
+@property(retain) MDAInstance *instance;
+@end
+
+id f0(MDATestDocument *d) {
+  return d.instance.path; // expected-error {{property 'path' cannot be found in forward class object 'MDAInstance *'}}
+}
+