about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-04-26 13:03:31 +0000
committerbors <bors@rust-lang.org>2015-04-26 13:03:31 +0000
commitd3724342a3ef8eff3473de988f80bc088dc2668d (patch)
treeaa1b6800a42adb5444005a1ea3ec7d3c86b1d407
parent6365080c5cd27b74ec87420c351a3e7bdcff988e (diff)
parent34601afd5720eb13aa8cf49a02161802900dacf4 (diff)
downloadrust-d3724342a3ef8eff3473de988f80bc088dc2668d.tar.gz
rust-d3724342a3ef8eff3473de988f80bc088dc2668d.zip
Auto merge of #24807 - luqmana:nullable-enum-opt-dst-raw-pointers, r=jakub-
Fixes #23433.
-rw-r--r--src/librustc_trans/trans/adt.rs4
-rw-r--r--src/test/run-pass/issue-23433.rs24
2 files changed, 28 insertions, 0 deletions
diff --git a/src/librustc_trans/trans/adt.rs b/src/librustc_trans/trans/adt.rs
index e2827eeae15..d0cbd3370cf 100644
--- a/src/librustc_trans/trans/adt.rs
+++ b/src/librustc_trans/trans/adt.rs
@@ -414,6 +414,10 @@ fn find_discr_field_candidate<'tcx>(tcx: &ty::ctxt<'tcx>,
             assert_eq!(nonzero_fields.len(), 1);
             let nonzero_field = ty::lookup_field_type(tcx, did, nonzero_fields[0].id, substs);
             match nonzero_field.sty {
+                ty::ty_ptr(ty::mt { ty, .. }) if !type_is_sized(tcx, ty) => {
+                    path.push_all(&[0, FAT_PTR_ADDR]);
+                    Some(path)
+                },
                 ty::ty_ptr(..) | ty::ty_int(..) | ty::ty_uint(..) => {
                     path.push(0);
                     Some(path)
diff --git a/src/test/run-pass/issue-23433.rs b/src/test/run-pass/issue-23433.rs
new file mode 100644
index 00000000000..82f80586b9f
--- /dev/null
+++ b/src/test/run-pass/issue-23433.rs
@@ -0,0 +1,24 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// Don't fail if we encounter a NonZero<*T> where T is an unsized type
+
+#![feature(unique)]
+
+use std::ptr::Unique;
+
+fn main() {
+    let mut a = [0u8; 5];
+    let b: Option<Unique<[u8]>> = unsafe { Some(Unique::new(&mut a)) };
+    match b {
+        Some(_) => println!("Got `Some`"),
+        None => panic!("Unexpected `None`"),
+    }
+}