diff options
| author | Luqman Aden <me@luqman.ca> | 2014-09-11 21:58:01 -0400 |
|---|---|---|
| committer | Luqman Aden <me@luqman.ca> | 2014-09-11 21:58:01 -0400 |
| commit | a152d5fcedf7dda803a34dcdb89908cacd8856d5 (patch) | |
| tree | ac3c7fbca303a4b8e05f6ce3f0bb04ee0a5bb4c3 | |
| parent | 06c0b1d28ac28ca42d6c179293e333a012a8a3fc (diff) | |
| download | rust-a152d5fcedf7dda803a34dcdb89908cacd8856d5.tar.gz rust-a152d5fcedf7dda803a34dcdb89908cacd8856d5.zip | |
librustc: Enum nullable pointer opt should not apply to raw pointers.
| -rw-r--r-- | src/librustc/middle/trans/adt.rs | 5 | ||||
| -rw-r--r-- | src/test/run-pass/enum-null-pointer-opt.rs | 5 |
2 files changed, 7 insertions, 3 deletions
diff --git a/src/librustc/middle/trans/adt.rs b/src/librustc/middle/trans/adt.rs index e62e3563a0a..4d8e0145901 100644 --- a/src/librustc/middle/trans/adt.rs +++ b/src/librustc/middle/trans/adt.rs @@ -298,9 +298,8 @@ impl Case { for (i, &ty) in self.tys.iter().enumerate() { match ty::get(ty).sty { - // &T/&mut T/*T could either be a thin or fat pointer depending on T - ty::ty_rptr(_, ty::mt { ty, .. }) - | ty::ty_ptr(ty::mt { ty, .. }) => match ty::get(ty).sty { + // &T/&mut T could either be a thin or fat pointer depending on T + ty::ty_rptr(_, ty::mt { ty, .. }) => match ty::get(ty).sty { // &[T] and &str are a pointer and length pair ty::ty_vec(_, None) | ty::ty_str => return Some(FatPointer(i, slice_elt_base)), diff --git a/src/test/run-pass/enum-null-pointer-opt.rs b/src/test/run-pass/enum-null-pointer-opt.rs index bd9dfc1e449..433c3b54224 100644 --- a/src/test/run-pass/enum-null-pointer-opt.rs +++ b/src/test/run-pass/enum-null-pointer-opt.rs @@ -37,4 +37,9 @@ fn main() { assert_eq!(size_of::<Box<int>>(), size_of::<Option<Box<int>>>()); assert_eq!(size_of::<Gc<int>>(), size_of::<Option<Gc<int>>>()); + + // The optimization can't apply to raw pointers + assert!(size_of::<Option<*const int>>() != size_of::<*const int>()); + assert!(Some(0 as *const int).is_some()); // Can't collapse None to null + } |
