mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Calls involving single trailing closure arguments require special handling because we don't have as much contextual information about function/argument types as in with regular calls, which means that diagnosing such situations only by `visitApplyExpr` yields subpar results. Resolves: SR-4836.
88 lines
1.8 KiB
Swift
88 lines
1.8 KiB
Swift
// RUN: %target-swift-frontend -typecheck -verify -swift-version 3 %s
|
|
|
|
let s = "Hello"
|
|
let ss = s[s.startIndex..<s.endIndex]
|
|
|
|
// CTP_Initialization
|
|
do {
|
|
let s1: String = { return ss }()
|
|
_ = s1
|
|
}
|
|
|
|
// CTP_ReturnStmt
|
|
do {
|
|
func returnsAString() -> String {
|
|
return ss
|
|
}
|
|
}
|
|
|
|
// CTP_ThrowStmt
|
|
// Doesn't really make sense for this fix-it - see case in diagnoseContextualConversionError:
|
|
// The conversion destination of throw is always ErrorType (at the moment)
|
|
// if this ever expands, this should be a specific form like () is for
|
|
// return.
|
|
|
|
// CTP_EnumCaseRawValue
|
|
// Substrings can't be raw values because they aren't literals.
|
|
|
|
// CTP_DefaultParameter
|
|
do {
|
|
func foo(x: String = ss) {}
|
|
}
|
|
|
|
// CTP_CalleeResult
|
|
do {
|
|
func getSubstring() -> Substring { return ss } // expected-error {{cannot convert return expression of type 'String' to return type 'Substring'}}
|
|
let gottenString : String = getSubstring() // expected-error {{cannot convert value of type 'Substring' to specified type 'String'}} {{31-31=String(}} {{45-45=)}}
|
|
_ = gottenString
|
|
}
|
|
|
|
// CTP_CallArgument
|
|
do {
|
|
func takesAString(_ s: String) {}
|
|
takesAString(ss)
|
|
}
|
|
|
|
// CTP_ClosureResult
|
|
do {
|
|
[ss].map { (x: Substring) -> String in x } // expected-error {{'Substring' is not convertible to 'String'}}
|
|
}
|
|
|
|
// CTP_ArrayElement
|
|
do {
|
|
let a: [String] = [ ss ]
|
|
_ = a
|
|
}
|
|
|
|
// CTP_DictionaryKey
|
|
do {
|
|
let d: [ String : String ] = [ ss : s ]
|
|
_ = d
|
|
}
|
|
|
|
// CTP_DictionaryValue
|
|
do {
|
|
let d: [ String : String ] = [ s : ss ]
|
|
_ = d
|
|
}
|
|
|
|
// CTP_CoerceOperand
|
|
do {
|
|
let s1: String = ss as String
|
|
_ = s1
|
|
}
|
|
|
|
// CTP_AssignSource
|
|
do {
|
|
let s1: String = ss
|
|
_ = s1
|
|
}
|
|
|
|
func takesString(_ s: String) {}
|
|
|
|
func apply(_ fn: (String) -> (), _ s: String) {
|
|
fn(s[s.startIndex..<s.endIndex])
|
|
let _: String = s[s.startIndex..<s.endIndex]
|
|
_ = s[s.startIndex..<s.endIndex] as String
|
|
}
|