Files
swift-mirror/test/Parse/operators.swift
Pavel Yaskevich 202234f325 [CSDiagnostics] Diagnose invalid optional unwrap via fixes
Detect and fix situations when (force) unwrap is used on
a non-optional type, this helps to diagnose invalid unwraps
precisely and provide fix-its.

Resolves: [SR-8977](https://bugs.swift.org/browse/SR-8977)
Resolves: rdar://problem/45218255
2018-12-05 08:10:07 -08:00

127 lines
2.9 KiB
Swift
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// RUN: %target-typecheck-verify-swift -parse-stdlib
// This disables importing the stdlib intentionally.
infix operator == : Equal
precedencegroup Equal {
associativity: left
higherThan: FatArrow
}
infix operator & : BitAnd
precedencegroup BitAnd {
associativity: left
higherThan: Equal
}
infix operator => : FatArrow
precedencegroup FatArrow {
associativity: right
higherThan: AssignmentPrecedence
}
precedencegroup AssignmentPrecedence {
assignment: true
}
precedencegroup DefaultPrecedence {}
struct Man {}
struct TheDevil {}
struct God {}
struct Five {}
struct Six {}
struct Seven {}
struct ManIsFive {}
struct TheDevilIsSix {}
struct GodIsSeven {}
struct TheDevilIsSixThenGodIsSeven {}
func == (x: Man, y: Five) -> ManIsFive {}
func == (x: TheDevil, y: Six) -> TheDevilIsSix {}
func == (x: God, y: Seven) -> GodIsSeven {}
func => (x: TheDevilIsSix, y: GodIsSeven) -> TheDevilIsSixThenGodIsSeven {}
func => (x: ManIsFive, y: TheDevilIsSixThenGodIsSeven) {}
func test1() {
Man() == Five() => TheDevil() == Six() => God() == Seven()
}
postfix operator *!*
prefix operator *!*
struct LOOK {}
struct LOOKBang {
func exclaim() {}
}
postfix func *!* (x: LOOK) -> LOOKBang {}
prefix func *!* (x: LOOKBang) {}
func test2() {
*!*LOOK()*!*
}
// This should be parsed as (x*!*).exclaim()
LOOK()*!*.exclaim()
prefix operator ^
infix operator ^
postfix operator ^
postfix func ^ (x: God) -> TheDevil {}
prefix func ^ (x: TheDevil) -> God {}
func ^ (x: TheDevil, y: God) -> Man {}
var _ : TheDevil = God()^
var _ : God = ^TheDevil()
var _ : Man = TheDevil() ^ God()
var _ : Man = God()^ ^ ^TheDevil()
let _ = God()^TheDevil() // expected-error{{cannot convert value of type 'God' to expected argument type 'TheDevil'}}
postfix func ^ (x: Man) -> () -> God {
return { return God() }
}
var _ : God = Man()^() // expected-error{{cannot convert value of type 'Man' to expected argument type 'TheDevil'}}
func &(x : Man, y : Man) -> Man { return x } // forgive amp_prefix token
prefix operator
prefix func (x: Man) { }
infix operator ?? : OptTest
precedencegroup OptTest {
associativity: right
}
func ??(x: Man, y: TheDevil) -> TheDevil {
return y
}
func test3(a: Man, b: Man, c: TheDevil) -> TheDevil {
return a ?? b ?? c
}
// <rdar://problem/17821399> We don't parse infix operators bound on both
// sides that begin with ! or ? correctly yet.
infix operator !!
func !!(x: Man, y: Man) {}
let foo = Man()
let bar = TheDevil()
foo!!foo
// expected-error@-1 {{cannot force unwrap value of non-optional type 'Man'}} {{4-5=}}
// expected-error@-2 {{cannot force unwrap value of non-optional type 'Man'}} {{5-6=}}
// expected-error@-3 {{consecutive statements}} {{6-6=;}}
// expected-warning@-4 {{expression of type 'Man' is unused}}
foo??bar // expected-error{{broken standard library}} expected-error{{consecutive statements}} {{6-6=;}}
// expected-warning @-1 {{expression of type 'TheDevil' is unused}}