Merge pull request #42228 from xedin/enable-se-0347-by-default

[TypeChecker] SE-0347: Enable type inference from default expressions
This commit is contained in:
Pavel Yaskevich
2022-04-08 16:10:20 -07:00
committed by GitHub
9 changed files with 21 additions and 18 deletions

View File

@@ -5,6 +5,20 @@ _**Note:** This is in reverse chronological order, so newer entries are added to
## Swift 5.7
* [SE-0347][]:
It's now possible to use a default value expression with a generic parameter type
to default the argument and its type:
```
func compute<C: Collection>(_ values: C = [0, 1, 2]) {
...
}
```
`compute` is now accepted by compiler and `[Int]` is going to be inferred
for `C` at call sites that do not provide the argument explicitly.
* [SE-0326][]:
It's now possible to infer parameter and result types from the body of a multi-statement
@@ -9150,6 +9164,7 @@ Swift 1.0
[SE-0340]: <https://github.com/apple/swift-evolution/blob/main/proposals/0340-swift-noasync.md>
[SE-0345]: <https://github.com/apple/swift-evolution/blob/main/proposals/0345-if-let-shorthand.md>
[SE-0326]: <https://github.com/apple/swift-evolution/blob/main/proposals/0326-extending-multi-statement-closure-inference.md>
[SE-0347]: <https://github.com/apple/swift-evolution/blob/main/proposals/0347-type-inference-from-default-exprs.md>
[SR-75]: <https://bugs.swift.org/browse/SR-75>
[SR-106]: <https://bugs.swift.org/browse/SR-106>

View File

@@ -752,10 +752,6 @@ namespace swift {
/// closures.
bool EnableMultiStatementClosureInference = true;
/// Enable experimental support for generic parameter inference in
/// parameter positions from associated default expressions.
bool EnableTypeInferenceFromDefaultArguments = false;
/// See \ref FrontendOptions.PrintFullConvention
bool PrintFullConvention = false;
};

View File

@@ -1107,9 +1107,6 @@ static bool ParseTypeCheckerArgs(TypeCheckerOptions &Opts, ArgList &Args,
Opts.EnableMultiStatementClosureInference |=
Args.hasArg(OPT_experimental_multi_statement_closures);
Opts.EnableTypeInferenceFromDefaultArguments |=
Args.hasArg(OPT_experimental_type_inference_from_defaults);
Opts.PrintFullConvention |=
Args.hasArg(OPT_experimental_print_full_convention);

View File

@@ -1780,7 +1780,8 @@ static ConstraintSystem::TypeMatchResult matchCallArguments(
if (parameterBindings[paramIdx].empty() && callee) {
auto &ctx = cs.getASTContext();
if (ctx.TypeCheckerOpts.EnableTypeInferenceFromDefaultArguments) {
// Type inference from default value expressions.
{
auto *paramList = getParameterList(callee);
if (!paramList)
continue;

View File

@@ -464,10 +464,6 @@ Type TypeChecker::typeCheckParameterDefault(Expr *&defaultValue,
return defaultValue->getType();
}
// If inference is disabled, fail.
if (!ctx.TypeCheckerOpts.EnableTypeInferenceFromDefaultArguments)
return Type();
// Caller-side defaults are always type-checked based on the concrete
// type of the argument deduced at a particular call site.
if (isa<MagicIdentifierLiteralExpr>(defaultValue))

View File

@@ -1,6 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend-emit-module -emit-module-path %t/InferViaDefaults.swiftmodule -enable-experimental-type-inference-from-defaults -module-name InferViaDefaults %S/Inputs/type_inference_via_defaults_other_module.swift
// RUN: %target-swift-frontend -enable-experimental-type-inference-from-defaults -module-name main -typecheck -verify -I %t %s %S/Inputs/type_inference_via_defaults_other_module.swift
// RUN: %target-swift-frontend-emit-module -emit-module-path %t/InferViaDefaults.swiftmodule -module-name InferViaDefaults %S/Inputs/type_inference_via_defaults_other_module.swift
// RUN: %target-swift-frontend -module-name main -typecheck -verify -I %t %s %S/Inputs/type_inference_via_defaults_other_module.swift
func testInferFromResult<T>(_: T = 42) -> T { fatalError() } // Ok

View File

@@ -1,6 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend-emit-module -emit-module-path %t/InferViaDefaults.swiftmodule -enable-experimental-type-inference-from-defaults -module-name InferViaDefaults %S/Inputs/type_inference_via_defaults_other_module.swift
// RUN: %target-build-swift -module-name main -Xfrontend -enable-experimental-type-inference-from-defaults -parse-as-library -I %t %s %S/Inputs/type_inference_via_defaults_other_module.swift -o %t/a.out
// RUN: %target-swift-frontend-emit-module -emit-module-path %t/InferViaDefaults.swiftmodule -module-name InferViaDefaults %S/Inputs/type_inference_via_defaults_other_module.swift
// RUN: %target-build-swift -module-name main -Xfrontend -parse-as-library -I %t %s %S/Inputs/type_inference_via_defaults_other_module.swift -o %t/a.out
// RUN: %target-run %t/a.out | %FileCheck %s --color
// REQUIRES: OS=macosx && CPU=x86_64

View File

@@ -1,5 +1,4 @@
// RUN: %target-typecheck-verify-swift
// RUN: %target-typecheck-verify-swift -enable-experimental-type-inference-from-defaults
var t1a: (Int...) = (1)
// expected-error@-1 {{cannot create a variadic tuple}}

View File

@@ -1,5 +1,4 @@
// RUN: %target-typecheck-verify-swift
// RUN: %target-typecheck-verify-swift -enable-experimental-type-inference-from-defaults
func takeIntToInt(_ f: (Int) -> Int) { }
func takeIntIntToInt(_ f: (Int, Int) -> Int) { }