// RUN: %empty-directory(%t) // // Build swift modules this test depends on. // RUN: %target-swift-frontend -emit-module -o %t %S/Inputs/foo_swift_module.swift -enable-objc-interop -disable-objc-attr-requires-foundation-module // // FIXME: BEGIN -enable-source-import hackaround // RUN: %target-swift-frontend(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk -I %t) -emit-module -o %t %S/../Inputs/clang-importer-sdk/swift-modules/ObjectiveC.swift -enable-objc-interop -disable-objc-attr-requires-foundation-module // FIXME: END -enable-source-import hackaround // // This file should not have any syntax or type checker errors. // RUN: %target-swift-frontend(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk -I %t) -swift-version 4 -D ERRORS -typecheck -verify %s -F %S/Inputs/mock-sdk -enable-objc-interop -disable-objc-attr-requires-foundation-module // // RUN: %target-swift-ide-test(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk -I %t) -swift-version 4 -skip-deinit=false -print-ast-typechecked -source-filename %s -F %S/Inputs/mock-sdk -function-definitions=false -prefer-type-repr=false -print-implicit-attrs=true -enable-objc-interop -disable-objc-attr-requires-foundation-module > %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_COMMON -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefixes=PASS_PRINT_AST,PASS_PRINT_AST_TYPE -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_RW_PROP_GET_SET -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_2200 -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_2500 -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_ONE_LINE -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_ONE_LINE_TYPE -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PREFER_TYPE_PRINTING -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_QUAL_UNQUAL -strict-whitespace < %t.printed.txt // // RUN: %target-swift-ide-test(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk -I %t) -swift-version 4 -skip-deinit=false -print-ast-typechecked -source-filename %s -F %S/Inputs/mock-sdk -function-definitions=false -prefer-type-repr=true -print-implicit-attrs=true -enable-objc-interop -disable-objc-attr-requires-foundation-module > %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_COMMON -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefixes=PASS_PRINT_AST,PASS_PRINT_AST_TYPEREPR -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_RW_PROP_GET_SET -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_2200 -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_2500 -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_ONE_LINE -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_ONE_LINE_TYPEREPR -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PREFER_TYPE_REPR_PRINTING -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_QUAL_UNQUAL -strict-whitespace < %t.printed.txt // // RUN: %target-swift-frontend(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk -I %t) -swift-version 4 -emit-module -o %t -F %S/Inputs/mock-sdk -enable-objc-interop -disable-objc-attr-requires-foundation-module %s // RUN: %target-swift-ide-test(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk -I %t) -swift-version 4 -skip-deinit=false -print-module -source-filename %s -F %S/Inputs/mock-sdk -module-to-print=print_ast_tc_decls -print-implicit-attrs=true -enable-objc-interop -disable-objc-attr-requires-foundation-module > %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_COMMON -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_PRINT_MODULE_INTERFACE -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_RW_PROP_NO_GET_SET -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_2200_DESERIALIZED -strict-whitespace < %t.printed.txt // FIXME: rdar://15167697 // FIXME: %FileCheck %s -check-prefix=PASS_2500 -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_ONE_LINE -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PREFER_TYPE_REPR_PRINTING -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_QUAL_UNQUAL -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_EXPLODE_PATTERN -strict-whitespace < %t.printed.txt // // RUN: %target-swift-ide-test(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk -I %t) -skip-deinit=false -print-module -source-filename %s -F %S/Inputs/mock-sdk -I %t -module-to-print=print_ast_tc_decls -synthesize-sugar-on-types=true -print-implicit-attrs=true -enable-objc-interop -disable-objc-attr-requires-foundation-module > %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_PRINT_MODULE_INTERFACE -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_QUAL_UNQUAL -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=SYNTHESIZE_SUGAR_ON_TYPES -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_EXPLODE_PATTERN -strict-whitespace < %t.printed.txt // RUN: %target-swift-ide-test(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk -I %t) -skip-deinit=false -print-module -source-filename %s -F %S/Inputs/mock-sdk -I %t -module-to-print=print_ast_tc_decls -synthesize-sugar-on-types=true -fully-qualified-types-if-ambiguous=true -print-implicit-attrs=true -enable-objc-interop -disable-objc-attr-requires-foundation-module > %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_PRINT_MODULE_INTERFACE -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=PASS_QUAL_IF_AMBIGUOUS -strict-whitespace < %t.printed.txt // RUN: %FileCheck %s -check-prefix=SYNTHESIZE_SUGAR_ON_TYPES -strict-whitespace < %t.printed.txt // FIXME: %FileCheck %s -check-prefix=PASS_EXPLODE_PATTERN -strict-whitespace < %t.printed.txt // FIXME: rdar://problem/19648117 Needs splitting objc parts out // REQUIRES: objc_interop import Bar import ObjectiveC import class Foo.FooClassBase import struct Foo.FooStruct1 import func Foo.fooFunc1 @_exported import FooHelper import foo_swift_module // FIXME: enum tests //import enum FooClangModule.FooEnum1 // PASS_COMMON: {{^}}import Bar{{$}} // PASS_COMMON: {{^}}import class Foo.FooClassBase{{$}} // PASS_COMMON: {{^}}import struct Foo.FooStruct1{{$}} // PASS_COMMON: {{^}}import func Foo.fooFunc1{{$}} // PASS_COMMON: {{^}}@_exported import FooHelper{{$}} // PASS_COMMON: {{^}}import foo_swift_module{{$}} //===--- //===--- Helper types. //===--- struct FooStruct {} class FooClass {} class BarClass {} protocol FooProtocol {} protocol BarProtocol {} protocol BazProtocol { func baz() } protocol QuxProtocol { associatedtype Qux } protocol SubFooProtocol : FooProtocol { } class FooProtocolImpl : FooProtocol {} class FooBarProtocolImpl : FooProtocol, BarProtocol {} class BazProtocolImpl : BazProtocol { func baz() {} } //===--- //===--- Basic smoketest. //===--- struct d0100_FooStruct { // PASS_COMMON-LABEL: {{^}}struct d0100_FooStruct {{{$}} var instanceVar1: Int = 0 // PASS_COMMON-NEXT: {{^}} @_hasInitialValue var instanceVar1: Int{{$}} var computedProp1: Int { get { return 42 } } // PASS_COMMON-NEXT: {{^}} var computedProp1: Int { get }{{$}} func instanceFunc0() {} // PASS_COMMON-NEXT: {{^}} func instanceFunc0(){{$}} func instanceFunc1(a: Int) {} // PASS_COMMON-NEXT: {{^}} func instanceFunc1(a: Int){{$}} func instanceFunc2(a: Int, b: inout Double) {} // PASS_COMMON-NEXT: {{^}} func instanceFunc2(a: Int, b: inout Double){{$}} func instanceFunc3(a: Int, b: Double) { var a = a; a = 1; _ = a } // PASS_COMMON-NEXT: {{^}} func instanceFunc3(a: Int, b: Double){{$}} func instanceFuncWithDefaultArg1(a: Int = 0) {} // PASS_COMMON-NEXT: {{^}} func instanceFuncWithDefaultArg1(a: Int = 0){{$}} func instanceFuncWithDefaultArg2(a: Int = 0, b: Double = 0) {} // PASS_COMMON-NEXT: {{^}} func instanceFuncWithDefaultArg2(a: Int = 0, b: Double = 0){{$}} func varargInstanceFunc0(v: Int...) {} // PASS_COMMON-NEXT: {{^}} func varargInstanceFunc0(v: Int...){{$}} func varargInstanceFunc1(a: Float, v: Int...) {} // PASS_COMMON-NEXT: {{^}} func varargInstanceFunc1(a: Float, v: Int...){{$}} func varargInstanceFunc2(a: Float, b: Double, v: Int...) {} // PASS_COMMON-NEXT: {{^}} func varargInstanceFunc2(a: Float, b: Double, v: Int...){{$}} func overloadedInstanceFunc1() -> Int { return 0; } // PASS_COMMON-NEXT: {{^}} func overloadedInstanceFunc1() -> Int{{$}} func overloadedInstanceFunc1() -> Double { return 0.0; } // PASS_COMMON-NEXT: {{^}} func overloadedInstanceFunc1() -> Double{{$}} func overloadedInstanceFunc2(x: Int) -> Int { return 0; } // PASS_COMMON-NEXT: {{^}} func overloadedInstanceFunc2(x: Int) -> Int{{$}} func overloadedInstanceFunc2(x: Double) -> Int { return 0; } // PASS_COMMON-NEXT: {{^}} func overloadedInstanceFunc2(x: Double) -> Int{{$}} func builderFunc1(a: Int) -> d0100_FooStruct { return d0100_FooStruct(); } // PASS_COMMON-NEXT: {{^}} func builderFunc1(a: Int) -> d0100_FooStruct{{$}} subscript(i: Int) -> Double { get { return Double(i) } } // PASS_COMMON-NEXT: {{^}} subscript(i: Int) -> Double { get }{{$}} subscript(i: Int, j: Int) -> Double { get { return Double(i + j) } } // PASS_COMMON-NEXT: {{^}} subscript(i: Int, j: Int) -> Double { get }{{$}} static subscript(i: Int) -> Double { get { return Double(i) } } // PASS_COMMON-NEXT: {{^}} static subscript(i: Int) -> Double { get }{{$}} func bodyNameVoidFunc1(a: Int, b x: Float) {} // PASS_COMMON-NEXT: {{^}} func bodyNameVoidFunc1(a: Int, b x: Float){{$}} func bodyNameVoidFunc2(a: Int, b x: Float, c y: Double) {} // PASS_COMMON-NEXT: {{^}} func bodyNameVoidFunc2(a: Int, b x: Float, c y: Double){{$}} func bodyNameStringFunc1(a: Int, b x: Float) -> String { return "" } // PASS_COMMON-NEXT: {{^}} func bodyNameStringFunc1(a: Int, b x: Float) -> String{{$}} func bodyNameStringFunc2(a: Int, b x: Float, c y: Double) -> String { return "" } // PASS_COMMON-NEXT: {{^}} func bodyNameStringFunc2(a: Int, b x: Float, c y: Double) -> String{{$}} struct NestedStruct {} // PASS_COMMON-NEXT: {{^}} struct NestedStruct {{{$}} // PASS_COMMON-NEXT: {{^}} init(){{$}} // PASS_COMMON-NEXT: {{^}} }{{$}} class NestedClass {} // PASS_COMMON-NEXT: {{^}} class NestedClass {{{$}} // PASS_COMMON-NEXT: {{^}} @objc deinit{{$}} // PASS_COMMON-NEXT: {{^}} init(){{$}} // PASS_COMMON-NEXT: {{^}} }{{$}} enum NestedEnum {} // PASS_COMMON-NEXT: {{^}} enum NestedEnum {{{$}} // PASS_COMMON-NEXT: {{^}} }{{$}} // Cannot declare a nested protocol. // protocol NestedProtocol {} typealias NestedTypealias = Int // PASS_COMMON-NEXT: {{^}} typealias NestedTypealias = Int{{$}} static var staticVar1: Int = 42 // PASS_COMMON-NEXT: {{^}} @_hasInitialValue static var staticVar1: Int{{$}} static var computedStaticProp1: Int { get { return 42 } } // PASS_COMMON-NEXT: {{^}} static var computedStaticProp1: Int { get }{{$}} static func staticFunc0() {} // PASS_COMMON-NEXT: {{^}} static func staticFunc0(){{$}} static func staticFunc1(a: Int) {} // PASS_COMMON-NEXT: {{^}} static func staticFunc1(a: Int){{$}} static func overloadedStaticFunc1() -> Int { return 0 } // PASS_COMMON-NEXT: {{^}} static func overloadedStaticFunc1() -> Int{{$}} static func overloadedStaticFunc1() -> Double { return 0.0 } // PASS_COMMON-NEXT: {{^}} static func overloadedStaticFunc1() -> Double{{$}} static func overloadedStaticFunc2(x: Int) -> Int { return 0 } // PASS_COMMON-NEXT: {{^}} static func overloadedStaticFunc2(x: Int) -> Int{{$}} static func overloadedStaticFunc2(x: Double) -> Int { return 0 } // PASS_COMMON-NEXT: {{^}} static func overloadedStaticFunc2(x: Double) -> Int{{$}} } // PASS_COMMON-NEXT: {{^}} init(){{$}} // PASS_COMMON-NEXT: {{^}} init(instanceVar1: Int = 0){{$}} // PASS_COMMON-NEXT: {{^}}}{{$}} extension d0100_FooStruct { // PASS_COMMON-LABEL: {{^}}extension d0100_FooStruct {{{$}} var extProp: Int { get { return 42 } } // PASS_COMMON-NEXT: {{^}} var extProp: Int { get }{{$}} func extFunc0() {} // PASS_COMMON-NEXT: {{^}} func extFunc0(){{$}} static var extStaticProp: Int { get { return 42 } } // PASS_COMMON-NEXT: {{^}} static var extStaticProp: Int { get }{{$}} static func extStaticFunc0() {} // PASS_COMMON-NEXT: {{^}} static func extStaticFunc0(){{$}} struct ExtNestedStruct {} // PASS_COMMON-NEXT: {{^}} struct ExtNestedStruct {{{$}} // PASS_COMMON-NEXT: {{^}} init(){{$}} // PASS_COMMON-NEXT: {{^}} }{{$}} class ExtNestedClass {} // PASS_COMMON-NEXT: {{^}} class ExtNestedClass {{{$}} // PASS_COMMON-NEXT: {{^}} @objc deinit{{$}} // PASS_COMMON-NEXT: {{^}} init(){{$}} // PASS_COMMON-NEXT: {{^}} }{{$}} enum ExtNestedEnum { case ExtEnumX(Int) } // PASS_COMMON-NEXT: {{^}} enum ExtNestedEnum {{{$}} // PASS_COMMON-NEXT: {{^}} case ExtEnumX(Int){{$}} // PASS_COMMON-NEXT: {{^}} }{{$}} typealias ExtNestedTypealias = Int // PASS_COMMON-NEXT: {{^}} typealias ExtNestedTypealias = Int{{$}} } // PASS_COMMON-NEXT: {{^}}}{{$}} extension d0100_FooStruct.NestedStruct { // PASS_COMMON-LABEL: {{^}}extension d0100_FooStruct.NestedStruct {{{$}} struct ExtNestedStruct2 {} // PASS_COMMON-NEXT: {{^}} struct ExtNestedStruct2 {{{$}} // PASS_COMMON-NEXT: {{^}} init(){{$}} // PASS_COMMON-NEXT: {{^}} }{{$}} } extension d0100_FooStruct.ExtNestedStruct { // PASS_COMMON-LABEL: {{^}}extension d0100_FooStruct.ExtNestedStruct {{{$}} struct ExtNestedStruct3 {} // PASS_COMMON-NEXT: {{^}} struct ExtNestedStruct3 {{{$}} // PASS_COMMON-NEXT: {{^}} init(){{$}} // PASS_COMMON-NEXT: {{^}} }{{$}} } // PASS_COMMON-NEXT: {{^}}}{{$}} var fooObject: d0100_FooStruct = d0100_FooStruct() // PASS_ONE_LINE-DAG: {{^}}@_hasInitialValue var fooObject: d0100_FooStruct{{$}} struct d0110_ReadWriteProperties { // PASS_RW_PROP_GET_SET-LABEL: {{^}}struct d0110_ReadWriteProperties {{{$}} // PASS_RW_PROP_NO_GET_SET-LABEL: {{^}}struct d0110_ReadWriteProperties {{{$}} var computedProp1: Int { get { return 42 } set {} } // PASS_RW_PROP_GET_SET-NEXT: {{^}} var computedProp1: Int { get set }{{$}} // PASS_RW_PROP_NO_GET_SET-NEXT: {{^}} var computedProp1: Int{{$}} subscript(i: Int) -> Int { get { return 42 } set {} } // PASS_RW_PROP_GET_SET-NEXT: {{^}} subscript(i: Int) -> Int { get set }{{$}} // PASS_RW_PROP_NO_GET_SET-NEXT: {{^}} subscript(i: Int) -> Int{{$}} static var computedStaticProp1: Int { get { return 42 } set {} } // PASS_RW_PROP_GET_SET-NEXT: {{^}} static var computedStaticProp1: Int { get set }{{$}} // PASS_RW_PROP_NO_GET_SET-NEXT: {{^}} static var computedStaticProp1: Int{{$}} var computedProp2: Int { mutating get { return 42 } set {} } // PASS_RW_PROP_GET_SET-NEXT: {{^}} var computedProp2: Int { mutating get set }{{$}} // PASS_RW_PROP_NO_GET_SET-NEXT: {{^}} var computedProp2: Int { mutating get set }{{$}} var computedProp3: Int { get { return 42 } nonmutating set {} } // PASS_RW_PROP_GET_SET-NEXT: {{^}} var computedProp3: Int { get nonmutating set }{{$}} // PASS_RW_PROP_NO_GET_SET-NEXT: {{^}} var computedProp3: Int { get nonmutating set }{{$}} var computedProp4: Int { mutating get { return 42 } nonmutating set {} } // PASS_RW_PROP_GET_SET-NEXT: {{^}} var computedProp4: Int { mutating get nonmutating set }{{$}} // PASS_RW_PROP_NO_GET_SET-NEXT: {{^}} var computedProp4: Int { mutating get nonmutating set }{{$}} subscript(i: Float) -> Int { get { return 42 } nonmutating set {} } // PASS_RW_PROP_GET_SET-NEXT: {{^}} subscript(i: Float) -> Int { get nonmutating set }{{$}} // PASS_RW_PROP_NO_GET_SET-NEXT: {{^}} subscript(i: Float) -> Int { get nonmutating set }{{$}} } // PASS_RW_PROP_GET_SET-NEXT: {{^}} init(){{$}} // PASS_RW_PROP_GET_SET-NEXT: {{^}}}{{$}} // PASS_RW_PROP_NO_GET_SET-NEXT: {{^}} init(){{$}} // PASS_RW_PROP_NO_GET_SET-NEXT: {{^}}}{{$}} extension d0110_ReadWriteProperties { // PASS_RW_PROP_GET_SET-LABEL: {{^}}extension d0110_ReadWriteProperties {{{$}} // PASS_RW_PROP_NO_GET_SET-LABEL: {{^}}extension d0110_ReadWriteProperties {{{$}} var extProp: Int { get { return 42 } set(v) {} } // PASS_RW_PROP_GET_SET-NEXT: {{^}} var extProp: Int { get set }{{$}} // PASS_RW_PROP_NO_GET_SET-NEXT: {{^}} var extProp: Int{{$}} static var extStaticProp: Int { get { return 42 } set(v) {} } // PASS_RW_PROP_GET_SET-NEXT: {{^}} static var extStaticProp: Int { get set }{{$}} // PASS_RW_PROP_NO_GET_SET-NEXT: {{^}} static var extStaticProp: Int{{$}} } // PASS_RW_PROP_GET_SET-NEXT: {{^}}}{{$}} // PASS_RW_PROP_NO_GET_SET-NEXT: {{^}}}{{$}} class d0120_TestClassBase { // PASS_COMMON-LABEL: {{^}}class d0120_TestClassBase {{{$}} required init() {} // PASS_COMMON-NEXT: {{^}} required init(){{$}} init?(fail: String) {} // PASS_COMMON-NEXT: {{^}} init?(fail: String){{$}} init!(iuoFail: String) {} // PASS_COMMON-NEXT: {{^}} init!(iuoFail: String){{$}} final func baseFunc1() {} // PASS_COMMON-NEXT: {{^}} final func baseFunc1(){{$}} func baseFunc2() {} // PASS_COMMON-NEXT: {{^}} func baseFunc2(){{$}} subscript(i: Int) -> Int { return 0 } // PASS_COMMON-NEXT: {{^}} subscript(i: Int) -> Int { get }{{$}} class var baseClassVar1: Int { return 0 } // PASS_COMMON-NEXT: {{^}} class var baseClassVar1: Int { get }{{$}} // FIXME: final class var not allowed to have storage, but static is? #if ERRORS final class var baseClassVar2: Int = 0 // expected-error@-1 {{class stored properties not supported in classes; did you mean 'static'?}} #endif final class var baseClassVar3: Int { return 0 } // PASS_COMMON: {{^}} final class var baseClassVar3: Int { get }{{$}} static var baseClassVar4: Int = 0 // PASS_COMMON-NEXT: {{^}} @_hasInitialValue static var baseClassVar4: Int{{$}} static var baseClassVar5: Int { return 0 } // PASS_COMMON-NEXT: {{^}} static var baseClassVar5: Int { get }{{$}} class func baseClassFunc1() {} // PASS_COMMON-NEXT: {{^}} class func baseClassFunc1(){{$}} final class func baseClassFunc2() {} // PASS_COMMON-NEXT: {{^}} final class func baseClassFunc2(){{$}} static func baseClassFunc3() {} // PASS_COMMON-NEXT: {{^}} static func baseClassFunc3(){{$}} } class d0121_TestClassDerived : d0120_TestClassBase { // PASS_COMMON-LABEL: {{^}}@_inheritsConvenienceInitializers {{()?}}class d0121_TestClassDerived : d0120_TestClassBase {{{$}} required init() { super.init() } // PASS_COMMON-NEXT: {{^}} required init(){{$}} override init?(fail: String) { nil } // PASS_COMMON-NEXT: {{^}} override init?(fail: String){{$}} override init!(iuoFail: String) { nil } // PASS_COMMON-NEXT: {{^}} override init!(iuoFail: String){{$}} final override func baseFunc2() {} // PASS_COMMON-NEXT: {{^}} {{(override |final )+}}func baseFunc2(){{$}} override final subscript(i: Int) -> Int { return 0 } // PASS_COMMON-NEXT: {{^}} override final subscript(i: Int) -> Int { get }{{$}} } protocol d0130_TestProtocol { // PASS_COMMON-LABEL: {{^}}protocol d0130_TestProtocol {{{$}} associatedtype NestedTypealias // PASS_COMMON-NEXT: {{^}} associatedtype NestedTypealias{{$}} var property1: Int { get } // PASS_COMMON-NEXT: {{^}} var property1: Int { get }{{$}} var property2: Int { get set } // PASS_COMMON-NEXT: {{^}} var property2: Int { get set }{{$}} func protocolFunc1() // PASS_COMMON-NEXT: {{^}} func protocolFunc1(){{$}} } @objc protocol d0140_TestObjCProtocol { // PASS_COMMON-LABEL: {{^}}@objc protocol d0140_TestObjCProtocol {{{$}} @objc optional var property1: Int { get } // PASS_COMMON-NEXT: {{^}} @objc optional var property1: Int { get }{{$}} @objc optional func protocolFunc1() // PASS_COMMON-NEXT: {{^}} @objc optional func protocolFunc1(){{$}} } protocol d0150_TestClassProtocol : class {} // PASS_COMMON-LABEL: {{^}}protocol d0150_TestClassProtocol : AnyObject {{{$}} @objc protocol d0151_TestClassProtocol {} // PASS_COMMON-LABEL: {{^}}@objc protocol d0151_TestClassProtocol {{{$}} class d0170_TestAvailability { // PASS_COMMON-LABEL: {{^}}class d0170_TestAvailability {{{$}} @available(*, unavailable) func f1() {} // PASS_COMMON-NEXT: {{^}} @available(*, unavailable){{$}} // PASS_COMMON-NEXT: {{^}} func f1(){{$}} @available(*, unavailable, message: "aaa \"bbb\" ccc\nddd\0eee") func f2() {} // PASS_COMMON-NEXT: {{^}} @available(*, unavailable, message: "aaa \"bbb\" ccc\nddd\0eee"){{$}} // PASS_COMMON-NEXT: {{^}} func f2(){{$}} @available(iOS, unavailable) @available(OSX, unavailable) func f3() {} // PASS_COMMON-NEXT: {{^}} @available(iOS, unavailable){{$}} // PASS_COMMON-NEXT: {{^}} @available(macOS, unavailable){{$}} // PASS_COMMON-NEXT: {{^}} func f3(){{$}} @available(iOS 8.0, OSX 10.10, *) func f4() {} // PASS_COMMON-NEXT: {{^}} @available(iOS 8.0, macOS 10.10, *){{$}} // PASS_COMMON-NEXT: {{^}} func f4(){{$}} // Convert long-form @available() to short form when possible. @available(iOS, introduced: 8.0) @available(OSX, introduced: 10.10) func f5() {} // PASS_COMMON-NEXT: {{^}} @available(iOS 8.0, macOS 10.10, *){{$}} // PASS_COMMON-NEXT: {{^}} func f5(){{$}} } @objc class d0180_TestIBAttrs { // PASS_COMMON-LABEL: {{^}}@objc class d0180_TestIBAttrs {{{$}} @IBAction func anAction(_: AnyObject) {} // Tolerate different attribute orders to support both reading from source // and deserializing from swiftmodule. // PASS_COMMON-NEXT: {{^}} @objc // PASS_COMMON-DAG: @IBAction // PASS_COMMON-DAG: @MainActor // PASS_COMMON: func anAction(_: AnyObject){{$}} @IBSegueAction func aSegueAction(_ coder: AnyObject, sender: AnyObject, identifier: AnyObject?) -> Any? { fatalError() } // PASS_COMMON-NEXT: {{^}} @objc @IBSegueAction func aSegueAction(_ coder: AnyObject, sender: AnyObject, identifier: AnyObject?) -> Any?{{$}} @IBDesignable class ADesignableClass {} // PASS_COMMON-NEXT: {{^}} @IBDesignable class ADesignableClass {{{$}} } @objc class d0181_TestIBAttrs { // PASS_EXPLODE_PATTERN-LABEL: {{^}}@objc class d0181_TestIBAttrs {{{$}} @IBOutlet weak var anOutlet: d0181_TestIBAttrs! // PASS_EXPLODE_PATTERN-NEXT: {{^}} @objc @IBOutlet @_hasInitialValue weak var anOutlet: @sil_weak d0181_TestIBAttrs!{{$}} @IBInspectable var inspectableProp: Int = 0 // PASS_EXPLODE_PATTERN-NEXT: {{^}} @objc @IBInspectable @_hasInitialValue var inspectableProp: Int{{$}} @GKInspectable var inspectableProp2: Int = 0 // PASS_EXPLODE_PATTERN-NEXT: {{^}} @objc @GKInspectable @_hasInitialValue var inspectableProp2: Int{{$}} } struct d0190_LetVarDecls { // PASS_PRINT_AST-LABEL: {{^}}struct d0190_LetVarDecls {{{$}} // PASS_PRINT_MODULE_INTERFACE-LABEL: {{^}}struct d0190_LetVarDecls {{{$}} let instanceVar1: Int = 0 // PASS_PRINT_AST-NEXT: {{^}} @_hasInitialValue let instanceVar1: Int{{$}} // PASS_PRINT_MODULE_INTERFACE-NEXT: {{^}} @_hasInitialValue let instanceVar1: Int{{$}} let instanceVar2 = 0 // PASS_PRINT_AST-NEXT: {{^}} @_hasInitialValue let instanceVar2: Int{{$}} // PASS_PRINT_MODULE_INTERFACE-NEXT: {{^}} @_hasInitialValue let instanceVar2: Int{{$}} static let staticVar1: Int = 42 // PASS_PRINT_AST-NEXT: {{^}} @_hasInitialValue static let staticVar1: Int{{$}} // PASS_PRINT_MODULE_INTERFACE-NEXT: {{^}} @_hasInitialValue static let staticVar1: Int{{$}} static let staticVar2 = 42 // FIXME: PRINTED_WITHOUT_TYPE // PASS_PRINT_AST-NEXT: {{^}} @_hasInitialValue static let staticVar2: Int{{$}} // PASS_PRINT_MODULE_INTERFACE-NEXT: {{^}} @_hasInitialValue static let staticVar2: Int{{$}} } struct d0200_EscapedIdentifiers { // PASS_COMMON-LABEL: {{^}}struct d0200_EscapedIdentifiers {{{$}} struct `struct` {} // PASS_COMMON-NEXT: {{^}} struct `struct` {{{$}} // PASS_COMMON-NEXT: {{^}} init(){{$}} // PASS_COMMON-NEXT: {{^}} }{{$}} enum `enum` { case `case` } // PASS_COMMON-NEXT: {{^}} enum `enum` {{{$}} // PASS_COMMON-NEXT: {{^}} case `case`{{$}} // PASS_COMMON-NEXT: {{^}} {{.*}}static func __derived_enum_equals(_ a: d0200_EscapedIdentifiers.`enum`, _ b: d0200_EscapedIdentifiers.`enum`) -> Bool // PASS_COMMON-NEXT: {{^}} func hash(into hasher: inout Hasher) // PASS_COMMON-NEXT: {{^}} var hashValue: Int { get }{{$}} // PASS_COMMON-NEXT: {{^}} }{{$}} class `class` {} // PASS_COMMON-NEXT: {{^}} class `class` {{{$}} // PASS_COMMON-NEXT: {{^}} @objc deinit{{$}} // PASS_COMMON-NEXT: {{^}} init(){{$}} // PASS_COMMON-NEXT: {{^}} }{{$}} typealias `protocol` = `class` // PASS_ONE_LINE_TYPE-DAG: {{^}} typealias `protocol` = d0200_EscapedIdentifiers.`class`{{$}} // PASS_ONE_LINE_TYPEREPR-DAG: {{^}} typealias `protocol` = `class`{{$}} class `extension` : `class` {} // PASS_ONE_LINE_TYPE-DAG: {{^}} @_inheritsConvenienceInitializers class `extension` : d0200_EscapedIdentifiers.`class` {{{$}} // PASS_ONE_LINE_TYPEREPR-DAG: {{^}} @_inheritsConvenienceInitializers class `extension` : `class` {{{$}} // PASS_COMMON: {{^}} {{(override )?}}init(){{$}} // PASS_COMMON-NEXT: {{^}} @objc deinit{{$}} // PASS_COMMON-NEXT: {{^}} }{{$}} func `func`<`let`: `protocol`, `where`>( class: Int, struct: `protocol`, foo: `let`, bar: `where`) where `where` : `protocol` {} // PASS_COMMON-NEXT: {{^}} func `func`<`let`, `where`>(class: Int, struct: {{(d0200_EscapedIdentifiers.)?}}`protocol`, foo: `let`, bar: `where`) where `let` : {{(d0200_EscapedIdentifiers.)?}}`class`, `where` : {{(d0200_EscapedIdentifiers.)?}}`class`{{$}} var `var`: `struct` = `struct`() // PASS_COMMON-NEXT: {{^}} @_hasInitialValue var `var`: {{(d0200_EscapedIdentifiers.)?}}`struct`{{$}} var tupleType: (`var`: Int, `let`: `struct`) // PASS_COMMON-NEXT: {{^}} var tupleType: (var: Int, let: {{(d0200_EscapedIdentifiers.)?}}`struct`){{$}} var accessors1: Int { get { return 0 } set(`let`) {} } // PASS_COMMON-NEXT: {{^}} var accessors1: Int{{( { get set })?}}{{$}} static func `static`(protocol: Int) {} // PASS_COMMON-NEXT: {{^}} static func `static`(protocol: Int){{$}} // PASS_COMMON-NEXT: {{^}} init(var: {{(d0200_EscapedIdentifiers.)?}}`struct` = {{(d0200_EscapedIdentifiers.)?}}`struct`(), tupleType: (var: Int, let: {{(d0200_EscapedIdentifiers.)?}}`struct`)){{$}} // PASS_COMMON-NEXT: {{^}}}{{$}} } struct d0210_Qualifications { // PASS_QUAL_UNQUAL: {{^}}struct d0210_Qualifications {{{$}} // PASS_QUAL_IF_AMBIGUOUS: {{^}}struct d0210_Qualifications {{{$}} var propFromStdlib1: Int = 0 // PASS_QUAL_UNQUAL-NEXT: {{^}} @_hasInitialValue var propFromStdlib1: Int{{$}} // PASS_QUAL_IF_AMBIGUOUS-NEXT: {{^}} @_hasInitialValue var propFromStdlib1: Int{{$}} var propFromSwift1: FooSwiftStruct = FooSwiftStruct() // PASS_QUAL_UNQUAL-NEXT: {{^}} @_hasInitialValue var propFromSwift1: FooSwiftStruct{{$}} // PASS_QUAL_IF_AMBIGUOUS-NEXT: {{^}} @_hasInitialValue var propFromSwift1: foo_swift_module.FooSwiftStruct{{$}} var propFromClang1: FooStruct1 = FooStruct1(x: 0, y: 0.0) // PASS_QUAL_UNQUAL-NEXT: {{^}} @_hasInitialValue var propFromClang1: FooStruct1{{$}} // PASS_QUAL_IF_AMBIGUOUS-NEXT: {{^}} @_hasInitialValue var propFromClang1: FooStruct1{{$}} func instanceFuncFromStdlib1(a: Int) -> Float { return 0.0 } // PASS_QUAL_UNQUAL-NEXT: {{^}} func instanceFuncFromStdlib1(a: Int) -> Float{{$}} // PASS_QUAL_IF_AMBIGUOUS-NEXT: {{^}} func instanceFuncFromStdlib1(a: Int) -> Float{{$}} func instanceFuncFromStdlib2(a: ObjCBool) {} // PASS_QUAL_UNQUAL-NEXT: {{^}} func instanceFuncFromStdlib2(a: ObjCBool){{$}} // PASS_QUAL_IF_AMBIGUOUS-NEXT: {{^}} func instanceFuncFromStdlib2(a: ObjCBool){{$}} func instanceFuncFromSwift1(a: FooSwiftStruct) -> FooSwiftStruct { return FooSwiftStruct() } // PASS_QUAL_UNQUAL-NEXT: {{^}} func instanceFuncFromSwift1(a: FooSwiftStruct) -> FooSwiftStruct{{$}} // PASS_QUAL_IF_AMBIGUOUS-NEXT: {{^}} func instanceFuncFromSwift1(a: foo_swift_module.FooSwiftStruct) -> foo_swift_module.FooSwiftStruct{{$}} func instanceFuncFromClang1(a: FooStruct1) -> FooStruct1 { return FooStruct1(x: 0, y: 0.0) } // PASS_QUAL_UNQUAL-NEXT: {{^}} func instanceFuncFromClang1(a: FooStruct1) -> FooStruct1{{$}} // PASS_QUAL_IF_AMBIGUOUS-NEXT: {{^}} func instanceFuncFromClang1(a: FooStruct1) -> FooStruct1{{$}} } // FIXME: this should be printed reasonably in case we use // -prefer-type-repr=true. Either we should print the types we inferred, or we // should print the initializers. class d0250_ExplodePattern { // PASS_EXPLODE_PATTERN-LABEL: {{^}}class d0250_ExplodePattern {{{$}} var instanceVar1 = 0 var instanceVar2 = 0.0 var instanceVar3 = "" // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar1: Int{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar2: Double{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar3: String{{$}} var instanceVar4 = FooStruct() var (instanceVar5, instanceVar6) = (FooStruct(), FooStruct()) var (instanceVar7, instanceVar8) = (FooStruct(), FooStruct()) var (instanceVar9, instanceVar10) : (FooStruct, FooStruct) = (FooStruct(), FooStruct()) final var (instanceVar11, instanceVar12) = (FooStruct(), FooStruct()) // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar4: FooStruct{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar5: FooStruct{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar6: FooStruct{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar7: FooStruct{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar8: FooStruct{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar9: FooStruct{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar10: FooStruct{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final var instanceVar11: FooStruct{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final var instanceVar12: FooStruct{{$}} let instanceLet1 = 0 let instanceLet2 = 0.0 let instanceLet3 = "" // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet1: Int{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet2: Double{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet3: String{{$}} let instanceLet4 = FooStruct() let (instanceLet5, instanceLet6) = (FooStruct(), FooStruct()) let (instanceLet7, instanceLet8) = (FooStruct(), FooStruct()) let (instanceLet9, instanceLet10) : (FooStruct, FooStruct) = (FooStruct(), FooStruct()) // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet4: FooStruct{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet5: FooStruct{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet6: FooStruct{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet7: FooStruct{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet8: FooStruct{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet9: FooStruct{{$}} // PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet10: FooStruct{{$}} } class d0260_ExplodePattern_TestClassBase { // PASS_EXPLODE_PATTERN-LABEL: {{^}}class d0260_ExplodePattern_TestClassBase {{{$}} init() { baseProp1 = 0 } // PASS_EXPLODE_PATTERN-NEXT: {{^}} init(){{$}} final var baseProp1: Int // PASS_EXPLODE_PATTERN-NEXT: {{^}} final var baseProp1: Int{{$}} var baseProp2: Int { get { return 0 } set {} } // PASS_EXPLODE_PATTERN-NEXT: {{^}} var baseProp2: Int{{$}} } class d0261_ExplodePattern_TestClassDerived : d0260_ExplodePattern_TestClassBase { // PASS_EXPLODE_PATTERN-LABEL: {{^}}@_inheritsConvenienceInitializers class d0261_ExplodePattern_TestClassDerived : d0260_ExplodePattern_TestClassBase {{{$}} override final var baseProp2: Int { get { return 0 } set {} } // PASS_EXPLODE_PATTERN-NEXT: {{^}} override final var baseProp2: Int{{$}} } //===--- //===--- Inheritance list in structs. //===--- struct StructWithoutInheritance1 {} // PASS_ONE_LINE-DAG: {{^}}struct StructWithoutInheritance1 {{{$}} struct StructWithInheritance1 : FooProtocol {} // PASS_ONE_LINE-DAG: {{^}}struct StructWithInheritance1 : FooProtocol {{{$}} struct StructWithInheritance2 : FooProtocol, BarProtocol {} // PASS_ONE_LINE-DAG: {{^}}struct StructWithInheritance2 : FooProtocol, BarProtocol {{{$}} struct StructWithInheritance3 : QuxProtocol, SubFooProtocol { typealias Qux = Int } // PASS_ONE_LINE-DAG: {{^}}struct StructWithInheritance3 : QuxProtocol, SubFooProtocol {{{$}} //===--- //===--- Inheritance list in classes. //===--- class ClassWithoutInheritance1 {} // PASS_ONE_LINE-DAG: {{^}}class ClassWithoutInheritance1 {{{$}} class ClassWithInheritance1 : FooProtocol {} // PASS_ONE_LINE-DAG: {{^}}class ClassWithInheritance1 : FooProtocol {{{$}} class ClassWithInheritance2 : FooProtocol, BarProtocol {} // PASS_ONE_LINE-DAG: {{^}}class ClassWithInheritance2 : FooProtocol, BarProtocol {{{$}} class ClassWithInheritance3 : FooClass {} // PASS_ONE_LINE-DAG: {{^}}@_inheritsConvenienceInitializers class ClassWithInheritance3 : FooClass {{{$}} class ClassWithInheritance4 : FooClass, FooProtocol {} // PASS_ONE_LINE-DAG: {{^}}@_inheritsConvenienceInitializers class ClassWithInheritance4 : FooClass, FooProtocol {{{$}} class ClassWithInheritance5 : FooClass, FooProtocol, BarProtocol {} // PASS_ONE_LINE-DAG: {{^}}@_inheritsConvenienceInitializers class ClassWithInheritance5 : FooClass, FooProtocol, BarProtocol {{{$}} class ClassWithInheritance6 : QuxProtocol, SubFooProtocol { typealias Qux = Int } // PASS_ONE_LINE-DAG: {{^}}class ClassWithInheritance6 : QuxProtocol, SubFooProtocol {{{$}} //===--- //===--- Inheritance list in enums. //===--- enum EnumWithoutInheritance1 {} // PASS_ONE_LINE-DAG: {{^}}enum EnumWithoutInheritance1 {{{$}} enum EnumWithInheritance1 : FooProtocol {} // PASS_ONE_LINE-DAG: {{^}}enum EnumWithInheritance1 : FooProtocol {{{$}} enum EnumWithInheritance2 : FooProtocol, BarProtocol {} // PASS_ONE_LINE-DAG: {{^}}enum EnumWithInheritance2 : FooProtocol, BarProtocol {{{$}} enum EnumDeclWithUnderlyingType1 : Int { case X } // PASS_ONE_LINE-DAG: {{^}}enum EnumDeclWithUnderlyingType1 : Int {{{$}} enum EnumDeclWithUnderlyingType2 : Int, FooProtocol { case X } // PASS_ONE_LINE-DAG: {{^}}enum EnumDeclWithUnderlyingType2 : Int, FooProtocol {{{$}} enum EnumWithInheritance3 : QuxProtocol, SubFooProtocol { typealias Qux = Int } // PASS_ONE_LINE-DAG: {{^}}enum EnumWithInheritance3 : QuxProtocol, SubFooProtocol {{{$}} //===--- //===--- Inheritance list in protocols. //===--- protocol ProtocolWithoutInheritance1 {} // PASS_ONE_LINE-DAG: {{^}}protocol ProtocolWithoutInheritance1 {{{$}} protocol ProtocolWithInheritance1 : FooProtocol {} // PASS_ONE_LINE-DAG: {{^}}protocol ProtocolWithInheritance1 : FooProtocol {{{$}} protocol ProtocolWithInheritance2 : FooProtocol, BarProtocol { } // PASS_ONE_LINE-DAG: {{^}}protocol ProtocolWithInheritance2 : BarProtocol, FooProtocol {{{$}} protocol ProtocolWithInheritance3 : QuxProtocol, SubFooProtocol { } // PASS_ONE_LINE-DAG: {{^}}protocol ProtocolWithInheritance3 : QuxProtocol, SubFooProtocol {{{$}} //===--- //===--- Inheritance list in extensions //===--- struct StructInherited { } // PASS_ONE_LINE-DAG: {{.*}}extension StructInherited : QuxProtocol, SubFooProtocol {{{$}} extension StructInherited : QuxProtocol, SubFooProtocol { typealias Qux = Int } //===--- //===--- Typealias printing. //===--- // Normal typealiases. typealias SimpleTypealias1 = FooProtocol // PASS_ONE_LINE-DAG: {{^}}typealias SimpleTypealias1 = FooProtocol{{$}} // Associated types. protocol AssociatedType1 { associatedtype AssociatedTypeDecl1 = Int // PASS_ONE_LINE-DAG: {{^}} associatedtype AssociatedTypeDecl1 = Int{{$}} associatedtype AssociatedTypeDecl2 : FooProtocol // PASS_ONE_LINE-DAG: {{^}} associatedtype AssociatedTypeDecl2 : FooProtocol{{$}} associatedtype AssociatedTypeDecl3 : FooProtocol, BarProtocol // PASS_ONE_LINE_TYPEREPR-DAG: {{^}} associatedtype AssociatedTypeDecl3 : BarProtocol, FooProtocol{{$}} associatedtype AssociatedTypeDecl4 where AssociatedTypeDecl4 : QuxProtocol, AssociatedTypeDecl4.Qux == Int // PASS_ONE_LINE_TYPEREPR-DAG: {{^}} associatedtype AssociatedTypeDecl4 : QuxProtocol where Self.AssociatedTypeDecl4.Qux == Int{{$}} associatedtype AssociatedTypeDecl5: FooClass // PASS_ONE_LINE_TYPEREPR-DAG: {{^}} associatedtype AssociatedTypeDecl5 : FooClass{{$}} } //===--- //===--- Variable declaration printing. //===--- var d0300_topLevelVar1: Int = 42 // PASS_COMMON: {{^}}@_hasInitialValue var d0300_topLevelVar1: Int{{$}} // PASS_COMMON-NOT: d0300_topLevelVar1 var d0400_topLevelVar2: Int = 42 // PASS_COMMON: {{^}}@_hasInitialValue var d0400_topLevelVar2: Int{{$}} // PASS_COMMON-NOT: d0400_topLevelVar2 var d0500_topLevelVar2: Int { get { return 42 } } // PASS_COMMON: {{^}}var d0500_topLevelVar2: Int { get }{{$}} // PASS_COMMON-NOT: d0500_topLevelVar2 class d0600_InClassVar1 { // PASS_O600-LABEL: d0600_InClassVar1 var instanceVar1: Int // PASS_COMMON: {{^}} var instanceVar1: Int{{$}} // PASS_COMMON-NOT: instanceVar1 var instanceVar2: Int = 42 // PASS_COMMON: {{^}} @_hasInitialValue var instanceVar2: Int{{$}} // PASS_COMMON-NOT: instanceVar2 // FIXME: this is sometimes printed without a type, see PASS_EXPLODE_PATTERN. // FIXME: PRINTED_WITHOUT_TYPE var instanceVar3 = 42 // PASS_COMMON: {{^}} @_hasInitialValue var instanceVar3 // PASS_COMMON-NOT: instanceVar3 var instanceVar4: Int { get { return 42 } } // PASS_COMMON: {{^}} var instanceVar4: Int { get }{{$}} // PASS_COMMON-NOT: instanceVar4 static var staticVar1: Int = 42 // PASS_COMMON: {{^}} @_hasInitialValue static var staticVar1: Int{{$}} // PASS_COMMON-NOT: staticVar1 static var staticVar2: Int { 42 } // PASS_COMMON: {{^}} static var staticVar2: Int { get }{{$}} // PASS_COMMON-NOT: staticVar2 init() { instanceVar1 = 10 } } //===--- //===--- Subscript declaration printing. //===--- class d0700_InClassSubscript1 { // PASS_COMMON-LABEL: d0700_InClassSubscript1 subscript(i: Int) -> Int { get { return 42 } } subscript(index i: Float) -> Int { return 42 } class `class` {} subscript(x: Float) -> `class` { return `class`() } // PASS_COMMON: {{^}} subscript(i: Int) -> Int { get }{{$}} // PASS_COMMON: {{^}} subscript(index i: Float) -> Int { get }{{$}} // PASS_COMMON: {{^}} subscript(x: Float) -> {{.*}} { get }{{$}} // PASS_COMMON-NOT: subscript // PASS_ONE_LINE_TYPE: {{^}} subscript(x: Float) -> d0700_InClassSubscript1.`class` { get }{{$}} // PASS_ONE_LINE_TYPEREPR: {{^}} subscript(x: Float) -> `class` { get }{{$}} } // PASS_COMMON: {{^}}}{{$}} //===--- //===--- Constructor declaration printing. //===--- struct d0800_ExplicitConstructors1 { // PASS_COMMON-LABEL: d0800_ExplicitConstructors1 init() {} // PASS_COMMON: {{^}} init(){{$}} init(a: Int) {} // PASS_COMMON: {{^}} init(a: Int){{$}} } struct d0900_ExplicitConstructorsSelector1 { // PASS_COMMON-LABEL: d0900_ExplicitConstructorsSelector1 init(int a: Int) {} // PASS_COMMON: {{^}} init(int a: Int){{$}} init(int a: Int, andFloat b: Float) {} // PASS_COMMON: {{^}} init(int a: Int, andFloat b: Float){{$}} } struct d1000_ExplicitConstructorsSelector2 { // PASS_COMMON-LABEL: d1000_ExplicitConstructorsSelector2 init(noArgs _: ()) {} // PASS_COMMON: {{^}} init(noArgs _: ()){{$}} init(_ a: Int) {} // PASS_COMMON: {{^}} init(_ a: Int){{$}} init(_ a: Int, withFloat b: Float) {} // PASS_COMMON: {{^}} init(_ a: Int, withFloat b: Float){{$}} init(int a: Int, _ b: Float) {} // PASS_COMMON: {{^}} init(int a: Int, _ b: Float){{$}} } //===--- //===--- Destructor declaration printing. //===--- class d1100_ExplicitDestructor1 { // PASS_COMMON-LABEL: d1100_ExplicitDestructor1 deinit {} // PASS_COMMON: {{^}} @objc deinit{{$}} } //===--- //===--- Enum declaration printing. //===--- enum d2000_EnumDecl1 { case ED1_First case ED1_Second } // PASS_COMMON: {{^}}enum d2000_EnumDecl1 {{{$}} // PASS_COMMON-NEXT: {{^}} case ED1_First{{$}} // PASS_COMMON-NEXT: {{^}} case ED1_Second{{$}} // PASS_COMMON-NEXT: {{^}} {{.*}}static func __derived_enum_equals(_ a: d2000_EnumDecl1, _ b: d2000_EnumDecl1) -> Bool // PASS_COMMON-NEXT: {{^}} func hash(into hasher: inout Hasher) // PASS_COMMON-NEXT: {{^}} var hashValue: Int { get }{{$}} // PASS_COMMON-NEXT: {{^}}}{{$}} enum d2100_EnumDecl2 { case ED2_A(Int) case ED2_B(Float) case ED2_C(Int, Float) case ED2_D(x: Int, y: Float) case ED2_E(x: Int, y: (Float, Double)) case ED2_F(x: Int, (y: Float, z: Double)) } // PASS_COMMON: {{^}}enum d2100_EnumDecl2 {{{$}} // PASS_COMMON-NEXT: {{^}} case ED2_A(Int){{$}} // PASS_COMMON-NEXT: {{^}} case ED2_B(Float){{$}} // PASS_COMMON-NEXT: {{^}} case ED2_C(Int, Float){{$}} // PASS_COMMON-NEXT: {{^}} case ED2_D(x: Int, y: Float){{$}} // PASS_COMMON-NEXT: {{^}} case ED2_E(x: Int, y: (Float, Double)){{$}} // PASS_COMMON-NEXT: {{^}} case ED2_F(x: Int, (y: Float, z: Double)){{$}} // PASS_COMMON-NEXT: {{^}}}{{$}} enum d2200_EnumDecl3 { case ED3_A, ED3_B case ED3_C(Int), ED3_D case ED3_E, ED3_F(Int) case ED3_G(Int), ED3_H(Int) case ED3_I(Int), ED3_J(Int), ED3_K } // PASS_2200: {{^}}enum d2200_EnumDecl3 {{{$}} // PASS_2200-NEXT: {{^}} case ED3_A, ED3_B{{$}} // PASS_2200-NEXT: {{^}} case ED3_C(Int), ED3_D{{$}} // PASS_2200-NEXT: {{^}} case ED3_E, ED3_F(Int){{$}} // PASS_2200-NEXT: {{^}} case ED3_G(Int), ED3_H(Int){{$}} // PASS_2200-NEXT: {{^}} case ED3_I(Int), ED3_J(Int), ED3_K{{$}} // PASS_2200-NEXT: {{^}}}{{$}} // PASS_2200_DESERIALIZED: {{^}}enum d2200_EnumDecl3 {{{$}} // PASS_2200_DESERIALIZED-NEXT: {{^}} case ED3_A{{$}} // PASS_2200_DESERIALIZED-NEXT: {{^}} case ED3_B{{$}} // PASS_2200_DESERIALIZED-NEXT: {{^}} case ED3_C(Int){{$}} // PASS_2200_DESERIALIZED-NEXT: {{^}} case ED3_D{{$}} // PASS_2200_DESERIALIZED-NEXT: {{^}} case ED3_E{{$}} // PASS_2200_DESERIALIZED-NEXT: {{^}} case ED3_F(Int){{$}} // PASS_2200_DESERIALIZED-NEXT: {{^}} case ED3_G(Int){{$}} // PASS_2200_DESERIALIZED-NEXT: {{^}} case ED3_H(Int){{$}} // PASS_2200_DESERIALIZED-NEXT: {{^}} case ED3_I(Int){{$}} // PASS_2200_DESERIALIZED-NEXT: {{^}} case ED3_J(Int){{$}} // PASS_2200_DESERIALIZED-NEXT: {{^}} case ED3_K{{$}} // PASS_2200_DESERIALIZED-NEXT: {{^}}}{{$}} enum d2300_EnumDeclWithValues1 : Int { case EDV2_First = 10 case EDV2_Second } // PASS_COMMON: {{^}}enum d2300_EnumDeclWithValues1 : Int {{{$}} // PASS_COMMON-NEXT: {{^}} case EDV2_First{{$}} // PASS_COMMON-NEXT: {{^}} case EDV2_Second{{$}} // PASS_COMMON-DAG: {{^}} typealias RawValue = Int // PASS_COMMON-DAG: {{^}} init?(rawValue: Int){{$}} // PASS_COMMON-DAG: {{^}} var rawValue: Int { get }{{$}} // PASS_COMMON: {{^}}}{{$}} enum d2400_EnumDeclWithValues2 : Double { case EDV3_First = 10 case EDV3_Second } // PASS_COMMON: {{^}}enum d2400_EnumDeclWithValues2 : Double {{{$}} // PASS_COMMON-NEXT: {{^}} case EDV3_First{{$}} // PASS_COMMON-NEXT: {{^}} case EDV3_Second{{$}} // PASS_COMMON-DAG: {{^}} typealias RawValue = Double // PASS_COMMON-DAG: {{^}} init?(rawValue: Double){{$}} // PASS_COMMON-DAG: {{^}} var rawValue: Double { get }{{$}} // PASS_COMMON: {{^}}}{{$}} //===--- //===--- Custom operator printing. //===--- postfix operator <*> // PASS_2500-LABEL: {{^}}postfix operator <*>{{$}} protocol d2600_ProtocolWithOperator1 { static postfix func <*>(_: Self) } // PASS_2500: {{^}}protocol d2600_ProtocolWithOperator1 {{{$}} // PASS_2500-NEXT: {{^}} postfix static func <*> (_: Self){{$}} // PASS_2500-NEXT: {{^}}}{{$}} struct d2601_TestAssignment {} infix operator %%% func %%%(lhs: inout d2601_TestAssignment, rhs: d2601_TestAssignment) -> Int { return 0 } // PASS_2500-LABEL: {{^}}infix operator %%% : DefaultPrecedence{{$}} // PASS_2500: {{^}}func %%% (lhs: inout d2601_TestAssignment, rhs: d2601_TestAssignment) -> Int{{$}} precedencegroup BoringPrecedence { // PASS_2500-LABEL: {{^}}precedencegroup BoringPrecedence {{{$}} associativity: left // PASS_2500-NEXT: {{^}} associativity: left{{$}} higherThan: AssignmentPrecedence // PASS_2500-NEXT: {{^}} higherThan: AssignmentPrecedence{{$}} // PASS_2500-NOT: assignment // PASS_2500-NOT: lowerThan } precedencegroup ReallyBoringPrecedence { // PASS_2500-LABEL: {{^}}precedencegroup ReallyBoringPrecedence {{{$}} associativity: right // PASS_2500-NEXT: {{^}} associativity: right{{$}} // PASS_2500-NOT: higherThan // PASS_2500-NOT: lowerThan // PASS_2500-NOT: assignment } precedencegroup BoringAssignmentPrecedence { // PASS_2500-LABEL: {{^}}precedencegroup BoringAssignmentPrecedence {{{$}} lowerThan: AssignmentPrecedence assignment: true // PASS_2500-NEXT: {{^}} assignment: true{{$}} // PASS_2500-NEXT: {{^}} lowerThan: AssignmentPrecedence{{$}} // PASS_2500-NOT: associativity // PASS_2500-NOT: higherThan } // PASS_2500: {{^}}}{{$}} //===--- //===--- Printing of deduced associated types. //===--- protocol d2700_ProtocolWithAssociatedType1 { associatedtype TA1 func returnsTA1() -> TA1 } // PREFER_TYPE_PRINTING: {{^}}protocol d2700_ProtocolWithAssociatedType1 {{{$}} // PREFER_TYPE_PRINTING-NEXT: {{^}} associatedtype TA1{{$}} // PREFER_TYPE_PRINTING-NEXT: {{^}} func returnsTA1() -> Self.TA1{{$}} // PREFER_TYPE_PRINTING-NEXT: {{^}}}{{$}} // PREFER_TYPEREPR_PRINTING: {{^}}protocol d2700_ProtocolWithAssociatedType1 {{{$}} // PREFER_TYPEREPR_PRINTING-NEXT: {{^}} associatedtype TA1{{$}} // PREFER_TYPEREPR_PRINTING-NEXT: {{^}} func returnsTA1() -> TA1{{$}} // PREFER_TYPEREPR_PRINTING-NEXT: {{^}}}{{$}} struct d2800_ProtocolWithAssociatedType1Impl : d2700_ProtocolWithAssociatedType1 { func returnsTA1() -> Int { return 42 } } // PASS_COMMON: {{^}}struct d2800_ProtocolWithAssociatedType1Impl : d2700_ProtocolWithAssociatedType1 {{{$}} // PASS_COMMON-NEXT: {{^}} func returnsTA1() -> Int{{$}} // PASS_COMMON-NEXT: {{^}} typealias TA1 = Int // PASS_COMMON-NEXT: {{^}} init(){{$}} // PASS_COMMON-NEXT: {{^}}}{{$}} //===--- //===--- Generic parameter list printing. //===--- struct GenericParams1< StructGenericFoo : FooProtocol, StructGenericFooX : FooClass, StructGenericBar : FooProtocol & BarProtocol, StructGenericBaz> { // PASS_ONE_LINE_TYPE-DAG: {{^}}struct GenericParams1 where StructGenericFoo : FooProtocol, StructGenericFooX : FooClass, StructGenericBar : BarProtocol, StructGenericBar : FooProtocol {{{$}} // PASS_ONE_LINE_TYPEREPR-DAG: {{^}}struct GenericParams1 where StructGenericFoo : FooProtocol, StructGenericFooX : FooClass, StructGenericBar : BarProtocol, StructGenericBar : FooProtocol {{{$}} init< GenericFoo : FooProtocol, GenericFooX : FooClass, GenericBar : FooProtocol & BarProtocol, GenericBaz>(a: StructGenericFoo, b: StructGenericBar, c: StructGenericBaz, d: GenericFoo, e: GenericFooX, f: GenericBar, g: GenericBaz) {} // PASS_ONE_LINE_TYPE-DAG: {{^}} init(a: StructGenericFoo, b: StructGenericBar, c: StructGenericBaz, d: GenericFoo, e: GenericFooX, f: GenericBar, g: GenericBaz) where GenericFoo : FooProtocol, GenericFooX : FooClass, GenericBar : BarProtocol, GenericBar : FooProtocol{{$}} // FIXME: in protocol compositions protocols are listed in reverse order. // // PASS_ONE_LINE_TYPEREPR-DAG: {{^}} init(a: StructGenericFoo, b: StructGenericBar, c: StructGenericBaz, d: GenericFoo, e: GenericFooX, f: GenericBar, g: GenericBaz) where GenericFoo : FooProtocol, GenericFooX : FooClass, GenericBar : BarProtocol, GenericBar : FooProtocol{{$}} func genericParams1< GenericFoo : FooProtocol, GenericFooX : FooClass, GenericBar : FooProtocol & BarProtocol, GenericBaz>(a: StructGenericFoo, b: StructGenericBar, c: StructGenericBaz, d: GenericFoo, e: GenericFooX, f: GenericBar, g: GenericBaz) {} // PASS_ONE_LINE_TYPE-DAG: {{^}} func genericParams1(a: StructGenericFoo, b: StructGenericBar, c: StructGenericBaz, d: GenericFoo, e: GenericFooX, f: GenericBar, g: GenericBaz) where GenericFoo : FooProtocol, GenericFooX : FooClass, GenericBar : BarProtocol, GenericBar : FooProtocol{{$}} // FIXME: in protocol compositions protocols are listed in reverse order. // // PASS_ONE_LINE_TYPEREPR-DAG: {{^}} func genericParams1(a: StructGenericFoo, b: StructGenericBar, c: StructGenericBaz, d: GenericFoo, e: GenericFooX, f: GenericBar, g: GenericBaz) where GenericFoo : FooProtocol, GenericFooX : FooClass, GenericBar : BarProtocol, GenericBar : FooProtocol{{$}} func contextualWhereClause1() where StructGenericBaz == Never {} // PASS_PRINT_AST: func contextualWhereClause1() where StructGenericBaz == Never{{$}} subscript(index: Int) -> Never where StructGenericBaz: FooProtocol { return fatalError() } // PASS_PRINT_AST: subscript(index: Int) -> Never where StructGenericBaz : FooProtocol { get }{{$}} } extension GenericParams1 where StructGenericBaz: FooProtocol { static func contextualWhereClause2() where StructGenericBaz: FooClass {} // PASS_PRINT_AST: static func contextualWhereClause2() where StructGenericBaz : FooClass{{$}} typealias ContextualWhereClause3 = Never where StructGenericBaz: QuxProtocol, StructGenericBaz.Qux == Void // PASS_PRINT_AST: typealias ContextualWhereClause3 = Never where StructGenericBaz : QuxProtocol, StructGenericBaz.Qux == (){{$}} } struct GenericParams2 where T : BarProtocol {} // PASS_ONE_LINE-DAG: {{^}}struct GenericParams2 where T : BarProtocol, T : FooProtocol {{{$}} struct GenericParams3 where T : BarProtocol, T : QuxProtocol {} // PASS_ONE_LINE-DAG: {{^}}struct GenericParams3 where T : BarProtocol, T : FooProtocol, T : QuxProtocol {{{$}} struct GenericParams4 where T.Qux : FooProtocol {} // PASS_ONE_LINE-DAG: {{^}}struct GenericParams4 where T : QuxProtocol, T.Qux : FooProtocol {{{$}} struct GenericParams5 where T.Qux : FooProtocol & BarProtocol {} // PREFER_TYPE_PRINTING: {{^}}struct GenericParams5 where T : QuxProtocol, T.Qux : BarProtocol, T.Qux : FooProtocol {{{$}} // PREFER_TYPE_REPR_PRINTING: {{^}}struct GenericParams5 where T : QuxProtocol, T.Qux : BarProtocol, T.Qux : FooProtocol {{{$}} struct GenericParams6 where T.Qux == U.Qux {} // PREFER_TYPE_PRINTING: {{^}}struct GenericParams6 where T : QuxProtocol, U : QuxProtocol, T.Qux == U.Qux {{{$}} // PREFER_TYPE_REPR_PRINTING: {{^}}struct GenericParams6 where T : QuxProtocol, U : QuxProtocol, T.Qux == U.Qux {{{$}} struct GenericParams7 where T.Qux : QuxProtocol, U.Qux : QuxProtocol, T.Qux.Qux == U.Qux.Qux {} // PREFER_TYPE_PRINTING: {{^}}struct GenericParams7 where T : QuxProtocol, U : QuxProtocol, T.Qux : QuxProtocol, U.Qux : QuxProtocol, T.Qux.Qux == U.Qux.Qux {{{$}} // PREFER_TYPE_REPR_PRINTING: {{^}}struct GenericParams7 where T : QuxProtocol, U : QuxProtocol, T.Qux : QuxProtocol, U.Qux : QuxProtocol, T.Qux.Qux == U.Qux.Qux {{{$}} //===--- //===--- Tupe sugar for library types. //===--- struct d2900_TypeSugar1 { // PASS_COMMON-LABEL: {{^}}struct d2900_TypeSugar1 {{{$}} // SYNTHESIZE_SUGAR_ON_TYPES-LABEL: {{^}}struct d2900_TypeSugar1 {{{$}} func f1(x: [Int]) {} // PASS_COMMON-NEXT: {{^}} func f1(x: [Int]){{$}} // SYNTHESIZE_SUGAR_ON_TYPES-NEXT: {{^}} func f1(x: [Int]){{$}} func f2(x: Array) {} // PASS_COMMON-NEXT: {{^}} func f2(x: Array){{$}} // SYNTHESIZE_SUGAR_ON_TYPES-NEXT: {{^}} func f2(x: [Int]){{$}} func f3(x: Int?) {} // PASS_COMMON-NEXT: {{^}} func f3(x: Int?){{$}} // SYNTHESIZE_SUGAR_ON_TYPES-NEXT: {{^}} func f3(x: Int?){{$}} func f4(x: Optional) {} // PASS_COMMON-NEXT: {{^}} func f4(x: Optional){{$}} // SYNTHESIZE_SUGAR_ON_TYPES-NEXT: {{^}} func f4(x: Int?){{$}} func f5(x: [Int]...) {} // PASS_COMMON-NEXT: {{^}} func f5(x: [Int]...){{$}} // SYNTHESIZE_SUGAR_ON_TYPES-NEXT: {{^}} func f5(x: [Int]...){{$}} func f6(x: Array...) {} // PASS_COMMON-NEXT: {{^}} func f6(x: Array...){{$}} // SYNTHESIZE_SUGAR_ON_TYPES-NEXT: {{^}} func f6(x: [Int]...){{$}} func f7(x: [Int : Int]...) {} // PASS_COMMON-NEXT: {{^}} func f7(x: [Int : Int]...){{$}} // SYNTHESIZE_SUGAR_ON_TYPES-NEXT: {{^}} func f7(x: [Int : Int]...){{$}} func f8(x: Dictionary...) {} // PASS_COMMON-NEXT: {{^}} func f8(x: Dictionary...){{$}} // SYNTHESIZE_SUGAR_ON_TYPES-NEXT: {{^}} func f8(x: [String : Int]...){{$}} } // PASS_COMMON-NEXT: {{^}} init(){{$}} // PASS_COMMON-NEXT: {{^}}}{{$}} // @discardableResult attribute public struct DiscardableThingy { // PASS_PRINT_AST: @discardableResult // PASS_PRINT_AST-NEXT: public init() @discardableResult public init() {} // PASS_PRINT_AST: @discardableResult // PASS_PRINT_AST-NEXT: public func useless() -> Int @discardableResult public func useless() -> Int { return 0 } } // Parameter Attributes. // Swift 1.2b1: Header gen puts @autoclosure in the wrong place // PASS_PRINT_AST: public func ParamAttrs1(a: @autoclosure () -> ()) public func ParamAttrs1(a : @autoclosure () -> ()) { a() } // PASS_PRINT_AST: public func ParamAttrs2(a: @autoclosure @escaping () -> ()) public func ParamAttrs2(a : @autoclosure @escaping () -> ()) { a() } // PASS_PRINT_AST: public func ParamAttrs3(a: () -> ()) public func ParamAttrs3(a : () -> ()) { a() } // PASS_PRINT_AST: public func ParamAttrs4(a: @escaping () -> ()) public func ParamAttrs4(a : @escaping () -> ()) { a() } // PASS_PRINT_AST: public func ParamAttrs5(a: (@escaping () -> ()) -> ()) public func ParamAttrs5(a : (@escaping () -> ()) -> ()) { } // PASS_PRINT_AST: public typealias ParamAttrs6 = (@autoclosure () -> ()) -> () public typealias ParamAttrs6 = (@autoclosure () -> ()) -> () // The following type only has the internal parameter name inferred from the // closure on the right-hand side of `=`. Thus, it is only part of the `Type` // and not part of the `TypeRepr`. // PASS_PRINT_AST_TYPE: public var ParamAttrs7: (_ f: @escaping () -> ()) -> () // PASS_PRINT_AST_TYPEREPR: public var ParamAttrs7: (@escaping () -> ()) -> () public var ParamAttrs7: (@escaping () -> ()) -> () = { f in f() } // PASS_PRINT_AST: public var ParamAttrs8: (_ f: @escaping () -> ()) -> () public var ParamAttrs8: (_ f: @escaping () -> ()) -> () = { f in f() } // Setter // PASS_PRINT_AST: class FooClassComputed { class FooClassComputed { // PASS_PRINT_AST: var stored: (((Int) -> Int) -> Int)? var stored : (((Int) -> Int) -> Int)? = nil // PASS_PRINT_AST: var computed: ((Int) -> Int) -> Int { get set } var computed : ((Int) -> Int) -> Int { get { return stored! } set { stored = newValue } } // PASS_PRINT_AST: } } // PASS_PRINT_AST: struct HasDefaultTupleOfNils { // PASS_PRINT_AST: var x: (Int?, Int?) // PASS_PRINT_AST: var y: Int? // PASS_PRINT_AST: var z: Int // PASS_PRINT_AST: var w: ((Int?, (), Int?), (Int?, Int?)) // PASS_PRINT_AST: init(x: (Int?, Int?) = (nil, nil), y: Int? = nil, z: Int, w: ((Int?, (), Int?), (Int?, Int?)) = ((nil, (), nil), (nil, nil))) // PASS_PRINT_AST: } struct HasDefaultTupleOfNils { var x: (Int?, Int?) var y: Int? var z: Int var w: ((Int?, (), Int?), (Int?, Int?)) } // Protocol extensions protocol ProtocolToExtend { associatedtype Assoc } extension ProtocolToExtend where Self.Assoc == Int {} // PREFER_TYPE_REPR_PRINTING: extension ProtocolToExtend where Self.Assoc == Int { // Protocol with where clauses protocol ProtocolWithWhereClause : QuxProtocol where Qux == Int {} // PREFER_TYPE_REPR_PRINTING: protocol ProtocolWithWhereClause : QuxProtocol where Self.Qux == Int { protocol ProtocolWithWhereClauseAndAssoc : QuxProtocol where Qux == Int { // PREFER_TYPE_REPR_PRINTING-DAG: protocol ProtocolWithWhereClauseAndAssoc : QuxProtocol where Self.Qux == Int { associatedtype A1 : QuxProtocol where A1 : FooProtocol, A1.Qux : QuxProtocol, Int == A1.Qux.Qux // PREFER_TYPE_REPR_PRINTING-DAG: {{^}} associatedtype A1 : FooProtocol, QuxProtocol where Self.A1.Qux : QuxProtocol, Self.A1.Qux.Qux == Int{{$}} associatedtype A2 : QuxProtocol where A2.Qux == Self // PREFER_TYPE_REPR_PRINTING-DAG: {{^}} associatedtype A2 : QuxProtocol where Self == Self.A2.Qux{{$}} } #if true #elseif false #else #endif // PASS_PRINT_AST-NOT: #if public struct MyPair { var a: A, b: B } public typealias MyPairI = MyPair // PASS_PRINT_AST: public typealias MyPairI = MyPair public typealias MyPairAlias = MyPair // PASS_PRINT_AST: public typealias MyPairAlias = MyPair typealias MyPairAlias2 = MyPair where U: BarProtocol // PASS_PRINT_AST: typealias MyPairAlias2 = MyPair where T : FooProtocol, U : BarProtocol