diff options
| author | bors <bors@rust-lang.org> | 2018-12-06 10:18:17 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-12-06 10:18:17 +0000 |
| commit | 128a1fa4e1f85e04f522653bb9bee83ed6523440 (patch) | |
| tree | cf1bb66e041bed563653ac45ea58bfa863d7518a /src/librustc_data_structures | |
| parent | 77a6a61f066af3dd693d8527a8a1bf5a446d295c (diff) | |
| parent | cb71752f911c47426e208a9f5f1862d4c0e56aa4 (diff) | |
| download | rust-128a1fa4e1f85e04f522653bb9bee83ed6523440.tar.gz rust-128a1fa4e1f85e04f522653bb9bee83ed6523440.zip | |
Auto merge of #55635 - oli-obk:min_const_unsafe_fn, r=nikomatsakis
Allow calling `const unsafe fn` in `const fn` behind a feature gate cc #55607 r? @Centril
Diffstat (limited to 'src/librustc_data_structures')
| -rw-r--r-- | src/librustc_data_structures/indexed_vec.rs | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/src/librustc_data_structures/indexed_vec.rs b/src/librustc_data_structures/indexed_vec.rs index a59bf9d530c..6522dbe1179 100644 --- a/src/librustc_data_structures/indexed_vec.rs +++ b/src/librustc_data_structures/indexed_vec.rs @@ -98,12 +98,18 @@ macro_rules! newtype_index { @max [$max:expr] @vis [$v:vis] @debug_format [$debug_format:tt]) => ( - #[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, $($derives),*)] + #[derive(Copy, PartialEq, Eq, Hash, PartialOrd, Ord, $($derives),*)] #[rustc_layout_scalar_valid_range_end($max)] $v struct $type { private: u32 } + impl Clone for $type { + fn clone(&self) -> Self { + *self + } + } + impl $type { $v const MAX_AS_U32: u32 = $max; @@ -145,7 +151,7 @@ macro_rules! newtype_index { #[inline] $v const unsafe fn from_u32_unchecked(value: u32) -> Self { - $type { private: value } + unsafe { $type { private: value } } } /// Extract value of this index as an integer. @@ -328,12 +334,13 @@ macro_rules! newtype_index { derive [$($derives:ident,)+] $($tokens:tt)*) => ( newtype_index!( - @derives [$($derives,)+ RustcDecodable, RustcEncodable,] + @derives [$($derives,)+ RustcEncodable,] @type [$type] @max [$max] @vis [$v] @debug_format [$debug_format] $($tokens)*); + newtype_index!(@decodable $type); ); // The case where no derives are added, but encodable is overridden. Don't @@ -360,12 +367,29 @@ macro_rules! newtype_index { @debug_format [$debug_format:tt] $($tokens:tt)*) => ( newtype_index!( - @derives [RustcDecodable, RustcEncodable,] + @derives [RustcEncodable,] @type [$type] @max [$max] @vis [$v] @debug_format [$debug_format] $($tokens)*); + newtype_index!(@decodable $type); + ); + + (@decodable $type:ident) => ( + impl $type { + fn __decodable__impl__hack() { + mod __more_hacks_because__self_doesnt_work_in_functions { + extern crate serialize; + use self::serialize::{Decodable, Decoder}; + impl Decodable for super::$type { + fn decode<D: Decoder>(d: &mut D) -> Result<Self, D::Error> { + d.read_u32().map(Self::from) + } + } + } + } + } ); // Rewrite final without comma to one that includes comma |
