diff --git a/compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs b/compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs index 0fe5e74da89..d8840731263 100644 --- a/compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs +++ b/compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs @@ -313,6 +313,15 @@ pub fn apply_adjustments(&self, expr: &hir::Expr<'_>, adj: Vec> ) => { // A reborrow has no effect before a dereference. } + // Catch cases which have Deref(None) + // having them slip to bug! causes ICE + // see #94291 for more info + (&[Adjustment { kind: Adjust::Deref(None), .. }], _) => { + self.tcx.sess.delay_span_bug( + DUMMY_SP, + &format!("Can't compose Deref(None) expressions"), + ) + } // FIXME: currently we never try to compose autoderefs // and ReifyFnPointer/UnsafeFnPointer, but we could. _ => bug!( diff --git a/src/test/ui/tuple/wrong_argument_ice.rs b/src/test/ui/tuple/wrong_argument_ice.rs new file mode 100644 index 00000000000..da967d8c146 --- /dev/null +++ b/src/test/ui/tuple/wrong_argument_ice.rs @@ -0,0 +1,17 @@ +use std::collections::VecDeque; + +pub struct BuildPlanBuilder { + acc: VecDeque<(String, String)>, + current_provides: String, + current_requires: String, +} + +impl BuildPlanBuilder { + pub fn or(&mut self) -> &mut Self { + self.acc.push_back(self.current_provides, self.current_requires); + //~^ ERROR this function takes 1 argument but 2 arguments were supplied + self + } +} + +fn main() {} diff --git a/src/test/ui/tuple/wrong_argument_ice.stderr b/src/test/ui/tuple/wrong_argument_ice.stderr new file mode 100644 index 00000000000..e96a957350b --- /dev/null +++ b/src/test/ui/tuple/wrong_argument_ice.stderr @@ -0,0 +1,19 @@ +error[E0061]: this function takes 1 argument but 2 arguments were supplied + --> $DIR/wrong_argument_ice.rs:11:18 + | +LL | self.acc.push_back(self.current_provides, self.current_requires); + | ^^^^^^^^^ --------------------- --------------------- supplied 2 arguments + | +note: associated function defined here + --> $SRC_DIR/alloc/src/collections/vec_deque/mod.rs:LL:COL + | +LL | pub fn push_back(&mut self, value: T) { + | ^^^^^^^^^ +help: use parentheses to construct a tuple + | +LL | self.acc.push_back((self.current_provides, self.current_requires)); + | + + + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0061`.