Forbid the upper indices of IndexVec indices to allow for niche optimizations

This commit is contained in:
Oliver Schneider
2018-09-07 15:28:23 +02:00
parent d272e2f6e2
commit 06a041cbd3
5 changed files with 29 additions and 6 deletions

View File

@@ -59,6 +59,8 @@
#![feature(optin_builtin_traits)] #![feature(optin_builtin_traits)]
#![feature(refcell_replace_swap)] #![feature(refcell_replace_swap)]
#![feature(rustc_diagnostic_macros)] #![feature(rustc_diagnostic_macros)]
#![feature(rustc_attrs)]
#![cfg_attr(stage0, feature(attr_literals))]
#![feature(slice_patterns)] #![feature(slice_patterns)]
#![feature(slice_sort_by_cached_key)] #![feature(slice_sort_by_cached_key)]
#![feature(specialization)] #![feature(specialization)]

View File

@@ -114,7 +114,7 @@ const SCOPE_DATA_NODE: u32 = !0;
const SCOPE_DATA_CALLSITE: u32 = !1; const SCOPE_DATA_CALLSITE: u32 = !1;
const SCOPE_DATA_ARGUMENTS: u32 = !2; const SCOPE_DATA_ARGUMENTS: u32 = !2;
const SCOPE_DATA_DESTRUCTION: u32 = !3; const SCOPE_DATA_DESTRUCTION: u32 = !3;
const SCOPE_DATA_REMAINDER_MAX: u32 = !4; // be sure to add the MAX of FirstStatementIndex if you add more constants here
#[derive(Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Debug, Copy, RustcEncodable, RustcDecodable)] #[derive(Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Debug, Copy, RustcEncodable, RustcDecodable)]
pub enum ScopeData { pub enum ScopeData {
@@ -160,9 +160,7 @@ pub struct BlockRemainder {
} }
newtype_index! { newtype_index! {
pub struct FirstStatementIndex { pub struct FirstStatementIndex;
MAX = SCOPE_DATA_REMAINDER_MAX
}
} }
impl_stable_hash_for!(struct ::middle::region::FirstStatementIndex { private }); impl_stable_hash_for!(struct ::middle::region::FirstStatementIndex { private });

View File

@@ -72,7 +72,7 @@ macro_rules! newtype_index {
newtype_index!( newtype_index!(
// Leave out derives marker so we can use its absence to ensure it comes first // Leave out derives marker so we can use its absence to ensure it comes first
@type [$name] @type [$name]
@max [::std::u32::MAX - 1] @max [0xFFFF_FFFE]
@vis [$v] @vis [$v]
@debug_format ["{}"]); @debug_format ["{}"]);
); );
@@ -82,7 +82,7 @@ macro_rules! newtype_index {
newtype_index!( newtype_index!(
// Leave out derives marker so we can use its absence to ensure it comes first // Leave out derives marker so we can use its absence to ensure it comes first
@type [$name] @type [$name]
@max [::std::u32::MAX - 1] @max [0xFFFF_FFFE]
@vis [$v] @vis [$v]
@debug_format ["{}"] @debug_format ["{}"]
$($tokens)+); $($tokens)+);
@@ -97,6 +97,7 @@ macro_rules! newtype_index {
@vis [$v:vis] @vis [$v:vis]
@debug_format [$debug_format:tt]) => ( @debug_format [$debug_format:tt]) => (
#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, $($derives),*)] #[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, $($derives),*)]
#[rustc_layout_scalar_range_end($max)]
$v struct $type { $v struct $type {
private: u32 private: u32
} }

View File

@@ -30,6 +30,8 @@ Rust MIR: a lowered representation of Rust. Also: an experiment!
#![feature(exhaustive_patterns)] #![feature(exhaustive_patterns)]
#![feature(range_contains)] #![feature(range_contains)]
#![feature(rustc_diagnostic_macros)] #![feature(rustc_diagnostic_macros)]
#![feature(rustc_attrs)]
#![cfg_attr(stage0, feature(attr_literals))]
#![feature(never_type)] #![feature(never_type)]
#![feature(specialization)] #![feature(specialization)]
#![feature(try_trait)] #![feature(try_trait)]

View File

@@ -0,0 +1,20 @@
#![feature(rustc_attrs, step_trait, rustc_private)]
#[macro_use] extern crate rustc_data_structures;
extern crate rustc_serialize;
use rustc_data_structures::indexed_vec::Idx;
newtype_index!(struct MyIdx { MAX = 0xFFFF_FFFA });
use std::mem::size_of;
fn main() {
assert_eq!(size_of::<MyIdx>(), 4);
assert_eq!(size_of::<Option<MyIdx>>(), 4);
assert_eq!(size_of::<Option<Option<MyIdx>>>(), 4);
assert_eq!(size_of::<Option<Option<Option<MyIdx>>>>(), 4);
assert_eq!(size_of::<Option<Option<Option<Option<MyIdx>>>>>(), 4);
assert_eq!(size_of::<Option<Option<Option<Option<Option<MyIdx>>>>>>(), 4);
assert_eq!(size_of::<Option<Option<Option<Option<Option<Option<MyIdx>>>>>>>(), 8);
}