diff options
| author | Boxy <rust@boxyuwu.dev> | 2025-04-08 17:01:29 +0100 |
|---|---|---|
| committer | Boxy <rust@boxyuwu.dev> | 2025-05-21 20:38:49 +0100 |
| commit | f60bab475e47e84bb188e463b6a17894a57092c4 (patch) | |
| tree | 18273bf8977cc8a04f3584db9e4f08299c1ed350 /tests/ui/repeat-expr | |
| parent | 356f2d077498d0ebe5ec4f9cfef04293a2b17611 (diff) | |
| download | rust-f60bab475e47e84bb188e463b6a17894a57092c4.tar.gz rust-f60bab475e47e84bb188e463b6a17894a57092c4.zip | |
Don't allow repeat expr count inference side effects to propagate
Diffstat (limited to 'tests/ui/repeat-expr')
4 files changed, 77 insertions, 2 deletions
diff --git a/tests/ui/repeat-expr/copy-check-deferred-before-fallback.rs b/tests/ui/repeat-expr/copy-check-deferred-before-fallback.rs index 4654d7483a6..bf519febb30 100644 --- a/tests/ui/repeat-expr/copy-check-deferred-before-fallback.rs +++ b/tests/ui/repeat-expr/copy-check-deferred-before-fallback.rs @@ -1,5 +1,3 @@ -//@ check-pass - #![feature(generic_arg_infer)] // Test that if we defer repeat expr copy checks to end of typechecking they're @@ -37,6 +35,7 @@ fn main() { let b: [Foo<_>; 2] = [Foo(PhantomData); _]; tie(&a, b); let c = [NotCopy; _]; + //~^ ERROR: type annotations needed for `[NotCopy; _]` // a is of type `?y` // b is of type `[Foo<?y>; 2]` diff --git a/tests/ui/repeat-expr/copy-check-deferred-before-fallback.stderr b/tests/ui/repeat-expr/copy-check-deferred-before-fallback.stderr new file mode 100644 index 00000000000..d6189329c92 --- /dev/null +++ b/tests/ui/repeat-expr/copy-check-deferred-before-fallback.stderr @@ -0,0 +1,14 @@ +error[E0282]: type annotations needed for `[NotCopy; _]` + --> $DIR/copy-check-deferred-before-fallback.rs:37:9 + | +LL | let c = [NotCopy; _]; + | ^ ------- type must be known at this point + | +help: consider giving `c` an explicit type, where the value of const parameter `N` is specified + | +LL | let c: [_; N] = [NotCopy; _]; + | ++++++++ + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0282`. diff --git a/tests/ui/repeat-expr/copy-check-inference-side-effects.rs b/tests/ui/repeat-expr/copy-check-inference-side-effects.rs new file mode 100644 index 00000000000..416a20169fb --- /dev/null +++ b/tests/ui/repeat-expr/copy-check-inference-side-effects.rs @@ -0,0 +1,34 @@ +#![feature(generic_arg_infer)] + +struct Foo<const N: usize>; + +impl Clone for Foo<1> { + fn clone(&self) -> Self { + Self + } +} +impl Copy for Foo<1> {} + +fn unify<const N: usize>(_: &[Foo<N>; 2], _: &[String; N]) {} + +fn works_if_inference_side_effects() { + // This will only pass if inference side effectrs from proving `Foo<?x>: Copy` are + // able to be relied upon by other repeat expressions. + let a /* : [Foo<?x>; 2] */ = [Foo::<_>; 2]; + //~^ ERROR: type annotations needed for `[Foo<_>; 2]` + let b /* : [String; ?x] */ = ["string".to_string(); _]; + + unify(&a, &b); +} + +fn works_if_fixed_point() { + // This will only pass if the *second* array repeat expr is checked first + // allowing `Foo<?x>: Copy` to infer the array length of the first repeat expr. + let b /* : [String; ?x] */ = ["string".to_string(); _]; + //~^ ERROR: type annotations needed for `[String; _]` + let a /* : [Foo<?x>; 2] */ = [Foo::<_>; 2]; + + unify(&a, &b); +} + +fn main() {} diff --git a/tests/ui/repeat-expr/copy-check-inference-side-effects.stderr b/tests/ui/repeat-expr/copy-check-inference-side-effects.stderr new file mode 100644 index 00000000000..505beff0f6b --- /dev/null +++ b/tests/ui/repeat-expr/copy-check-inference-side-effects.stderr @@ -0,0 +1,28 @@ +error[E0282]: type annotations needed for `[Foo<_>; 2]` + --> $DIR/copy-check-inference-side-effects.rs:17:9 + | +LL | let a /* : [Foo<?x>; 2] */ = [Foo::<_>; 2]; + | ^ +LL | +LL | let b /* : [String; ?x] */ = ["string".to_string(); _]; + | -------------------- type must be known at this point + | +help: consider giving `a` an explicit type, where the value of const parameter `N` is specified + | +LL | let a: [Foo<N>; 2] /* : [Foo<?x>; 2] */ = [Foo::<_>; 2]; + | +++++++++++++ + +error[E0282]: type annotations needed for `[String; _]` + --> $DIR/copy-check-inference-side-effects.rs:27:9 + | +LL | let b /* : [String; ?x] */ = ["string".to_string(); _]; + | ^ -------------------- type must be known at this point + | +help: consider giving `b` an explicit type, where the value of const parameter `N` is specified + | +LL | let b: [_; N] /* : [String; ?x] */ = ["string".to_string(); _]; + | ++++++++ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0282`. |
