Forbid the upper indices of IndexVec indices to allow for niche optimizations
This commit is contained in:
@@ -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)]
|
||||||
|
|||||||
@@ -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 });
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)]
|
||||||
|
|||||||
20
src/test/run-pass-fulldeps/newtype_index.rs
Normal file
20
src/test/run-pass-fulldeps/newtype_index.rs
Normal 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);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user