Nuance:
Compiler says:
Expression following ‘return’ is treated as an argument of the 'return'.
unless foo() is indented by at least one space. Then there is no complaint.
> On 2017-10-15, at 4:32 PM, Dave Yost <[email protected]> wrote:
>
> Very cool!
>
> func foo() -> Int { return 17 }
>
> func bug1() -> Int {
> return
> foo() // Compiler says: Expression following ‘return'
> // is treated as an argument of the 'return'.
> }
>
> var x = 0
>
> func bug2() {
> return x = 4 // not even a warning – should be an error
> }
>
> print(bug1()) // prints 17
> bug2()
>
> Dave
>
> bug1() suggests that return be one of perhaps a set of special cases where
> line wrap is illegal.
>
> bug2() is a compiler bug IMO.
>
>> On 2017-10-15, at 8:32 AM, Mike Kluev via swift-evolution
>> <[email protected] <mailto:[email protected]>> wrote:
>>
>> on Date: Fri, 13 Oct 2017 20:21:22 -0700 Chris Lattner <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>> We already have whitespace sensitive rules to handle this. There is no
>> fundamental implementation difference that I see between separating the
>> elements of lists (which are expressions) and the elements of statements
>> (which can be expressions):
>>
>> func foo() -> Int { … }
>>
>> func statements() {
>> foo()
>> foo()
>> }
>>
>> let list = [
>> foo()
>> foo()
>> ]
>>
>> i was beaten by these optional semicolons...
>>
>> override func viewDidLoad() {
>> super.viewDidLoad()
>> return // put it ad-hoc to temporarily circumvent the rest of the code
>>
>> someView = SomeView(frame: view.bounds) // *
>> view.addSubview(someView) // **
>> ...
>> }
>>
>> so i put that ad-hoc return statement to circumvent the rest of the code
>> temporarily. of course i didn't put a semicolon after "return" as that skill
>> was long lost. to my surprise the app crashed, and nowhere else but in the
>> code that i thought was disabled...
>>
>> further investigation showed that in this case compiler was treating the
>> statement after return which happened to have the matching type “Void” as
>> part of return statement.
>>
>> should the function return type was, say, Int - that wouldn’t happen. or
>> should the next statement was of a different type - that wouldn’t happen. in
>> this case i was just “lucky”. here semantic information (matching vs non
>> matching types) is clearly "aiding" syntax parsing and sometimes it leads to
>> a surprising results.
>>
>> there was a warning on the * line:
>> “warning: expression following 'return' is treated as an argument of the
>> 'return’”
>>
>> and another warning on the ** line:
>> “warning: code after 'return' will never be executed”
>>
>> as i was prepared to get the warning about the code being unused in the
>> first place, i didn’t pay too much attention to the exact wording of that
>> warning... and was beaten by it.
>>
>> Mike
>>
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected] <mailto:[email protected]>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution