forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmisc_diagnostics.swift
159 lines (116 loc) · 6.51 KB
/
misc_diagnostics.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
// RUN: %target-typecheck-verify-swift
// REQUIRES: objc_interop
import Foundation
import CoreGraphics
var roomName : String?
if let realRoomName = roomName as! NSString { // expected-warning{{forced cast from 'String?' to 'NSString' only unwraps and bridges; did you mean to use '!' with 'as'?}}
// expected-error@-1{{initializer for conditional binding must have Optional type, not 'NSString'}}
}
var pi = 3.14159265358979
var d: CGFloat = 2.0
var dpi:CGFloat = d*pi // expected-error{{binary operator '*' cannot be applied to operands of type 'CGFloat' and 'Double'}} // expected-note{{expected an argument list of type '(CGFloat, CGFloat)'}}
let ff: CGFloat = floorf(20.0) // expected-error{{cannot convert value of type 'Float' to specified type 'CGFloat'}}
let total = 15.0
let count = 7
let median = total / count // expected-error {{binary operator '/' cannot be applied to operands of type 'Double' and 'Int'}} expected-note {{overloads for '/' exist with these partially matching parameter lists:}}
if (1) {} // expected-error{{'Int' is not convertible to 'Bool'}}
if 1 {} // expected-error {{'Int' is not convertible to 'Bool'}}
var a: [String] = [1] // expected-error{{cannot convert value of type 'Int' to expected element type 'String'}}
var b: Int = [1, 2, 3] // expected-error{{contextual type 'Int' cannot be used with array literal}}
var f1: Float = 2.0
var f2: Float = 3.0
var dd: Double = f1 - f2 // expected-error{{cannot convert value of type 'Float' to specified type 'Double'}}
func f() -> Bool {
return 1 + 1 // expected-error{{cannot convert return expression of type 'Int' to return type 'Bool'}}
}
// Test that nested diagnostics are properly surfaced.
func takesInt(_ i: Int) {}
func noParams() -> Int { return 0 }
func takesAndReturnsInt(_ i: Int) -> Int { return 0 }
takesInt(noParams(1)) // expected-error{{argument passed to call that takes no arguments}}
takesInt(takesAndReturnsInt("")) // expected-error{{cannot convert value of type 'String' to expected argument type 'Int'}}
// Test error recovery for type expressions.
struct MyArray<Element> {}
class A {
var a: MyArray<Int>
init() {
a = MyArray<Int // expected-error{{binary operator '<' cannot be applied to operands of type 'MyArray<_>.Type' and 'Int.Type'}}
// expected-note @-1 {{overloads for '<' exist with these partially matching parameter lists:}}
}
}
func retV() { return true } // expected-error {{unexpected non-void return value in void function}}
func retAI() -> Int {
let a = [""]
let b = [""]
return (a + b) // expected-error{{cannot convert return expression of type '[String]' to return type 'Int'}}
}
func bad_return1() {
return 42 // expected-error {{unexpected non-void return value in void function}}
}
func bad_return2() -> (Int, Int) {
return 42 // expected-error {{cannot convert return expression of type 'Int' to return type '(Int, Int)'}}
}
// <rdar://problem/14096697> QoI: Diagnostics for trying to return values from void functions
func bad_return3(lhs: Int, rhs: Int) {
return lhs != 0 // expected-error {{unexpected non-void return value in void function}}
}
class MyBadReturnClass {
static var intProperty = 42
}
func ==(lhs:MyBadReturnClass, rhs:MyBadReturnClass) {
return MyBadReturnClass.intProperty == MyBadReturnClass.intProperty // expected-error{{unexpected non-void return value in void function}}
}
func testIS1() -> Int { return 0 }
let _: String = testIS1() // expected-error {{cannot convert value of type 'Int' to specified type 'String'}}
func insertA<T>(array : inout [T], elt : T) {
array.append(T.self); // expected-error {{cannot invoke 'append' with an argument list of type '(T.Type)'}} expected-note {{expected an argument list of type '(T)'}}
// FIXME: Kind of weird
array.append(T); // expected-error {{cannot invoke 'append' with an argument list of type '((T).Type)'}} expected-note {{expected an argument list of type '(T)'}}
}
// <rdar://problem/17875634> can't append to array of tuples
func test17875634() {
var match: [(Int, Int)] = []
var row = 1
var col = 2
var coord = (row, col)
match += (1, 2) // expected-error{{argument type '(Int, Int)' does not conform to expected type 'Sequence'}}
match += (row, col) // expected-error{{argument type '(@lvalue Int, @lvalue Int)' does not conform to expected type 'Sequence'}}
match += coord // expected-error{{argument type '@lvalue (Int, Int)' does not conform to expected type 'Sequence'}}
match.append(row, col) // expected-error {{instance method 'append' expects a single parameter of type '(Int, Int)'}} {{16-16=(}} {{24-24=)}}
match.append(1, 2) // expected-error {{instance method 'append' expects a single parameter of type '(Int, Int)'}} {{16-16=(}} {{20-20=)}}
match.append(coord)
match.append((1, 2))
// Make sure the behavior matches the non-generic case.
struct FakeNonGenericArray {
func append(_ p: (Int, Int)) {}
}
let a2 = FakeNonGenericArray()
a2.append(row, col) // expected-error {{instance method 'append' expects a single parameter of type '(Int, Int)'}} {{13-13=(}} {{21-21=)}}
a2.append(1, 2) // expected-error {{instance method 'append' expects a single parameter of type '(Int, Int)'}} {{13-13=(}} {{17-17=)}}
a2.append(coord)
a2.append((1, 2))
}
// <rdar://problem/20770032> Pattern matching ranges against tuples crashes the compiler
func test20770032() {
if case let 1...10 = (1, 1) { // expected-warning{{'let' pattern has no effect; sub-pattern didn't bind any variables}} {{11-15=}} expected-error{{expression pattern of type 'CountableClosedRange<Int>' cannot match values of type '(Int, Int)'}}
}
}
func tuple_splat1(_ a : Int, _ b : Int) { // expected-note {{'tuple_splat1' declared here}}
let x = (1,2)
tuple_splat1(x) // expected-error {{passing 2 arguments to a callee as a single tuple value has been removed in Swift 3}}
tuple_splat1(1, 2) // Ok.
tuple_splat1((1, 2)) // expected-error {{missing argument for parameter #2 in call}}
}
// This take a tuple as a value, so it isn't a tuple splat.
func tuple_splat2(_ q : (a : Int, b : Int)) {
let x = (1,2)
tuple_splat2(x) // Ok
let y = (1, b: 2)
tuple_splat2(y) // Ok
tuple_splat2((1, b: 2)) // Ok.
tuple_splat2(1, b: 2) // expected-error {{global function 'tuple_splat2' expects a single parameter of type '(a: Int, b: Int)'}} {{16-16=(}} {{23-23=)}}
}
// SR-1612: Type comparison of foreign types is always true.
func is_foreign(a: AnyObject) -> Bool {
return a is CGColor // expected-warning {{'is' test is always true because 'CGColor' is a Core Foundation type}}
}