1
Fork 0

constify parts of libcore.

This commit is contained in:
Mazdak Farrokhzad 2018-10-23 02:04:14 +02:00
parent b4c046b342
commit 5b89877dda
33 changed files with 84 additions and 112 deletions

View file

@ -25,7 +25,7 @@ use num::NonZeroUsize;
#[derive(Debug)] #[derive(Debug)]
pub struct Excess(pub NonNull<u8>, pub usize); pub struct Excess(pub NonNull<u8>, pub usize);
fn size_align<T>() -> (usize, usize) { const fn size_align<T>() -> (usize, usize) {
(mem::size_of::<T>(), mem::align_of::<T>()) (mem::size_of::<T>(), mem::align_of::<T>())
} }
@ -116,7 +116,7 @@ impl Layout {
/// The minimum size in bytes for a memory block of this layout. /// The minimum size in bytes for a memory block of this layout.
#[stable(feature = "alloc_layout", since = "1.28.0")] #[stable(feature = "alloc_layout", since = "1.28.0")]
#[inline] #[inline]
pub fn size(&self) -> usize { self.size_ } pub const fn size(&self) -> usize { self.size_ }
/// The minimum byte alignment for a memory block of this layout. /// The minimum byte alignment for a memory block of this layout.
#[stable(feature = "alloc_layout", since = "1.28.0")] #[stable(feature = "alloc_layout", since = "1.28.0")]

View file

@ -77,7 +77,7 @@ impl TryFromSliceError {
issue = "0")] issue = "0")]
#[inline] #[inline]
#[doc(hidden)] #[doc(hidden)]
pub fn __description(&self) -> &str { pub const fn __description(&self) -> &str {
"could not convert slice to array" "could not convert slice to array"
} }
} }

View file

@ -39,7 +39,7 @@ fn bench_multiple_take(b: &mut Bencher) {
}); });
} }
fn scatter(x: i32) -> i32 { (x * 31) % 127 } const fn scatter(x: i32) -> i32 { (x * 31) % 127 }
#[bench] #[bench]
fn bench_max_by_key(b: &mut Bencher) { fn bench_max_by_key(b: &mut Bencher) {

View file

@ -474,7 +474,7 @@ impl<T: ?Sized> Cell<T> {
/// ``` /// ```
#[inline] #[inline]
#[stable(feature = "cell_as_ptr", since = "1.12.0")] #[stable(feature = "cell_as_ptr", since = "1.12.0")]
pub fn as_ptr(&self) -> *mut T { pub const fn as_ptr(&self) -> *mut T {
self.value.get() self.value.get()
} }
@ -636,12 +636,12 @@ type BorrowFlag = isize;
const UNUSED: BorrowFlag = 0; const UNUSED: BorrowFlag = 0;
#[inline(always)] #[inline(always)]
fn is_writing(x: BorrowFlag) -> bool { const fn is_writing(x: BorrowFlag) -> bool {
x < UNUSED x < UNUSED
} }
#[inline(always)] #[inline(always)]
fn is_reading(x: BorrowFlag) -> bool { const fn is_reading(x: BorrowFlag) -> bool {
x > UNUSED x > UNUSED
} }
@ -1508,7 +1508,7 @@ impl<T: ?Sized> UnsafeCell<T> {
/// ``` /// ```
#[inline] #[inline]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub fn get(&self) -> *mut T { pub const fn get(&self) -> *mut T {
&self.value as *const T as *mut T &self.value as *const T as *mut T
} }
} }

View file

