mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
C++ namespaces are module-independent, but enums are owned by their module's in Swift. So, to prevent declaring two enums with the same name, this patch implements a new approach to namespaces: enums with extensions.
Here's an example:
```
// Module A
namespace N { void test1(); }
// Module B
namespace N { void test2(); }
// __ObjC module
enum N { }
// Swift module A
extension N { func test1() }
// Swift module B
extension N { func test1() }
```
Thanks to @gribozavr for the great idea.
43 lines
2.3 KiB
Swift
43 lines
2.3 KiB
Swift
// RUN: %target-swift-ide-test -print-module -module-to-print=Templates -I %S/Inputs -source-filename=x -enable-cxx-interop | %FileCheck %s
|
|
|
|
// CHECK-NOT: extension
|
|
// CHECK: extension TemplatesNS1 {
|
|
// CHECK: static func basicFunctionTemplate<T>(_: T) -> UnsafePointer<CChar>!
|
|
// CHECK: struct __CxxTemplateInstN12TemplatesNS118BasicClassTemplateIcEE {
|
|
// CHECK: init()
|
|
// CHECK: mutating func basicMember() -> UnsafePointer<CChar>!
|
|
// CHECK: }
|
|
// CHECK: typealias BasicClassTemplateChar = TemplatesNS1.__CxxTemplateInstN12TemplatesNS118BasicClassTemplateIcEE
|
|
// CHECK: typealias UseTemplate = TemplatesNS4.__CxxTemplateInstN12TemplatesNS417HasSpecializationIcEE
|
|
// CHECK: typealias ForwardDeclaredClassTemplateChar = TemplatesNS1.TemplatesNS2.__CxxTemplateInstN12TemplatesNS112TemplatesNS228ForwardDeclaredClassTemplateIcEE
|
|
// CHECK: }
|
|
// CHECK: typealias ForwardDeclaredClassTemplateOutOfLineChar = TemplatesNS1.TemplatesNS2.__CxxTemplateInstN12TemplatesNS112TemplatesNS237ForwardDeclaredClassTemplateOutOfLineIcEE
|
|
// CHECK-NOT: extension
|
|
|
|
|
|
// CHECK: extension TemplatesNS1.TemplatesNS2 {
|
|
// CHECK: typealias BasicClassTemplateChar = TemplatesNS1.TemplatesNS3.__CxxTemplateInstN12TemplatesNS112TemplatesNS318BasicClassTemplateIcEE
|
|
// CHECK: static func takesClassTemplateFromSibling(_: TemplatesNS1.TemplatesNS2.BasicClassTemplateChar) -> UnsafePointer<CChar>!
|
|
// CHECK: static func forwardDeclaredFunctionTemplate<T>(_: T) -> UnsafePointer<CChar>!
|
|
// CHECK: struct __CxxTemplateInstN12TemplatesNS112TemplatesNS228ForwardDeclaredClassTemplateIcEE {
|
|
// CHECK: init()
|
|
// CHECK: mutating func basicMember() -> UnsafePointer<CChar>!
|
|
// CHECK: }
|
|
// CHECK: static func forwardDeclaredFunctionTemplateOutOfLine<T>(_: T) -> UnsafePointer<CChar>!
|
|
// CHECK: struct __CxxTemplateInstN12TemplatesNS112TemplatesNS237ForwardDeclaredClassTemplateOutOfLineIcEE {
|
|
// CHECK: init()
|
|
// CHECK: mutating func basicMember() -> UnsafePointer<CChar>!
|
|
// CHECK: }
|
|
// CHECK: }
|
|
// CHECK-NOT: extension
|
|
|
|
// CHECK: extension TemplatesNS4 {
|
|
// CHECK: struct __CxxTemplateInstN12TemplatesNS417HasSpecializationIcEE {
|
|
// CHECK: init()
|
|
// CHECK: }
|
|
// CHECK: struct __CxxTemplateInstN12TemplatesNS417HasSpecializationIiEE {
|
|
// CHECK: init()
|
|
// CHECK: }
|
|
// CHECK: }
|
|
// CHECK-NOT: extension
|