Even more tests

This commit is contained in:
Michael Goulet 2023-04-21 18:04:39 +00:00
parent 9d44f9b4e2
commit 2e346b6f3f
10 changed files with 280 additions and 0 deletions

@ -0,0 +1,35 @@
error[E0277]: the trait bound `T: Copy` is not satisfied
--> $DIR/explicit-drop-bounds.rs:27:18
|
LL | impl<T> Drop for DropMe<T>
| ^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
note: required by a bound in `DropMe`
--> $DIR/explicit-drop-bounds.rs:7:18
|
LL | struct DropMe<T: Copy>(T);
| ^^^^ required by this bound in `DropMe`
help: consider further restricting type parameter `T`
|
LL | [T; 1]: Copy, T: std::marker::Copy // But `[T; 1]: Copy` does not imply `T: Copy`
| ~~~~~~~~~~~~~~~~~~~~~~
error[E0277]: the trait bound `T: Copy` is not satisfied
--> $DIR/explicit-drop-bounds.rs:32:13
|
LL | fn drop(&mut self) {}
| ^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
note: required by a bound in `DropMe`
--> $DIR/explicit-drop-bounds.rs:7:18
|
LL | struct DropMe<T: Copy>(T);
| ^^^^ required by this bound in `DropMe`
help: consider further restricting type parameter `T`
|
LL | [T; 1]: Copy, T: std::marker::Copy // But `[T; 1]: Copy` does not imply `T: Copy`
| ~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0277`.

@ -0,0 +1,35 @@
error[E0277]: the trait bound `T: Copy` is not satisfied
--> $DIR/explicit-drop-bounds.rs:37:18
|
LL | impl<T> Drop for DropMe<T>
| ^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
note: required by a bound in `DropMe`
--> $DIR/explicit-drop-bounds.rs:7:18
|
LL | struct DropMe<T: Copy>(T);
| ^^^^ required by this bound in `DropMe`
help: consider restricting type parameter `T`
|
LL | impl<T: std::marker::Copy> Drop for DropMe<T>
| +++++++++++++++++++
error[E0277]: the trait bound `T: Copy` is not satisfied
--> $DIR/explicit-drop-bounds.rs:40:13
|
LL | fn drop(&mut self) {}
| ^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
note: required by a bound in `DropMe`
--> $DIR/explicit-drop-bounds.rs:7:18
|
LL | struct DropMe<T: Copy>(T);
| ^^^^ required by this bound in `DropMe`
help: consider restricting type parameter `T`
|
LL | impl<T: std::marker::Copy> Drop for DropMe<T>
| +++++++++++++++++++
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0277`.

@ -0,0 +1,44 @@
// revisions: good1 good2 bad1 bad2
//[good1] check-pass
//[good2] check-pass
use std::ops::Drop;
struct DropMe<T: Copy>(T);
#[cfg(good1)]
impl<T> Drop for DropMe<T>
where
T: Copy + Clone,
{
fn drop(&mut self) {}
}
#[cfg(good2)]
impl<T> Drop for DropMe<T>
where
T: Copy,
[T; 1]: Copy, // Trivial bound implied by `T: Copy`
{
fn drop(&mut self) {}
}
#[cfg(bad1)]
impl<T> Drop for DropMe<T>
//[bad1]~^ ERROR the trait bound `T: Copy` is not satisfied
where
[T; 1]: Copy, // But `[T; 1]: Copy` does not imply `T: Copy`
{
fn drop(&mut self) {}
//[bad1]~^ ERROR the trait bound `T: Copy` is not satisfied
}
#[cfg(bad2)]
impl<T> Drop for DropMe<T>
//[bad2]~^ ERROR the trait bound `T: Copy` is not satisfied
{
fn drop(&mut self) {}
//[bad2]~^ ERROR the trait bound `T: Copy` is not satisfied
}
fn main() {}

