Rollup merge of #98005 - compiler-errors:impossible-bounds, r=Mark-Simulacrum

Add some tests for impossible bounds

Adds test for #93008
Adds test for #94680
Closes #94999
Closes #95640
This commit is contained in:
Yuki Okushi 2022-06-22 15:16:14 +09:00 committed by GitHub
commit 400751d40b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 153 additions and 20 deletions

View file

@ -1,10 +1,15 @@
// compile-flags: -Zmir-opt-level=4
// build-pass
// compile-flags: -Zmir-opt-level=3 --crate-type=lib
pub fn bar<T>(s: &'static mut ())
where
&'static mut (): Clone, //~ ERROR the trait bound
{
<&'static mut () as Clone>::clone(&s);
#![feature(trivial_bounds)]
#![allow(trivial_bounds)]
trait Foo {
fn test(self);
}
fn baz<T>()
where
&'static str: Foo,
{
"Foo".test()
}
fn main() {}

View file

@ -1,12 +0,0 @@
error[E0277]: the trait bound `&'static mut (): Clone` is not satisfied
--> $DIR/issue-93008.rs:5:5
|
LL | &'static mut (): Clone,
| ^^^^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `&'static mut ()`
|
= help: see issue #48214
= help: add `#![feature(trivial_bounds)]` to the crate attributes to enable
error: aborting due to previous error
For more information about this error, try `rustc --explain E0277`.

View file

@ -0,0 +1,14 @@
// check-pass
fn main() {
println!("{:?}", {
type T = ();
pub fn cloneit(it: &'_ mut T) -> (&'_ mut T, &'_ mut T)
where
for<'any> &'any mut T: Clone,
{
(it.clone(), it)
}
});
}

View file

@ -0,0 +1,34 @@
// check-pass
trait Identity<Q> {
type T;
}
impl<Q, T> Identity<Q> for T {
type T = T;
}
trait Holds {
type Q;
}
struct S;
struct X(S);
struct XHelper;
impl Holds for X {
type Q = XHelper;
}
impl<Q> Clone for X
where
<S as Identity<Q>>::T: Clone,
X: Holds<Q = Q>,
{
fn clone(&self) -> Self {
Self(self.0.clone())
}
}
fn main() {}

View file

@ -0,0 +1,31 @@
// build-pass
// compile-flags:-Zmir-opt-level=3
struct D;
trait Tr {
type It;
fn foo(self) -> Option<Self::It>;
}
impl<'a> Tr for &'a D {
type It = ();
fn foo(self) -> Option<()> {
None
}
}
fn run<F>(f: F)
where
for<'a> &'a D: Tr,
F: Fn(<&D as Tr>::It),
{
let d = &D;
while let Some(i) = d.foo() {
f(i);
}
}
fn main() {
run(|_| {});
}

View file

@ -0,0 +1,43 @@
// known-bug
// build-fail
// failure-status: 101
// compile-flags:--crate-type=lib -Zmir-opt-level=3
// rustc-env:RUST_BACKTRACE=0
// normalize-stderr-test "thread 'rustc' panicked.*" -> "thread 'rustc' panicked"
// normalize-stderr-test "note:.*RUST_BACKTRACE=1.*\n" -> ""
// normalize-stderr-test "error: internal compiler error.*" -> "error: internal compiler error"
// normalize-stderr-test "encountered.*with incompatible types:" "encountered ... with incompatible types:"
// normalize-stderr-test "note:.*unexpectedly panicked.*\n\n" -> ""
// normalize-stderr-test "note: we would appreciate a bug report.*\n\n" -> ""
// normalize-stderr-test "note: compiler flags.*\n\n" -> ""
// normalize-stderr-test "note: rustc.*running on.*\n\n" -> ""
// normalize-stderr-test "query stack during panic:\n" -> ""
// normalize-stderr-test "we're just showing a limited slice of the query stack\n" -> ""
// normalize-stderr-test "end of query stack\n" -> ""
// normalize-stderr-test "#.*\n" -> ""
// This is a known bug that @compiler-errors tried to fix in #94238,
// but the solution was probably not correct.
pub trait Factory<T> {
type Item;
}
pub struct IntFactory;
impl<T> Factory<T> for IntFactory {
type Item = usize;
}
pub fn foo<T>()
where
IntFactory: Factory<T>,
{
let mut x: <IntFactory as Factory<T>>::Item = bar::<T>();
}
#[inline]
pub fn bar<T>() -> <IntFactory as Factory<T>>::Item {
0usize
}

View file

@ -0,0 +1,18 @@
error: internal compiler error
error: internal compiler error
encountered ... with incompatible types:
left-hand side has type: <IntFactory as Factory<T>>::Item
right-hand side has type: usize
--> $DIR/select-param-env-instead-of-blanket.rs:42:5
|
LL | let mut x: <IntFactory as Factory<T>>::Item = bar::<T>();
| ---------- in this inlined function call
...
LL | 0usize
| ^^^^^^
|
= note: delayed at compiler/rustc_const_eval/src/transform/validate.rs:128:36
thread 'rustc' panicked