35 lines
963 B
Rust
35 lines
963 B
Rust
// Copyright 2018 The Chromium OS Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
use std::marker::PhantomData;
|
|
|
|
pub struct True;
|
|
pub struct False;
|
|
|
|
pub trait Expr {
|
|
type Value;
|
|
}
|
|
|
|
impl Expr for [(); 0] {
|
|
type Value = False;
|
|
}
|
|
|
|
impl Expr for [(); 1] {
|
|
type Value = True;
|
|
}
|
|
|
|
// If the macro instantiates this with `T = [(); 1]` then it compiles successfully.
|
|
//
|
|
// On the other hand if `T = [(); 0]` the user receives an error like the following:
|
|
//
|
|
// error[E0271]: type mismatch resolving `<[(); 0] as assertions::Expr>::Value == assertions::True`
|
|
// --> src/main.rs:5:5
|
|
// |
|
|
// 5 | const_assert!(std::mem::size_of::<String>() == 8);
|
|
// | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `assertions::True`, found struct `assertions::False`
|
|
//
|
|
pub struct Assert<T: Expr<Value = True>> {
|
|
marker: PhantomData<T>,
|
|
}
|