Files
swift-mirror/test/IRGen/enum_empty_payloads.sil
Joe Groff a806943d02 IRGen: Allow empty-type enum payloads to be projected.
We can still produce an undefined address for the empty value, even though we considered them as no-payload cases for layout purposes. Fixes rdar://problem/21515490.

Swift SVN r30490
2015-07-22 05:10:47 +00:00

46 lines
1.6 KiB
Plaintext

// RUN: %target-swift-frontend -emit-ir -verify %s
sil_stage canonical
struct Empty<T> {}
enum SinglePayload<T> {
case A(T)
case B()
case C(Empty<T>)
}
enum MultiPayload<T, U> {
case A(T)
case B(U)
case C()
case D()
case E(Empty<T>)
case F(Empty<U>)
}
sil @project_empty_payloads_single : $@convention(thin) <T> (@in SinglePayload<T>) -> () {
entry(%0 : $*SinglePayload<T>):
%1 = init_enum_data_addr %0 : $*SinglePayload<T>, #SinglePayload.B!enumelt.1
%2 = init_enum_data_addr %0 : $*SinglePayload<T>, #SinglePayload.C!enumelt.1
%3 = unchecked_take_enum_data_addr %0 : $*SinglePayload<T>, #SinglePayload.B!enumelt.1
%4 = unchecked_take_enum_data_addr %0 : $*SinglePayload<T>, #SinglePayload.C!enumelt.1
return undef : $()
}
sil @project_empty_payloads_multi : $@convention(thin) <T, U> (@in MultiPayload<T, U>) -> () {
entry(%0 : $*MultiPayload<T, U>):
%1 = init_enum_data_addr %0 : $*MultiPayload<T, U>, #MultiPayload.C!enumelt.1
%2 = init_enum_data_addr %0 : $*MultiPayload<T, U>, #MultiPayload.D!enumelt.1
%3 = init_enum_data_addr %0 : $*MultiPayload<T, U>, #MultiPayload.E!enumelt.1
%4 = init_enum_data_addr %0 : $*MultiPayload<T, U>, #MultiPayload.F!enumelt.1
%5 = unchecked_take_enum_data_addr %0 : $*MultiPayload<T, U>, #MultiPayload.C!enumelt.1
%6 = unchecked_take_enum_data_addr %0 : $*MultiPayload<T, U>, #MultiPayload.D!enumelt.1
%7 = unchecked_take_enum_data_addr %0 : $*MultiPayload<T, U>, #MultiPayload.E!enumelt.1
%8 = unchecked_take_enum_data_addr %0 : $*MultiPayload<T, U>, #MultiPayload.F!enumelt.1
return undef : $()
}