From 218caa410aa38c29984be31a5229b9fa717560ee Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 14:19:13 +0200 Subject: Merging upstream version 1.68.2+dfsg1. Signed-off-by: Daniel Baumann --- tests/ui/const-generics/occurs-check/bind-param.rs | 17 +++++++++++++ .../const-generics/occurs-check/unify-fixpoint.rs | 12 ++++++++++ .../occurs-check/unify-fixpoint.stderr | 11 +++++++++ .../occurs-check/unify-n-nplusone.rs | 16 +++++++++++++ .../occurs-check/unify-n-nplusone.stderr | 9 +++++++ .../const-generics/occurs-check/unused-substs-1.rs | 13 ++++++++++ .../occurs-check/unused-substs-1.stderr | 19 +++++++++++++++ .../const-generics/occurs-check/unused-substs-2.rs | 28 ++++++++++++++++++++++ .../occurs-check/unused-substs-2.stderr | 9 +++++++ .../const-generics/occurs-check/unused-substs-3.rs | 19 +++++++++++++++ .../occurs-check/unused-substs-3.stderr | 11 +++++++++ .../const-generics/occurs-check/unused-substs-4.rs | 11 +++++++++ .../occurs-check/unused-substs-4.stderr | 9 +++++++ .../const-generics/occurs-check/unused-substs-5.rs | 20 ++++++++++++++++ .../occurs-check/unused-substs-5.stderr | 11 +++++++++ 15 files changed, 215 insertions(+) create mode 100644 tests/ui/const-generics/occurs-check/bind-param.rs create mode 100644 tests/ui/const-generics/occurs-check/unify-fixpoint.rs create mode 100644 tests/ui/const-generics/occurs-check/unify-fixpoint.stderr create mode 100644 tests/ui/const-generics/occurs-check/unify-n-nplusone.rs create mode 100644 tests/ui/const-generics/occurs-check/unify-n-nplusone.stderr create mode 100644 tests/ui/const-generics/occurs-check/unused-substs-1.rs create mode 100644 tests/ui/const-generics/occurs-check/unused-substs-1.stderr create mode 100644 tests/ui/const-generics/occurs-check/unused-substs-2.rs create mode 100644 tests/ui/const-generics/occurs-check/unused-substs-2.stderr create mode 100644 tests/ui/const-generics/occurs-check/unused-substs-3.rs create mode 100644 tests/ui/const-generics/occurs-check/unused-substs-3.stderr create mode 100644 tests/ui/const-generics/occurs-check/unused-substs-4.rs create mode 100644 tests/ui/const-generics/occurs-check/unused-substs-4.stderr create mode 100644 tests/ui/const-generics/occurs-check/unused-substs-5.rs create mode 100644 tests/ui/const-generics/occurs-check/unused-substs-5.stderr (limited to 'tests/ui/const-generics/occurs-check') diff --git a/tests/ui/const-generics/occurs-check/bind-param.rs b/tests/ui/const-generics/occurs-check/bind-param.rs new file mode 100644 index 000000000..ee4244051 --- /dev/null +++ b/tests/ui/const-generics/occurs-check/bind-param.rs @@ -0,0 +1,17 @@ +// build-pass +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] + +// This test does not use any "unevaluated" consts, so it should compile just fine. + +fn bind(value: [u8; N]) -> [u8; N] { + todo!() +} + +fn sink(_: [u8; 5]) {} + +fn main() { + let mut arr = Default::default(); + arr = bind(arr); + sink(arr); +} diff --git a/tests/ui/const-generics/occurs-check/unify-fixpoint.rs b/tests/ui/const-generics/occurs-check/unify-fixpoint.rs new file mode 100644 index 000000000..e6f8e4ad3 --- /dev/null +++ b/tests/ui/const-generics/occurs-check/unify-fixpoint.rs @@ -0,0 +1,12 @@ +// check-pass +#![feature(generic_const_exprs)] //~ WARN the feature `generic_const_exprs` is incomplete + + +fn bind(value: [u8; N + 2]) -> [u8; N * 2] { + todo!() +} + +fn main() { + let mut arr = Default::default(); + arr = bind::<2>(arr); +} diff --git a/tests/ui/const-generics/occurs-check/unify-fixpoint.stderr b/tests/ui/const-generics/occurs-check/unify-fixpoint.stderr new file mode 100644 index 000000000..fe3f24a67 --- /dev/null +++ b/tests/ui/const-generics/occurs-check/unify-fixpoint.stderr @@ -0,0 +1,11 @@ +warning: the feature `generic_const_exprs` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/unify-fixpoint.rs:2:12 + | +LL | #![feature(generic_const_exprs)] + | ^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #76560 for more information + = note: `#[warn(incomplete_features)]` on by default + +warning: 1 warning emitted + diff --git a/tests/ui/const-generics/occurs-check/unify-n-nplusone.rs b/tests/ui/const-generics/occurs-check/unify-n-nplusone.rs new file mode 100644 index 000000000..c6324bca1 --- /dev/null +++ b/tests/ui/const-generics/occurs-check/unify-n-nplusone.rs @@ -0,0 +1,16 @@ +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] + +// This test would tries to unify `N` with `N + 1` which must fail the occurs check. + +fn bind(value: [u8; N]) -> [u8; N + 1] { + todo!() +} + +fn sink(_: [u8; 5]) {} + +fn main() { + let mut arr = Default::default(); + arr = bind(arr); //~ ERROR mismatched types + sink(arr); +} diff --git a/tests/ui/const-generics/occurs-check/unify-n-nplusone.stderr b/tests/ui/const-generics/occurs-check/unify-n-nplusone.stderr new file mode 100644 index 000000000..6b8e688fb --- /dev/null +++ b/tests/ui/const-generics/occurs-check/unify-n-nplusone.stderr @@ -0,0 +1,9 @@ +error[E0308]: mismatched types + --> $DIR/unify-n-nplusone.rs:14:11 + | +LL | arr = bind(arr); + | ^^^^^^^^^ encountered a self-referencing constant + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/const-generics/occurs-check/unused-substs-1.rs b/tests/ui/const-generics/occurs-check/unused-substs-1.rs new file mode 100644 index 000000000..9d12250c9 --- /dev/null +++ b/tests/ui/const-generics/occurs-check/unused-substs-1.rs @@ -0,0 +1,13 @@ +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] + +trait Bar {} +impl Bar for A<{ 6 + 1 }> {} + +struct A +where + A: Bar; + +fn main() { + let _ = A; //~ERROR the trait bound +} diff --git a/tests/ui/const-generics/occurs-check/unused-substs-1.stderr b/tests/ui/const-generics/occurs-check/unused-substs-1.stderr new file mode 100644 index 000000000..a3c011d92 --- /dev/null +++ b/tests/ui/const-generics/occurs-check/unused-substs-1.stderr @@ -0,0 +1,19 @@ +error[E0277]: the trait bound `A<_>: Bar<_>` is not satisfied + --> $DIR/unused-substs-1.rs:12:13 + | +LL | let _ = A; + | ^ the trait `Bar<_>` is not implemented for `A<_>` + | + = help: the trait `Bar` is implemented for `A<7>` +note: required by a bound in `A` + --> $DIR/unused-substs-1.rs:9:11 + | +LL | struct A + | - required by a bound in this +LL | where +LL | A: Bar; + | ^^^^^^ required by this bound in `A` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. diff --git a/tests/ui/const-generics/occurs-check/unused-substs-2.rs b/tests/ui/const-generics/occurs-check/unused-substs-2.rs new file mode 100644 index 000000000..9b1212694 --- /dev/null +++ b/tests/ui/const-generics/occurs-check/unused-substs-2.rs @@ -0,0 +1,28 @@ +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] + +// The goal is to get an unevaluated const `ct` with a `Ty::Infer(TyVar(_#1t)` subst. +// +// If we are then able to infer `ty::Infer(TyVar(_#1t) := Ty` we introduced an +// artificial inference cycle. +struct Foo; + +trait Bind { + fn bind() -> (T, Self); +} + +// `N` has to be `ConstKind::Unevaluated`. +impl Bind for Foo<{ 6 + 1 }> { + fn bind() -> (T, Self) { + (panic!(), Foo) + } +} + +fn main() { + let (mut t, foo) = Foo::bind(); + // `t` is `ty::Infer(TyVar(_#1t))` + // `foo` contains `ty::Infer(TyVar(_#1t))` in its substs + t = foo; + //~^ ERROR mismatched types + //~| NOTE cyclic type +} diff --git a/tests/ui/const-generics/occurs-check/unused-substs-2.stderr b/tests/ui/const-generics/occurs-check/unused-substs-2.stderr new file mode 100644 index 000000000..9532fc21a --- /dev/null +++ b/tests/ui/const-generics/occurs-check/unused-substs-2.stderr @@ -0,0 +1,9 @@ +error[E0308]: mismatched types + --> $DIR/unused-substs-2.rs:25:9 + | +LL | t = foo; + | ^^^ cyclic type of infinite size + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/const-generics/occurs-check/unused-substs-3.rs b/tests/ui/const-generics/occurs-check/unused-substs-3.rs new file mode 100644 index 000000000..d5aeab47e --- /dev/null +++ b/tests/ui/const-generics/occurs-check/unused-substs-3.rs @@ -0,0 +1,19 @@ +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] + +// The goal is to get an unevaluated const `ct` with a `Ty::Infer(TyVar(_#1t)` subst. +// +// If we are then able to infer `ty::Infer(TyVar(_#1t) := Ty` we introduced an +// artificial inference cycle. +fn bind() -> (T, [u8; 6 + 1]) { + todo!() +} + +fn main() { + let (mut t, foo) = bind(); + // `t` is `ty::Infer(TyVar(_#1t))` + // `foo` contains `ty::Infer(TyVar(_#1t))` in its substs + t = foo; + //~^ ERROR mismatched types + //~| NOTE cyclic type +} diff --git a/tests/ui/const-generics/occurs-check/unused-substs-3.stderr b/tests/ui/const-generics/occurs-check/unused-substs-3.stderr new file mode 100644 index 000000000..fd8f8b269 --- /dev/null +++ b/tests/ui/const-generics/occurs-check/unused-substs-3.stderr @@ -0,0 +1,11 @@ +error[E0308]: mismatched types + --> $DIR/unused-substs-3.rs:16:9 + | +LL | t = foo; + | ^^^- help: try using a conversion method: `.to_vec()` + | | + | cyclic type of infinite size + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/const-generics/occurs-check/unused-substs-4.rs b/tests/ui/const-generics/occurs-check/unused-substs-4.rs new file mode 100644 index 000000000..03c2f5486 --- /dev/null +++ b/tests/ui/const-generics/occurs-check/unused-substs-4.rs @@ -0,0 +1,11 @@ +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] + +fn bind(value: [u8; N]) -> [u8; 3 + 4] { + todo!() +} + +fn main() { + let mut arr = Default::default(); + arr = bind(arr); //~ ERROR mismatched type +} diff --git a/tests/ui/const-generics/occurs-check/unused-substs-4.stderr b/tests/ui/const-generics/occurs-check/unused-substs-4.stderr new file mode 100644 index 000000000..5685eedbd --- /dev/null +++ b/tests/ui/const-generics/occurs-check/unused-substs-4.stderr @@ -0,0 +1,9 @@ +error[E0308]: mismatched types + --> $DIR/unused-substs-4.rs:10:11 + | +LL | arr = bind(arr); + | ^^^^^^^^^ encountered a self-referencing constant + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/const-generics/occurs-check/unused-substs-5.rs b/tests/ui/const-generics/occurs-check/unused-substs-5.rs new file mode 100644 index 000000000..383ab4cd8 --- /dev/null +++ b/tests/ui/const-generics/occurs-check/unused-substs-5.rs @@ -0,0 +1,20 @@ +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] + +// `N + 1` also depends on `T` here even if it doesn't use it. +fn q(_: T) -> [u8; N + 1] { + todo!() +} + +fn supplier() -> T { + todo!() +} + +fn catch_me() where [u8; N + 1]: Default { + let mut x = supplier(); + x = q::<_, N>(x); //~ ERROR mismatched types +} + +fn main() { + catch_me::<3>(); +} diff --git a/tests/ui/const-generics/occurs-check/unused-substs-5.stderr b/tests/ui/const-generics/occurs-check/unused-substs-5.stderr new file mode 100644 index 000000000..be289f44f --- /dev/null +++ b/tests/ui/const-generics/occurs-check/unused-substs-5.stderr @@ -0,0 +1,11 @@ +error[E0308]: mismatched types + --> $DIR/unused-substs-5.rs:15:9 + | +LL | x = q::<_, N>(x); + | ^^^^^^^^^^^^- help: try using a conversion method: `.to_vec()` + | | + | cyclic type of infinite size + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. -- cgit v1.2.3