Rollup merge of #60959 - petrochenkov:sassert, r=estebank

rustc: Improve type size assertions

Now they
- Tell what the new size is, when it changes
- Do not require passing an identifier

```
   ::: src\libsyntax\parse\token.rs:223:1
    |
223 |    static_assert_size!(Token, 123);
    |    -------------------------------- in this macro invocation
    |
    = note: expected type `[(); 123]`
               found type `[(); 16]`
```
This commit is contained in:
Mazdak Farrokhzad 2019-05-20 23:03:07 +02:00 committed by GitHub
commit 581cf70367
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 31 additions and 23 deletions

View File

@ -1356,7 +1356,7 @@ pub struct Expr {
// `Expr` is used a lot. Make sure it doesn't unintentionally get bigger. // `Expr` is used a lot. Make sure it doesn't unintentionally get bigger.
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
static_assert!(MEM_SIZE_OF_EXPR: std::mem::size_of::<Expr>() == 72); static_assert_size!(Expr, 72);
impl Expr { impl Expr {
pub fn precedence(&self) -> ExprPrecedence { pub fn precedence(&self) -> ExprPrecedence {

View File

@ -158,7 +158,7 @@ newtype_index! {
impl_stable_hash_for!(struct crate::middle::region::FirstStatementIndex { private }); impl_stable_hash_for!(struct crate::middle::region::FirstStatementIndex { private });
// compilation error if size of `ScopeData` is not the same as a `u32` // compilation error if size of `ScopeData` is not the same as a `u32`
static_assert!(ASSERT_SCOPE_DATA: mem::size_of::<ScopeData>() == 4); static_assert_size!(ScopeData, 4);
impl Scope { impl Scope {
/// Returns a item-local ID associated with this scope. /// Returns a item-local ID associated with this scope.

View File

@ -78,7 +78,7 @@ pub struct Pointer<Tag=(),Id=AllocId> {
pub tag: Tag, pub tag: Tag,
} }
static_assert!(POINTER_SIZE: ::std::mem::size_of::<Pointer>() == 16); static_assert_size!(Pointer, 16);
/// Produces a `Pointer` which points to the beginning of the Allocation /// Produces a `Pointer` which points to the beginning of the Allocation
impl From<AllocId> for Pointer { impl From<AllocId> for Pointer {

View File

@ -54,7 +54,7 @@ pub enum ConstValue<'tcx> {
} }
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
static_assert!(CONST_SIZE: ::std::mem::size_of::<ConstValue<'static>>() == 40); static_assert_size!(ConstValue<'_>, 40);
impl<'tcx> ConstValue<'tcx> { impl<'tcx> ConstValue<'tcx> {
#[inline] #[inline]
@ -111,7 +111,7 @@ pub enum Scalar<Tag=(), Id=AllocId> {
} }
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
static_assert!(SCALAR_SIZE: ::std::mem::size_of::<Scalar>() == 24); static_assert_size!(Scalar, 24);
impl<Tag> fmt::Display for Scalar<Tag> { impl<Tag> fmt::Display for Scalar<Tag> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {

View File

@ -1738,7 +1738,7 @@ pub struct Statement<'tcx> {
// `Statement` is used a lot. Make sure it doesn't unintentionally get bigger. // `Statement` is used a lot. Make sure it doesn't unintentionally get bigger.
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
static_assert!(MEM_SIZE_OF_STATEMENT: mem::size_of::<Statement<'_>>() == 56); static_assert_size!(Statement<'_>, 56);
impl<'tcx> Statement<'tcx> { impl<'tcx> Statement<'tcx> {
/// Changes a statement to a nop. This is both faster than deleting instructions and avoids /// Changes a statement to a nop. This is both faster than deleting instructions and avoids
@ -1997,10 +1997,9 @@ pub type PlaceProjection<'tcx> = Projection<Place<'tcx>, Local, Ty<'tcx>>;
/// and the index is a local. /// and the index is a local.
pub type PlaceElem<'tcx> = ProjectionElem<Local, Ty<'tcx>>; pub type PlaceElem<'tcx> = ProjectionElem<Local, Ty<'tcx>>;
// at least on 64 bit systems, `PlaceElem` should not be larger than two pointers // At least on 64 bit systems, `PlaceElem` should not be larger than two pointers.
static_assert!(PROJECTION_ELEM_IS_2_PTRS_LARGE: #[cfg(target_arch = "x86_64")]
mem::size_of::<PlaceElem<'_>>() <= 16 static_assert_size!(PlaceElem<'_>, 16);
);
/// Alias for projections as they appear in `UserTypeProjection`, where we /// Alias for projections as they appear in `UserTypeProjection`, where we
/// need neither the `V` parameter for `Index` nor the `T` for `Field`. /// need neither the `V` parameter for `Index` nor the `T` for `Field`.

View File

@ -17,9 +17,9 @@ pub struct PlaceTy<'tcx> {
pub variant_index: Option<VariantIdx>, pub variant_index: Option<VariantIdx>,
} }
static_assert!(PLACE_TY_IS_3_PTRS_LARGE: // At least on 64 bit systems, `PlaceTy` should not be larger than two or three pointers.
mem::size_of::<PlaceTy<'_>>() <= 24 #[cfg(target_arch = "x86_64")]
); static_assert_size!(PlaceTy<'_>, 16);
impl<'a, 'gcx, 'tcx> PlaceTy<'tcx> { impl<'a, 'gcx, 'tcx> PlaceTy<'tcx> {
pub fn from_ty(ty: Ty<'tcx>) -> PlaceTy<'tcx> { pub fn from_ty(ty: Ty<'tcx>) -> PlaceTy<'tcx> {

View File

@ -510,7 +510,7 @@ pub struct TyS<'tcx> {
// `TyS` is used a lot. Make sure it doesn't unintentionally get bigger. // `TyS` is used a lot. Make sure it doesn't unintentionally get bigger.
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
static_assert!(MEM_SIZE_OF_TY_S: ::std::mem::size_of::<TyS<'_>>() == 32); static_assert_size!(TyS<'_>, 32);
impl<'tcx> Ord for TyS<'tcx> { impl<'tcx> Ord for TyS<'tcx> {
fn cmp(&self, other: &TyS<'tcx>) -> Ordering { fn cmp(&self, other: &TyS<'tcx>) -> Ordering {

View File

@ -211,7 +211,7 @@ pub enum TyKind<'tcx> {
// `TyKind` is used a lot. Make sure it doesn't unintentionally get bigger. // `TyKind` is used a lot. Make sure it doesn't unintentionally get bigger.
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
static_assert!(MEM_SIZE_OF_TY_KIND: ::std::mem::size_of::<TyKind<'_>>() == 24); static_assert_size!(TyKind<'_>, 24);
/// A closure can be modeled as a struct that looks like: /// A closure can be modeled as a struct that looks like:
/// ///
@ -2207,7 +2207,7 @@ pub struct Const<'tcx> {
} }
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
static_assert!(CONST_SIZE: ::std::mem::size_of::<Const<'static>>() == 48); static_assert_size!(Const<'_>, 48);
impl<'tcx> Const<'tcx> { impl<'tcx> Const<'tcx> {
#[inline] #[inline]

View File

@ -10,3 +10,12 @@ macro_rules! static_assert {
static $name: () = [()][!($test: bool) as usize]; static $name: () = [()][!($test: bool) as usize];
} }
} }
/// Type size assertion. The first argument is a type and the second argument is its expected size.
#[macro_export]
#[allow_internal_unstable(underscore_const_names)]
macro_rules! static_assert_size {
($ty:ty, $size:expr) => {
const _: [(); $size] = [(); ::std::mem::size_of::<$ty>()];
}
}

View File

@ -16,7 +16,7 @@ use crate::ThinVec;
use rustc_data_structures::indexed_vec::Idx; use rustc_data_structures::indexed_vec::Idx;
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
use rustc_data_structures::static_assert; use rustc_data_structures::static_assert_size;
use rustc_target::spec::abi::Abi; use rustc_target::spec::abi::Abi;
use syntax_pos::{Span, DUMMY_SP}; use syntax_pos::{Span, DUMMY_SP};
@ -964,7 +964,7 @@ pub struct Expr {
// `Expr` is used a lot. Make sure it doesn't unintentionally get bigger. // `Expr` is used a lot. Make sure it doesn't unintentionally get bigger.
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
static_assert!(MEM_SIZE_OF_EXPR: std::mem::size_of::<Expr>() == 96); static_assert_size!(Expr, 96);
impl Expr { impl Expr {
/// Whether this expression would be valid somewhere that expects a value; for example, an `if` /// Whether this expression would be valid somewhere that expects a value; for example, an `if`

View File

@ -19,7 +19,7 @@ use log::info;
use std::fmt; use std::fmt;
use std::mem; use std::mem;
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
use rustc_data_structures::static_assert; use rustc_data_structures::static_assert_size;
use rustc_data_structures::sync::Lrc; use rustc_data_structures::sync::Lrc;
#[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Hash, Debug, Copy)] #[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Hash, Debug, Copy)]
@ -74,7 +74,7 @@ pub enum Lit {
} }
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
static_assert!(MEM_SIZE_OF_LIT: mem::size_of::<Lit>() == 8); static_assert_size!(Lit, 8);
impl Lit { impl Lit {
crate fn literal_name(&self) -> &'static str { crate fn literal_name(&self) -> &'static str {
@ -220,7 +220,7 @@ pub enum Token {
// `Token` is used a lot. Make sure it doesn't unintentionally get bigger. // `Token` is used a lot. Make sure it doesn't unintentionally get bigger.
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
static_assert!(MEM_SIZE_OF_STATEMENT: mem::size_of::<Token>() == 16); static_assert_size!(Token, 16);
impl Token { impl Token {
/// Recovers a `Token` from an `ast::Ident`. This creates a raw identifier if necessary. /// Recovers a `Token` from an `ast::Ident`. This creates a raw identifier if necessary.

View File

@ -21,7 +21,7 @@ use crate::print::pprust;
use syntax_pos::{BytePos, Mark, Span, DUMMY_SP}; use syntax_pos::{BytePos, Mark, Span, DUMMY_SP};
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
use rustc_data_structures::static_assert; use rustc_data_structures::static_assert_size;
use rustc_data_structures::sync::Lrc; use rustc_data_structures::sync::Lrc;
use serialize::{Decoder, Decodable, Encoder, Encodable}; use serialize::{Decoder, Decodable, Encoder, Encodable};
use smallvec::{SmallVec, smallvec}; use smallvec::{SmallVec, smallvec};
@ -158,7 +158,7 @@ pub type TreeAndJoint = (TokenTree, IsJoint);
// `TokenStream` is used a lot. Make sure it doesn't unintentionally get bigger. // `TokenStream` is used a lot. Make sure it doesn't unintentionally get bigger.
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
static_assert!(MEM_SIZE_OF_TOKEN_STREAM: mem::size_of::<TokenStream>() == 8); static_assert_size!(TokenStream, 8);
#[derive(Clone, Copy, Debug, PartialEq)] #[derive(Clone, Copy, Debug, PartialEq)]
pub enum IsJoint { pub enum IsJoint {