Files
swift-mirror/validation-test/Evolution/Inputs/enum_add_cases_trap.swift
Jordan Rose 9be6519f5a [SILGen] Show a message when an unexpected enum value is switched on (#15614)
Builds on 36eae9d4f6 to emit a message instead of just trapping
when a switch over a non-frozen enum ends up not matching anything.
If the enum is known to be an @objc enum, the message is

  unexpected enum case 'MyEnum(rawValue: -42)'

and if it's anything else (a Swift enum, a tuple containing enums,
whatever), it's a more opaque

  unexpected enum case while switching on value of type 'MyEnum'

The reason for this is to avoid calling String(describing:) or
String(reflecting:) an arbitrary value when the enum might conform to
CustomStringConvertible and therefore /itself/ have a switch that's
going to fall off the end. By handling plain @objc enums (using a
bitcast), we've at least covered the 90% case.

rdar://problem/37728359
2018-04-03 11:21:36 -07:00

153 lines
2.8 KiB
Swift

public func getVersion() -> Int {
#if BEFORE
return 0
#else
return 1
#endif
}
public var starfishCount: Int = 0
public class Starfish {
public init() {
starfishCount += 1
}
deinit {
starfishCount -= 1
}
}
///////////////////////////////////////////////////////////////////////
public enum AddNoPayloadToSingleton {
case Noses
#if AFTER
case Tummies
case Tails
#endif
}
public func addNoPayloadToSingletonCases() -> [AddNoPayloadToSingleton] {
#if BEFORE
return [.Noses]
#else
return [.Noses, .Tummies, .Tails]
#endif
}
///////////////////////////////////////////////////////////////////////
public enum AddPayloadToSingleton {
case Cats
#if AFTER
case Horses(Starfish)
#endif
}
public func addPayloadToSingletonCases(_ s: Starfish)
-> [AddPayloadToSingleton] {
#if BEFORE
return [.Cats]
#else
return [.Cats, .Horses(s)]
#endif
}
///////////////////////////////////////////////////////////////////////
public enum AddPayloadsToSingleton {
case Cats
#if AFTER
case Horses(Starfish)
case Foxes(Starfish, Starfish)
#endif
}
public func addPayloadsToSingletonCases(_ s: Starfish)
-> [AddPayloadsToSingleton] {
#if BEFORE
return [.Cats]
#else
return [.Cats, .Horses(s), .Foxes(s, s)]
#endif
}
///////////////////////////////////////////////////////////////////////
public enum AddNoPayloadToSinglePayload {
case Cats(Starfish)
case Noses
#if AFTER
case Tummies
#endif
}
public func addNoPayloadToSinglePayloadCases(_ s: Starfish)
-> [AddNoPayloadToSinglePayload] {
#if BEFORE
return [.Cats(s), .Noses]
#else
return [.Cats(s), .Noses, .Tummies]
#endif
}
///////////////////////////////////////////////////////////////////////
public enum AddPayloadToSinglePayload {
case Cats
case Paws(Starfish)
#if AFTER
case Tails(Starfish)
#endif
}
public func addPayloadToSinglePayloadCases(_ s: Starfish)
-> [AddPayloadToSinglePayload] {
#if BEFORE
return [.Cats, .Paws(s)]
#else
return [.Cats, .Paws(s), .Tails(s)]
#endif
}
///////////////////////////////////////////////////////////////////////
public enum AddNoPayloadToMultiPayload {
case Cats(Starfish)
case Puppies(Starfish)
#if AFTER
case Lambs
case Piglets
#endif
}
public func addNoPayloadToMultiPayloadCases(_ s: Starfish)
-> [AddNoPayloadToMultiPayload] {
#if BEFORE
return [.Cats(s), .Puppies(s)]
#else
return [.Cats(s), .Puppies(s), .Lambs, .Piglets]
#endif
}
///////////////////////////////////////////////////////////////////////
public enum AddPayloadToMultiPayload {
case Cats(Starfish)
case Ponies(Starfish)
case Pandas
#if AFTER
case Piglets(Int64)
#endif
}
public func addPayloadToMultiPayloadCases(_ s: Starfish)
-> [AddPayloadToMultiPayload] {
#if BEFORE
return [.Cats(s), .Ponies(s), .Pandas]
#else
return [.Cats(s), .Ponies(s), .Pandas, .Piglets(1234321)]
#endif
}