Merge pull request #10718 from xedin/rdar-33067102-4.0
[4.0] [QoI] Don't assume that contextual type is always present for trailing closure diagnostics
diff --git a/lib/Sema/CSDiag.cpp b/lib/Sema/CSDiag.cpp
index c44733e..678f636 100644
--- a/lib/Sema/CSDiag.cpp
+++ b/lib/Sema/CSDiag.cpp
@@ -6159,28 +6159,30 @@
if (!fnType)
return false;
- auto expectedArgType = FunctionType::get(fnType->getInput(), resultType,
- fnType->getExtInfo());
-
- auto expectedType =
- FunctionType::get(expectedArgType, CS->getContextualType());
-
class ClosureCalleeListener : public ExprTypeCheckListener {
- Type contextualType;
+ Type InputType;
+ Type ResultType;
public:
- explicit ClosureCalleeListener(Type contextualType)
- : contextualType(contextualType) {}
+ explicit ClosureCalleeListener(Type inputType, Type resultType)
+ : InputType(inputType), ResultType(resultType) {}
bool builtConstraints(ConstraintSystem &cs, Expr *expr) override {
+ if (!InputType || !ResultType)
+ return false;
+
+ auto expectedType = FunctionType::get(InputType, ResultType);
cs.addConstraint(ConstraintKind::Conversion, cs.getType(expr),
- contextualType, cs.getConstraintLocator(expr),
+ expectedType, cs.getConstraintLocator(expr),
/*isFavored*/ true);
return false;
}
};
- ClosureCalleeListener listener(expectedType);
+ auto expectedArgType = FunctionType::get(fnType->getInput(), resultType,
+ fnType->getExtInfo());
+
+ ClosureCalleeListener listener(expectedArgType, CS->getContextualType());
return !typeCheckChildIndependently(callExpr->getFn(), Type(),
CTP_CalleeResult, TCC_ForceRecheck,
&listener);
diff --git a/validation-test/compiler_crashers_2_fixed/0111-rdar33067102.swift b/validation-test/compiler_crashers_2_fixed/0111-rdar33067102.swift
new file mode 100644
index 0000000..3d349e9
--- /dev/null
+++ b/validation-test/compiler_crashers_2_fixed/0111-rdar33067102.swift
@@ -0,0 +1,5 @@
+// RUN: not %target-swift-frontend -swift-version 4 %s -typecheck
+
+func flatterMap(_ records: [(Int)]) -> [Int] {
+ records.flatMap { _ in return 1 } // expected-note {{}}
+}