From 38aafa842843e746db067b480318b30aae45c949 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Tue, 5 Aug 2014 05:19:17 +0000 Subject: Merging r214734: ------------------------------------------------------------------------ r214734 | ogoffart | 2014-08-04 10:28:05 -0700 (Mon, 04 Aug 2014) | 7 lines Fix crash when assiging to a property with an invalid type This is a regression from clang 3.4 Set the result to ExprError and returns true, rather than simply returns false because errors have been reported already and returning false show a confusing error ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_35@214839 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaPseudoObject.cpp | 7 ++++++- test/SemaObjCXX/property-invalid-type.mm | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 test/SemaObjCXX/property-invalid-type.mm diff --git a/lib/Sema/SemaPseudoObject.cpp b/lib/Sema/SemaPseudoObject.cpp index c8d34f84e1..fac7774734 100644 --- a/lib/Sema/SemaPseudoObject.cpp +++ b/lib/Sema/SemaPseudoObject.cpp @@ -845,7 +845,12 @@ bool ObjCPropertyOpBuilder::tryBuildGetOfReference(Expr *op, if (!S.getLangOpts().CPlusPlus) return false; findGetter(); - assert(Getter && "property has no setter and no getter!"); + if (!Getter) { + // The property has no setter and no getter! This can happen if the type is + // invalid. Error have already been reported. + result = ExprError(); + return true; + } // Only do this if the getter returns an l-value reference type. QualType resultType = Getter->getReturnType(); diff --git a/test/SemaObjCXX/property-invalid-type.mm b/test/SemaObjCXX/property-invalid-type.mm new file mode 100644 index 0000000000..e249ace3d2 --- /dev/null +++ b/test/SemaObjCXX/property-invalid-type.mm @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s + +@interface I +{ + A* response; // expected-error {{unknown type name 'A'}} +} +@end +@interface I () +@property A* response; // expected-error {{unknown type name 'A'}} +@end +@implementation I +@synthesize response; +- (void) foo :(A*) a // expected-error {{expected a type}} +{ + self.response = a; +} +@end + + -- cgit v1.2.3