// RUN: %empty-directory(%t) // RUN: %gyb %s > %t/main.swift // Other module is not resilient: // RUN: %empty-directory(%t/types) // RUN: %target-build-swift %S/Inputs/extension_types.swift -module-name ExtensionTypes -emit-module -emit-module-path %t/types/ExtensionTypes.swiftmodule // This module is both not resilient: // RUN: %target-swift-frontend -emit-ir -o%t/not_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift // RUN: %target-swift-frontend -emit-ir -o%t/not_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift -O // ... and resilient: // RUN: %target-swift-frontend -emit-ir -o%t/not_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift -enable-library-evolution // RUN: %target-swift-frontend -emit-ir -o%t/not_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift -enable-library-evolution -O // The same, but with -enable-testing: // RUN: %target-swift-frontend -emit-ir -o%t/not_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift -enable-testing // RUN: %target-swift-frontend -emit-ir -o%t/not_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift -enable-testing -O // RUN: %target-swift-frontend -emit-ir -o%t/not_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift -enable-library-evolution -enable-testing // RUN: %target-swift-frontend -emit-ir -o%t/not_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift -enable-library-evolution -enable-testing -O // Other module is resilient: // RUN: %empty-directory(%t/types) // RUN: %target-build-swift %S/Inputs/extension_types.swift -module-name ExtensionTypes -emit-module -emit-module-path %t/types/ExtensionTypes.swiftmodule -enable-library-evolution // This module is both not resilient: // RUN: %target-swift-frontend -emit-ir -o%t/resilient_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift // RUN: %target-swift-frontend -emit-ir -o%t/resilient_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift -O // ... and resilient: // RUN: %target-swift-frontend -emit-ir -o%t/resilient_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift -enable-library-evolution // RUN: %target-swift-frontend -emit-ir -o%t/resilient_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift -enable-library-evolution -O // The same but with -enable-testing: // RUN: %target-swift-frontend -emit-ir -o%t/resilient_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift -enable-testing // RUN: %target-swift-frontend -emit-ir -o%t/resilient_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift -enable-testing -O // RUN: %target-swift-frontend -emit-ir -o%t/resilient_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift -enable-library-evolution -enable-testing // RUN: %target-swift-frontend -emit-ir -o%t/resilient_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift -enable-library-evolution -enable-testing -O import ExtensionTypes // This generates all combinations of a public/internal/private struct // (plus a public one from another module) being extended to conform // to a public/internal/private protocol (plus a public one from // another module), both with and without inheritance/defaulting. %{ local_decl_names = ["Public", "Internal", "Private"] all_decl_names = ["Foreign"] + local_decl_names decl_name_to_access = { "Foreign": "public", "Public": "public", "Internal": "internal", "Private": "fileprivate" } def conformanceBody(protocol): return """ {access} func {name}Method() {{}} {access} var {name}Get: Int {{ return 0 }} {access} var {name}GetSet: Int {{ get {{ return 0 }} set {{}} }} """.format(access = decl_name_to_access[protocol], name = protocol.lower()) }% % for name in local_decl_names: % access = name.lower() ${access} protocol Extension${name} { func ${access}Method() var ${access}Get: Int { get } var ${access}GetSet: Int { get set } } // Defaulted methods: ${access} protocol Extension${name}Inherit: ExtensionForeign {} extension Extension${name}Inherit { ${conformanceBody(name)} } ${access} struct ${name}Struct {} ${access} struct ${name}StructInherit {} ${access} struct ${name}StructInheritNoDefault {} ${access} struct ${name}StructOneExtension {} % end % for sname in all_decl_names: % access = sname.lower() % for pname in all_decl_names: // e.g. extension PublicStruct: Private { ... } extension ${sname}Struct: Extension${pname} { ${conformanceBody(pname)} } // e.g. extension PublicStructInherit: PrivateInherit {} extension ${sname}StructInherit: Extension${pname}Inherit {} // e.g. extension PublicStructInheritNoDefault: PrivateInherit { ... } extension ${sname}StructInheritNoDefault: Extension${pname}Inherit { ${conformanceBody(pname)} } % end // e.g. extension PublicStructOneExtension: ExtensionForeign, ExtensionPublic, ExtensionInternal, ExtensionPrivate { ... } extension ${sname}StructOneExtension: ${", ".join("Extension" + p for p in all_decl_names)} { % for pname in all_decl_names: ${conformanceBody(pname)} % end } % end