Skip to content

Default expression for inference works for static methods but not functions #67680

Open
@adamkuipers

Description

@adamkuipers

Description
A default expression for type inference of a protocol when another parameter is an associated type of the protocol works for static methods but not functions.

Consider Task.sleep:

static func sleep<C>(
    until deadline: C.Instant,
    tolerance: C.Instant.Duration? = nil,
    clock: C = ContinuousClock()
) async throws where C : Clock

This method has a generic type C constrained to Clock, and it's parameters use both the types C and C.Instant. C is inferred from the clock parameter's the default expression ContinousClock().

Task.sleep is inexpressible as a function, even though no type information from Task is required—Task is strictly used as a namespace. As far as I know, static methods should be expressible as functions as long as they don't depend on anything from the type.

Steps to reproduce
Here's a minimal example using a default expression for inference of a protocol in a static method and as a function, with the function failing to compile:

protocol Parent {
    associatedtype Child
}

struct Default: Parent {
    struct Child {}
}

enum Namespace {
    static func defaulting<P: Parent>(
        child: P.Child,
        parent: P = Default()
    ) {}
}

func defaulting<P: Parent>(
    child: P.Child,
    parent: P = Default()
) {}

The function defaulting fails to compile with the message, Cannot use default expression for inference of 'P' because it is inferrable from parameters #0, #1.

Expected behavior
I'd expect to be able to express functions the same as static methods such as Task.sleep and, from the example above, Namespace.defaulting.

Environment

  • Swift compiler version info
    swift-driver version: 1.75.2 Apple Swift version 5.8.1 (swiftlang-5.8.0.124.5 clang-1403.0.22.11.100)
    Target: arm64-apple-macosx13.0
  • Xcode version info Xcode 14.3.1 (14E300c)
  • Deployment target: N/A, any

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugA deviation from expected or documented behavior. Also: expected but undesirable behavior.compilerThe Swift compiler itselfdeclarationsFeature: declarationsdefault argumentsFeature: default arguments for value parametersfuncFeature → declarations: FunctionsgenericsFeature: generic declarations and typesswift 5.9type checkerArea → compiler: Semantic analysistype inferenceFeature: type inferenceunexpected errorBug: Unexpected error

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions