@@ -549,8 +549,59 @@ bool MemberAccessOnOptionalBaseFailure::diagnoseAsError() {
549549 resultIsOptional, SourceRange ());
550550}
551551
552+ Optional<AnyFunctionType::Param>
553+ MissingOptionalUnwrapFailure::getOperatorParameterFor (Expr *expr) const {
554+ auto *parentExpr = findParentExpr (expr);
555+ if (!parentExpr)
556+ return None;
557+
558+ auto getArgIdx = [](TupleExpr *tuple, Expr *argExpr) -> unsigned {
559+ for (unsigned i = 0 , n = tuple->getNumElements (); i != n; ++i) {
560+ if (tuple->getElement (i) == argExpr)
561+ return i;
562+ }
563+ llvm_unreachable (" argument is not in enclosing tuple?!" );
564+ };
565+
566+ auto *tupleExpr = dyn_cast<TupleExpr>(parentExpr);
567+ if (!(tupleExpr && tupleExpr->isImplicit ()))
568+ return None;
569+
570+ parentExpr = findParentExpr (tupleExpr);
571+ if (!(parentExpr && isa<ApplyExpr>(parentExpr)))
572+ return None;
573+
574+ auto &cs = getConstraintSystem ();
575+ auto *fnExpr = cast<ApplyExpr>(parentExpr)->getFn ();
576+ if (auto overload =
577+ getOverloadChoiceIfAvailable (cs.getConstraintLocator (fnExpr))) {
578+ if (auto *decl = overload->choice .getDecl ()) {
579+ if (!decl->isOperator ())
580+ return None;
581+
582+ auto *fnType = overload->openedType ->castTo <FunctionType>();
583+ return fnType->getParams ()[getArgIdx (tupleExpr, expr)];
584+ }
585+ }
586+
587+ return None;
588+ }
589+
552590void MissingOptionalUnwrapFailure::offerDefaultValueUnwrapFixIt (
553591 DeclContext *DC, Expr *expr) const {
592+ auto *anchor = getAnchor ();
593+
594+ // If anchor is an explicit address-of, or expression which produces
595+ // an l-value (e.g. first argument of `+=` operator), let's not
596+ // suggest default value here because that would produce r-value type.
597+ if (isa<InOutExpr>(anchor))
598+ return ;
599+
600+ if (auto param = getOperatorParameterFor (anchor)) {
601+ if (param->isInOut ())
602+ return ;
603+ }
604+
554605 auto diag = emitDiagnostic (expr->getLoc (), diag::unwrap_with_default_value);
555606
556607 auto &TC = getTypeChecker ();
0 commit comments