]> granicus.if.org Git - clang/commitdiff
Issue extended diagnostic when property dot-syntax is used and
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 19 Feb 2010 18:30:30 +0000 (18:30 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 19 Feb 2010 18:30:30 +0000 (18:30 +0000)
there is a setter but no getter (part of radar 7664555).

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
test/SemaObjC/property-user-setter.m

index 52d4dd26ff48cf0db6b334760a01a6e1f0be02db..a8b295abb2f8bae4e464672a9b98e2c6a0ec8754 100644 (file)
@@ -2704,6 +2704,8 @@ def ext_c99_array_usage : Extension<
 def err_c99_array_usage_cxx : Error<
   "C99-specific array features are not permitted in C++">;
   
+def note_getter_unavailable : Note<
+  "or because setter is declared here, but no getter method %0 is found">;
 def err_invalid_protocol_qualifiers : Error<
   "invalid protocol qualifiers on non-ObjC type">;
 def warn_ivar_use_hidden : Warning<
index e950be04858759b12b83a0592ec86baa74725b8b..b3bb7dc7d577c3e596144e1478f82338bdfc3270 100644 (file)
@@ -3147,9 +3147,12 @@ Sema::LookupMemberExpr(LookupResult &R, Expr *&BaseExpr,
       return LookupMemberExpr(Res, BaseExpr, IsArrow, OpLoc, SS,
                               ObjCImpDecl);
     }
-
-    return ExprError(Diag(MemberLoc, diag::err_property_not_found)
-      << MemberName << BaseType);
+    Diag(MemberLoc, diag::err_property_not_found)
+      << MemberName << BaseType;
+    if (Setter && !Getter)
+      Diag(Setter->getLocation(), diag::note_getter_unavailable)
+        << MemberName << BaseExpr->getSourceRange();
+    return ExprError();
   }
 
   // Handle the following exceptional case (*Obj).isa.
@@ -3168,7 +3171,7 @@ Sema::LookupMemberExpr(LookupResult &R, Expr *&BaseExpr,
     return Owned(new (Context) ExtVectorElementExpr(ret, BaseExpr, *Member,
                                                     MemberLoc));
   }
-
+  
   Diag(MemberLoc, diag::err_typecheck_member_reference_struct_union)
     << BaseType << BaseExpr->getSourceRange();
 
index babccee4a7f04cd8e5f944f5dc8e2b40fa04db9e..9479bc6a73b29d553b94b9c77c71926d8127c079 100644 (file)
@@ -70,7 +70,7 @@ static int g_val;
 {
     int setterOnly;
 }
-- (void) setSetterOnly:(int)value;
+- (void) setSetterOnly:(int)value;     // expected-note {{or because setter is declared here, but no getter method 'setterOnly' is found}}
 @end
 
 @implementation Subclass
@@ -82,7 +82,7 @@ static int g_val;
 
 @interface C {}
 // - (int)Foo;
-- (void)setFoo:(int)value;
+- (void)setFoo:(int)value;     // expected-note 2 {{or because setter is declared here, but no getter method 'Foo' is found}}
 @end
 
 void g(int);