diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index b31fb6b9b78ef9d6253c2b31aaef2be4bcd2854b..0ee99f5cedf9d06aa991e9b57944843a2c694c0f 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -4182,7 +4182,7 @@ def err_property_not_found : Error< def err_invalid_property_name : Error< "%0 is not a valid property name (accessing an object of type %1)">; def err_getter_not_found : Error< - "expected getter method not found on object of type %0">; + "no getter method for read from property">; def err_objc_subscript_method_not_found : Error< "expected method to %select{read|write}1 %select{dictionary|array}2 element not " "found on object of type %0">; diff --git a/clang/lib/Sema/SemaPseudoObject.cpp b/clang/lib/Sema/SemaPseudoObject.cpp index 74d0818b0e4b359ff4972cc40228506a92f84251..67bf742384482f36966199e8abdce079189266cd 100644 --- a/clang/lib/Sema/SemaPseudoObject.cpp +++ b/clang/lib/Sema/SemaPseudoObject.cpp @@ -113,7 +113,7 @@ namespace { Expr *rebuildSpecific(ObjCPropertyRefExpr *refExpr) { // Fortunately, the constraint that we're rebuilding something // with a base limits the number of cases here. - assert(refExpr->getBase()); + assert(refExpr->isObjectReceiver()); if (refExpr->isExplicitProperty()) { return new (S.Context) @@ -713,10 +713,9 @@ ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc, ExprResult ObjCPropertyOpBuilder::buildRValueOperation(Expr *op) { // Explicit properties always have getters, but implicit ones don't. // Check that before proceeding. - if (RefExpr->isImplicitProperty() && - !RefExpr->getImplicitPropertyGetter()) { + if (RefExpr->isImplicitProperty() && !RefExpr->getImplicitPropertyGetter()) { S.Diag(RefExpr->getLocation(), diag::err_getter_not_found) - << RefExpr->getBase()->getType(); + << RefExpr->getSourceRange(); return ExprError(); } diff --git a/clang/test/SemaObjC/error-missing-getter.m b/clang/test/SemaObjC/error-missing-getter.m index 3c91ab2ffcd02de221430a15f4598429d4b589e2..3dce858837aa96e7fb24e9f5941759bcd5b0103d 100644 --- a/clang/test/SemaObjC/error-missing-getter.m +++ b/clang/test/SemaObjC/error-missing-getter.m @@ -9,11 +9,34 @@ @end int func (int arg, Subclass *x) { - if (x.setterOnly) { // expected-error {{expected getter method not found on object of type 'Subclass *'}} + if (x.setterOnly) { // expected-error {{no getter method for read from property}} x.setterOnly = 1; } - func(x.setterOnly + 1, x); // expected-error {{expected getter method not found on object of type 'Subclass *'}} - int i = x.setterOnly + 1; // expected-error {{expected getter method not found on object of type 'Subclass *'}} - return x.setterOnly + 1; // expected-error {{expected getter method not found on object of type 'Subclass *'}} + func(x.setterOnly + 1, x); // expected-error {{no getter method for read from property}} + int i = x.setterOnly + 1; // expected-error {{no getter method for read from property}} + return x.setterOnly + 1; // expected-error {{no getter method for read from property}} } +// + +@interface TestClass ++ (void) setSetterOnly : (int) arg; +@end + +int func2 (int arg) { + if (TestClass.setterOnly) { // expected-error {{no getter method for read from property}} + TestClass.setterOnly = 1; + } + func(TestClass.setterOnly + 1, x); // expected-error {{no getter method for read from property}} + int i = TestClass.setterOnly + 1; // expected-error {{no getter method for read from property}} + return TestClass.setterOnly + 1; // expected-error {{no getter method for read from property}} +} + +@interface Sub : Subclass +- (int) func3; +@end +@implementation Sub +- (int) func3 { + return super.setterOnly; // expected-error {{no getter method for read from property}} +} +@end diff --git a/clang/test/SemaObjC/property-user-setter.m b/clang/test/SemaObjC/property-user-setter.m index 9ebad6048df87715828d183952411af95741da80..cda983c9ec024a2a0e1e8879875524747c0c02eb 100644 --- a/clang/test/SemaObjC/property-user-setter.m +++ b/clang/test/SemaObjC/property-user-setter.m @@ -89,7 +89,7 @@ void g(int); // expected-note {{passing argument to parameter here}} void f(C *c) { c.Foo = 17; // OK - g(c.Foo); // expected-error {{expected getter method not found on object of type 'C *'}} + g(c.Foo); // expected-error {{no getter method for read from property}} } @@ -132,7 +132,7 @@ int main (void) { self.Pxyz = 0; // expected-error {{synthesized properties 'Pxyz' and 'pxyz' both claim setter 'setPxyz:'}} self.pxyz = 0; // expected-error {{synthesized properties 'pxyz' and 'Pxyz' both claim setter 'setPxyz:'}} self.R = 0; - return self.R; // expected-error {{expected getter method not found on object of type 'rdar11363363 *'}} + return self.R; // expected-error {{no getter method for read from property}} } @end diff --git a/clang/test/SemaObjCXX/properties.mm b/clang/test/SemaObjCXX/properties.mm index 0783eebc11c50a84ea55a846abd585b37df61da4..804d6829b164f786be78d92bdd1a598b70d1b998 100644 --- a/clang/test/SemaObjCXX/properties.mm +++ b/clang/test/SemaObjCXX/properties.mm @@ -28,7 +28,7 @@ struct X { - (int) z; @end void test2(Test2 *a) { - auto y = a.y; // expected-error {{expected getter method not found on object of type 'Test2 *'}} + auto y = a.y; // expected-error {{no getter method for read from property}} auto z = a.z; }