@ -130,7 +130,7 @@ impl<I: Iterator<Item = u16>> Iterator for DecodeUtf16<I> {
impl DecodeUtf16Error { impl DecodeUtf16Error {
/// Returns the unpaired surrogate which caused this error. /// Returns the unpaired surrogate which caused this error.
#[stable(feature = "decode_utf16", since = "1.9.0")] #[stable(feature = "decode_utf16", since = "1.9.0")]
pub fn unpaired_surrogate(&self) -> u16 { pub const fn unpaired_surrogate(&self) -> u16 {
self.code self.code
} }
} }

View file

@ -903,7 +903,7 @@ impl char {
/// ``` /// ```
#[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")] #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
#[inline] #[inline]
pub fn is_ascii(&self) -> bool { pub const fn is_ascii(&self) -> bool {
*self as u32 <= 0x7F *self as u32 <= 0x7F
} }

View file

@ -104,7 +104,6 @@
/// assert_eq!(vec![1, 3], filtered); /// assert_eq!(vec![1, 3], filtered);
/// ``` /// ```
#[unstable(feature = "convert_id", issue = "53500")] #[unstable(feature = "convert_id", issue = "53500")]
#[rustc_const_unstable(feature = "const_convert_id")]
#[inline] #[inline]
pub const fn identity<T>(x: T) -> T { x } pub const fn identity<T>(x: T) -> T { x }

View file

@ -341,7 +341,7 @@ impl<'a> Arguments<'a> {
#[doc(hidden)] #[inline] #[doc(hidden)] #[inline]
#[unstable(feature = "fmt_internals", reason = "internal to format_args!", #[unstable(feature = "fmt_internals", reason = "internal to format_args!",
issue = "0")] issue = "0")]
pub fn new_v1(pieces: &'a [&'a str], pub const fn new_v1(pieces: &'a [&'a str],
args: &'a [ArgumentV1<'a>]) -> Arguments<'a> { args: &'a [ArgumentV1<'a>]) -> Arguments<'a> {
Arguments { Arguments {
pieces, pieces,
@ -359,7 +359,7 @@ impl<'a> Arguments<'a> {
#[doc(hidden)] #[inline] #[doc(hidden)] #[inline]
#[unstable(feature = "fmt_internals", reason = "internal to format_args!", #[unstable(feature = "fmt_internals", reason = "internal to format_args!",
issue = "0")] issue = "0")]
pub fn new_v1_formatted(pieces: &'a [&'a str], pub const fn new_v1_formatted(pieces: &'a [&'a str],
args: &'a [ArgumentV1<'a>], args: &'a [ArgumentV1<'a>],
fmt: &'a [rt::v1::Argument]) -> Arguments<'a> { fmt: &'a [rt::v1::Argument]) -> Arguments<'a> {
Arguments { Arguments {
@ -1492,7 +1492,7 @@ impl<'a> Formatter<'a> {
/// assert_eq!(&format!("{:t>6}", Foo), "tttttt"); /// assert_eq!(&format!("{:t>6}", Foo), "tttttt");
/// ``` /// ```
#[stable(feature = "fmt_flags", since = "1.5.0")] #[stable(feature = "fmt_flags", since = "1.5.0")]
pub fn fill(&self) -> char { self.fill } pub const fn fill(&self) -> char { self.fill }
/// Flag indicating what form of alignment was requested. /// Flag indicating what form of alignment was requested.
/// ///
@ -1562,7 +1562,7 @@ impl<'a> Formatter<'a> {
/// assert_eq!(&format!("{}", Foo(23)), "Foo(23)"); /// assert_eq!(&format!("{}", Foo(23)), "Foo(23)");
/// ``` /// ```
#[stable(feature = "fmt_flags", since = "1.5.0")] #[stable(feature = "fmt_flags", since = "1.5.0")]
pub fn width(&self) -> Option<usize> { self.width } pub const fn width(&self) -> Option<usize> { self.width }
/// Optionally specified precision for numeric types. /// Optionally specified precision for numeric types.
/// ///
@ -1589,7 +1589,7 @@ impl<'a> Formatter<'a> {
/// assert_eq!(&format!("{}", Foo(23.2)), "Foo(23.20)"); /// assert_eq!(&format!("{}", Foo(23.2)), "Foo(23.20)");
/// ``` /// ```
#[stable(feature = "fmt_flags", since = "1.5.0")] #[stable(feature = "fmt_flags", since = "1.5.0")]
pub fn precision(&self) -> Option<usize> { self.precision } pub const fn precision(&self) -> Option<usize> { self.precision }
/// Determines if the `+` flag was specified. /// Determines if the `+` flag was specified.
/// ///
@ -1617,7 +1617,9 @@ impl<'a> Formatter<'a> {
/// assert_eq!(&format!("{}", Foo(23)), "Foo(23)"); /// assert_eq!(&format!("{}", Foo(23)), "Foo(23)");
/// ``` /// ```
#[stable(feature = "fmt_flags", since = "1.5.0")] #[stable(feature = "fmt_flags", since = "1.5.0")]
pub fn sign_plus(&self) -> bool { self.flags & (1 << FlagV1::SignPlus as u32) != 0 } pub const fn sign_plus(&self) -> bool {
self.flags & (1 << FlagV1::SignPlus as u32) != 0
}
/// Determines if the `-` flag was specified. /// Determines if the `-` flag was specified.
/// ///
@ -1643,7 +1645,9 @@ impl<'a> Formatter<'a> {
/// assert_eq!(&format!("{}", Foo(23)), "Foo(23)"); /// assert_eq!(&format!("{}", Foo(23)), "Foo(23)");
/// ``` /// ```
#[stable(feature = "fmt_flags", since = "1.5.0")] #[stable(feature = "fmt_flags", since = "1.5.0")]
pub fn sign_minus(&self) -> bool { self.flags & (1 << FlagV1::SignMinus as u32) != 0 } pub const fn sign_minus(&self) -> bool {
self.flags & (1 << FlagV1::SignMinus as u32) != 0
}
/// Determines if the `#` flag was specified. /// Determines if the `#` flag was specified.
/// ///
@ -1668,7 +1672,9 @@ impl<'a> Formatter<'a> {
/// assert_eq!(&format!("{}", Foo(23)), "23"); /// assert_eq!(&format!("{}", Foo(23)), "23");
/// ``` /// ```
#[stable(feature = "fmt_flags", since = "1.5.0")] #[stable(feature = "fmt_flags", since = "1.5.0")]
pub fn alternate(&self) -> bool { self.flags & (1 << FlagV1::Alternate as u32) != 0 } pub const fn alternate(&self) -> bool {
self.flags & (1 << FlagV1::Alternate as u32) != 0
}
/// Determines if the `0` flag was specified. /// Determines if the `0` flag was specified.
/// ///
@ -1691,15 +1697,19 @@ impl<'a> Formatter<'a> {
/// assert_eq!(&format!("{:04}", Foo(23)), "23"); /// assert_eq!(&format!("{:04}", Foo(23)), "23");
/// ``` /// ```
#[stable(feature = "fmt_flags", since = "1.5.0")] #[stable(feature = "fmt_flags", since = "1.5.0")]
pub fn sign_aware_zero_pad(&self) -> bool { pub const fn sign_aware_zero_pad(&self) -> bool {
self.flags & (1 << FlagV1::SignAwareZeroPad as u32) != 0 self.flags & (1 << FlagV1::SignAwareZeroPad as u32) != 0
} }
// FIXME: Decide what public API we want for these two flags. // FIXME: Decide what public API we want for these two flags.
// https://github.com/rust-lang/rust/issues/48584 // https://github.com/rust-lang/rust/issues/48584
fn debug_lower_hex(&self) -> bool { self.flags & (1 << FlagV1::DebugLowerHex as u32) != 0 } const fn debug_lower_hex(&self) -> bool {
self.flags & (1 << FlagV1::DebugLowerHex as u32) != 0
}
fn debug_upper_hex(&self) -> bool { self.flags & (1 << FlagV1::DebugUpperHex as u32) != 0 } const fn debug_upper_hex(&self) -> bool {
self.flags & (1 << FlagV1::DebugUpperHex as u32) != 0
}
/// Creates a [`DebugStruct`] builder designed to assist with creation of /// Creates a [`DebugStruct`] builder designed to assist with creation of
/// [`fmt::Debug`] implementations for structs. /// [`fmt::Debug`] implementations for structs.

View file

@ -2658,7 +2658,7 @@ impl<I, U> FusedIterator for Flatten<I>
I::Item: IntoIterator<IntoIter = U, Item = U::Item> {} I::Item: IntoIterator<IntoIter = U, Item = U::Item> {}
/// Adapts an iterator by flattening it, for use in `flatten()` and `flat_map()`. /// Adapts an iterator by flattening it, for use in `flatten()` and `flat_map()`.
fn flatten_compat<I, U>(iter: I) -> FlattenCompat<I, U> { const fn flatten_compat<I, U>(iter: I) -> FlattenCompat<I, U> {
FlattenCompat { iter, frontiter: None, backiter: None } FlattenCompat { iter, frontiter: None, backiter: None }
} }

View file

@ -283,7 +283,7 @@ impl<T> Default for Empty<T> {
/// assert_eq!(None, nope.next()); /// assert_eq!(None, nope.next());
/// ``` /// ```
#[stable(feature = "iter_empty", since = "1.2.0")] #[stable(feature = "iter_empty", since = "1.2.0")]
pub fn empty<T>() -> Empty<T> { pub const fn empty<T>() -> Empty<T> {
Empty(marker::PhantomData) Empty(marker::PhantomData)
} }

View file

@ -82,7 +82,6 @@
#![feature(const_fn)] #![feature(const_fn)]
#![feature(const_int_ops)] #![feature(const_int_ops)]
#![feature(const_fn_union)] #![feature(const_fn_union)]
#![feature(const_manually_drop_new)]
#![feature(custom_attribute)] #![feature(custom_attribute)]
#![feature(doc_cfg)] #![feature(doc_cfg)]
#![feature(doc_spotlight)] #![feature(doc_spotlight)]

View file

@ -139,7 +139,7 @@ pub use intrinsics::transmute;
/// [ub]: ../../reference/behavior-considered-undefined.html /// [ub]: ../../reference/behavior-considered-undefined.html
#[inline] #[inline]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub fn forget<T>(t: T) { pub const fn forget<T>(t: T) {
ManuallyDrop::new(t); ManuallyDrop::new(t);
} }
@ -942,7 +942,6 @@ impl<T> ManuallyDrop<T> {
/// ManuallyDrop::new(Box::new(())); /// ManuallyDrop::new(Box::new(()));
/// ``` /// ```
#[stable(feature = "manually_drop", since = "1.20.0")] #[stable(feature = "manually_drop", since = "1.20.0")]
#[rustc_const_unstable(feature = "const_manually_drop_new")]
#[inline] #[inline]
pub const fn new(value: T) -> ManuallyDrop<T> { pub const fn new(value: T) -> ManuallyDrop<T> {
ManuallyDrop { value } ManuallyDrop { value }
@ -961,7 +960,7 @@ impl<T> ManuallyDrop<T> {
/// ``` /// ```
#[stable(feature = "manually_drop", since = "1.20.0")] #[stable(feature = "manually_drop", since = "1.20.0")]
#[inline] #[inline]
pub fn into_inner(slot: ManuallyDrop<T>) -> T { pub const fn into_inner(slot: ManuallyDrop<T>) -> T {
slot.value slot.value
} }

View file

@ -187,11 +187,11 @@ impl fmt::Display for ParseFloatError {
} }
} }
fn pfe_empty() -> ParseFloatError { const fn pfe_empty() -> ParseFloatError {
ParseFloatError { kind: FloatErrorKind::Empty } ParseFloatError { kind: FloatErrorKind::Empty }
} }
fn pfe_invalid() -> ParseFloatError { const fn pfe_invalid() -> ParseFloatError {
ParseFloatError { kind: FloatErrorKind::Invalid } ParseFloatError { kind: FloatErrorKind::Invalid }
} }

View file

@ -39,7 +39,7 @@ pub struct Decimal<'a> {
} }
impl<'a> Decimal<'a> { impl<'a> Decimal<'a> {
pub fn new(integral: &'a [u8], fractional: &'a [u8], exp: i64) -> Decimal<'a> { pub const fn new(integral: &'a [u8], fractional: &'a [u8], exp: i64) -> Decimal<'a> {
Decimal { integral, fractional, exp } Decimal { integral, fractional, exp }
} }
} }

View file

@ -44,7 +44,7 @@ pub struct Unpacked {
} }
impl Unpacked { impl Unpacked {
pub fn new(sig: u64, k: i16) -> Self { pub const fn new(sig: u64, k: i16) -> Self {
Unpacked { sig, k } Unpacked { sig, k }
} }
} }

View file

@ -15,11 +15,10 @@
/// This is used to approximate `k = ceil(log_10 (mant * 2^exp))`; /// This is used to approximate `k = ceil(log_10 (mant * 2^exp))`;
/// the true `k` is either `k_0` or `k_0+1`. /// the true `k` is either `k_0` or `k_0+1`.
#[doc(hidden)] #[doc(hidden)]
pub fn estimate_scaling_factor(mant: u64, exp: i16) -> i16 { pub const fn estimate_scaling_factor(mant: u64, exp: i16) -> i16 {
// 2^(nbits-1) < mant <= 2^nbits if mant > 0 // 2^(nbits-1) < mant <= 2^nbits if mant > 0
let nbits = 64 - (mant - 1).leading_zeros() as i64; let nbits = 64 - (mant - 1).leading_zeros() as i64;
// 1292913986 = floor(2^32 * log_10 2) // 1292913986 = floor(2^32 * log_10 2)
// therefore this always underestimates (or is exact), but not much. // therefore this always underestimates (or is exact), but not much.
(((nbits + exp as i64) * 1292913986) >> 32) as i16 (((nbits + exp as i64) * 1292913986) >> 32) as i16
} }

View file

@ -658,4 +658,3 @@ pub fn to_exact_fixed_str<'a, T, F>(mut format_exact: F, v: T,
} }
} }
} }

View file

@ -387,7 +387,7 @@ assert_eq!(n.count_ones(), 3);
```"), ```"),
#[inline] #[inline]
#[unstable(feature = "wrapping_int_impl", issue = "32463")] #[unstable(feature = "wrapping_int_impl", issue = "32463")]
pub fn count_ones(self) -> u32 { pub const fn count_ones(self) -> u32 {
self.0.count_ones() self.0.count_ones()
} }
} }
@ -407,7 +407,7 @@ assert_eq!(Wrapping(!0", stringify!($t), ").count_zeros(), 0);
```"), ```"),
#[inline] #[inline]
#[unstable(feature = "wrapping_int_impl", issue = "32463")] #[unstable(feature = "wrapping_int_impl", issue = "32463")]
pub fn count_zeros(self) -> u32 { pub const fn count_zeros(self) -> u32 {
self.0.count_zeros() self.0.count_zeros()
} }
} }
@ -430,7 +430,7 @@ assert_eq!(n.trailing_zeros(), 3);
```"), ```"),
#[inline] #[inline]
#[unstable(feature = "wrapping_int_impl", issue = "32463")] #[unstable(feature = "wrapping_int_impl", issue = "32463")]
pub fn trailing_zeros(self) -> u32 { pub const fn trailing_zeros(self) -> u32 {
self.0.trailing_zeros() self.0.trailing_zeros()
} }
} }
@ -456,7 +456,7 @@ assert_eq!(n.trailing_zeros(), 3);
/// ``` /// ```
#[inline] #[inline]
#[unstable(feature = "wrapping_int_impl", issue = "32463")] #[unstable(feature = "wrapping_int_impl", issue = "32463")]
pub fn rotate_left(self, n: u32) -> Self { pub const fn rotate_left(self, n: u32) -> Self {
Wrapping(self.0.rotate_left(n)) Wrapping(self.0.rotate_left(n))
} }
@ -481,7 +481,7 @@ assert_eq!(n.trailing_zeros(), 3);
/// ``` /// ```
#[inline] #[inline]
#[unstable(feature = "wrapping_int_impl", issue = "32463")] #[unstable(feature = "wrapping_int_impl", issue = "32463")]
pub fn rotate_right(self, n: u32) -> Self { pub const fn rotate_right(self, n: u32) -> Self {
Wrapping(self.0.rotate_right(n)) Wrapping(self.0.rotate_right(n))
} }
@ -505,7 +505,7 @@ assert_eq!(n.trailing_zeros(), 3);
/// ``` /// ```
#[inline] #[inline]
#[unstable(feature = "wrapping_int_impl", issue = "32463")] #[unstable(feature = "wrapping_int_impl", issue = "32463")]
pub fn swap_bytes(self) -> Self { pub const fn swap_bytes(self) -> Self {
Wrapping(self.0.swap_bytes()) Wrapping(self.0.swap_bytes())
} }
@ -532,7 +532,7 @@ assert_eq!(n.trailing_zeros(), 3);
/// ``` /// ```
#[unstable(feature = "reverse_bits", issue = "48763")] #[unstable(feature = "reverse_bits", issue = "48763")]
#[inline] #[inline]
pub fn reverse_bits(self) -> Self { pub const fn reverse_bits(self) -> Self {
Wrapping(self.0.reverse_bits()) Wrapping(self.0.reverse_bits())
} }
@ -560,7 +560,7 @@ if cfg!(target_endian = \"big\") {
```"), ```"),
#[inline] #[inline]
#[unstable(feature = "wrapping_int_impl", issue = "32463")] #[unstable(feature = "wrapping_int_impl", issue = "32463")]
pub fn from_be(x: Self) -> Self { pub const fn from_be(x: Self) -> Self {
Wrapping(<$t>::from_be(x.0)) Wrapping(<$t>::from_be(x.0))
} }
} }
@ -589,7 +589,7 @@ if cfg!(target_endian = \"little\") {
```"), ```"),
#[inline] #[inline]
#[unstable(feature = "wrapping_int_impl", issue = "32463")] #[unstable(feature = "wrapping_int_impl", issue = "32463")]
pub fn from_le(x: Self) -> Self { pub const fn from_le(x: Self) -> Self {
Wrapping(<$t>::from_le(x.0)) Wrapping(<$t>::from_le(x.0))
} }
} }
@ -618,7 +618,7 @@ if cfg!(target_endian = \"big\") {
```"), ```"),
#[inline] #[inline]
#[unstable(feature = "wrapping_int_impl", issue = "32463")] #[unstable(feature = "wrapping_int_impl", issue = "32463")]
pub fn to_be(self) -> Self { pub const fn to_be(self) -> Self {
Wrapping(self.0.to_be()) Wrapping(self.0.to_be())
} }
} }
@ -647,7 +647,7 @@ if cfg!(target_endian = \"little\") {
```"), ```"),
#[inline] #[inline]
#[unstable(feature = "wrapping_int_impl", issue = "32463")] #[unstable(feature = "wrapping_int_impl", issue = "32463")]
pub fn to_le(self) -> Self { pub const fn to_le(self) -> Self {
Wrapping(self.0.to_le()) Wrapping(self.0.to_le())
} }
} }
@ -707,7 +707,7 @@ assert_eq!(n.leading_zeros(), 3);
```"), ```"),
#[inline] #[inline]
#[unstable(feature = "wrapping_int_impl", issue = "32463")] #[unstable(feature = "wrapping_int_impl", issue = "32463")]
pub fn leading_zeros(self) -> u32 { pub const fn leading_zeros(self) -> u32 {
self.0.leading_zeros() self.0.leading_zeros()
} }
} }
@ -784,7 +784,7 @@ assert!(!Wrapping(-10", stringify!($t), ").is_positive());
```"), ```"),
#[inline] #[inline]
#[unstable(feature = "wrapping_int_impl", issue = "32463")] #[unstable(feature = "wrapping_int_impl", issue = "32463")]
pub fn is_positive(self) -> bool { pub const fn is_positive(self) -> bool {
self.0.is_positive() self.0.is_positive()
} }
} }
@ -806,7 +806,7 @@ assert!(!Wrapping(10", stringify!($t), ").is_negative());
```"), ```"),
#[inline] #[inline]
#[unstable(feature = "wrapping_int_impl", issue = "32463")] #[unstable(feature = "wrapping_int_impl", issue = "32463")]
pub fn is_negative(self) -> bool { pub const fn is_negative(self) -> bool {
self.0.is_negative() self.0.is_negative()
} }
} }
@ -836,7 +836,7 @@ assert_eq!(n.leading_zeros(), 2);
```"), ```"),
#[inline] #[inline]
#[unstable(feature = "wrapping_int_impl", issue = "32463")] #[unstable(feature = "wrapping_int_impl", issue = "32463")]
pub fn leading_zeros(self) -> u32 { pub const fn leading_zeros(self) -> u32 {
self.0.leading_zeros() self.0.leading_zeros()
} }
} }

