about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLuqman Aden <laden@csclub.uwaterloo.ca>2014-12-04 16:56:26 -0500
committerLuqman Aden <laden@csclub.uwaterloo.ca>2014-12-28 19:40:47 -0500
commit5fb1e6b1e2952b1205baaa3fc9facaf7f5b34483 (patch)
tree88ce8d36f97f71494b35112e1232c91e1a973ccc
parente6b6234e66539a3e80aa48281ea1b72464eb90df (diff)
downloadrust-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.rs13
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
     }