コンパイルが通ってほしい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
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'