kateinoigakukunのブログ

思考垂れ流しObserver

コンパイルが通ってほしいSwiftコード

見つけたら随時更新。バグレポ出してないやつもある

Protocol extension周り

protocol extensionの中でtypealiasを貼ると何かが壊れる

'T' does not have a member type named 'A'; did you mean 'A'?

func foo<T: P>(a: T) -> T.A {
    fatalError()
}

struct B {}
protocol P {}
extension P {
    typealias A = B
}

訳が分からないのは

struct B {}
protocol P {}
extension P {
    typealias A = B
}
func foo<T: P>(a: T) -> T.A {
    fatalError()
}

にすると通るようになる。PのassoctypeにAを宣言しても通る。

assoctypeのデフォルト型

WIP

protocol P {
    associatedtype X = Int
    func f(_ x: X)
}

extension P where Self == S {
    func f(_ x: X) {}
}

struct S: P {
    func f(_ x: X) {} // error: reference to invalid associated type 'X' of type 'S'
}

デフォルト引数

inner関数のデフォルト引数に外の関数の引数を詰めるとセグフォで落ちる。 SILを作る時にアサーションでコケてる。比較的コントリビュートしやすそうなので頑張りたい。

bool isGlobalLazilyInitialized(swift::VarDecl *): Assertion `!var->getDeclContext()->isLocalContext() && "not a global variable!"' failed.
func bar(foo: Int) {
    func inner(arg: Int = foo) {}
    print(inner())
}

bar(foo: 3)

https://bugs.swift.org/browse/SR-7328

assoctypeのデフォルト型

2018/04/17追記

デフォルト型を持つassoctypeをシグネチャに持つ要素を2個実装するとコンパイルが通らなくなる。XをIntに展開して書くと通る。witness tableが壊れてそう。

ついでに、デフォルト型を持つassoctypeが補完に出ないので困ってる。

 error: reference to invalid associated type 'X' of type 'S'
    func f2(_ x: X) {}
protocol P {
    associatedtype X = Int

    func f1(_ x: X)
    func f2(_ x: X)
}

struct S: P {
    func f1(_ x: X) {}
    func f2(_ x: X) {}
}

https://bugs.swift.org/browse/SR-7467

github.com

where付きextensionでassoctypeを上書き

型を再帰的に決定させるためにassoctypeのデフォルト型で再帰の終了条件を表現できるなー、と思い書いてみたところクラッシュした。

protocol P {
    associatedtype Assoc = A
}

struct A {}
struct B: P {
    typealias Assoc = Int
}

struct S<T>: P {}

extension S where T: P {
    typealias Assoc = T.Assoc
}

print(type(of: S<B>.Assoc.self)) // expected 'Int'