@@ -549,8 +549,59 @@ bool MemberAccessOnOptionalBaseFailure::diagnoseAsError() {
549
549
resultIsOptional, SourceRange ());
550
550
}
551
551
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
+
552
590
void MissingOptionalUnwrapFailure::offerDefaultValueUnwrapFixIt (
553
591
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
+
554
605
auto diag = emitDiagnostic (expr->getLoc (), diag::unwrap_with_default_value);
555
606
556
607
auto &TC = getTypeChecker ();
0 commit comments