From b4dbd51440da3c3dcf3953bfe6016ea5c19a5dce Mon Sep 17 00:00:00 2001 From: bit-aloo Date: Tue, 16 Jun 2026 18:04:22 +0530 Subject: [PATCH 1/3] add test when function item is used as const arg --- .../ui/const-generics/mgca/trait-assoc-fn-as-const-arg.rs | 8 ++++++++ .../mgca/trait-assoc-fn-as-const-arg.stderr | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.rs create mode 100644 tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.stderr diff --git a/tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.rs b/tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.rs new file mode 100644 index 0000000000000..2997ef0d969a2 --- /dev/null +++ b/tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.rs @@ -0,0 +1,8 @@ +#![feature(min_generic_const_args)] + +trait Bar { + fn x(&self) -> [i32; Bar::x]; + //~^ ERROR function items cannot be used as const arguments +} + +fn main() {} diff --git a/tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.stderr b/tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.stderr new file mode 100644 index 0000000000000..f276c5f5717d3 --- /dev/null +++ b/tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.stderr @@ -0,0 +1,8 @@ +error: function items cannot be used as const arguments + --> $DIR/trait-assoc-fn-as-const-arg.rs:4:26 + | +LL | fn x(&self) -> [i32; Bar::x]; + | ^^^^^^ + +error: aborting due to 1 previous error + From dd56e6b01eca473eb036d57e7d963cc47b6736ad Mon Sep 17 00:00:00 2001 From: bit-aloo Date: Tue, 16 Jun 2026 18:04:59 +0530 Subject: [PATCH 2/3] Previously both free functions and associated functions creates a FnDef const after scheduling. That works only when a later phase emits a real diagnostics. For function item (associated fn), the lowering needs parent trait and self args. --- compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs b/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs index 7909fdbf2365e..57d5522876702 100644 --- a/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs +++ b/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs @@ -2791,8 +2791,13 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ { Res::Def(DefKind::Static { .. }, _) => { span_bug!(span, "use of bare `static` ConstArgKind::Path's not yet supported") } + Res::Def(DefKind::AssocFn, _) => { + let guar = + self.dcx().span_err(span, "function items cannot be used as const arguments"); + Const::new_error(tcx, guar) + } // FIXME(const_generics): create real const to allow fn items as const paths - Res::Def(DefKind::Fn | DefKind::AssocFn, did) => { + Res::Def(DefKind::Fn, did) => { self.dcx().span_delayed_bug(span, "function items cannot be used as const args"); let args = self.lower_generic_args_of_path_segment( span, From f227e79e5ddee36e6e125dbb60ab5f33547380ad Mon Sep 17 00:00:00 2001 From: bit-aloo Date: Wed, 17 Jun 2026 13:57:56 +0000 Subject: [PATCH 3/3] Remove crashtest and mention the issue in the ui test --- tests/crashes/138088.rs | 5 ----- tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.rs | 2 ++ .../const-generics/mgca/trait-assoc-fn-as-const-arg.stderr | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) delete mode 100644 tests/crashes/138088.rs diff --git a/tests/crashes/138088.rs b/tests/crashes/138088.rs deleted file mode 100644 index 25496d804fef7..0000000000000 --- a/tests/crashes/138088.rs +++ /dev/null @@ -1,5 +0,0 @@ -//@ known-bug: #138088 -#![feature(min_generic_const_args)] -trait Bar { - fn x(&self) -> [i32; Bar::x]; -} diff --git a/tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.rs b/tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.rs index 2997ef0d969a2..134b1c4d0c178 100644 --- a/tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.rs +++ b/tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.rs @@ -1,5 +1,7 @@ #![feature(min_generic_const_args)] +// Regression test for #138088. assoc functions cannot be lowered as const +// args, and this should emit a regular diagnostic instead of ICEing. trait Bar { fn x(&self) -> [i32; Bar::x]; //~^ ERROR function items cannot be used as const arguments diff --git a/tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.stderr b/tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.stderr index f276c5f5717d3..38a272ca87c85 100644 --- a/tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.stderr +++ b/tests/ui/const-generics/mgca/trait-assoc-fn-as-const-arg.stderr @@ -1,5 +1,5 @@ error: function items cannot be used as const arguments - --> $DIR/trait-assoc-fn-as-const-arg.rs:4:26 + --> $DIR/trait-assoc-fn-as-const-arg.rs:6:26 | LL | fn x(&self) -> [i32; Bar::x]; | ^^^^^^