From f7702e7520601cd0b1b0ae88571d3aa7e9a5b478 Mon Sep 17 00:00:00 2001 From: im-lunex Date: Sat, 8 Aug 2026 17:12:47 +0600 Subject: [PATCH] add regression tests for the fn sig ice --- .../ice-missing-field-fn-sig-closure.rs | 15 ++++ .../ice-missing-field-fn-sig-closure.stderr | 78 +++++++++++++++++++ .../ice-missing-field-fn-sig-method.rs | 13 ++++ .../ice-missing-field-fn-sig-method.stderr | 22 ++++++ 4 files changed, 128 insertions(+) create mode 100644 tests/ui/structs/ice-missing-field-fn-sig-closure.rs create mode 100644 tests/ui/structs/ice-missing-field-fn-sig-closure.stderr create mode 100644 tests/ui/structs/ice-missing-field-fn-sig-method.rs create mode 100644 tests/ui/structs/ice-missing-field-fn-sig-method.stderr diff --git a/tests/ui/structs/ice-missing-field-fn-sig-closure.rs b/tests/ui/structs/ice-missing-field-fn-sig-closure.rs new file mode 100644 index 0000000000000..cc47270e44dda --- /dev/null +++ b/tests/ui/structs/ice-missing-field-fn-sig-closure.rs @@ -0,0 +1,15 @@ +// A closure call with a struct literal missing a field shouldn't ICE when checking the fn sig. + +trait Context {} +struct Wrapper { + container: &'static C, +} + +fn main() { + let c = |_: Wrapper<()>| {}; //~ ERROR the trait bound `(): Context` is not satisfied + c(Wrapper { /* missing */ }); + //~^ ERROR the trait bound `(): Context` is not satisfied + //~^^ ERROR missing field `container` in initializer of `Wrapper<_>` + //~^^^ ERROR the trait bound `(): Context` is not satisfied + //~^^^^ ERROR the trait bound `(): Context` is not satisfied +} diff --git a/tests/ui/structs/ice-missing-field-fn-sig-closure.stderr b/tests/ui/structs/ice-missing-field-fn-sig-closure.stderr new file mode 100644 index 0000000000000..06d1f79d5e592 --- /dev/null +++ b/tests/ui/structs/ice-missing-field-fn-sig-closure.stderr @@ -0,0 +1,78 @@ +error[E0277]: the trait bound `(): Context` is not satisfied + --> $DIR/ice-missing-field-fn-sig-closure.rs:9:17 + | +LL | let c = |_: Wrapper<()>| {}; + | ^^^^^^^^^^^ the trait `Context` is not implemented for `()` + | +help: this trait has no implementations, consider adding one + --> $DIR/ice-missing-field-fn-sig-closure.rs:3:1 + | +LL | trait Context {} + | ^^^^^^^^^^^^^ +note: required by a bound in `Wrapper` + --> $DIR/ice-missing-field-fn-sig-closure.rs:4:19 + | +LL | struct Wrapper { + | ^^^^^^^ required by this bound in `Wrapper` + +error[E0277]: the trait bound `(): Context` is not satisfied + --> $DIR/ice-missing-field-fn-sig-closure.rs:10:7 + | +LL | c(Wrapper { /* missing */ }); + | ^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Context` is not implemented for `()` + | +help: this trait has no implementations, consider adding one + --> $DIR/ice-missing-field-fn-sig-closure.rs:3:1 + | +LL | trait Context {} + | ^^^^^^^^^^^^^ +note: required by a bound in `Wrapper` + --> $DIR/ice-missing-field-fn-sig-closure.rs:4:19 + | +LL | struct Wrapper { + | ^^^^^^^ required by this bound in `Wrapper` + +error[E0063]: missing field `container` in initializer of `Wrapper<_>` + --> $DIR/ice-missing-field-fn-sig-closure.rs:10:7 + | +LL | c(Wrapper { /* missing */ }); + | ^^^^^^^ missing `container` + +error[E0277]: the trait bound `(): Context` is not satisfied + --> $DIR/ice-missing-field-fn-sig-closure.rs:10:7 + | +LL | c(Wrapper { /* missing */ }); + | ^^^^^^^ the trait `Context` is not implemented for `()` + | +help: this trait has no implementations, consider adding one + --> $DIR/ice-missing-field-fn-sig-closure.rs:3:1 + | +LL | trait Context {} + | ^^^^^^^^^^^^^ +note: required by a bound in `Wrapper` + --> $DIR/ice-missing-field-fn-sig-closure.rs:4:19 + | +LL | struct Wrapper { + | ^^^^^^^ required by this bound in `Wrapper` + +error[E0277]: the trait bound `(): Context` is not satisfied + --> $DIR/ice-missing-field-fn-sig-closure.rs:10:5 + | +LL | c(Wrapper { /* missing */ }); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Context` is not implemented for `()` + | +help: this trait has no implementations, consider adding one + --> $DIR/ice-missing-field-fn-sig-closure.rs:3:1 + | +LL | trait Context {} + | ^^^^^^^^^^^^^ +note: required by a bound in `Wrapper` + --> $DIR/ice-missing-field-fn-sig-closure.rs:4:19 + | +LL | struct Wrapper { + | ^^^^^^^ required by this bound in `Wrapper` + +error: aborting due to 5 previous errors + +Some errors have detailed explanations: E0063, E0277. +For more information about an error, try `rustc --explain E0063`. diff --git a/tests/ui/structs/ice-missing-field-fn-sig-method.rs b/tests/ui/structs/ice-missing-field-fn-sig-method.rs new file mode 100644 index 0000000000000..1d1b6bc94a265 --- /dev/null +++ b/tests/ui/structs/ice-missing-field-fn-sig-method.rs @@ -0,0 +1,13 @@ +// A method call whose where-clause fails shouldn't ICE when checking the fn sig. + +trait Context {} +struct Foo; +impl Foo { + fn take(&self, _: T) {} +} + +fn main() { + let f = Foo; + f.take(()); + //~^ ERROR the trait bound `(): Context` is not satisfied +} diff --git a/tests/ui/structs/ice-missing-field-fn-sig-method.stderr b/tests/ui/structs/ice-missing-field-fn-sig-method.stderr new file mode 100644 index 0000000000000..8ee967782b750 --- /dev/null +++ b/tests/ui/structs/ice-missing-field-fn-sig-method.stderr @@ -0,0 +1,22 @@ +error[E0277]: the trait bound `(): Context` is not satisfied + --> $DIR/ice-missing-field-fn-sig-method.rs:11:12 + | +LL | f.take(()); + | ---- ^^ the trait `Context` is not implemented for `()` + | | + | required by a bound introduced by this call + | +help: this trait has no implementations, consider adding one + --> $DIR/ice-missing-field-fn-sig-method.rs:3:1 + | +LL | trait Context {} + | ^^^^^^^^^^^^^ +note: required by a bound in `Foo::take` + --> $DIR/ice-missing-field-fn-sig-method.rs:6:16 + | +LL | fn take(&self, _: T) {} + | ^^^^^^^ required by this bound in `Foo::take` + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0277`.