From c8c08763ec12b0e693f400390957249c1f6583b9 Mon Sep 17 00:00:00 2001 From: Jed Davis Date: Wed, 28 Aug 2013 18:21:04 -0700 Subject: Add repr attributes in various places that need them. --- src/libstd/rt/io/signal.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'src/libstd') diff --git a/src/libstd/rt/io/signal.rs b/src/libstd/rt/io/signal.rs index 4c6c675df03..b782d713950 100644 --- a/src/libstd/rt/io/signal.rs +++ b/src/libstd/rt/io/signal.rs @@ -26,6 +26,7 @@ use result::{Err, Ok}; use rt::io::io_error; use rt::rtio::{IoFactory, RtioSignal, with_local_io}; +#[repr(int)] #[deriving(Eq, IterBytes)] pub enum Signum { /// Equivalent to SIGBREAK, delivered when the user presses Ctrl-Break. -- cgit 1.4.1-3-g733a5 From fcfbfde0b71d2470cb544d3d216eaf61ceb348bf Mon Sep 17 00:00:00 2001 From: Jed Davis Date: Sun, 29 Sep 2013 02:20:11 -0700 Subject: Adjust reflection for the possibility of discriminants larger than int. Not only can discriminants be smaller than int now, but they can be larger than int on 32-bit targets. This has obvious implications for the reflection interface. Without this change, things fail with LLVM assertions when we try to "extend" i64 to i32. --- src/librustc/middle/trans/common.rs | 4 ++++ src/librustc/middle/trans/reflect.rs | 8 ++++---- src/libstd/reflect.rs | 10 +++++----- src/libstd/repr.rs | 12 ++++++------ src/libstd/unstable/intrinsics.rs | 13 +++++++++---- src/test/run-pass/enum-discrim-width-stuff.rs | 9 ++------- src/test/run-pass/reflect-visit-data.rs | 18 +++++++++--------- src/test/run-pass/reflect-visit-type.rs | 10 +++++----- 8 files changed, 44 insertions(+), 40 deletions(-) (limited to 'src/libstd') diff --git a/src/librustc/middle/trans/common.rs b/src/librustc/middle/trans/common.rs index 560cfa4be6b..c002584a7ff 100644 --- a/src/librustc/middle/trans/common.rs +++ b/src/librustc/middle/trans/common.rs @@ -868,6 +868,10 @@ pub fn C_i64(i: i64) -> ValueRef { return C_integral(Type::i64(), i as u64, true); } +pub fn C_u64(i: u64) -> ValueRef { + return C_integral(Type::i64(), i, false); +} + pub fn C_int(cx: &CrateContext, i: int) -> ValueRef { return C_integral(cx.int_type, i as u64, true); } diff --git a/src/librustc/middle/trans/reflect.rs b/src/librustc/middle/trans/reflect.rs index 1b27e06dca8..7e875243fd0 100644 --- a/src/librustc/middle/trans/reflect.rs +++ b/src/librustc/middle/trans/reflect.rs @@ -292,11 +292,11 @@ impl Reflector { sub_path, "get_disr"); - let llfdecl = decl_internal_rust_fn(ccx, [opaqueptrty], ty::mk_int(), sym); + let llfdecl = decl_internal_rust_fn(ccx, [opaqueptrty], ty::mk_u64(), sym); let fcx = new_fn_ctxt(ccx, ~[], llfdecl, - ty::mk_uint(), + ty::mk_u64(), None); let arg = unsafe { // @@ -308,7 +308,7 @@ impl Reflector { }; let mut bcx = fcx.entry_bcx.unwrap(); let arg = BitCast(bcx, arg, llptrty); - let ret = adt::trans_get_discr(bcx, repr, arg, Some(ccx.int_type)); + let ret = adt::trans_get_discr(bcx, repr, arg, Some(Type::i64())); Store(bcx, ret, fcx.llretptr.unwrap()); match fcx.llreturn { Some(llreturn) => cleanup_and_Br(bcx, bcx, llreturn), @@ -324,7 +324,7 @@ impl Reflector { for (i, v) in variants.iter().enumerate() { let name = ccx.sess.str_of(v.name); let variant_args = ~[this.c_uint(i), - C_integral(self.bcx.ccx().int_type, v.disr_val, false), + C_u64(v.disr_val), this.c_uint(v.args.len()), this.c_slice(name)]; do this.bracketed("enum_variant", variant_args) |this| { diff --git a/src/libstd/reflect.rs b/src/libstd/reflect.rs index d63b14f982d..19fa9abc0da 100644 --- a/src/libstd/reflect.rs +++ b/src/libstd/reflect.rs @@ -16,7 +16,7 @@ Runtime type reflection #[allow(missing_doc)]; -use unstable::intrinsics::{Opaque, TyDesc, TyVisitor}; +use unstable::intrinsics::{Disr, Opaque, TyDesc, TyVisitor}; use libc::c_void; use mem; use unstable::raw; @@ -396,7 +396,7 @@ impl TyVisitor for MovePtrAdaptor { } fn visit_enter_enum(&mut self, n_variants: uint, - get_disr: extern unsafe fn(ptr: *Opaque) -> int, + get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, sz: uint, align: uint) -> bool { self.align(align); @@ -407,7 +407,7 @@ impl TyVisitor for MovePtrAdaptor { } fn visit_enter_enum_variant(&mut self, variant: uint, - disr_val: int, + disr_val: Disr, n_fields: uint, name: &str) -> bool { if ! self.inner.visit_enter_enum_variant(variant, disr_val, @@ -426,7 +426,7 @@ impl TyVisitor for MovePtrAdaptor { } fn visit_leave_enum_variant(&mut self, variant: uint, - disr_val: int, + disr_val: Disr, n_fields: uint, name: &str) -> bool { if ! self.inner.visit_leave_enum_variant(variant, disr_val, @@ -437,7 +437,7 @@ impl TyVisitor for MovePtrAdaptor { } fn visit_leave_enum(&mut self, n_variants: uint, - get_disr: extern unsafe fn(ptr: *Opaque) -> int, + get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, sz: uint, align: uint) -> bool { if ! self.inner.visit_leave_enum(n_variants, get_disr, sz, align) { return false; diff --git a/src/libstd/repr.rs b/src/libstd/repr.rs index d03621eb60d..dd68c57e37e 100644 --- a/src/libstd/repr.rs +++ b/src/libstd/repr.rs @@ -29,7 +29,7 @@ use reflect::{MovePtr, align}; use str::StrSlice; use to_str::ToStr; use vec::OwnedVector; -use unstable::intrinsics::{Opaque, TyDesc, TyVisitor, get_tydesc, visit_tydesc}; +use unstable::intrinsics::{Disr, Opaque, TyDesc, TyVisitor, get_tydesc, visit_tydesc}; use unstable::raw; /// Representations @@ -92,7 +92,7 @@ num_repr!(f64, "f64") // New implementation using reflect::MovePtr enum VariantState { - SearchingFor(int), + SearchingFor(Disr), Matched, AlreadyFound } @@ -473,7 +473,7 @@ impl<'self> TyVisitor for ReprVisitor<'self> { fn visit_enter_enum(&mut self, _n_variants: uint, - get_disr: extern unsafe fn(ptr: *Opaque) -> int, + get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, _sz: uint, _align: uint) -> bool { let disr = unsafe { @@ -484,7 +484,7 @@ impl<'self> TyVisitor for ReprVisitor<'self> { } fn visit_enter_enum_variant(&mut self, _variant: uint, - disr_val: int, + disr_val: Disr, n_fields: uint, name: &str) -> bool { let mut write = false; @@ -531,7 +531,7 @@ impl<'self> TyVisitor for ReprVisitor<'self> { } fn visit_leave_enum_variant(&mut self, _variant: uint, - _disr_val: int, + _disr_val: Disr, n_fields: uint, _name: &str) -> bool { match self.var_stk[self.var_stk.len() - 1] { @@ -547,7 +547,7 @@ impl<'self> TyVisitor for ReprVisitor<'self> { fn visit_leave_enum(&mut self, _n_variants: uint, - _get_disr: extern unsafe fn(ptr: *Opaque) -> int, + _get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, _sz: uint, _align: uint) -> bool { diff --git a/src/libstd/unstable/intrinsics.rs b/src/libstd/unstable/intrinsics.rs index 1900d9d5801..20563718a6c 100644 --- a/src/libstd/unstable/intrinsics.rs +++ b/src/libstd/unstable/intrinsics.rs @@ -75,6 +75,11 @@ pub struct TyDesc { #[cfg(not(test))] pub enum Opaque { } +#[cfg(stage0)] +pub type Disr = int; +#[cfg(not(stage0))] +pub type Disr = u64; + #[lang="ty_visitor"] #[cfg(not(test))] pub trait TyVisitor { @@ -140,19 +145,19 @@ pub trait TyVisitor { sz: uint, align: uint) -> bool; fn visit_enter_enum(&mut self, n_variants: uint, - get_disr: extern unsafe fn(ptr: *Opaque) -> int, + get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, sz: uint, align: uint) -> bool; fn visit_enter_enum_variant(&mut self, variant: uint, - disr_val: int, + disr_val: Disr, n_fields: uint, name: &str) -> bool; fn visit_enum_variant_field(&mut self, i: uint, offset: uint, inner: *TyDesc) -> bool; fn visit_leave_enum_variant(&mut self, variant: uint, - disr_val: int, + disr_val: Disr, n_fields: uint, name: &str) -> bool; fn visit_leave_enum(&mut self, n_variants: uint, - get_disr: extern unsafe fn(ptr: *Opaque) -> int, + get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, sz: uint, align: uint) -> bool; fn visit_enter_fn(&mut self, purity: uint, proto: uint, diff --git a/src/test/run-pass/enum-discrim-width-stuff.rs b/src/test/run-pass/enum-discrim-width-stuff.rs index 65f93b1c3c2..bc4cb87f06b 100644 --- a/src/test/run-pass/enum-discrim-width-stuff.rs +++ b/src/test/run-pass/enum-discrim-width-stuff.rs @@ -13,13 +13,8 @@ use std::mem; pub fn main() { enum E { V = 0x1717171717171717 } static C: E = V; - let expected: u64 = if mem::size_of::() < 8 { - 0x17171717 - } else { - 0x1717171717171717 - }; - assert_eq!(expected, V as u64); - assert_eq!(expected, C as u64); + assert_eq!(V as u64, 0x1717171717171717u64); + assert_eq!(C as u64, 0x1717171717171717u64); assert_eq!(format!("{:?}", V), ~"V"); assert_eq!(format!("{:?}", C), ~"V"); } diff --git a/src/test/run-pass/reflect-visit-data.rs b/src/test/run-pass/reflect-visit-data.rs index 9901f7493f7..de8d9470f10 100644 --- a/src/test/run-pass/reflect-visit-data.rs +++ b/src/test/run-pass/reflect-visit-data.rs @@ -15,7 +15,7 @@ use std::libc::c_void; use std::ptr; use std::mem; -use std::unstable::intrinsics::{TyDesc, get_tydesc, visit_tydesc, TyVisitor, Opaque}; +use std::unstable::intrinsics::{TyDesc, get_tydesc, visit_tydesc, TyVisitor, Disr, Opaque}; use std::unstable::raw::Vec; #[doc = "High-level interfaces to `std::unstable::intrinsics::visit_ty` reflection system."] @@ -380,7 +380,7 @@ impl TyVisitor for ptr_visit_adaptor { } fn visit_enter_enum(&mut self, n_variants: uint, - get_disr: extern unsafe fn(ptr: *Opaque) -> int, + get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, sz: uint, align: uint) -> bool { self.align(align); @@ -389,7 +389,7 @@ impl TyVisitor for ptr_visit_adaptor { } fn visit_enter_enum_variant(&mut self, variant: uint, - disr_val: int, + disr_val: Disr, n_fields: uint, name: &str) -> bool { if ! self.inner.visit_enter_enum_variant(variant, disr_val, @@ -405,7 +405,7 @@ impl TyVisitor for ptr_visit_adaptor { } fn visit_leave_enum_variant(&mut self, variant: uint, - disr_val: int, + disr_val: Disr, n_fields: uint, name: &str) -> bool { if ! self.inner.visit_leave_enum_variant(variant, disr_val, @@ -416,7 +416,7 @@ impl TyVisitor for ptr_visit_adaptor { } fn visit_leave_enum(&mut self, n_variants: uint, - get_disr: extern unsafe fn(ptr: *Opaque) -> int, + get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, sz: uint, align: uint) -> bool { if ! self.inner.visit_leave_enum(n_variants, get_disr, sz, align) { return false; } @@ -578,24 +578,24 @@ impl TyVisitor for my_visitor { _sz: uint, _align: uint) -> bool { true } fn visit_enter_enum(&mut self, _n_variants: uint, - _get_disr: extern unsafe fn(ptr: *Opaque) -> int, + _get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, _sz: uint, _align: uint) -> bool { // FIXME (#3732): this needs to rewind between enum variants, or something. true } fn visit_enter_enum_variant(&mut self, _variant: uint, - _disr_val: int, + _disr_val: Disr, _n_fields: uint, _name: &str) -> bool { true } fn visit_enum_variant_field(&mut self, _i: uint, _offset: uint, inner: *TyDesc) -> bool { self.visit_inner(inner) } fn visit_leave_enum_variant(&mut self, _variant: uint, - _disr_val: int, + _disr_val: Disr, _n_fields: uint, _name: &str) -> bool { true } fn visit_leave_enum(&mut self, _n_variants: uint, - _get_disr: extern unsafe fn(ptr: *Opaque) -> int, + _get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, _sz: uint, _align: uint) -> bool { true } fn visit_enter_fn(&mut self, _purity: uint, _proto: uint, diff --git a/src/test/run-pass/reflect-visit-type.rs b/src/test/run-pass/reflect-visit-type.rs index db68ee2b500..e77cb432c3a 100644 --- a/src/test/run-pass/reflect-visit-type.rs +++ b/src/test/run-pass/reflect-visit-type.rs @@ -10,7 +10,7 @@ #[feature(managed_boxes)]; -use std::unstable::intrinsics::{TyDesc, get_tydesc, visit_tydesc, TyVisitor, Opaque}; +use std::unstable::intrinsics::{TyDesc, get_tydesc, visit_tydesc, TyVisitor, Disr, Opaque}; struct MyVisitor { types: @mut ~[~str], @@ -114,22 +114,22 @@ impl TyVisitor for MyVisitor { _sz: uint, _align: uint) -> bool { true } fn visit_enter_enum(&mut self, _n_variants: uint, - _get_disr: extern unsafe fn(ptr: *Opaque) -> int, + _get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, _sz: uint, _align: uint) -> bool { true } fn visit_enter_enum_variant(&mut self, _variant: uint, - _disr_val: int, + _disr_val: Disr, _n_fields: uint, _name: &str) -> bool { true } fn visit_enum_variant_field(&mut self, _i: uint, _offset: uint, _inner: *TyDesc) -> bool { true } fn visit_leave_enum_variant(&mut self, _variant: uint, - _disr_val: int, + _disr_val: Disr, _n_fields: uint, _name: &str) -> bool { true } fn visit_leave_enum(&mut self, _n_variants: uint, - _get_disr: extern unsafe fn(ptr: *Opaque) -> int, + _get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, _sz: uint, _align: uint) -> bool { true } fn visit_enter_fn(&mut self, _purity: uint, _proto: uint, -- cgit 1.4.1-3-g733a5 From 472d798dc1c0a7804b54c67b485e134fe097a57e Mon Sep 17 00:00:00 2001 From: Jed Davis Date: Sun, 20 Oct 2013 11:13:41 -0700 Subject: Work around const_eval issues by changing signed integer `min_value`s. Otherwise, run-pass/deriving-primitive.rs breaks on 32-bit platforms, because `int::min_value` is `0xffffffff7fffffff` when evaluated for the discriminant declaration. --- src/libstd/num/int_macros.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/libstd') diff --git a/src/libstd/num/int_macros.rs b/src/libstd/num/int_macros.rs index 694e5e7f6bf..ba1a7a4f912 100644 --- a/src/libstd/num/int_macros.rs +++ b/src/libstd/num/int_macros.rs @@ -29,7 +29,8 @@ pub static bits : uint = $bits; pub static bytes : uint = ($bits / 8); pub static min_value: $T = (-1 as $T) << (bits - 1); -pub static max_value: $T = min_value - 1 as $T; +// FIXME(#9837): Compute min_value like this so the high bits that shouldn't exist are 0. +pub static max_value: $T = !min_value; impl CheckedDiv for $T { #[inline] -- cgit 1.4.1-3-g733a5