Commit 20b8eb19 authored by Bill Wendling's avatar Bill Wendling
Browse files

Merging r214735:

------------------------------------------------------------------------
r214735 | ogoffart | 2014-08-04 10:28:11 -0700 (Mon, 04 Aug 2014) | 1 line

Fix crash when accessing a property of an invalid interface
------------------------------------------------------------------------

llvm-svn: 214840
parent 13b8dc20
Loading
Loading
Loading
Loading
+10 −12
Original line number Diff line number Diff line
@@ -284,7 +284,7 @@ namespace {
    bool tryBuildGetOfReference(Expr *op, ExprResult &result);
    bool findSetter(bool warn=true);
    bool findGetter();
    bool DiagnoseUnsupportedPropertyUse();
    void DiagnoseUnsupportedPropertyUse();

    Expr *rebuildAndCaptureObject(Expr *syntacticBase) override;
    ExprResult buildGet() override;
@@ -642,7 +642,7 @@ bool ObjCPropertyOpBuilder::findSetter(bool warn) {
  return false;
}

bool ObjCPropertyOpBuilder::DiagnoseUnsupportedPropertyUse() {
void ObjCPropertyOpBuilder::DiagnoseUnsupportedPropertyUse() {
  if (S.getCurLexicalContext()->isObjCContainer() &&
      S.getCurLexicalContext()->getDeclKind() != Decl::ObjCCategoryImpl &&
      S.getCurLexicalContext()->getDeclKind() != Decl::ObjCImplementation) {
@@ -650,10 +650,8 @@ bool ObjCPropertyOpBuilder::DiagnoseUnsupportedPropertyUse() {
        S.Diag(RefExpr->getLocation(),
               diag::err_property_function_in_objc_container);
        S.Diag(prop->getLocation(), diag::note_property_declare);
        return true;
    }
  }
  return false;
}

/// Capture the base object of an Objective-C property expression.
@@ -679,10 +677,10 @@ Expr *ObjCPropertyOpBuilder::rebuildAndCaptureObject(Expr *syntacticBase) {
/// Load from an Objective-C property reference.
ExprResult ObjCPropertyOpBuilder::buildGet() {
  findGetter();
  if (!Getter && DiagnoseUnsupportedPropertyUse())
  if (!Getter) {
    DiagnoseUnsupportedPropertyUse();
    return ExprError();

  assert(Getter);
  }

  if (SyntacticRefExpr)
    SyntacticRefExpr->setIsMessagingGetter();
@@ -720,10 +718,10 @@ ExprResult ObjCPropertyOpBuilder::buildGet() {
///   value being set as the value of the property operation.
ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc,
                                           bool captureSetValueAsResult) {
  bool hasSetter = findSetter(false);
  if (!hasSetter && DiagnoseUnsupportedPropertyUse())
  if (!findSetter(false)) {
    DiagnoseUnsupportedPropertyUse();
    return ExprError();
  assert(hasSetter); (void) hasSetter;
  }

  if (SyntacticRefExpr)
    SyntacticRefExpr->setIsMessagingSetter();
+5 −1
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
@end
@interface I ()
@property A* response;  // expected-error {{unknown type name 'A'}}
@property  int helper;
@end
@implementation I
@synthesize response;
@@ -16,4 +17,7 @@
}
@end

void foo(I *i)
{
  i.helper;
}