Compiler crashes if conditions of the case clause are duplicated

Originator:kishikawakatsumi
Number:rdar://21676778 Date Originated:06-Jul-2015 00:15 AM
Status:Open Resolved:
Product:Developer Tools Product Version:
Classification: Reproducible:Always
 
Summary:
Compiler crashes if conditions of the case clause are duplicated in the initializer.
For example: Conforming to RawRepresentable protocol

Steps to Reproduce:
1. Define following enum
2. Set build configuration in scheme to 'Release'
3. Build it

public enum Enum {
    case A
    case B
    case C
}

extension Enum : RawRepresentable {

    public init?(rawValue: Int) {
        switch rawValue {
        case 0:
            self = A
        case 1:
            self = B
        case 1:
            self = B
        default:
            self = C
        }
    }

    public var rawValue: Int {
        switch self {
        case A:
            return 0
        case B:
            return 1
        default:
            return 2
        }
    }
}

Expected Results:
Build succeeded

Actual Results:
Build failed due to following error:
Command failed due to signal: Illegal instruction: 4

SIL verification failed: select_value dispatches on same case value more than once: !seenCaseValues.count(elt)
Verifying instruction:
     %4 = load %3 : $*Builtin.Int64               // user: %10
     %5 = integer_literal $Builtin.Int64, 0       // user: %10
     %6 = enum $Enum, #Enum.A!enumelt             // user: %10
     %7 = integer_literal $Builtin.Int64, 1       // users: %10, %10
     %7 = integer_literal $Builtin.Int64, 1       // users: %10, %10
     %8 = enum $Enum, #Enum.B!enumelt             // users: %10, %10
     %8 = enum $Enum, #Enum.B!enumelt             // users: %10, %10
     %9 = enum $Enum, #Enum.C!enumelt             // user: %10
->   %10 = select_value %4 : $Builtin.Int64, case %5: %6, case %7: %8, case %7: %8, default %9 : $Enum // user: %11
     %11 = enum $Optional<Enum>, #Optional.Some!enumelt.1, %10 : $Enum // user: %12
In function:
// protocol witness for Swift.RawRepresentable.init <A where A: Swift.RawRepresentable> (A.Type)(rawValue : A.RawValue) -> Swift.Optional<A> in conformance EnumTest.Enum : Swift.RawRepresentable in EnumTest
sil [transparent] [thunk] @_TTWO8EnumTest4EnumSs16RawRepresentableS_FS1_CuRq_S1__fMq_FT8rawValueqq_S1_8RawValue_GSqq__ : $@convention(witness_method) (@out Optional<Enum>, @in Int, @thick Enum.Type) -> () {
bb0(%0 : $*Optional<Enum>, %1 : $*Int, %2 : $@thick Enum.Type):
  %3 = struct_element_addr %1 : $*Int, #Int.value // user: %4
  %4 = load %3 : $*Builtin.Int64                  // user: %10
  %5 = integer_literal $Builtin.Int64, 0          // user: %10
  %6 = enum $Enum, #Enum.A!enumelt                // user: %10
  %7 = integer_literal $Builtin.Int64, 1          // users: %10, %10
  %8 = enum $Enum, #Enum.B!enumelt                // users: %10, %10
  %9 = enum $Enum, #Enum.C!enumelt                // user: %10
  %10 = select_value %4 : $Builtin.Int64, case %5: %6, case %7: %8, case %7: %8, default %9 : $Enum // user: %11
  %11 = enum $Optional<Enum>, #Optional.Some!enumelt.1, %10 : $Enum // user: %12
  store %11 to %0 : $*Optional<Enum>              // id: %12
  %13 = tuple ()                                  // user: %14
  return %13 : $()                                // id: %14
}

Version:
OS X 10.10.3 (14D136), Version 7.0 beta (7A121l)
OS X 10.11 (15A204h), Version 7.0 beta (7A120f)

Notes:
This crash is occurred RELEASE build only

Configuration:
MacBookPro10,1, 16GB RAM
MacBook8,1, 8GB RAM

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!