diff options
| author | Luqman Aden <laden@csclub.uwaterloo.ca> | 2014-12-04 16:56:26 -0500 |
|---|---|---|
| committer | Luqman Aden <laden@csclub.uwaterloo.ca> | 2014-12-28 19:40:47 -0500 |
| commit | 5fb1e6b1e2952b1205baaa3fc9facaf7f5b34483 (patch) | |
| tree | 88ce8d36f97f71494b35112e1232c91e1a973ccc | |
| parent | e6b6234e66539a3e80aa48281ea1b72464eb90df (diff) | |
| download | rust-5fb1e6b1e2952b1205baaa3fc9facaf7f5b34483.tar.gz rust-5fb1e6b1e2952b1205baaa3fc9facaf7f5b34483.zip | |
librustc: Try looking in fixed sized arrays for nullable enum opt.
| -rw-r--r-- | src/librustc_trans/trans/adt.rs | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/librustc_trans/trans/adt.rs b/src/librustc_trans/trans/adt.rs index 120e894b050..28a2174889c 100644 --- a/src/librustc_trans/trans/adt.rs +++ b/src/librustc_trans/trans/adt.rs @@ -390,6 +390,19 @@ fn find_discr_field_candidate<'tcx>(tcx: &ty::ctxt<'tcx>, ty: Ty<'tcx>) -> Optio None }, + // Is this a fixed-size array of something non-zero + // with at least one element? + ty::ty_vec(ety, Some(d)) if d > 0 => { + match find_discr_field_candidate(tcx, ety) { + Some(v) => { + let mut discrfield = vec![0]; + discrfield.extend(v.into_iter()); + return Some(discrfield); + } + None => None + } + }, + // Anything else is not a pointer _ => None } |
