mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Try to fix constraint system in a way where member reference is going to be defined in terms of its use, which makes it seem like parameters match arguments exactly. Such helps to produce solutions and diagnose failures related to missing members precisely. These changes would be further extended to diagnose use of unavailable members and other structural member failures. Resolves: rdar://problem/34583132 Resolves: rdar://problem/36989788 Resolved: rdar://problem/39586166 Resolves: rdar://problem/40537782 Resolves: rdar://problem/46211109
277 lines
12 KiB
Swift
277 lines
12 KiB
Swift
// RUN: %empty-directory(%t)
|
|
|
|
// RUN: %target-swift-ide-test -F %S/Inputs/custom-frameworks -print-module -source-filename %s -module-to-print=APINotesFrameworkTest -function-definitions=false -print-regular-comments -swift-version 5 | %FileCheck -check-prefix=CHECK-SWIFT-5 %s
|
|
|
|
// RUN: %target-swift-ide-test -F %S/Inputs/custom-frameworks -print-module -source-filename %s -module-to-print=APINotesFrameworkTest -function-definitions=false -print-regular-comments -swift-version 4 | %FileCheck -check-prefix=CHECK-SWIFT-4 %s
|
|
|
|
// CHECK-SWIFT-5: func jumpTo(x: Double, y: Double, z: Double)
|
|
// CHECK-SWIFT-4: func jumpTo(x: Double, y: Double, z: Double)
|
|
|
|
// CHECK-SWIFT-5: func accept(_ ptr: UnsafeMutablePointer<Double>)
|
|
// CHECK-SWIFT-4: func acceptPointer(_ ptr: UnsafeMutablePointer<Double>?)
|
|
|
|
// CHECK-SWIFT-5: func normallyUnchanged()
|
|
// CHECK-SWIFT-5: @available(swift, obsoleted: 4.2, renamed: "normallyUnchanged()")
|
|
// CHECK-SWIFT-5-NEXT: func normallyUnchangedButChangedInSwift4()
|
|
// CHECK-SWIFT-4: @available(swift, obsoleted: 3, renamed: "normallyUnchangedButChangedInSwift4()")
|
|
// CHECK-SWIFT-4-NEXT: func normallyUnchanged()
|
|
// CHECK-SWIFT-4: func normallyUnchangedButChangedInSwift4()
|
|
|
|
|
|
// CHECK-SWIFT-5: func normallyChanged()
|
|
// CHECK-SWIFT-5-NEXT: @available(swift, obsoleted: 4.2, renamed: "normallyChanged()")
|
|
// CHECK-SWIFT-5-NEXT: func normallyChangedButSpecialInSwift4()
|
|
// CHECK-SWIFT-5-NEXT: @available(swift, obsoleted: 3, renamed: "normallyChanged()")
|
|
// CHECK-SWIFT-5-NEXT: func normallyChangedOriginal()
|
|
// CHECK-SWIFT-4: @available(swift, introduced: 4.2, renamed: "normallyChangedButSpecialInSwift4()")
|
|
// CHECK-SWIFT-4-NEXT: func normallyChanged()
|
|
// CHECK-SWIFT-4-NEXT: func normallyChangedButSpecialInSwift4()
|
|
// CHECK-SWIFT-4-NEXT: @available(swift, obsoleted: 3, renamed: "normallyChangedButSpecialInSwift4()")
|
|
// CHECK-SWIFT-4-NEXT: func normallyChangedOriginal()
|
|
|
|
// CHECK-SWIFT-5: @available(swift, obsoleted: 4.2, renamed: "NormallyUnchangedWrapper")
|
|
// CHECK-SWIFT-5-NEXT: typealias NormallyUnchangedButChangedInSwift4Wrapper = NormallyUnchangedWrapper
|
|
// CHECK-SWIFT-5: struct NormallyUnchangedWrapper {
|
|
// CHECK-SWIFT-4: typealias NormallyUnchangedButChangedInSwift4Wrapper = NormallyUnchangedWrapper
|
|
// CHECK-SWIFT-4-NEXT: struct NormallyUnchangedWrapper {
|
|
|
|
// CHECK-SWIFT-5: @available(swift, obsoleted: 4.2, renamed: "NormallyChangedWrapper")
|
|
// CHECK-SWIFT-5-NEXT: typealias NormallyChangedButSpecialInSwift4Wrapper = NormallyChangedWrapper
|
|
// CHECK-SWIFT-5: @available(swift, obsoleted: 3, renamed: "NormallyChangedWrapper")
|
|
// CHECK-SWIFT-5-NEXT: typealias NormallyChangedOriginalWrapper = NormallyChangedWrapper
|
|
// CHECK-SWIFT-5: struct NormallyChangedWrapper {
|
|
// CHECK-SWIFT-4: typealias NormallyChangedButSpecialInSwift4Wrapper = NormallyChangedWrapper
|
|
// CHECK-SWIFT-4-NEXT: @available(swift, obsoleted: 3, renamed: "NormallyChangedButSpecialInSwift4Wrapper")
|
|
// CHECK-SWIFT-4-NEXT: typealias NormallyChangedOriginalWrapper = NormallyChangedButSpecialInSwift4Wrapper
|
|
// CHECK-SWIFT-4-NEXT: struct NormallyChangedWrapper {
|
|
|
|
|
|
// RUN: not %target-swift-frontend -typecheck -F %S/Inputs/custom-frameworks -swift-version 5 %s 2>&1 | %FileCheck -check-prefix=CHECK-DIAGS -check-prefix=CHECK-DIAGS-5 %s
|
|
// RUN: not %target-swift-frontend -typecheck -F %S/Inputs/custom-frameworks -swift-version 4 %s 2>&1 | %FileCheck -check-prefix=CHECK-DIAGS -check-prefix=CHECK-DIAGS-4 %s
|
|
|
|
// RUN: %target-swift-frontend -emit-silgen -F %S/Inputs/custom-frameworks -swift-version 4 %s -DSILGEN 2>&1 | %FileCheck -check-prefix=CHECK-SILGEN -check-prefix=CHECK-SILGEN-4 %s
|
|
// RUN: %target-swift-frontend -emit-silgen -F %S/Inputs/custom-frameworks -swift-version 5 %s -DSILGEN 2>&1 | %FileCheck -check-prefix=CHECK-SILGEN -check-prefix=CHECK-SILGEN-5 %s
|
|
|
|
import APINotesFrameworkTest
|
|
|
|
#if !SILGEN
|
|
func testRenamedTopLevelDiags() {
|
|
var value = 0.0
|
|
|
|
// CHECK-DIAGS-5-NOT: versioned.swift:[[@LINE+1]]:
|
|
accept(&value)
|
|
// CHECK-DIAGS-4: versioned.swift:[[@LINE-1]]:3: error: 'accept' has been renamed to 'acceptPointer(_:)'
|
|
// CHECK-DIAGS-4: note: 'accept' was introduced in Swift 4.2
|
|
|
|
// CHECK-DIAGS-4-NOT: versioned.swift:[[@LINE+1]]:
|
|
acceptPointer(&value)
|
|
// CHECK-DIAGS-5: versioned.swift:[[@LINE-1]]:3: error: 'acceptPointer' has been renamed to 'accept(_:)'
|
|
// CHECK-DIAGS-5: note: 'acceptPointer' was obsoleted in Swift 4.2
|
|
|
|
acceptDoublePointer(&value)
|
|
// CHECK-DIAGS: versioned.swift:[[@LINE-1]]:3: error: 'acceptDoublePointer' has been renamed to
|
|
// CHECK-DIAGS-5-SAME: 'accept(_:)'
|
|
// CHECK-DIAGS-4-SAME: 'acceptPointer(_:)'
|
|
// CHECK-DIAGS: note: 'acceptDoublePointer' was obsoleted in Swift 3
|
|
|
|
oldAcceptDoublePointer(&value)
|
|
// CHECK-DIAGS: versioned.swift:[[@LINE-1]]:3: error: 'oldAcceptDoublePointer' has been renamed to
|
|
// CHECK-DIAGS-5-SAME: 'accept(_:)'
|
|
// CHECK-DIAGS-4-SAME: 'acceptPointer(_:)'
|
|
// CHECK-DIAGS: note: 'oldAcceptDoublePointer' has been explicitly marked unavailable here
|
|
|
|
_ = SomeCStruct()
|
|
// CHECK-DIAGS: versioned.swift:[[@LINE-1]]:7: error: 'SomeCStruct' has been renamed to
|
|
// CHECK-DIAGS-5-SAME: 'VeryImportantCStruct'
|
|
// CHECK-DIAGS-4-SAME: 'ImportantCStruct'
|
|
// CHECK-DIAGS: note: 'SomeCStruct' was obsoleted in Swift 3
|
|
|
|
// CHECK-DIAGS-4-NOT: versioned.swift:[[@LINE+1]]:
|
|
_ = ImportantCStruct()
|
|
// CHECK-DIAGS-5: versioned.swift:[[@LINE-1]]:7: error: 'ImportantCStruct' has been renamed to 'VeryImportantCStruct'
|
|
// CHECK-DIAGS-5: note: 'ImportantCStruct' was obsoleted in Swift 4.2
|
|
|
|
// CHECK-DIAGS-5-NOT: versioned.swift:[[@LINE+1]]:
|
|
_ = VeryImportantCStruct()
|
|
// CHECK-DIAGS-4-NOTE: versioned.swift:[[@LINE-1]]:
|
|
|
|
// CHECK-DIAGS-4-NOT: versioned.swift:[[@LINE+1]]:
|
|
let s = InnerInSwift5()
|
|
// CHECK-DIAGS-5: versioned.swift:[[@LINE-1]]:11: error: 'InnerInSwift5' has been renamed to 'Outer.Inner'
|
|
// CHECK-DIAGS-5: note: 'InnerInSwift5' was obsoleted in Swift 4.2
|
|
_ = s.value
|
|
// CHECK-DIAGS-5-NOT: versioned.swift:[[@LINE-1]]:
|
|
|
|
// CHECK-DIAGS-5-NOT: versioned.swift:[[@LINE+1]]:
|
|
let t = Outer.Inner()
|
|
// CHECK-DIAGS-4-NOT: versioned.swift:[[@LINE-1]]:
|
|
_ = s.value
|
|
// CHECK-DIAGS-4-NOT: versioned.swift:[[@LINE-1]]:
|
|
}
|
|
|
|
func testAKA(structValue: ImportantCStruct, aliasValue: ImportantCAlias) {
|
|
let _: Int = structValue
|
|
// CHECK-DIAGS-4: versioned.swift:[[@LINE-1]]:16: error: cannot convert value of type 'ImportantCStruct' to specified type 'Int'
|
|
|
|
let _: Int = aliasValue
|
|
// CHECK-DIAGS-4: versioned.swift:[[@LINE-1]]:16: error: cannot convert value of type 'ImportantCAlias' (aka 'Int32') to specified type 'Int'
|
|
|
|
let optStructValue: Optional = structValue
|
|
let _: Int = optStructValue
|
|
// CHECK-DIAGS-4: versioned.swift:[[@LINE-1]]:16: error: cannot convert value of type 'ImportantCStruct?' to specified type 'Int'
|
|
|
|
let optAliasValue: Optional = aliasValue
|
|
let _: Int = optAliasValue
|
|
// CHECK-DIAGS-4: versioned.swift:[[@LINE-1]]:16: error: cannot convert value of type 'ImportantCAlias?' (aka 'Optional<Int32>') to specified type 'Int'
|
|
}
|
|
|
|
func testRenamedEnumConstants() {
|
|
_ = AnonymousEnumValue // okay
|
|
|
|
// CHECK-DIAGS-5: [[@LINE+1]]:7: error: 'AnonymousEnumRenamed' has been renamed to 'AnonymousEnumRenamedSwiftUnversioned'
|
|
_ = AnonymousEnumRenamed
|
|
// CHECK-DIAGS-4: [[@LINE-1]]:7: error: 'AnonymousEnumRenamed' has been renamed to 'AnonymousEnumRenamedSwift4'
|
|
|
|
// CHECK-DIAGS-5-NOT: :[[@LINE+1]]:7:
|
|
_ = AnonymousEnumRenamedSwiftUnversioned
|
|
// CHECK-DIAGS-4: [[@LINE-1]]:7: error: 'AnonymousEnumRenamedSwiftUnversioned' has been renamed to 'AnonymousEnumRenamedSwift4'
|
|
|
|
// CHECK-DIAGS-5: [[@LINE+1]]:7: error: 'AnonymousEnumRenamedSwift4' has been renamed to 'AnonymousEnumRenamedSwiftUnversioned'
|
|
_ = AnonymousEnumRenamedSwift4
|
|
// CHECK-DIAGS-4-NOT: :[[@LINE-1]]:7:
|
|
}
|
|
|
|
func testRenamedUnknownEnum() {
|
|
_ = UnknownEnumValue // okay
|
|
|
|
// CHECK-DIAGS-5: [[@LINE+1]]:7: error: 'UnknownEnumRenamed' has been renamed to 'UnknownEnumRenamedSwiftUnversioned'
|
|
_ = UnknownEnumRenamed
|
|
// CHECK-DIAGS-4: [[@LINE-1]]:7: error: 'UnknownEnumRenamed' has been renamed to 'UnknownEnumRenamedSwift4'
|
|
|
|
// CHECK-DIAGS-5-NOT: :[[@LINE+1]]:7:
|
|
_ = UnknownEnumRenamedSwiftUnversioned
|
|
// CHECK-DIAGS-4: [[@LINE-1]]:7: error: 'UnknownEnumRenamedSwiftUnversioned' has been renamed to 'UnknownEnumRenamedSwift4'
|
|
|
|
// CHECK-DIAGS-5: [[@LINE+1]]:7: error: 'UnknownEnumRenamedSwift4' has been renamed to 'UnknownEnumRenamedSwiftUnversioned'
|
|
_ = UnknownEnumRenamedSwift4
|
|
// CHECK-DIAGS-4-NOT: :[[@LINE-1]]:7:
|
|
}
|
|
|
|
func testRenamedTrueEnum() {
|
|
// CHECK-DIAGS: [[@LINE+1]]:7: error: use of unresolved identifier 'TrueEnumValue'
|
|
_ = TrueEnumValue
|
|
|
|
// CHECK-DIAGS: [[@LINE+1]]:16: error: type 'TrueEnum' has no member 'TrueEnumValue'
|
|
_ = TrueEnum.TrueEnumValue
|
|
|
|
// CHECK-DIAGS: [[@LINE+1]]:16: error: 'Value' has been renamed to 'value'
|
|
_ = TrueEnum.Value
|
|
|
|
_ = TrueEnum.value // okay
|
|
|
|
// CHECK-DIAGS: [[@LINE+1]]:7: error: use of unresolved identifier 'TrueEnumRenamed'
|
|
_ = TrueEnumRenamed
|
|
|
|
// CHECK-DIAGS: [[@LINE+1]]:16: error: type 'TrueEnum' has no member 'TrueEnumRenamed'
|
|
_ = TrueEnum.TrueEnumRenamed
|
|
|
|
// CHECK-DIAGS-5: [[@LINE+1]]:16: error: 'Renamed' has been renamed to 'renamedSwiftUnversioned'
|
|
_ = TrueEnum.Renamed
|
|
// CHECK-DIAGS-4: [[@LINE-1]]:16: error: 'Renamed' has been renamed to 'renamedSwift4'
|
|
|
|
// CHECK-DIAGS: [[@LINE+1]]:16: error: type 'TrueEnum' has no member 'renamed'
|
|
_ = TrueEnum.renamed
|
|
|
|
// CHECK-DIAGS-5-NOT: :[[@LINE+1]]:16:
|
|
_ = TrueEnum.renamedSwiftUnversioned
|
|
// CHECK-DIAGS-4: [[@LINE-1]]:16: error: 'renamedSwiftUnversioned' has been renamed to 'renamedSwift4'
|
|
|
|
// CHECK-DIAGS-5: [[@LINE+1]]:16: error: 'renamedSwift4' has been renamed to 'renamedSwiftUnversioned'
|
|
_ = TrueEnum.renamedSwift4
|
|
// CHECK-DIAGS-4-NOT: :[[@LINE-1]]:16:
|
|
|
|
// CHECK-DIAGS: [[@LINE+1]]:7: error: use of unresolved identifier 'TrueEnumAliasRenamed'
|
|
_ = TrueEnumAliasRenamed
|
|
|
|
// CHECK-DIAGS: [[@LINE+1]]:16: error: type 'TrueEnum' has no member 'TrueEnumAliasRenamed'
|
|
_ = TrueEnum.TrueEnumAliasRenamed
|
|
|
|
// CHECK-DIAGS-5: [[@LINE+1]]:16: error: 'AliasRenamed' has been renamed to 'aliasRenamedSwiftUnversioned'
|
|
_ = TrueEnum.AliasRenamed
|
|
// CHECK-DIAGS-4: [[@LINE-1]]:16: error: 'AliasRenamed' has been renamed to 'aliasRenamedSwift4'
|
|
|
|
// CHECK-DIAGS: [[@LINE+1]]:16: error: type 'TrueEnum' has no member 'aliasRenamed'
|
|
_ = TrueEnum.aliasRenamed
|
|
|
|
// CHECK-DIAGS-5-NOT: :[[@LINE+1]]:16:
|
|
_ = TrueEnum.aliasRenamedSwiftUnversioned
|
|
// CHECK-DIAGS-4: [[@LINE-1]]:16: error: 'aliasRenamedSwiftUnversioned' has been renamed to 'aliasRenamedSwift4'
|
|
|
|
// CHECK-DIAGS-5: [[@LINE+1]]:16: error: 'aliasRenamedSwift4' has been renamed to 'aliasRenamedSwiftUnversioned'
|
|
_ = TrueEnum.aliasRenamedSwift4
|
|
// CHECK-DIAGS-4-NOT: :[[@LINE-1]]:16:
|
|
}
|
|
|
|
func testRenamedOptionyEnum() {
|
|
// CHECK-DIAGS: [[@LINE+1]]:7: error: use of unresolved identifier 'OptionyEnumValue'
|
|
_ = OptionyEnumValue
|
|
|
|
// CHECK-DIAGS: [[@LINE+1]]:19: error: type 'OptionyEnum' has no member 'OptionyEnumValue'
|
|
_ = OptionyEnum.OptionyEnumValue
|
|
|
|
// CHECK-DIAGS: [[@LINE+1]]:19: error: 'Value' has been renamed to 'value'
|
|
_ = OptionyEnum.Value
|
|
|
|
_ = OptionyEnum.value // okay
|
|
|
|
// CHECK-DIAGS: [[@LINE+1]]:7: error: use of unresolved identifier 'OptionyEnumRenamed'
|
|
_ = OptionyEnumRenamed
|
|
|
|
// CHECK-DIAGS: [[@LINE+1]]:19: error: type 'OptionyEnum' has no member 'OptionyEnumRenamed'
|
|
_ = OptionyEnum.OptionyEnumRenamed
|
|
|
|
// CHECK-DIAGS-5: [[@LINE+1]]:19: error: 'Renamed' has been renamed to 'renamedSwiftUnversioned'
|
|
_ = OptionyEnum.Renamed
|
|
// CHECK-DIAGS-4: [[@LINE-1]]:19: error: 'Renamed' has been renamed to 'renamedSwift4'
|
|
|
|
// CHECK-DIAGS: [[@LINE+1]]:19: error: type 'OptionyEnum' has no member 'renamed'
|
|
_ = OptionyEnum.renamed
|
|
|
|
// CHECK-DIAGS-5-NOT: :[[@LINE+1]]:19:
|
|
_ = OptionyEnum.renamedSwiftUnversioned
|
|
// CHECK-DIAGS-4: [[@LINE-1]]:19: error: 'renamedSwiftUnversioned' has been renamed to 'renamedSwift4'
|
|
|
|
// CHECK-DIAGS-5: [[@LINE+1]]:19: error: 'renamedSwift4' has been renamed to 'renamedSwiftUnversioned'
|
|
_ = OptionyEnum.renamedSwift4
|
|
// CHECK-DIAGS-4-NOT: :[[@LINE-1]]:19:
|
|
}
|
|
|
|
#endif
|
|
|
|
#if !swift(>=5)
|
|
|
|
func useSwift4Name(_: ImportantCStruct) {}
|
|
// CHECK-SILGEN-4: sil hidden [ossa] @$s9versioned13useSwift4NameyySo11SomeCStructVF
|
|
|
|
func useNewlyNested(_: InnerInSwift5) {}
|
|
// CHECK-SILGEN-4: sil hidden [ossa] @$s9versioned14useNewlyNestedyySo13InnerInSwift5VF
|
|
#endif
|
|
|
|
func useSwift5Name(_: VeryImportantCStruct) {}
|
|
// CHECK-SILGEN: sil hidden [ossa] @$s9versioned13useSwift5NameyySo11SomeCStructVF
|
|
|
|
|
|
|
|
#if swift(>=5)
|
|
func testSwiftWrapperInSwift5() {
|
|
_ = EnclosingStruct.Identifier.member
|
|
let _: EnclosingStruct.Identifier = .member
|
|
}
|
|
|
|
#else
|
|
func testSwiftWrapperInSwift4() {
|
|
_ = EnclosingStruct.Identifier.member
|
|
let _: EnclosingStruct.Identifier = .member
|
|
}
|
|
#endif
|