about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLuqman Aden <laden@csclub.uwaterloo.ca>2014-12-04 16:55:56 -0500
committerLuqman Aden <laden@csclub.uwaterloo.ca>2014-12-28 19:40:47 -0500
commite6b6234e66539a3e80aa48281ea1b72464eb90df (patch)
tree0a0fe5f8a0d2349cfc5dc894940f87d2d5dff246
parente954fc4385e92907916135244fd2fe0e47b24deb (diff)
downloadrust-e6b6234e66539a3e80aa48281ea1b72464eb90df.tar.gz
rust-e6b6234e66539a3e80aa48281ea1b72464eb90df.zip
librustc: Try looking in tuple fields for nullable enum opt.
-rw-r--r--src/librustc_trans/trans/adt.rs15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/librustc_trans/trans/adt.rs b/src/librustc_trans/trans/adt.rs
index 44b86dc03c0..120e894b050 100644
--- a/src/librustc_trans/trans/adt.rs
+++ b/src/librustc_trans/trans/adt.rs
@@ -375,6 +375,21 @@ fn find_discr_field_candidate<'tcx>(tcx: &ty::ctxt<'tcx>, ty: Ty<'tcx>) -> Optio
             None
         },
 
+        // Can we use one of the fields in this tuple?
+        ty::ty_tup(ref tys) => {
+            for (j, &ty) in tys.iter().enumerate() {
+                match find_discr_field_candidate(tcx, ty) {
+                    Some(v) => {
+                        let mut discrfield = vec![j];
+                        discrfield.extend(v.into_iter());
+                        return Some(discrfield);
+                    }
+                    None => continue
+                }
+            }
+            None
+        },
+
         // Anything else is not a pointer
         _ => None
     }