summary refs log blame commit diff
path: root/assertions/src/mechanism.rs
blob: e14b91a866c2c36f6c455d5a8de83a232c514ed4 (plain) (tree)

































                                                                                                                                     
// 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>,
}