Files
swift-mirror/test/SILOptimizer/return.swift
Valeriy Van b5ab1c85af Fix bug: wrong var used (#62683)
* Fix bug: wrong var used

* Augment tests for cases returning from initializers without initializing all stored properties
2023-01-03 20:57:17 -07:00

269 lines
7.5 KiB
Swift

// RUN: %target-swift-frontend %s -emit-sil -verify
func singleBlock() -> Int {
_ = 0
} // expected-error {{missing return in global function expected to return 'Int'}}
func singleBlock2() -> Int {
var y = 0
y += 1
} // expected-error {{missing return in global function expected to return 'Int'}}
enum NoCasesButNotNever {}
func diagnoseNoCaseEnumMissingReturn() -> NoCasesButNotNever {
} // expected-error {{function with uninhabited return type 'NoCasesButNotNever' is missing call to another never-returning function on all paths}}
func diagnoseNeverMissingBody() -> Never {
} // expected-error {{function with uninhabited return type 'Never' is missing call to another never-returning function on all paths}}
_ = { () -> Never in
}() // expected-error {{closure with uninhabited return type 'Never' is missing call to another never-returning function on all paths}}-
func diagnoseNeverWithBody(i : Int) -> Never {
if (i == -1) {
print("Oh no!")
} else {
switch i {
case 0:
exit()
case 1:
fatalError()
default:
repeat { } while true
}
}
} // expected-error {{function with uninhabited return type 'Never' is missing call to another never-returning function on all paths}}
class MyClassWithClosure {
var f : (_ s: String) -> String = { (_ s: String) -> String in } // expected-error {{missing return in closure expected to return 'String'}}
}
func multipleBlocksSingleMissing(b: Bool) -> (String, Int) {
var y = 0
if b {
return ("a", 1)
} else if (y == 0) {
y += 1
}
} // expected-error {{missing return in global function expected to return '(String, Int)'}}
func multipleBlocksAllMissing(x: Int) -> Int {
var y : Int = x + 1
while (y > 0 ) {
y -= 1
break
}
var x = 0
x += 1
} // expected-error {{missing return in global function expected to return 'Int'}}
@_silgen_name("exit") func exit () -> Never
func diagnose_missing_return_in_the_else_branch(i: Bool) -> Int {
if (i) {
exit()
}
} // expected-error {{missing return in global function expected to return 'Int'}}
func diagnose_missing_return_no_error_after_noreturn(i: Bool) -> Int {
if (i) {
exit()
} else {
exit()
}
} // no error
class TuringMachine {
func halt() -> Never {
repeat { } while true
}
}
func diagnose_missing_return_no_error_after_noreturn_method() -> Int {
TuringMachine().halt()
} // no error
func whileLoop(flag: Bool) -> Int {
var b = 1
while (flag) {
if b == 3 {
return 3
}
b += 1
}
} //expected-error {{missing return in global function expected to return 'Int'}}
struct S {}
extension S:ExpressibleByStringLiteral {
init!(stringLiteral:String) {
} // no error
}
func whileTrueLoop() -> Int {
var b = 1
while (true) {
if b == 3 {
return 3
}
b += 1
} // no-error
}
func testUnreachableAfterNoReturn(x: Int) -> Int {
exit(); // expected-note{{a call to a never-returning function}}
return x; // expected-warning {{will never be executed}}
}
func testUnreachableAfterNoReturnInADifferentBlock() -> Int {
let x:Int = 5
if true { // expected-note {{condition always evaluates to true}}
exit();
}
return x; // expected-warning {{will never be executed}}
}
func testReachableAfterNoReturnInADifferentBlock(x: Int) -> Int {
if x == 5 {
exit();
}
return x; // no warning
}
func testUnreachableAfterNoReturnFollowedByACall() -> Int {
let x:Int = 5
exit(); // expected-note{{a call to a never-returning function}}
exit(); // expected-warning {{will never be executed}}
return x
}
func testUnreachableAfterNoReturnMethod() -> Int {
TuringMachine().halt(); // expected-note{{a call to a never-returning function}}
return 0; // expected-warning {{will never be executed}}
}
func testCleanupCodeEmptyTuple(fn: @autoclosure () -> Bool = false,
message: String = "",
file: String = #file,
line: Int = #line) {
if true {
exit()
}
} // no warning
protocol InitProtocol {
init(_ x: Int)
}
struct StructWithIUOinit : InitProtocol {
init!(_ x: Int) { } // no missing-return error
}
// https://github.com/apple/swift/issues/56150
func f_56150() {
let _ : () -> Int = {
var x : Int {
get { 0 }
set { }
}
x // expected-error {{missing return in closure expected to return 'Int'}}
// expected-note@-1 {{did you mean to return the last expression?}}{{5-5=return }}
// expected-warning@-2 {{setter argument 'newValue' was never used, but the property was accessed}}
// expected-note@-3 {{did you mean to use 'newValue' instead of accessing the property's current value?}}
// expected-warning@-4 {{variable is unused}}
}
func f() -> Int {
var x : Int {
get { 0 }
set { }
}
x // expected-error {{missing return in local function expected to return 'Int'}}
// expected-note@-1 {{did you mean to return the last expression?}}{{5-5=return }}
// expected-warning@-2 {{setter argument 'newValue' was never used, but the property was accessed}}
// expected-note@-3 {{did you mean to use 'newValue' instead of accessing the property's current value?}}
// expected-warning@-4 {{variable is unused}}
}
let _ : () -> Int = {
var x : UInt {
get { 0 }
set { }
}
x
// expected-warning@-1 {{setter argument 'newValue' was never used, but the property was accessed}}
// expected-note@-2 {{did you mean to use 'newValue' instead of accessing the property's current value?}}
// expected-warning@-3 {{variable is unused}}
} // expected-error {{missing return in closure expected to return 'Int'}}
func f1() -> Int {
var x : UInt {
get { 0 }
set { }
}
x
// expected-warning@-1 {{setter argument 'newValue' was never used, but the property was accessed}}
// expected-note@-2 {{did you mean to use 'newValue' instead of accessing the property's current value?}}
// expected-warning@-3 {{variable is unused}}
} // expected-error {{missing return in local function expected to return 'Int'}}
let _ : () -> Int = {
var x : Int = 0 // expected-warning {{variable 'x' was never mutated; consider changing to 'let' constant}}
var _ : Int = 0
x // expected-error{{missing return in closure expected to return 'Int'}}
// expected-note@-1 {{did you mean to return the last expression?}}{{5-5=return }}
//expected-warning@-2{{variable is unused}}
}
}
// https://github.com/apple/swift/issues/56857
struct S_56857 {
init(_ i: Int) {
if i > 0 {
b = false
}
} // expected-error {{return from initializer without initializing all stored properties}}
let b: Bool // expected-note {{'self.b' not initialized}}
var x: Int {
if b {
return 0
}
} // expected-error {{missing return in getter expected to return 'Int'}}
var y: Int {
get {
if b {
return 0
}
} // expected-error {{missing return in getter expected to return 'Int'}}
set {}
}
}
class C_56857 {
init(_ i: Int) {
if i > 0 {
b = false
}
} // expected-error {{return from initializer without initializing all stored properties}}
static let a = false
let b: Bool // expected-note {{'self.b' not initialized}}
func method() -> Int {
if b {
return 0
}
} // expected-error {{missing return in instance method expected to return 'Int'}}
class func method1() -> Int {
if a {
return 0
}
} // expected-error {{missing return in class method expected to return 'Int'}}
}