Swift 2: Guard let can shadow let-bound func param but not let-bound local name

Originator:jeremyw.sherman
Number:rdar://22609757 Date Originated:08-Sep-2015 09:48 AM
Status:Open Resolved:
Product:Developer Tools Product Version:
Classification:Serious Bug Reproducible:Always
 
Summary:
If I have func a(x: Int?), I can guard let x = x else { return }, and this works fine. I love this, because it lets me avoid unnecessary nesting without having to fiddle with names.

But if, within a(_:), I do let b = maybeInt(); guard let b = b else { return }, I get a redefinition error for b. This is frustrating; now I need to do something like let maybeB = maybeInt(); guard let b = maybeB else { return }.

It seems weird that the let-bound function parameter can be shadowed, but not the let-bound local name.

Steps to Reproduce:
> swift
(.lldbinit loaded)
fcWelcome to Apple Swift version 2.0 (700.0.57 700.0.72). Type :help for assistance.
  1> func b() -> Int? { return 3 }
  2> func a(x: Int?) {
  3.     guard let x = x else { return }
  4.     let y = b()
  5.     guard let y = y else { return }
  6.     print(x, y)
  7. }
repl.swift:5:15: error: definition conflicts with previous value
    guard let y = y else { return }
              ^
repl.swift:4:9: note: previous definition of 'y' is here
    let y = b()
        ^


Expected Results:
b is shadowed for the rest of the method body with the unwrapped value of b, so that b: Int? is replaced with b: Int.

This would be identical to the handling of the let-bound function argument name.

Actual Results:
repl.swift:5:15: error: definition conflicts with previous value
    guard let y = y else { return }
              ^
repl.swift:4:9: note: previous definition of 'y' is here
    let y = b()
        ^

Version:
Apple Swift version 2.0 (swiftlang-700.0.57.3 clang-700.0.72)
Target: x86_64-apple-darwin14.5.0

Xcode 7.0
Build version 7A192o

ProductName:	Mac OS X
ProductVersion:	10.10.5
BuildVersion:	14F27


Notes:


Configuration:


Attachments:

Comments


Please note: Reports posted here will not necessarily be seen by Apple. All problems should be submitted at bugreport.apple.com before they are posted here. Please only post information for Radars that you have filed yourself, and please do not include Apple confidential information in your posts. Thank you!