View file

@ -416,7 +416,7 @@ impl<Idx> RangeInclusive<Idx> {
/// ``` /// ```
#[stable(feature = "inclusive_range_methods", since = "1.27.0")] #[stable(feature = "inclusive_range_methods", since = "1.27.0")]
#[inline] #[inline]
pub fn start(&self) -> &Idx { pub const fn start(&self) -> &Idx {
&self.start &self.start
} }
@ -440,7 +440,7 @@ impl<Idx> RangeInclusive<Idx> {
/// ``` /// ```
#[stable(feature = "inclusive_range_methods", since = "1.27.0")] #[stable(feature = "inclusive_range_methods", since = "1.27.0")]
#[inline] #[inline]
pub fn end(&self) -> &Idx { pub const fn end(&self) -> &Idx {
&self.end &self.end
} }

View file

@ -55,7 +55,7 @@ impl<'a> PanicInfo<'a> {
issue = "0")] issue = "0")]
#[doc(hidden)] #[doc(hidden)]
#[inline] #[inline]
pub fn internal_constructor(message: Option<&'a fmt::Arguments<'a>>, pub const fn internal_constructor(message: Option<&'a fmt::Arguments<'a>>,
location: Location<'a>) location: Location<'a>)
-> Self { -> Self {
struct NoPayload; struct NoPayload;
@ -96,7 +96,7 @@ impl<'a> PanicInfo<'a> {
/// ///
/// [`fmt::write`]: ../fmt/fn.write.html /// [`fmt::write`]: ../fmt/fn.write.html
#[unstable(feature = "panic_info_message", issue = "44489")] #[unstable(feature = "panic_info_message", issue = "44489")]
pub fn message(&self) -> Option<&fmt::Arguments> { pub const fn message(&self) -> Option<&fmt::Arguments> {
self.message self.message
} }
@ -125,7 +125,7 @@ impl<'a> PanicInfo<'a> {
/// panic!("Normal panic"); /// panic!("Normal panic");
/// ``` /// ```
#[stable(feature = "panic_hooks", since = "1.10.0")] #[stable(feature = "panic_hooks", since = "1.10.0")]
pub fn location(&self) -> Option<&Location> { pub const fn location(&self) -> Option<&Location> {
// NOTE: If this is changed to sometimes return None, // NOTE: If this is changed to sometimes return None,
// deal with that case in std::panicking::default_hook and std::panicking::begin_panic_fmt. // deal with that case in std::panicking::default_hook and std::panicking::begin_panic_fmt.
Some(&self.location) Some(&self.location)
@ -186,7 +186,7 @@ impl<'a> Location<'a> {
and related macros", and related macros",
issue = "0")] issue = "0")]
#[doc(hidden)] #[doc(hidden)]
pub fn internal_constructor(file: &'a str, line: u32, col: u32) -> Self { pub const fn internal_constructor(file: &'a str, line: u32, col: u32) -> Self {
Location { file, line, col } Location { file, line, col }
} }
@ -208,7 +208,7 @@ impl<'a> Location<'a> {
/// panic!("Normal panic"); /// panic!("Normal panic");
/// ``` /// ```
#[stable(feature = "panic_hooks", since = "1.10.0")] #[stable(feature = "panic_hooks", since = "1.10.0")]
pub fn file(&self) -> &str { pub const fn file(&self) -> &str {
self.file self.file
} }
@ -230,7 +230,7 @@ impl<'a> Location<'a> {
/// panic!("Normal panic"); /// panic!("Normal panic");
/// ``` /// ```
#[stable(feature = "panic_hooks", since = "1.10.0")] #[stable(feature = "panic_hooks", since = "1.10.0")]
pub fn line(&self) -> u32 { pub const fn line(&self) -> u32 {
self.line self.line
} }
@ -252,7 +252,7 @@ impl<'a> Location<'a> {
/// panic!("Normal panic"); /// panic!("Normal panic");
/// ``` /// ```
#[stable(feature = "panic_col", since = "1.25.0")] #[stable(feature = "panic_col", since = "1.25.0")]
pub fn column(&self) -> u32 { pub const fn column(&self) -> u32 {
self.col self.col
} }
} }

View file

@ -207,7 +207,7 @@ impl<'a, T: ?Sized> Pin<&'a T> {
/// with the same lifetime as the original `Pin`. /// with the same lifetime as the original `Pin`.
#[unstable(feature = "pin", issue = "49150")] #[unstable(feature = "pin", issue = "49150")]
#[inline(always)] #[inline(always)]
pub fn get_ref(this: Pin<&'a T>) -> &'a T { pub const fn get_ref(this: Pin<&'a T>) -> &'a T {
this.pointer this.pointer
} }
} }
@ -216,7 +216,7 @@ impl<'a, T: ?Sized> Pin<&'a mut T> {
/// Convert this `Pin<&mut T>` into a `Pin<&T>` with the same lifetime. /// Convert this `Pin<&mut T>` into a `Pin<&T>` with the same lifetime.
#[unstable(feature = "pin", issue = "49150")] #[unstable(feature = "pin", issue = "49150")]
#[inline(always)] #[inline(always)]
pub fn into_ref(this: Pin<&'a mut T>) -> Pin<&'a T> { pub const fn into_ref(this: Pin<&'a mut T>) -> Pin<&'a T> {
Pin { pointer: this.pointer } Pin { pointer: this.pointer }
} }

View file

@ -2759,7 +2759,7 @@ impl<T: ?Sized> Unique<T> {
} }
/// Acquires the underlying `*mut` pointer. /// Acquires the underlying `*mut` pointer.
pub fn as_ptr(self) -> *mut T { pub const fn as_ptr(self) -> *mut T {
self.pointer.0 as *mut T self.pointer.0 as *mut T
} }
@ -2905,7 +2905,7 @@ impl<T: ?Sized> NonNull<T> {
/// Acquires the underlying `*mut` pointer. /// Acquires the underlying `*mut` pointer.
#[stable(feature = "nonnull", since = "1.25.0")] #[stable(feature = "nonnull", since = "1.25.0")]
#[inline] #[inline]
pub fn as_ptr(self) -> *mut T { pub const fn as_ptr(self) -> *mut T {
self.pointer.0 as *mut T self.pointer.0 as *mut T
} }

View file

@ -29,19 +29,19 @@ const HI_USIZE: usize = HI_U64 as usize;
/// bytes where the borrow propagated all the way to the most significant /// bytes where the borrow propagated all the way to the most significant
/// bit." /// bit."
#[inline] #[inline]
fn contains_zero_byte(x: usize) -> bool { const fn contains_zero_byte(x: usize) -> bool {
x.wrapping_sub(LO_USIZE) & !x & HI_USIZE != 0 x.wrapping_sub(LO_USIZE) & !x & HI_USIZE != 0
} }
#[cfg(target_pointer_width = "16")] #[cfg(target_pointer_width = "16")]
#[inline] #[inline]
fn repeat_byte(b: u8) -> usize { const fn repeat_byte(b: u8) -> usize {
(b as usize) << 8 | b as usize (b as usize) << 8 | b as usize
} }
#[cfg(not(target_pointer_width = "16"))] #[cfg(not(target_pointer_width = "16"))]
#[inline] #[inline]
fn repeat_byte(b: u8) -> usize { const fn repeat_byte(b: u8) -> usize {
(b as usize) * (::usize::MAX / 255) (b as usize) * (::usize::MAX / 255)
} }

View file

@ -385,7 +385,6 @@ impl<T> [T] {
/// ``` /// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[inline] #[inline]
#[rustc_const_unstable(feature = "const_slice_as_ptr")]
pub const fn as_ptr(&self) -> *const T { pub const fn as_ptr(&self) -> *const T {
self as *const [T] as *const T self as *const [T] as *const T
} }
@ -2738,7 +2737,7 @@ impl<'a, T> IntoIterator for &'a mut [T] {
// Macro helper functions // Macro helper functions
#[inline(always)] #[inline(always)]
fn size_from_ptr<T>(_: *const T) -> usize { const fn size_from_ptr<T>(_: *const T) -> usize {
mem::size_of::<T>() mem::size_of::<T>()
} }
@ -4022,7 +4021,7 @@ impl<'a, T> ChunksExact<'a, T> {
/// returned by the iterator. The returned slice has at most `chunk_size-1` /// returned by the iterator. The returned slice has at most `chunk_size-1`
/// elements. /// elements.
#[stable(feature = "chunks_exact", since = "1.31.0")] #[stable(feature = "chunks_exact", since = "1.31.0")]
pub fn remainder(&self) -> &'a [T] { pub const fn remainder(&self) -> &'a [T] {
self.rem self.rem
} }
} }
@ -4518,7 +4517,7 @@ impl<'a, T> RChunksExact<'a, T> {
/// returned by the iterator. The returned slice has at most `chunk_size-1` /// returned by the iterator. The returned slice has at most `chunk_size-1`
/// elements. /// elements.
#[stable(feature = "rchunks", since = "1.31.0")] #[stable(feature = "rchunks", since = "1.31.0")]
pub fn remainder(&self) -> &'a [T] { pub const fn remainder(&self) -> &'a [T] {
self.rem self.rem
} }
} }

View file

@ -29,7 +29,7 @@ impl Utf8Lossy {
unsafe { mem::transmute(bytes) } unsafe { mem::transmute(bytes) }
} }
pub fn chunks(&self) -> Utf8LossyChunksIter { pub const fn chunks(&self) -> Utf8LossyChunksIter {
Utf8LossyChunksIter { source: &self.bytes } Utf8LossyChunksIter { source: &self.bytes }
} }
} }

View file

@ -231,7 +231,7 @@ impl Utf8Error {
/// assert_eq!(1, error.valid_up_to()); /// assert_eq!(1, error.valid_up_to());
/// ``` /// ```
#[stable(feature = "utf8_error", since = "1.5.0")] #[stable(feature = "utf8_error", since = "1.5.0")]
pub fn valid_up_to(&self) -> usize { self.valid_up_to } pub const fn valid_up_to(&self) -> usize { self.valid_up_to }
/// Provide more information about the failure: /// Provide more information about the failure:
/// ///
@ -476,16 +476,16 @@ pub struct Chars<'a> {
/// The first byte is special, only want bottom 5 bits for width 2, 4 bits /// The first byte is special, only want bottom 5 bits for width 2, 4 bits
/// for width 3, and 3 bits for width 4. /// for width 3, and 3 bits for width 4.
#[inline] #[inline]
fn utf8_first_byte(byte: u8, width: u32) -> u32 { (byte & (0x7F >> width)) as u32 } const fn utf8_first_byte(byte: u8, width: u32) -> u32 { (byte & (0x7F >> width)) as u32 }
/// Returns the value of `ch` updated with continuation byte `byte`. /// Returns the value of `ch` updated with continuation byte `byte`.
#[inline] #[inline]
fn utf8_acc_cont_byte(ch: u32, byte: u8) -> u32 { (ch << 6) | (byte & CONT_MASK) as u32 } const fn utf8_acc_cont_byte(ch: u32, byte: u8) -> u32 { (ch << 6) | (byte & CONT_MASK) as u32 }
/// Checks whether the byte is a UTF-8 continuation byte (i.e. starts with the /// Checks whether the byte is a UTF-8 continuation byte (i.e. starts with the
/// bits `10`). /// bits `10`).
#[inline] #[inline]
fn utf8_is_cont_byte(byte: u8) -> bool { (byte & !CONT_MASK) == TAG_CONT_U8 } const fn utf8_is_cont_byte(byte: u8) -> bool { (byte & !CONT_MASK) == TAG_CONT_U8 }
#[inline] #[inline]
fn unwrap_or_0(opt: Option<&u8>) -> u8 { fn unwrap_or_0(opt: Option<&u8>) -> u8 {
@ -1420,7 +1420,7 @@ const NONASCII_MASK: usize = 0x80808080_80808080u64 as usize;
/// Returns `true` if any byte in the word `x` is nonascii (>= 128). /// Returns `true` if any byte in the word `x` is nonascii (>= 128).
#[inline] #[inline]
fn contains_nonascii(x: usize) -> bool { const fn contains_nonascii(x: usize) -> bool {
(x & NONASCII_MASK) != 0 (x & NONASCII_MASK) != 0
} }
@ -2277,7 +2277,6 @@ impl str {
/// ``` /// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[inline] #[inline]
#[rustc_const_unstable(feature = "const_str_as_ptr")]
pub const fn as_ptr(&self) -> *const u8 { pub const fn as_ptr(&self) -> *const u8 {
self as *const str as *const u8 self as *const str as *const u8
} }

View file

@ -141,7 +141,7 @@ impl LocalWaker {
/// `Waker` is nearly identical to `LocalWaker`, but is threadsafe /// `Waker` is nearly identical to `LocalWaker`, but is threadsafe
/// (implements `Send` and `Sync`). /// (implements `Send` and `Sync`).
#[inline] #[inline]
pub fn as_waker(&self) -> &Waker { pub const fn as_waker(&self) -> &Waker {
&self.0 &self.0
} }

View file

@ -71,6 +71,6 @@ impl SmallBoolTrie {
} }
} }
fn trie_range_leaf(c: u32, bitmap_chunk: u64) -> bool { const fn trie_range_leaf(c: u32, bitmap_chunk: u64) -> bool {
((bitmap_chunk >> (c & 63)) & 1) != 0 ((bitmap_chunk >> (c & 63)) & 1) != 0
} }

View file

@ -2598,4 +2598,3 @@ pub mod conversions {
]; ];
} }

View file

@ -10,8 +10,6 @@
// compile-pass // compile-pass
#![feature(duration_getters)]
use std::time::Duration; use std::time::Duration;
fn main() { fn main() {

View file

@ -1,17 +0,0 @@
// Copyright 2018 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.
// This test should fail since identity is not stable as a const fn yet.
#![feature(convert_id)]
fn main() {
const _FOO: u8 = ::std::convert::identity(42u8);
}

View file

@ -1,10 +0,0 @@
error: `std::convert::identity` is not yet stable as a const fn
--> $DIR/convert-id-const-no-gate.rs:16:22
|
LL | const _FOO: u8 = ::std::convert::identity(42u8);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: in Nightly builds, add `#![feature(const_convert_id)]` to the crate attributes to enable
error: aborting due to previous error

View file

@ -8,12 +8,11 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
// This test should pass since we've opted into 'identity' as an // This test should pass since 'identity' is const fn.
// unstable const fn.
// compile-pass // compile-pass
#![feature(convert_id, const_convert_id)] #![feature(convert_id)]
fn main() { fn main() {
const _FOO: u8 = ::std::convert::identity(42u8); const _FOO: u8 = ::std::convert::identity(42u8);