forked from libre-chip/fayalite
add test that SimValue can't be interned, since its PartialEq may ignore types
This commit is contained in:
parent
07725ab489
commit
e0c9939147
2 changed files with 193 additions and 0 deletions
15
crates/fayalite/tests/ui/simvalue_is_not_internable.rs
Normal file
15
crates/fayalite/tests/ui/simvalue_is_not_internable.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
|
// See Notices.txt for copyright information
|
||||||
|
|
||||||
|
//! check that SimValue can't be interned, since equality may ignore types
|
||||||
|
|
||||||
|
use fayalite::{
|
||||||
|
intern::{Intern, Interned},
|
||||||
|
sim::value::SimValue,
|
||||||
|
};
|
||||||
|
|
||||||
|
fn f(v: SimValue<()>) -> Interned<SimValue<()>> {
|
||||||
|
Intern::intern_sized(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
178
crates/fayalite/tests/ui/simvalue_is_not_internable.stderr
Normal file
178
crates/fayalite/tests/ui/simvalue_is_not_internable.stderr
Normal file
|
@ -0,0 +1,178 @@
|
||||||
|
error[E0277]: `Cell<util::alternating_cell::State>` cannot be shared between threads safely
|
||||||
|
--> tests/ui/simvalue_is_not_internable.rs:11:26
|
||||||
|
|
|
||||||
|
11 | fn f(v: SimValue<()>) -> Interned<SimValue<()>> {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^ `Cell<util::alternating_cell::State>` cannot be shared between threads safely
|
||||||
|
|
|
||||||
|
= help: within `SimValue<()>`, the trait `Sync` is not implemented for `Cell<util::alternating_cell::State>`, which is required by `SimValue<()>: Sync`
|
||||||
|
= note: if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock`
|
||||||
|
note: required because it appears within the type `util::alternating_cell::AlternatingCell<value::SimValueInner<()>>`
|
||||||
|
--> src/util/alternating_cell.rs
|
||||||
|
|
|
||||||
|
| pub(crate) struct AlternatingCell<T: ?Sized> {
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
note: required because it appears within the type `SimValue<()>`
|
||||||
|
--> src/sim/value.rs
|
||||||
|
|
|
||||||
|
| pub struct SimValue<T: Type> {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: required by a bound in `fayalite::intern::Interned`
|
||||||
|
--> src/intern.rs
|
||||||
|
|
|
||||||
|
| pub struct Interned<T: ?Sized + 'static + Send + Sync> {
|
||||||
|
| ^^^^ required by this bound in `Interned`
|
||||||
|
|
||||||
|
error[E0277]: `UnsafeCell<value::SimValueInner<()>>` cannot be shared between threads safely
|
||||||
|
--> tests/ui/simvalue_is_not_internable.rs:11:26
|
||||||
|
|
|
||||||
|
11 | fn f(v: SimValue<()>) -> Interned<SimValue<()>> {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^ `UnsafeCell<value::SimValueInner<()>>` cannot be shared between threads safely
|
||||||
|
|
|
||||||
|
= help: within `SimValue<()>`, the trait `Sync` is not implemented for `UnsafeCell<value::SimValueInner<()>>`, which is required by `SimValue<()>: Sync`
|
||||||
|
note: required because it appears within the type `util::alternating_cell::AlternatingCell<value::SimValueInner<()>>`
|
||||||
|
--> src/util/alternating_cell.rs
|
||||||
|
|
|
||||||
|
| pub(crate) struct AlternatingCell<T: ?Sized> {
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
note: required because it appears within the type `SimValue<()>`
|
||||||
|
--> src/sim/value.rs
|
||||||
|
|
|
||||||
|
| pub struct SimValue<T: Type> {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: required by a bound in `fayalite::intern::Interned`
|
||||||
|
--> src/intern.rs
|
||||||
|
|
|
||||||
|
| pub struct Interned<T: ?Sized + 'static + Send + Sync> {
|
||||||
|
| ^^^^ required by this bound in `Interned`
|
||||||
|
|
||||||
|
error[E0277]: the trait bound `SimValue<()>: Intern` is not satisfied
|
||||||
|
--> tests/ui/simvalue_is_not_internable.rs:12:26
|
||||||
|
|
|
||||||
|
12 | Intern::intern_sized(v)
|
||||||
|
| -------------------- ^ the trait `Hash` is not implemented for `SimValue<()>`, which is required by `SimValue<()>: Intern`
|
||||||
|
| |
|
||||||
|
| required by a bound introduced by this call
|
||||||
|
|
|
||||||
|
= help: the following other types implement trait `Intern`:
|
||||||
|
BitSlice
|
||||||
|
[T]
|
||||||
|
str
|
||||||
|
= note: required for `SimValue<()>` to implement `Intern`
|
||||||
|
|
||||||
|
error[E0277]: the trait bound `SimValue<()>: Intern` is not satisfied
|
||||||
|
--> tests/ui/simvalue_is_not_internable.rs:12:26
|
||||||
|
|
|
||||||
|
12 | Intern::intern_sized(v)
|
||||||
|
| -------------------- ^ the trait `std::cmp::Eq` is not implemented for `SimValue<()>`, which is required by `SimValue<()>: Intern`
|
||||||
|
| |
|
||||||
|
| required by a bound introduced by this call
|
||||||
|
|
|
||||||
|
= help: the following other types implement trait `Intern`:
|
||||||
|
BitSlice
|
||||||
|
[T]
|
||||||
|
str
|
||||||
|
= note: required for `SimValue<()>` to implement `Intern`
|
||||||
|
|
||||||
|
error[E0277]: `Cell<util::alternating_cell::State>` cannot be shared between threads safely
|
||||||
|
--> tests/ui/simvalue_is_not_internable.rs:12:26
|
||||||
|
|
|
||||||
|
12 | Intern::intern_sized(v)
|
||||||
|
| -------------------- ^ `Cell<util::alternating_cell::State>` cannot be shared between threads safely
|
||||||
|
| |
|
||||||
|
| required by a bound introduced by this call
|
||||||
|
|
|
||||||
|
= help: within `SimValue<()>`, the trait `Sync` is not implemented for `Cell<util::alternating_cell::State>`, which is required by `SimValue<()>: Sync`
|
||||||
|
= note: if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock`
|
||||||
|
note: required because it appears within the type `util::alternating_cell::AlternatingCell<value::SimValueInner<()>>`
|
||||||
|
--> src/util/alternating_cell.rs
|
||||||
|
|
|
||||||
|
| pub(crate) struct AlternatingCell<T: ?Sized> {
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
note: required because it appears within the type `SimValue<()>`
|
||||||
|
--> src/sim/value.rs
|
||||||
|
|
|
||||||
|
| pub struct SimValue<T: Type> {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: required by a bound in `intern_sized`
|
||||||
|
--> src/intern.rs
|
||||||
|
|
|
||||||
|
| pub trait Intern: Any + Send + Sync {
|
||||||
|
| ^^^^ required by this bound in `Intern::intern_sized`
|
||||||
|
| fn intern(&self) -> Interned<Self>;
|
||||||
|
| fn intern_sized(self) -> Interned<Self>
|
||||||
|
| ------------ required by a bound in this associated function
|
||||||
|
|
||||||
|
error[E0277]: `UnsafeCell<value::SimValueInner<()>>` cannot be shared between threads safely
|
||||||
|
--> tests/ui/simvalue_is_not_internable.rs:12:26
|
||||||
|
|
|
||||||
|
12 | Intern::intern_sized(v)
|
||||||
|
| -------------------- ^ `UnsafeCell<value::SimValueInner<()>>` cannot be shared between threads safely
|
||||||
|
| |
|
||||||
|
| required by a bound introduced by this call
|
||||||
|
|
|
||||||
|
= help: within `SimValue<()>`, the trait `Sync` is not implemented for `UnsafeCell<value::SimValueInner<()>>`, which is required by `SimValue<()>: Sync`
|
||||||
|
note: required because it appears within the type `util::alternating_cell::AlternatingCell<value::SimValueInner<()>>`
|
||||||
|
--> src/util/alternating_cell.rs
|
||||||
|
|
|
||||||
|
| pub(crate) struct AlternatingCell<T: ?Sized> {
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
note: required because it appears within the type `SimValue<()>`
|
||||||
|
--> src/sim/value.rs
|
||||||
|
|
|
||||||
|
| pub struct SimValue<T: Type> {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: required by a bound in `intern_sized`
|
||||||
|
--> src/intern.rs
|
||||||
|
|
|
||||||
|
| pub trait Intern: Any + Send + Sync {
|
||||||
|
| ^^^^ required by this bound in `Intern::intern_sized`
|
||||||
|
| fn intern(&self) -> Interned<Self>;
|
||||||
|
| fn intern_sized(self) -> Interned<Self>
|
||||||
|
| ------------ required by a bound in this associated function
|
||||||
|
|
||||||
|
error[E0277]: `Cell<util::alternating_cell::State>` cannot be shared between threads safely
|
||||||
|
--> tests/ui/simvalue_is_not_internable.rs:12:5
|
||||||
|
|
|
||||||
|
12 | Intern::intern_sized(v)
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^ `Cell<util::alternating_cell::State>` cannot be shared between threads safely
|
||||||
|
|
|
||||||
|
= help: within `SimValue<()>`, the trait `Sync` is not implemented for `Cell<util::alternating_cell::State>`, which is required by `SimValue<()>: Sync`
|
||||||
|
= note: if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock`
|
||||||
|
note: required because it appears within the type `util::alternating_cell::AlternatingCell<value::SimValueInner<()>>`
|
||||||
|
--> src/util/alternating_cell.rs
|
||||||
|
|
|
||||||
|
| pub(crate) struct AlternatingCell<T: ?Sized> {
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
note: required because it appears within the type `SimValue<()>`
|
||||||
|
--> src/sim/value.rs
|
||||||
|
|
|
||||||
|
| pub struct SimValue<T: Type> {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: required by a bound in `fayalite::intern::Interned`
|
||||||
|
--> src/intern.rs
|
||||||
|
|
|
||||||
|
| pub struct Interned<T: ?Sized + 'static + Send + Sync> {
|
||||||
|
| ^^^^ required by this bound in `Interned`
|
||||||
|
|
||||||
|
error[E0277]: `UnsafeCell<value::SimValueInner<()>>` cannot be shared between threads safely
|
||||||
|
--> tests/ui/simvalue_is_not_internable.rs:12:5
|
||||||
|
|
|
||||||
|
12 | Intern::intern_sized(v)
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^ `UnsafeCell<value::SimValueInner<()>>` cannot be shared between threads safely
|
||||||
|
|
|
||||||
|
= help: within `SimValue<()>`, the trait `Sync` is not implemented for `UnsafeCell<value::SimValueInner<()>>`, which is required by `SimValue<()>: Sync`
|
||||||
|
note: required because it appears within the type `util::alternating_cell::AlternatingCell<value::SimValueInner<()>>`
|
||||||
|
--> src/util/alternating_cell.rs
|
||||||
|
|
|
||||||
|
| pub(crate) struct AlternatingCell<T: ?Sized> {
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
note: required because it appears within the type `SimValue<()>`
|
||||||
|
--> src/sim/value.rs
|
||||||
|
|
|
||||||
|
| pub struct SimValue<T: Type> {
|
||||||
|
| ^^^^^^^^
|
||||||
|
note: required by a bound in `fayalite::intern::Interned`
|
||||||
|
--> src/intern.rs
|
||||||
|
|
|
||||||
|
| pub struct Interned<T: ?Sized + 'static + Send + Sync> {
|
||||||
|
| ^^^^ required by this bound in `Interned`
|
Loading…
Add table
Add a link
Reference in a new issue