about summary refs log tree commit diff
diff options
context:
space:
mode:
authorkennytm <kennytm@gmail.com>2018-10-12 22:04:15 +0800
committerGitHub <noreply@github.com>2018-10-12 22:04:15 +0800
commit0187e81da97df00610ab8138bae682678efe9c1b (patch)
tree7a96268cd9c69b77c55cf1b59f67d79a340bd611
parent8e3f18918091bbd5f45c7a0bc86702532a25dde0 (diff)
parenta332387b87f850fd3ac8474ff3fc9c83fd70167b (diff)
downloadrust-0187e81da97df00610ab8138bae682678efe9c1b.tar.gz
rust-0187e81da97df00610ab8138bae682678efe9c1b.zip
Rollup merge of #54958 - RalfJung:static-assert, r=oli-obk
add a macro for static (compile-time) assertions

Cc @oli-obk
-rw-r--r--src/librustc/macros.rs10
-rw-r--r--src/librustc/middle/region.rs3
-rw-r--r--src/librustc/ty/context.rs7
3 files changed, 13 insertions, 7 deletions
diff --git a/src/librustc/macros.rs b/src/librustc/macros.rs
index 759ac1a7952..897e9cc2a38 100644
--- a/src/librustc/macros.rs
+++ b/src/librustc/macros.rs
@@ -63,6 +63,16 @@ macro_rules! span_bug {
 }
 
 #[macro_export]
+macro_rules! static_assert {
+    ($name:ident: $test:expr) => {
+        // Use the bool to access an array such that if the bool is false, the access
+        // is out-of-bounds.
+        #[allow(dead_code)]
+        static $name: () = [()][!$test as usize];
+    }
+}
+
+#[macro_export]
 macro_rules! __impl_stable_hash_field {
     ($field:ident, $ctx:expr, $hasher:expr) => ($field.hash_stable($ctx, $hasher));
     ($field:ident, $ctx:expr, $hasher:expr, _) => ({ let _ = $field; });
diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs
index edb571da7db..a90f03f536a 100644
--- a/src/librustc/middle/region.rs
+++ b/src/librustc/middle/region.rs
@@ -167,8 +167,7 @@ newtype_index! {
 impl_stable_hash_for!(struct ::middle::region::FirstStatementIndex { private });
 
 // compilation error if size of `ScopeData` is not the same as a `u32`
-#[allow(dead_code)]
-static ASSERT: () = [()][!(mem::size_of::<ScopeData>() == 4) as usize];
+static_assert!(ASSERT_SCOPE_DATA: mem::size_of::<ScopeData>() == 4);
 
 impl Scope {
     /// Returns a item-local id associated with this scope.
diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs
index 3d4ae572d0b..ab1df2d4c3b 100644
--- a/src/librustc/ty/context.rs
+++ b/src/librustc/ty/context.rs
@@ -829,12 +829,9 @@ impl<'tcx> CommonTypes<'tcx> {
     fn new(interners: &CtxtInterners<'tcx>) -> CommonTypes<'tcx> {
         // Ensure our type representation does not grow
         #[cfg(target_pointer_width = "64")]
-        #[allow(dead_code)]
-        static ASSERT_TY_KIND: () =
-            [()][!(::std::mem::size_of::<ty::TyKind<'_>>() <= 24) as usize];
+        static_assert!(ASSERT_TY_KIND: ::std::mem::size_of::<ty::TyKind<'_>>() <= 24);
         #[cfg(target_pointer_width = "64")]
-        #[allow(dead_code)]
-        static ASSERT_TYS: () = [()][!(::std::mem::size_of::<ty::TyS<'_>>() <= 32) as usize];
+        static_assert!(ASSERT_TYS: ::std::mem::size_of::<ty::TyS<'_>>() <= 32);
 
         let mk = |sty| CtxtInterners::intern_ty(interners, interners, sty);
         let mk_region = |r| {