@ -0,0 +1,15 @@
error[E0367]: `Drop` impl requires `T: 'static` but the struct it is implemented for does not
--> $DIR/explicit-implied-outlives.rs:28:8
|
LL | T: 'static,
| ^^^^^^^
|
note: the implementor must specify the same requirement
--> $DIR/explicit-implied-outlives.rs:7:1
|
LL | struct DropMe<'a, T>(&'a T);
| ^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0367`.

@ -0,0 +1,15 @@
error[E0367]: `Drop` impl requires `'a: 'static` but the struct it is implemented for does not
--> $DIR/explicit-implied-outlives.rs:37:9
|
LL | 'a: 'static,
| ^^^^^^^
|
note: the implementor must specify the same requirement
--> $DIR/explicit-implied-outlives.rs:7:1
|
LL | struct DropMe<'a, T>(&'a T);
| ^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0367`.

@ -0,0 +1,43 @@
// revisions: good1 good2 bad1 bad2
//[good1] check-pass
//[good2] check-pass
use std::ops::Drop;
struct DropMe<'a, T>(&'a T);
#[cfg(good1)]
impl<'a, T> Drop for DropMe<'a, T>
where
T: 'a, // Implied by struct, explicit on impl
{
fn drop(&mut self) {}
}
#[cfg(good2)]
impl<'a, T> Drop for DropMe<'a, T>
where
'static: 'a, // Trivial bound
{
fn drop(&mut self) {}
}
#[cfg(bad1)]
impl<'a, T> Drop for DropMe<'a, T>
where
T: 'static,
//[bad1]~^ ERROR `Drop` impl requires `T: 'static`
{
fn drop(&mut self) {}
}
#[cfg(bad2)]
impl<'a, T> Drop for DropMe<'a, T>
where
'a: 'static,
//[bad2]~^ ERROR `Drop` impl requires `'a: 'static`
{
fn drop(&mut self) {}
}
fn main() {}

@ -0,0 +1,18 @@
// check-pass
use std::marker::PhantomData;
use std::ops::Drop;
// a >= b >= c >= a implies a = b = c
struct DropMe<'a: 'b, 'b: 'c, 'c: 'a>(
PhantomData<&'a ()>,
PhantomData<&'b ()>,
PhantomData<&'c ()>,
);
// a >= b, a >= c, b >= a, c >= a implies a = b = c
impl<'a: 'b + 'c, 'b: 'a, 'c: 'a> Drop for DropMe<'a, 'b, 'c> {
fn drop(&mut self) {}
}
fn main() {}

@ -0,0 +1,15 @@
error[E0367]: `Drop` impl requires `'a: 'c` but the struct it is implemented for does not
--> $DIR/transitive-outlives.rs:20:9
|
LL | 'a: 'c,
| ^^
|
note: the implementor must specify the same requirement
--> $DIR/transitive-outlives.rs:7:1
|
LL | struct DropMe<'a, 'b: 'a, 'c: 'b>(PhantomData<&'a ()>, PhantomData<&'b ()>, PhantomData<&'c ()>);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0367`.

@ -0,0 +1,26 @@
// revisions: good bad
//[good] check-pass
use std::marker::PhantomData;
use std::ops::Drop;
struct DropMe<'a, 'b: 'a, 'c: 'b>(PhantomData<&'a ()>, PhantomData<&'b ()>, PhantomData<&'c ()>);
#[cfg(good)]
impl<'a, 'b, 'c> Drop for DropMe<'a, 'b, 'c>
where
'c: 'a,
{
fn drop(&mut self) {}
}
#[cfg(bad)]
impl<'a, 'b, 'c> Drop for DropMe<'a, 'b, 'c>
where
'a: 'c,
//[bad]~^ ERROR `Drop` impl requires `'a: 'c`
{
fn drop(&mut self) {}
}
fn main() {}

@ -0,0 +1,34 @@
// revisions: good1 good2 good3
// check-pass
use std::ops::Drop;
struct Foo;
const X: usize = 1;
#[cfg(good1)]
impl Drop for Foo
where
[(); X]:, // Trivial WF bound
{
fn drop(&mut self) {}
}
#[cfg(good2)]
impl Drop for Foo
where
for<'a> &'a (): Copy, // Trivial trait bound
{
fn drop(&mut self) {}
}
#[cfg(good3)]
impl Drop for Foo
where
for<'a> &'a (): 'a, // Trivial outlives bound
{
fn drop(&mut self) {}
}
fn main() {}