From 23cecd7f1debd44cc686df3cd72865c7dd28fd5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 18 Jul 2025 22:51:15 +0000 Subject: [PATCH 1/6] Point at non-const trait impl when encountering unmet `[const]` bound When encountering an unmet `Ty: [const] Trait` bound, if `Trait` is `#[const_trait]` and there's an `impl Trait for Ty` point at it. If local, suggest `impl const Trait for Ty`, otherwise just point at it. ``` error[E0277]: the trait bound `NonConstAdd: [const] Add` is not satisfied --> $DIR/assoc-type.rs:37:16 | LL | type Bar = NonConstAdd; | ^^^^^^^^^^^ | note: required by a bound in `Foo::Bar` --> $DIR/assoc-type.rs:33:15 | LL | type Bar: [const] Add; | ^^^^^^^^^^^ required by this bound in `Foo::Bar` help: make the `impl` of trait `Add` `const` | LL | impl const Add for NonConstAdd { | +++++ ``` ``` error[E0277]: the trait bound `T: [const] PartialEq` is not satisfied --> tests/ui/traits/const-traits/call-generic-method-fail.rs:5:5 | 5 | *t == *t | ^^^^^^^^ | note: trait `PartialEq` is implemented but not `const` --> /home/gh-estebank/rust/library/core/src/ptr/const_ptr.rs:1590:1 | 1590 | impl PartialEq for *const T { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: trait `PartialEq` is implemented but not `const` --> /home/gh-estebank/rust/library/core/src/ptr/mut_ptr.rs:2011:1 | 2011 | impl PartialEq for *mut T { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``` --- .../traits/fulfillment_errors.rs | 28 +++++++++++++++++++ .../const-traits/assoc-type.current.stderr | 4 +++ .../const-traits/assoc-type.next.stderr | 4 +++ .../const-traits/call-const-closure.stderr | 5 ++++ .../call-const-trait-method-fail.stderr | 5 ++++ .../call-generic-method-fail.stderr | 5 ++++ .../call-generic-method-nonconst.stderr | 4 +++ .../const-closure-trait-method-fail.stderr | 5 ++++ .../const-default-method-bodies.stderr | 5 ++++ .../const-drop-fail-2.precise.stderr | 4 +++ .../const-drop-fail-2.stock.stderr | 4 +++ .../const-traits/const-impl-trait.stderr | 2 ++ .../const-traits/const-opaque.no.stderr | 9 ++++++ .../const_derives/derive-const-use.stderr | 3 ++ .../const-traits/cross-crate.gatednc.stderr | 6 ++++ ...-method-body-is-const-body-checking.stderr | 4 +++ ...-method-body-is-const-same-trait-ck.stderr | 5 ++++ .../item-bound-entailment-fails.stderr | 4 +++ .../const-traits/minicore-deref-fail.stderr | 5 ++++ .../const-traits/minicore-fn-fail.stderr | 4 +++ .../no-explicit-const-params.stderr | 5 ++++ .../specializing-constness-2.stderr | 5 ++++ .../const-traits/super-traits-fail.stderr | 5 ++++ 23 files changed, 130 insertions(+) diff --git a/compiler/rustc_trait_selection/src/error_reporting/traits/fulfillment_errors.rs b/compiler/rustc_trait_selection/src/error_reporting/traits/fulfillment_errors.rs index 1ac309da101f1..1d2a803418ce7 100644 --- a/compiler/rustc_trait_selection/src/error_reporting/traits/fulfillment_errors.rs +++ b/compiler/rustc_trait_selection/src/error_reporting/traits/fulfillment_errors.rs @@ -806,6 +806,34 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> { )) { diag.downgrade_to_delayed_bug(); } + for candidate in self.find_similar_impl_candidates(trait_ref) { + let CandidateSimilarity::Exact { .. } = candidate.similarity else { continue }; + let impl_did = candidate.impl_def_id; + let trait_did = candidate.trait_ref.def_id; + let impl_span = self.tcx.def_span(impl_did); + let trait_name = self.tcx.item_name(trait_did); + + if self.tcx.is_const_trait(trait_did) && !self.tcx.is_const_trait_impl(impl_did) { + if let Some(impl_did) = impl_did.as_local() + && let item = self.tcx.hir_expect_item(impl_did) + && let hir::ItemKind::Impl(item) = item.kind + && let Some(of_trait) = item.of_trait + { + // trait is const, impl is local and not const + diag.span_suggestion_verbose( + of_trait.path.span.shrink_to_lo(), + format!("make the `impl` of trait `{trait_name}` `const`"), + "const ".to_string(), + Applicability::MachineApplicable, + ); + } else { + diag.span_note( + impl_span, + format!("trait `{trait_name}` is implemented but not `const`"), + ); + } + } + } diag } diff --git a/tests/ui/traits/const-traits/assoc-type.current.stderr b/tests/ui/traits/const-traits/assoc-type.current.stderr index 1e58efeedeea1..7fe086550f1c2 100644 --- a/tests/ui/traits/const-traits/assoc-type.current.stderr +++ b/tests/ui/traits/const-traits/assoc-type.current.stderr @@ -9,6 +9,10 @@ note: required by a bound in `Foo::Bar` | LL | type Bar: [const] Add; | ^^^^^^^^^^^ required by this bound in `Foo::Bar` +help: make the `impl` of trait `Add` `const` + | +LL | impl const Add for NonConstAdd { + | +++++ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/assoc-type.next.stderr b/tests/ui/traits/const-traits/assoc-type.next.stderr index 1e58efeedeea1..7fe086550f1c2 100644 --- a/tests/ui/traits/const-traits/assoc-type.next.stderr +++ b/tests/ui/traits/const-traits/assoc-type.next.stderr @@ -9,6 +9,10 @@ note: required by a bound in `Foo::Bar` | LL | type Bar: [const] Add; | ^^^^^^^^^^^ required by this bound in `Foo::Bar` +help: make the `impl` of trait `Add` `const` + | +LL | impl const Add for NonConstAdd { + | +++++ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/call-const-closure.stderr b/tests/ui/traits/const-traits/call-const-closure.stderr index 4bb8b2e9777e6..9de22759c2003 100644 --- a/tests/ui/traits/const-traits/call-const-closure.stderr +++ b/tests/ui/traits/const-traits/call-const-closure.stderr @@ -3,6 +3,11 @@ error[E0277]: the trait bound `(): [const] Bar` is not satisfied | LL | (const || ().foo())(); | ^^^ + | +help: make the `impl` of trait `Bar` `const` + | +LL | impl const Bar for () { + | +++++ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/call-const-trait-method-fail.stderr b/tests/ui/traits/const-traits/call-const-trait-method-fail.stderr index 4aaf53344c90a..c6f93629379ac 100644 --- a/tests/ui/traits/const-traits/call-const-trait-method-fail.stderr +++ b/tests/ui/traits/const-traits/call-const-trait-method-fail.stderr @@ -3,6 +3,11 @@ error[E0277]: the trait bound `u32: [const] Plus` is not satisfied | LL | a.plus(b) | ^ + | +help: make the `impl` of trait `Plus` `const` + | +LL | impl const Plus for u32 { + | +++++ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/call-generic-method-fail.stderr b/tests/ui/traits/const-traits/call-generic-method-fail.stderr index a2fba141f7b89..6e75730b9b513 100644 --- a/tests/ui/traits/const-traits/call-generic-method-fail.stderr +++ b/tests/ui/traits/const-traits/call-generic-method-fail.stderr @@ -3,6 +3,11 @@ error[E0277]: the trait bound `T: [const] PartialEq` is not satisfied | LL | *t == *t | ^^^^^^^^ + | +note: trait `PartialEq` is implemented but not `const` + --> $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL +note: trait `PartialEq` is implemented but not `const` + --> $SRC_DIR/core/src/ptr/mut_ptr.rs:LL:COL error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/call-generic-method-nonconst.stderr b/tests/ui/traits/const-traits/call-generic-method-nonconst.stderr index 9c1e0fee9e711..b2ec41182a83b 100644 --- a/tests/ui/traits/const-traits/call-generic-method-nonconst.stderr +++ b/tests/ui/traits/const-traits/call-generic-method-nonconst.stderr @@ -11,6 +11,10 @@ note: required by a bound in `equals_self` | LL | const fn equals_self(t: &T) -> bool { | ^^^^^^^^^^^ required by this bound in `equals_self` +help: make the `impl` of trait `Foo` `const` + | +LL | impl const Foo for S { + | +++++ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/const-closure-trait-method-fail.stderr b/tests/ui/traits/const-traits/const-closure-trait-method-fail.stderr index fddd8d10bccc4..faacc86512441 100644 --- a/tests/ui/traits/const-traits/const-closure-trait-method-fail.stderr +++ b/tests/ui/traits/const-traits/const-closure-trait-method-fail.stderr @@ -3,6 +3,11 @@ error[E0277]: the trait bound `(): const Tr` is not satisfied | LL | const _: () = assert!(need_const_closure(Tr::a) == 42); | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: make the `impl` of trait `Tr` `const` + | +LL | impl const Tr for () { + | +++++ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/const-default-method-bodies.stderr b/tests/ui/traits/const-traits/const-default-method-bodies.stderr index 03ca6f1d51155..22b6a9b5613a8 100644 --- a/tests/ui/traits/const-traits/const-default-method-bodies.stderr +++ b/tests/ui/traits/const-traits/const-default-method-bodies.stderr @@ -3,6 +3,11 @@ error[E0277]: the trait bound `NonConstImpl: [const] ConstDefaultFn` is not sati | LL | NonConstImpl.a(); | ^ + | +help: make the `impl` of trait `ConstDefaultFn` `const` + | +LL | impl const ConstDefaultFn for NonConstImpl { + | +++++ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/const-drop-fail-2.precise.stderr b/tests/ui/traits/const-traits/const-drop-fail-2.precise.stderr index c2309ea6e122e..48c8852a7b8d4 100644 --- a/tests/ui/traits/const-traits/const-drop-fail-2.precise.stderr +++ b/tests/ui/traits/const-traits/const-drop-fail-2.precise.stderr @@ -16,6 +16,10 @@ note: required by a bound in `check` | LL | const fn check(_: T) {} | ^^^^^^^^^^^^^^^^ required by this bound in `check` +help: make the `impl` of trait `A` `const` + | +LL | impl const A for NonTrivialDrop {} + | +++++ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/const-drop-fail-2.stock.stderr b/tests/ui/traits/const-traits/const-drop-fail-2.stock.stderr index c2309ea6e122e..48c8852a7b8d4 100644 --- a/tests/ui/traits/const-traits/const-drop-fail-2.stock.stderr +++ b/tests/ui/traits/const-traits/const-drop-fail-2.stock.stderr @@ -16,6 +16,10 @@ note: required by a bound in `check` | LL | const fn check(_: T) {} | ^^^^^^^^^^^^^^^^ required by this bound in `check` +help: make the `impl` of trait `A` `const` + | +LL | impl const A for NonTrivialDrop {} + | +++++ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/const-impl-trait.stderr b/tests/ui/traits/const-traits/const-impl-trait.stderr index cbb68d8c9839e..12f5aa478aced 100644 --- a/tests/ui/traits/const-traits/const-impl-trait.stderr +++ b/tests/ui/traits/const-traits/const-impl-trait.stderr @@ -6,6 +6,8 @@ LL | assert!(cmp(&())); | | | required by a bound introduced by this call | +note: trait `PartialEq` is implemented but not `const` + --> $SRC_DIR/core/src/cmp.rs:LL:COL note: required by a bound in `cmp` --> $DIR/const-impl-trait.rs:11:23 | diff --git a/tests/ui/traits/const-traits/const-opaque.no.stderr b/tests/ui/traits/const-traits/const-opaque.no.stderr index acf19ba96ab39..591b81f976745 100644 --- a/tests/ui/traits/const-traits/const-opaque.no.stderr +++ b/tests/ui/traits/const-traits/const-opaque.no.stderr @@ -11,12 +11,21 @@ note: required by a bound in `bar` | LL | const fn bar(t: T) -> impl [const] Foo { | ^^^^^^^^^^^ required by this bound in `bar` +help: make the `impl` of trait `Foo` `const` + | +LL | impl const Foo for () { + | +++++ error[E0277]: the trait bound `(): const Foo` is not satisfied --> $DIR/const-opaque.rs:33:12 | LL | opaque.method(); | ^^^^^^ + | +help: make the `impl` of trait `Foo` `const` + | +LL | impl const Foo for () { + | +++++ error: aborting due to 2 previous errors diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-use.stderr b/tests/ui/traits/const-traits/const_derives/derive-const-use.stderr index 4ea11a0c7ed91..caf72aae82add 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-use.stderr +++ b/tests/ui/traits/const-traits/const_derives/derive-const-use.stderr @@ -5,6 +5,9 @@ LL | #[derive_const(Default, PartialEq)] | --------- in this derive macro expansion LL | pub struct S((), A); | ^^ + | +note: trait `PartialEq` is implemented but not `const` + --> $SRC_DIR/core/src/cmp.rs:LL:COL error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/cross-crate.gatednc.stderr b/tests/ui/traits/const-traits/cross-crate.gatednc.stderr index 1da519151182a..fe45ff188efb4 100644 --- a/tests/ui/traits/const-traits/cross-crate.gatednc.stderr +++ b/tests/ui/traits/const-traits/cross-crate.gatednc.stderr @@ -3,6 +3,12 @@ error[E0277]: the trait bound `cross_crate::NonConst: [const] cross_crate::MyTra | LL | NonConst.func(); | ^^^^ + | +note: trait `MyTrait` is implemented but not `const` + --> $DIR/auxiliary/cross-crate.rs:12:1 + | +LL | impl MyTrait for NonConst { + | ^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/default-method-body-is-const-body-checking.stderr b/tests/ui/traits/const-traits/default-method-body-is-const-body-checking.stderr index 2e236cecfb475..3ce646ec5027f 100644 --- a/tests/ui/traits/const-traits/default-method-body-is-const-body-checking.stderr +++ b/tests/ui/traits/const-traits/default-method-body-is-const-body-checking.stderr @@ -9,6 +9,10 @@ note: required by a bound in `foo` | LL | const fn foo() where T: [const] Tr {} | ^^^^^^^^^^ required by this bound in `foo` +help: make the `impl` of trait `Tr` `const` + | +LL | impl const Tr for () {} + | +++++ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/default-method-body-is-const-same-trait-ck.stderr b/tests/ui/traits/const-traits/default-method-body-is-const-same-trait-ck.stderr index 2dc2d48461749..f473a687efcb0 100644 --- a/tests/ui/traits/const-traits/default-method-body-is-const-same-trait-ck.stderr +++ b/tests/ui/traits/const-traits/default-method-body-is-const-same-trait-ck.stderr @@ -3,6 +3,11 @@ error[E0277]: the trait bound `(): [const] Tr` is not satisfied | LL | ().a() | ^ + | +help: make the `impl` of trait `Tr` `const` + | +LL | impl const Tr for () {} + | +++++ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/item-bound-entailment-fails.stderr b/tests/ui/traits/const-traits/item-bound-entailment-fails.stderr index 8e5894a32966f..3c150c77a6916 100644 --- a/tests/ui/traits/const-traits/item-bound-entailment-fails.stderr +++ b/tests/ui/traits/const-traits/item-bound-entailment-fails.stderr @@ -9,6 +9,10 @@ note: required by a bound in `Foo::Assoc` | LL | type Assoc: [const] Bar | ^^^^^^^^^^^ required by this bound in `Foo::Assoc` +help: make the `impl` of trait `Bar` `const` + | +LL | impl const Bar for N where T: Bar {} + | +++++ error[E0277]: the trait bound `T: [const] Bar` is not satisfied --> $DIR/item-bound-entailment-fails.rs:24:21 diff --git a/tests/ui/traits/const-traits/minicore-deref-fail.stderr b/tests/ui/traits/const-traits/minicore-deref-fail.stderr index 4329b235756be..e6c087cb9d822 100644 --- a/tests/ui/traits/const-traits/minicore-deref-fail.stderr +++ b/tests/ui/traits/const-traits/minicore-deref-fail.stderr @@ -3,6 +3,11 @@ error[E0277]: the trait bound `Ty: [const] minicore::Deref` is not satisfied | LL | *Ty; | ^^^ + | +help: make the `impl` of trait `Deref` `const` + | +LL | impl const Deref for Ty { + | +++++ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/minicore-fn-fail.stderr b/tests/ui/traits/const-traits/minicore-fn-fail.stderr index c02a067774b56..eb840d421f488 100644 --- a/tests/ui/traits/const-traits/minicore-fn-fail.stderr +++ b/tests/ui/traits/const-traits/minicore-fn-fail.stderr @@ -11,6 +11,10 @@ note: required by a bound in `call_indirect` | LL | const fn call_indirect(t: &T) { t() } | ^^^^^^^^^^^^ required by this bound in `call_indirect` +help: make the `impl` of trait `Foo` `const` + | +LL | impl const Foo for () {} + | +++++ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/no-explicit-const-params.stderr b/tests/ui/traits/const-traits/no-explicit-const-params.stderr index 6955e9ab2985d..47fa65b2479be 100644 --- a/tests/ui/traits/const-traits/no-explicit-const-params.stderr +++ b/tests/ui/traits/const-traits/no-explicit-const-params.stderr @@ -59,6 +59,11 @@ error[E0277]: the trait bound `(): const Bar` is not satisfied | LL | <() as Bar>::bar(); | ^^ + | +help: make the `impl` of trait `Bar` `const` + | +LL | impl const Bar for () { + | +++++ error: aborting due to 5 previous errors diff --git a/tests/ui/traits/const-traits/specializing-constness-2.stderr b/tests/ui/traits/const-traits/specializing-constness-2.stderr index 850e6939daebc..2a34cd1c4f82d 100644 --- a/tests/ui/traits/const-traits/specializing-constness-2.stderr +++ b/tests/ui/traits/const-traits/specializing-constness-2.stderr @@ -3,6 +3,11 @@ error[E0277]: the trait bound `T: [const] A` is not satisfied | LL | ::a(); | ^ + | +help: make the `impl` of trait `A` `const` + | +LL | impl const A for T { + | +++++ error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/super-traits-fail.stderr b/tests/ui/traits/const-traits/super-traits-fail.stderr index e19aa30cf95c3..3010a5df0c31f 100644 --- a/tests/ui/traits/const-traits/super-traits-fail.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail.stderr @@ -3,6 +3,11 @@ error[E0277]: the trait bound `S: [const] Foo` is not satisfied | LL | impl const Bar for S {} | ^ + | +help: make the `impl` of trait `Foo` `const` + | +LL | impl const Foo for S { + | +++++ error: aborting due to 1 previous error From 0fc3d5f2b0ae0c959589f4291bcf670e7249c74c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Sat, 19 Jul 2025 00:40:03 +0000 Subject: [PATCH 2/6] Point at non-const trait when using them in const context Point at trait and associated item when that associated item is used in a const context. Suggest making the trait `#[const_trait]`. ``` error[E0015]: cannot call non-const method `<() as Trait>::foo` in constant functions --> $DIR/inline-incorrect-early-bound-in-ctfe.rs:26:8 | LL | ().foo(); | ^^^^^ | note: method `foo` is not const because trait `Trait` is not const --> $DIR/inline-incorrect-early-bound-in-ctfe.rs:13:1 | LL | trait Trait { | ^^^^^^^^^^^ this trait is not const LL | fn foo(self); | ------------- this method is not const = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Trait` const | LL + #[const_trait] LL | trait Trait { | ``` --- .../rustc_const_eval/src/check_consts/ops.rs | 62 ++++++++++++++++--- tests/ui/asm/non-const.stderr | 5 ++ tests/ui/borrowck/issue-64453.stderr | 2 + tests/ui/consts/const-call.stderr | 5 ++ tests/ui/consts/const-eval/format.stderr | 2 + .../const-extern-fn-call-extern-fn.stderr | 10 +++ .../consts/const-fn-not-safe-for-const.stderr | 5 ++ .../ui/consts/control-flow/issue-46843.stderr | 5 ++ tests/ui/consts/issue-16538.stderr | 5 ++ tests/ui/consts/issue-32829-2.stderr | 15 +++++ tests/ui/consts/issue-43105.stderr | 5 ++ tests/ui/consts/mir_check_nonconst.stderr | 5 ++ tests/ui/error-codes/E0015.stderr | 5 ++ tests/ui/explicit-tail-calls/constck.stderr | 10 +++ tests/ui/resolve/issue-39559-2.stderr | 24 +++++++ .../static-vec-repeat-not-constant.stderr | 5 ++ .../statics/check-values-constraints.stderr | 7 +++ .../const-check-fns-in-const-impl.stderr | 5 ++ ...nline-incorrect-early-bound-in-ctfe.stderr | 12 ++++ .../ui/traits/const-traits/issue-79450.stderr | 2 + .../ui/traits/const-traits/issue-88155.stderr | 12 ++++ .../super-traits-fail-2.nn.stderr | 12 ++++ .../super-traits-fail-2.ny.stderr | 12 ++++ .../super-traits-fail-3.nnn.stderr | 12 ++++ .../super-traits-fail-3.nny.stderr | 12 ++++ .../super-traits-fail-3.ynn.stderr | 12 ++++ .../super-traits-fail-3.yny.stderr | 12 ++++ .../typeck_type_placeholder_item.stderr | 19 ++++++ 28 files changed, 291 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_const_eval/src/check_consts/ops.rs b/compiler/rustc_const_eval/src/check_consts/ops.rs index b2e0577cc8248..ddcb999ae57d4 100644 --- a/compiler/rustc_const_eval/src/check_consts/ops.rs +++ b/compiler/rustc_const_eval/src/check_consts/ops.rs @@ -1,9 +1,10 @@ //! Concrete error types for all operations which may be invalid in a certain const context. use hir::{ConstContext, LangItem}; -use rustc_errors::Diag; use rustc_errors::codes::*; +use rustc_errors::{Applicability, Diag, MultiSpan}; use rustc_hir as hir; +use rustc_hir::def::DefKind; use rustc_hir::def_id::DefId; use rustc_infer::infer::TyCtxtInferExt; use rustc_infer::traits::{ImplSource, Obligation, ObligationCause}; @@ -355,13 +356,58 @@ fn build_error_for_const_call<'tcx>( non_or_conditionally, }) } - _ => ccx.dcx().create_err(errors::NonConstFnCall { - span, - def_descr: ccx.tcx.def_descr(callee), - def_path_str: ccx.tcx.def_path_str_with_args(callee, args), - kind: ccx.const_kind(), - non_or_conditionally, - }), + _ => { + let def_descr = ccx.tcx.def_descr(callee); + let mut err = ccx.dcx().create_err(errors::NonConstFnCall { + span, + def_descr, + def_path_str: ccx.tcx.def_path_str_with_args(callee, args), + kind: ccx.const_kind(), + non_or_conditionally, + }); + let def_kind = ccx.tcx.def_kind(callee); + if let DefKind::AssocTy | DefKind::AssocConst | DefKind::AssocFn = def_kind { + let parent = ccx.tcx.parent(callee); + if let DefKind::Trait = ccx.tcx.def_kind(parent) + && !ccx.tcx.is_const_trait(parent) + { + let assoc_span = ccx.tcx.def_span(callee); + let assoc_name = ccx.tcx.item_name(callee); + let mut span: MultiSpan = ccx.tcx.def_span(parent).into(); + span.push_span_label(assoc_span, format!("this {def_descr} is not const")); + let trait_descr = ccx.tcx.def_descr(parent); + let trait_span = ccx.tcx.def_span(parent); + let trait_name = ccx.tcx.item_name(parent); + span.push_span_label(trait_span, format!("this {trait_descr} is not const")); + err.span_note( + span, + format!( + "{def_descr} `{assoc_name}` is not const because {trait_descr} \ + `{trait_name}` is not const", + ), + ); + let indentation = ccx + .tcx + .sess + .source_map() + .indentation_before(trait_span) + .unwrap_or_default(); + err.span_suggestion_verbose( + trait_span.shrink_to_lo(), + format!("consider making trait `{trait_name}` const"), + format!("#[const_trait]\n{indentation}"), + Applicability::MachineApplicable, + ); + } + } else if ccx.tcx.constness(callee) != hir::Constness::Const { + let name = ccx.tcx.item_name(callee); + err.span_note( + ccx.tcx.def_span(callee), + format!("{def_descr} `{name}` is not const"), + ); + } + err + } }; err.note(format!( diff --git a/tests/ui/asm/non-const.stderr b/tests/ui/asm/non-const.stderr index eac4fe841bffd..d7a901ba20ee5 100644 --- a/tests/ui/asm/non-const.stderr +++ b/tests/ui/asm/non-const.stderr @@ -4,6 +4,11 @@ error[E0015]: cannot call non-const function `non_const_fn` in constants LL | global_asm!("/* {} */", const non_const_fn(0)); | ^^^^^^^^^^^^^^^ | +note: function `non_const_fn` is not const + --> $DIR/non-const.rs:8:1 + | +LL | fn non_const_fn(x: i32) -> i32 { x } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/borrowck/issue-64453.stderr b/tests/ui/borrowck/issue-64453.stderr index 8ec9a10f09f4d..29a7363705cd7 100644 --- a/tests/ui/borrowck/issue-64453.stderr +++ b/tests/ui/borrowck/issue-64453.stderr @@ -4,6 +4,8 @@ error[E0015]: cannot call non-const function `format` in statics LL | static settings_dir: String = format!(""); | ^^^^^^^^^^^ | +note: function `format` is not const + --> $SRC_DIR/alloc/src/fmt.rs:LL:COL = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `format` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/consts/const-call.stderr b/tests/ui/consts/const-call.stderr index b9dcf5addb519..cc80f73d0bb61 100644 --- a/tests/ui/consts/const-call.stderr +++ b/tests/ui/consts/const-call.stderr @@ -4,6 +4,11 @@ error[E0015]: cannot call non-const function `f` in constants LL | let _ = [0; f(2)]; | ^^^^ | +note: function `f` is not const + --> $DIR/const-call.rs:1:1 + | +LL | fn f(x: usize) -> usize { + | ^^^^^^^^^^^^^^^^^^^^^^^ = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/consts/const-eval/format.stderr b/tests/ui/consts/const-eval/format.stderr index bd50ac0bf4116..ea191eb5c0989 100644 --- a/tests/ui/consts/const-eval/format.stderr +++ b/tests/ui/consts/const-eval/format.stderr @@ -21,6 +21,8 @@ error[E0015]: cannot call non-const function `_print` in constant functions LL | println!("{:?}", 0); | ^^^^^^^^^^^^^^^^^^^ | +note: function `_print` is not const + --> $SRC_DIR/std/src/io/stdio.rs:LL:COL = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: this error originates in the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr b/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr index 1fa881cf42b6a..ac0d344d8f480 100644 --- a/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr +++ b/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr @@ -4,6 +4,11 @@ error[E0015]: cannot call non-const function `regular_in_block` in constant func LL | regular_in_block(); | ^^^^^^^^^^^^^^^^^^ | +note: function `regular_in_block` is not const + --> $DIR/const-extern-fn-call-extern-fn.rs:2:5 + | +LL | fn regular_in_block(); + | ^^^^^^^^^^^^^^^^^^^^^^ = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const function `regular` in constant functions @@ -12,6 +17,11 @@ error[E0015]: cannot call non-const function `regular` in constant functions LL | regular(); | ^^^^^^^^^ | +note: function `regular` is not const + --> $DIR/const-extern-fn-call-extern-fn.rs:12:1 + | +LL | extern "C" fn regular() {} + | ^^^^^^^^^^^^^^^^^^^^^^^ = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 2 previous errors diff --git a/tests/ui/consts/const-fn-not-safe-for-const.stderr b/tests/ui/consts/const-fn-not-safe-for-const.stderr index e8f0566e73dd8..8fd27df5367e0 100644 --- a/tests/ui/consts/const-fn-not-safe-for-const.stderr +++ b/tests/ui/consts/const-fn-not-safe-for-const.stderr @@ -4,6 +4,11 @@ error[E0015]: cannot call non-const function `random` in constant functions LL | random() | ^^^^^^^^ | +note: function `random` is not const + --> $DIR/const-fn-not-safe-for-const.rs:5:1 + | +LL | fn random() -> u32 { + | ^^^^^^^^^^^^^^^^^^ = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/consts/control-flow/issue-46843.stderr b/tests/ui/consts/control-flow/issue-46843.stderr index 42eb035647c0e..46b2a6bf1fd36 100644 --- a/tests/ui/consts/control-flow/issue-46843.stderr +++ b/tests/ui/consts/control-flow/issue-46843.stderr @@ -4,6 +4,11 @@ error[E0015]: cannot call non-const function `non_const` in constants LL | pub const Q: i32 = match non_const() { | ^^^^^^^^^^^ | +note: function `non_const` is not const + --> $DIR/issue-46843.rs:6:1 + | +LL | fn non_const() -> Thing { + | ^^^^^^^^^^^^^^^^^^^^^^^ = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/consts/issue-16538.stderr b/tests/ui/consts/issue-16538.stderr index 8bd11541a7dff..fd97b4360a468 100644 --- a/tests/ui/consts/issue-16538.stderr +++ b/tests/ui/consts/issue-16538.stderr @@ -4,6 +4,11 @@ error[E0015]: cannot call non-const function `Y::foo` in statics LL | static foo: &Y::X = &*Y::foo(Y::x as *const Y::X); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | +note: function `foo` is not const + --> $DIR/issue-16538.rs:6:5 + | +LL | pub fn foo(value: *const X) -> *const X { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` diff --git a/tests/ui/consts/issue-32829-2.stderr b/tests/ui/consts/issue-32829-2.stderr index eedd9d34e550e..b201454866ed5 100644 --- a/tests/ui/consts/issue-32829-2.stderr +++ b/tests/ui/consts/issue-32829-2.stderr @@ -4,6 +4,11 @@ error[E0015]: cannot call non-const function `invalid` in constants LL | invalid(); | ^^^^^^^^^ | +note: function `invalid` is not const + --> $DIR/issue-32829-2.rs:68:1 + | +LL | fn invalid() {} + | ^^^^^^^^^^^^ = note: calls in constants are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const function `invalid` in statics @@ -12,6 +17,11 @@ error[E0015]: cannot call non-const function `invalid` in statics LL | invalid(); | ^^^^^^^^^ | +note: function `invalid` is not const + --> $DIR/issue-32829-2.rs:68:1 + | +LL | fn invalid() {} + | ^^^^^^^^^^^^ = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` @@ -21,6 +31,11 @@ error[E0015]: cannot call non-const function `invalid` in statics LL | invalid(); | ^^^^^^^^^ | +note: function `invalid` is not const + --> $DIR/issue-32829-2.rs:68:1 + | +LL | fn invalid() {} + | ^^^^^^^^^^^^ = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` diff --git a/tests/ui/consts/issue-43105.stderr b/tests/ui/consts/issue-43105.stderr index c030c0f5fcdec..7ec0a2b73afc5 100644 --- a/tests/ui/consts/issue-43105.stderr +++ b/tests/ui/consts/issue-43105.stderr @@ -4,6 +4,11 @@ error[E0015]: cannot call non-const function `xyz` in constants LL | const NUM: u8 = xyz(); | ^^^^^ | +note: function `xyz` is not const + --> $DIR/issue-43105.rs:1:1 + | +LL | fn xyz() -> u8 { 42 } + | ^^^^^^^^^^^^^^ = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/consts/mir_check_nonconst.stderr b/tests/ui/consts/mir_check_nonconst.stderr index e930fa2103d5d..bb0940ee789b9 100644 --- a/tests/ui/consts/mir_check_nonconst.stderr +++ b/tests/ui/consts/mir_check_nonconst.stderr @@ -4,6 +4,11 @@ error[E0015]: cannot call non-const function `bar` in statics LL | static foo: Foo = bar(); | ^^^^^ | +note: function `bar` is not const + --> $DIR/mir_check_nonconst.rs:4:1 + | +LL | fn bar() -> Foo { + | ^^^^^^^^^^^^^^^ = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` diff --git a/tests/ui/error-codes/E0015.stderr b/tests/ui/error-codes/E0015.stderr index 0c983d2843492..bc457aefaecb0 100644 --- a/tests/ui/error-codes/E0015.stderr +++ b/tests/ui/error-codes/E0015.stderr @@ -4,6 +4,11 @@ error[E0015]: cannot call non-const function `create_some` in constants LL | const FOO: Option = create_some(); | ^^^^^^^^^^^^^ | +note: function `create_some` is not const + --> $DIR/E0015.rs:1:1 + | +LL | fn create_some() -> Option { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/explicit-tail-calls/constck.stderr b/tests/ui/explicit-tail-calls/constck.stderr index c223d273b383f..2fc2fb7f9338b 100644 --- a/tests/ui/explicit-tail-calls/constck.stderr +++ b/tests/ui/explicit-tail-calls/constck.stderr @@ -4,6 +4,11 @@ error[E0015]: cannot call non-const function `not_const` in constant functions LL | become not_const(); | ^^^^^^^^^^^ | +note: function `not_const` is not const + --> $DIR/constck.rs:18:1 + | +LL | fn not_const() {} + | ^^^^^^^^^^^^^^ = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const function `not_const` in constant functions @@ -12,6 +17,11 @@ error[E0015]: cannot call non-const function `not_const` in constant functions LL | become yes_const(not_const()); | ^^^^^^^^^^^ | +note: function `not_const` is not const + --> $DIR/constck.rs:18:1 + | +LL | fn not_const() {} + | ^^^^^^^^^^^^^^ = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 2 previous errors diff --git a/tests/ui/resolve/issue-39559-2.stderr b/tests/ui/resolve/issue-39559-2.stderr index f6e6917d01e6d..8b8b68c7c8c3d 100644 --- a/tests/ui/resolve/issue-39559-2.stderr +++ b/tests/ui/resolve/issue-39559-2.stderr @@ -4,7 +4,19 @@ error[E0015]: cannot call non-const associated function `::dim` in LL | let array: [usize; Dim3::dim()] | ^^^^^^^^^^^ | +note: associated function `dim` is not const because trait `Dim` is not const + --> $DIR/issue-39559-2.rs:1:1 + | +LL | trait Dim { + | ^^^^^^^^^ this trait is not const +LL | fn dim() -> usize; + | ------------------ this associated function is not const = note: calls in constants are limited to constant functions, tuple structs and tuple variants +help: consider making trait `Dim` const + | +LL + #[const_trait] +LL | trait Dim { + | error[E0015]: cannot call non-const associated function `::dim` in constants --> $DIR/issue-39559-2.rs:16:15 @@ -12,7 +24,19 @@ error[E0015]: cannot call non-const associated function `::dim` in LL | = [0; Dim3::dim()]; | ^^^^^^^^^^^ | +note: associated function `dim` is not const because trait `Dim` is not const + --> $DIR/issue-39559-2.rs:1:1 + | +LL | trait Dim { + | ^^^^^^^^^ this trait is not const +LL | fn dim() -> usize; + | ------------------ this associated function is not const = note: calls in constants are limited to constant functions, tuple structs and tuple variants +help: consider making trait `Dim` const + | +LL + #[const_trait] +LL | trait Dim { + | error: aborting due to 2 previous errors diff --git a/tests/ui/static/static-vec-repeat-not-constant.stderr b/tests/ui/static/static-vec-repeat-not-constant.stderr index e6ff199ae0198..fa4033f6a4076 100644 --- a/tests/ui/static/static-vec-repeat-not-constant.stderr +++ b/tests/ui/static/static-vec-repeat-not-constant.stderr @@ -4,6 +4,11 @@ error[E0015]: cannot call non-const function `foo` in statics LL | static a: [isize; 2] = [foo(); 2]; | ^^^^^ | +note: function `foo` is not const + --> $DIR/static-vec-repeat-not-constant.rs:1:1 + | +LL | fn foo() -> isize { 23 } + | ^^^^^^^^^^^^^^^^^ = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` diff --git a/tests/ui/statics/check-values-constraints.stderr b/tests/ui/statics/check-values-constraints.stderr index eb2d37d297e9f..c54f4830533ae 100644 --- a/tests/ui/statics/check-values-constraints.stderr +++ b/tests/ui/statics/check-values-constraints.stderr @@ -35,6 +35,13 @@ error[E0015]: cannot call non-const method `::to_string` in sta LL | field2: SafeEnum::Variant4("str".to_string()), | ^^^^^^^^^^^ | +note: method `to_string` is not const because trait `ToString` is not const + --> $SRC_DIR/alloc/src/string.rs:LL:COL + | + = note: this trait is not const + ::: $SRC_DIR/alloc/src/string.rs:LL:COL + | + = note: this method is not const = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` diff --git a/tests/ui/traits/const-traits/const-check-fns-in-const-impl.stderr b/tests/ui/traits/const-traits/const-check-fns-in-const-impl.stderr index 599a5503b0f33..1a7ec35f3ddba 100644 --- a/tests/ui/traits/const-traits/const-check-fns-in-const-impl.stderr +++ b/tests/ui/traits/const-traits/const-check-fns-in-const-impl.stderr @@ -4,6 +4,11 @@ error[E0015]: cannot call non-const function `non_const` in constant functions LL | fn foo() { non_const() } | ^^^^^^^^^^^ | +note: function `non_const` is not const + --> $DIR/const-check-fns-in-const-impl.rs:11:1 + | +LL | fn non_const() {} + | ^^^^^^^^^^^^^^ = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/inline-incorrect-early-bound-in-ctfe.stderr b/tests/ui/traits/const-traits/inline-incorrect-early-bound-in-ctfe.stderr index ad0829ff05fb0..ca73ae845550d 100644 --- a/tests/ui/traits/const-traits/inline-incorrect-early-bound-in-ctfe.stderr +++ b/tests/ui/traits/const-traits/inline-incorrect-early-bound-in-ctfe.stderr @@ -13,7 +13,19 @@ error[E0015]: cannot call non-const method `<() as Trait>::foo` in constant func LL | ().foo(); | ^^^^^ | +note: method `foo` is not const because trait `Trait` is not const + --> $DIR/inline-incorrect-early-bound-in-ctfe.rs:13:1 + | +LL | trait Trait { + | ^^^^^^^^^^^ this trait is not const +LL | fn foo(self); + | ------------- this method is not const = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants +help: consider making trait `Trait` const + | +LL + #[const_trait] +LL | trait Trait { + | error: aborting due to 2 previous errors diff --git a/tests/ui/traits/const-traits/issue-79450.stderr b/tests/ui/traits/const-traits/issue-79450.stderr index 5bdebbbfb032b..d8a9e18980687 100644 --- a/tests/ui/traits/const-traits/issue-79450.stderr +++ b/tests/ui/traits/const-traits/issue-79450.stderr @@ -4,6 +4,8 @@ error[E0015]: cannot call non-const function `_print` in constant functions LL | println!("lul"); | ^^^^^^^^^^^^^^^ | +note: function `_print` is not const + --> $SRC_DIR/std/src/io/stdio.rs:LL:COL = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: this error originates in the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/traits/const-traits/issue-88155.stderr b/tests/ui/traits/const-traits/issue-88155.stderr index 96a3c4187f5c2..4a912cc8274a7 100644 --- a/tests/ui/traits/const-traits/issue-88155.stderr +++ b/tests/ui/traits/const-traits/issue-88155.stderr @@ -4,7 +4,19 @@ error[E0015]: cannot call non-const associated function `::assoc` in con LL | T::assoc() | ^^^^^^^^^^ | +note: associated function `assoc` is not const because trait `A` is not const + --> $DIR/issue-88155.rs:3:1 + | +LL | pub trait A { + | ^^^^^^^^^^^ this trait is not const +LL | fn assoc() -> bool; + | ------------------- this associated function is not const = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants +help: consider making trait `A` const + | +LL + #[const_trait] +LL | pub trait A { + | error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/super-traits-fail-2.nn.stderr b/tests/ui/traits/const-traits/super-traits-fail-2.nn.stderr index 0ecbad64bc853..c9dc239bef334 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-2.nn.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-2.nn.stderr @@ -51,7 +51,19 @@ error[E0015]: cannot call non-const method `::a` in constant functions LL | x.a(); | ^^^ | +note: method `a` is not const because trait `Foo` is not const + --> $DIR/super-traits-fail-2.rs:6:1 + | +LL | trait Foo { + | ^^^^^^^^^ this trait is not const +LL | fn a(&self); + | ------------ this method is not const = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants +help: consider making trait `Foo` const + | +LL + #[const_trait] +LL | trait Foo { + | error: aborting due to 5 previous errors diff --git a/tests/ui/traits/const-traits/super-traits-fail-2.ny.stderr b/tests/ui/traits/const-traits/super-traits-fail-2.ny.stderr index 0e5b697d1ddef..bfbf6980ab833 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-2.ny.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-2.ny.stderr @@ -63,7 +63,19 @@ error[E0015]: cannot call non-const method `::a` in constant functions LL | x.a(); | ^^^ | +note: method `a` is not const because trait `Foo` is not const + --> $DIR/super-traits-fail-2.rs:6:1 + | +LL | trait Foo { + | ^^^^^^^^^ this trait is not const +LL | fn a(&self); + | ------------ this method is not const = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants +help: consider making trait `Foo` const + | +LL + #[const_trait] +LL | trait Foo { + | error: aborting due to 6 previous errors diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr index a0ae60526ef3f..97e79f28515d0 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr @@ -94,7 +94,19 @@ error[E0015]: cannot call non-const method `::a` in constant functions LL | x.a(); | ^^^ | +note: method `a` is not const because trait `Foo` is not const + --> $DIR/super-traits-fail-3.rs:17:1 + | +LL | trait Foo { + | ^^^^^^^^^ this trait is not const +LL | fn a(&self); + | ------------ this method is not const = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants +help: consider making trait `Foo` const + | +LL + #[const_trait] +LL | trait Foo { + | error: aborting due to 9 previous errors diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr index a0ae60526ef3f..97e79f28515d0 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr @@ -94,7 +94,19 @@ error[E0015]: cannot call non-const method `::a` in constant functions LL | x.a(); | ^^^ | +note: method `a` is not const because trait `Foo` is not const + --> $DIR/super-traits-fail-3.rs:17:1 + | +LL | trait Foo { + | ^^^^^^^^^ this trait is not const +LL | fn a(&self); + | ------------ this method is not const = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants +help: consider making trait `Foo` const + | +LL + #[const_trait] +LL | trait Foo { + | error: aborting due to 9 previous errors diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.ynn.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.ynn.stderr index c8ec77c2f0930..5951caebe7335 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.ynn.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.ynn.stderr @@ -74,7 +74,19 @@ error[E0015]: cannot call non-const method `::a` in constant functions LL | x.a(); | ^^^ | +note: method `a` is not const because trait `Foo` is not const + --> $DIR/super-traits-fail-3.rs:17:1 + | +LL | trait Foo { + | ^^^^^^^^^ this trait is not const +LL | fn a(&self); + | ------------ this method is not const = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants +help: consider making trait `Foo` const + | +LL + #[const_trait] +LL | trait Foo { + | error: aborting due to 7 previous errors diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.yny.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.yny.stderr index a820239cde012..563495204ad7b 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.yny.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.yny.stderr @@ -63,7 +63,19 @@ error[E0015]: cannot call non-const method `::a` in constant functions LL | x.a(); | ^^^ | +note: method `a` is not const because trait `Foo` is not const + --> $DIR/super-traits-fail-3.rs:17:1 + | +LL | trait Foo { + | ^^^^^^^^^ this trait is not const +LL | fn a(&self); + | ------------ this method is not const = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants +help: consider making trait `Foo` const + | +LL + #[const_trait] +LL | trait Foo { + | error: aborting due to 6 previous errors diff --git a/tests/ui/typeck/typeck_type_placeholder_item.stderr b/tests/ui/typeck/typeck_type_placeholder_item.stderr index 87750ee6dc140..76e028bcc0019 100644 --- a/tests/ui/typeck/typeck_type_placeholder_item.stderr +++ b/tests/ui/typeck/typeck_type_placeholder_item.stderr @@ -632,6 +632,11 @@ error[E0015]: cannot call non-const function `map::` in constants LL | const _: Option<_> = map(value); | ^^^^^^^^^^ | +note: function `map` is not const + --> $DIR/typeck_type_placeholder_item.rs:222:1 + | +LL | fn map(_: fn() -> Option<&'static T>) -> Option { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: calls in constants are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const method ` as Iterator>::filter::<{closure@$DIR/typeck_type_placeholder_item.rs:240:29: 240:32}>` in constants @@ -640,6 +645,13 @@ error[E0015]: cannot call non-const method ` as Iterator>:: LL | const _: _ = (1..10).filter(|x| x % 2 == 0).map(|x| x * x); | ^^^^^^^^^^^^^^^^^^^^^^ | +note: method `filter` is not const because trait `Iterator` is not const + --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL + | + = note: this trait is not const + ::: $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL + | + = note: this method is not const = note: calls in constants are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const method `, {closure@$DIR/typeck_type_placeholder_item.rs:240:29: 240:32}> as Iterator>::map::` in constants @@ -648,6 +660,13 @@ error[E0015]: cannot call non-const method `, {closu LL | const _: _ = (1..10).filter(|x| x % 2 == 0).map(|x| x * x); | ^^^^^^^^^^^^^^ | +note: method `map` is not const because trait `Iterator` is not const + --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL + | + = note: this trait is not const + ::: $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL + | + = note: this method is not const = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 83 previous errors From 8b89cb3dcbeed1baebae9a1ebecc53d4f7e99fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Sat, 19 Jul 2025 01:03:00 +0000 Subject: [PATCH 3/6] Only suggest `#[const_trait]` only on local traits --- .../rustc_const_eval/src/check_consts/ops.rs | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/compiler/rustc_const_eval/src/check_consts/ops.rs b/compiler/rustc_const_eval/src/check_consts/ops.rs index ddcb999ae57d4..a8915d76e0ee6 100644 --- a/compiler/rustc_const_eval/src/check_consts/ops.rs +++ b/compiler/rustc_const_eval/src/check_consts/ops.rs @@ -386,18 +386,20 @@ fn build_error_for_const_call<'tcx>( `{trait_name}` is not const", ), ); - let indentation = ccx - .tcx - .sess - .source_map() - .indentation_before(trait_span) - .unwrap_or_default(); - err.span_suggestion_verbose( - trait_span.shrink_to_lo(), - format!("consider making trait `{trait_name}` const"), - format!("#[const_trait]\n{indentation}"), - Applicability::MachineApplicable, - ); + if parent.is_local() { + let indentation = ccx + .tcx + .sess + .source_map() + .indentation_before(trait_span) + .unwrap_or_default(); + err.span_suggestion_verbose( + trait_span.shrink_to_lo(), + format!("consider making trait `{trait_name}` const"), + format!("#[const_trait]\n{indentation}"), + Applicability::MachineApplicable, + ); + } } } else if ccx.tcx.constness(callee) != hir::Constness::Const { let name = ccx.tcx.item_name(callee); From 90ff38bfb8aaee233e79fe54e79fe1027de756c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Sat, 19 Jul 2025 01:23:52 +0000 Subject: [PATCH 4/6] Point at the enclosing const context ``` error[E0015]: cannot call non-const associated function `Foo::{constant#0}::Foo::<17>::value` in constants --> $DIR/nested-type.rs:15:5 | LL | struct Foo; LL | | LL | | impl Foo { ... | LL | | Foo::<17>::value() | | ^^^^^^^^^^^^^^^^^^ LL | | LL | | }]>; | |_- calls in constants are limited to constant functions, tuple structs and tuple variants ``` --- .../rustc_const_eval/src/check_consts/ops.rs | 18 +++++++--- tests/ui/asm/non-const.stderr | 3 +- tests/ui/borrowck/issue-64453.stderr | 5 +-- .../ui/const-generics/nested-type.full.stderr | 15 ++++++--- .../ui/const-generics/nested-type.min.stderr | 15 ++++++--- tests/ui/consts/const-call.stderr | 3 +- tests/ui/consts/const-eval/format.stderr | 3 +- .../const-extern-fn-call-extern-fn.stderr | 8 +++-- .../consts/const-fn-not-safe-for-const.stderr | 3 +- .../ui/consts/control-flow/issue-46843.stderr | 5 +-- tests/ui/consts/issue-16538.stderr | 5 +-- tests/ui/consts/issue-32829-2.stderr | 12 +++++-- tests/ui/consts/issue-43105.stderr | 5 +-- .../min_const_fn/bad_const_fn_body_ice.stderr | 3 +- tests/ui/consts/mir_check_nonconst.stderr | 5 +-- tests/ui/error-codes/E0010-teach.stderr | 5 +-- tests/ui/error-codes/E0010.stderr | 5 +-- tests/ui/error-codes/E0015.stderr | 5 +-- tests/ui/explicit-tail-calls/constck.stderr | 8 +++-- tests/ui/issues/issue-7364.stderr | 5 +-- tests/ui/resolve/issue-39559-2.stderr | 6 ++-- .../ui/static/static-mut-not-constant.stderr | 5 +-- .../static-vec-repeat-not-constant.stderr | 5 +-- .../statics/check-values-constraints.stderr | 33 ++++++++++++------- .../const-check-fns-in-const-impl.stderr | 5 +-- .../const_derives/derive-const-gate.stderr | 4 +-- .../derive-const-non-const-type.stderr | 4 +-- .../const-traits/cross-crate.stock.stderr | 4 ++- .../const-traits/cross-crate.stocknc.stderr | 9 +++-- ...nline-incorrect-early-bound-in-ctfe.stderr | 3 +- .../ui/traits/const-traits/issue-79450.stderr | 3 +- .../ui/traits/const-traits/issue-88155.stderr | 3 +- .../const-traits/staged-api-user-crate.stderr | 3 +- .../const-traits/std-impl-gate.stock.stderr | 3 +- .../super-traits-fail-2.nn.stderr | 3 +- .../super-traits-fail-2.ny.stderr | 3 +- .../super-traits-fail-3.nnn.stderr | 4 ++- .../super-traits-fail-3.nny.stderr | 4 ++- .../super-traits-fail-3.nyn.stderr | 4 ++- .../super-traits-fail-3.nyy.stderr | 4 ++- .../super-traits-fail-3.ynn.stderr | 4 ++- .../super-traits-fail-3.yny.stderr | 4 ++- .../typeck_type_placeholder_item.stderr | 15 +++++---- 43 files changed, 176 insertions(+), 95 deletions(-) diff --git a/compiler/rustc_const_eval/src/check_consts/ops.rs b/compiler/rustc_const_eval/src/check_consts/ops.rs index a8915d76e0ee6..45ec3a838ace8 100644 --- a/compiler/rustc_const_eval/src/check_consts/ops.rs +++ b/compiler/rustc_const_eval/src/check_consts/ops.rs @@ -212,6 +212,7 @@ fn build_error_for_const_call<'tcx>( debug!(?call_kind); + let mut note = true; let mut err = match call_kind { CallKind::Normal { desugaring: Some((kind, self_ty)), .. } => { macro_rules! error { @@ -365,6 +366,12 @@ fn build_error_for_const_call<'tcx>( kind: ccx.const_kind(), non_or_conditionally, }); + let context_span = ccx.tcx.def_span(ccx.def_id()); + err.span_label(context_span, format!( + "calls in {}s are limited to constant functions, tuple structs and tuple variants", + ccx.const_kind(), + )); + note = false; let def_kind = ccx.tcx.def_kind(callee); if let DefKind::AssocTy | DefKind::AssocConst | DefKind::AssocFn = def_kind { let parent = ccx.tcx.parent(callee); @@ -412,11 +419,12 @@ fn build_error_for_const_call<'tcx>( } }; - err.note(format!( - "calls in {}s are limited to constant functions, \ - tuple structs and tuple variants", - ccx.const_kind(), - )); + if note { + err.note(format!( + "calls in {}s are limited to constant functions, tuple structs and tuple variants", + ccx.const_kind(), + )); + } err } diff --git a/tests/ui/asm/non-const.stderr b/tests/ui/asm/non-const.stderr index d7a901ba20ee5..da881a12f120f 100644 --- a/tests/ui/asm/non-const.stderr +++ b/tests/ui/asm/non-const.stderr @@ -2,14 +2,13 @@ error[E0015]: cannot call non-const function `non_const_fn` in constants --> $DIR/non-const.rs:10:31 | LL | global_asm!("/* {} */", const non_const_fn(0)); - | ^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^ calls in constants are limited to constant functions, tuple structs and tuple variants | note: function `non_const_fn` is not const --> $DIR/non-const.rs:8:1 | LL | fn non_const_fn(x: i32) -> i32 { x } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/borrowck/issue-64453.stderr b/tests/ui/borrowck/issue-64453.stderr index 29a7363705cd7..47d9082765555 100644 --- a/tests/ui/borrowck/issue-64453.stderr +++ b/tests/ui/borrowck/issue-64453.stderr @@ -2,11 +2,12 @@ error[E0015]: cannot call non-const function `format` in statics --> $DIR/issue-64453.rs:4:31 | LL | static settings_dir: String = format!(""); - | ^^^^^^^^^^^ + | --------------------------- ^^^^^^^^^^^ + | | + | calls in statics are limited to constant functions, tuple structs and tuple variants | note: function `format` is not const --> $SRC_DIR/alloc/src/fmt.rs:LL:COL - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `format` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/const-generics/nested-type.full.stderr b/tests/ui/const-generics/nested-type.full.stderr index e5a1f230380d3..587de095452d1 100644 --- a/tests/ui/const-generics/nested-type.full.stderr +++ b/tests/ui/const-generics/nested-type.full.stderr @@ -1,10 +1,17 @@ error[E0015]: cannot call non-const associated function `Foo::{constant#0}::Foo::<17>::value` in constants --> $DIR/nested-type.rs:15:5 | -LL | Foo::<17>::value() - | ^^^^^^^^^^^^^^^^^^ - | - = note: calls in constants are limited to constant functions, tuple structs and tuple variants +LL | struct Foo; +LL | | +LL | | impl Foo { +... | +LL | | Foo::<17>::value() + | | ^^^^^^^^^^^^^^^^^^ +LL | | +LL | | }]>; + | |_- calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/const-generics/nested-type.min.stderr b/tests/ui/const-generics/nested-type.min.stderr index 8282acd4ea7b1..e7d21f8a98949 100644 --- a/tests/ui/const-generics/nested-type.min.stderr +++ b/tests/ui/const-generics/nested-type.min.stderr @@ -1,10 +1,17 @@ error[E0015]: cannot call non-const associated function `Foo::{constant#0}::Foo::<17>::value` in constants --> $DIR/nested-type.rs:15:5 | -LL | Foo::<17>::value() - | ^^^^^^^^^^^^^^^^^^ - | - = note: calls in constants are limited to constant functions, tuple structs and tuple variants +LL | struct Foo; +LL | | +LL | | impl Foo { +... | +LL | | Foo::<17>::value() + | | ^^^^^^^^^^^^^^^^^^ +LL | | +LL | | }]>; + | |_- calls in constants are limited to constant functions, tuple structs and tuple variants error: `[u8; { struct Foo; diff --git a/tests/ui/consts/const-call.stderr b/tests/ui/consts/const-call.stderr index cc80f73d0bb61..db375f80b6c67 100644 --- a/tests/ui/consts/const-call.stderr +++ b/tests/ui/consts/const-call.stderr @@ -2,14 +2,13 @@ error[E0015]: cannot call non-const function `f` in constants --> $DIR/const-call.rs:6:17 | LL | let _ = [0; f(2)]; - | ^^^^ + | ^^^^ calls in constants are limited to constant functions, tuple structs and tuple variants | note: function `f` is not const --> $DIR/const-call.rs:1:1 | LL | fn f(x: usize) -> usize { | ^^^^^^^^^^^^^^^^^^^^^^^ - = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/consts/const-eval/format.stderr b/tests/ui/consts/const-eval/format.stderr index ea191eb5c0989..97b4436a058ee 100644 --- a/tests/ui/consts/const-eval/format.stderr +++ b/tests/ui/consts/const-eval/format.stderr @@ -18,12 +18,13 @@ LL | println!("{:?}", 0); error[E0015]: cannot call non-const function `_print` in constant functions --> $DIR/format.rs:7:5 | +LL | const fn print() { + | ---------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | println!("{:?}", 0); | ^^^^^^^^^^^^^^^^^^^ | note: function `_print` is not const --> $SRC_DIR/std/src/io/stdio.rs:LL:COL - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: this error originates in the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info) error[E0015]: cannot call non-const formatting macro in constant functions diff --git a/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr b/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr index ac0d344d8f480..8f07e038e1994 100644 --- a/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr +++ b/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr @@ -1,6 +1,9 @@ error[E0015]: cannot call non-const function `regular_in_block` in constant functions --> $DIR/const-extern-fn-call-extern-fn.rs:7:9 | +LL | const extern "C" fn bar() { + | ------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants +LL | unsafe { LL | regular_in_block(); | ^^^^^^^^^^^^^^^^^^ | @@ -9,11 +12,13 @@ note: function `regular_in_block` is not const | LL | fn regular_in_block(); | ^^^^^^^^^^^^^^^^^^^^^^ - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const function `regular` in constant functions --> $DIR/const-extern-fn-call-extern-fn.rs:16:9 | +LL | const extern "C" fn foo() { + | ------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants +LL | unsafe { LL | regular(); | ^^^^^^^^^ | @@ -22,7 +27,6 @@ note: function `regular` is not const | LL | extern "C" fn regular() {} | ^^^^^^^^^^^^^^^^^^^^^^^ - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 2 previous errors diff --git a/tests/ui/consts/const-fn-not-safe-for-const.stderr b/tests/ui/consts/const-fn-not-safe-for-const.stderr index 8fd27df5367e0..068c06601c8b6 100644 --- a/tests/ui/consts/const-fn-not-safe-for-const.stderr +++ b/tests/ui/consts/const-fn-not-safe-for-const.stderr @@ -1,6 +1,8 @@ error[E0015]: cannot call non-const function `random` in constant functions --> $DIR/const-fn-not-safe-for-const.rs:14:5 | +LL | const fn sub1() -> u32 { + | ---------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | random() | ^^^^^^^^ | @@ -9,7 +11,6 @@ note: function `random` is not const | LL | fn random() -> u32 { | ^^^^^^^^^^^^^^^^^^ - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/consts/control-flow/issue-46843.stderr b/tests/ui/consts/control-flow/issue-46843.stderr index 46b2a6bf1fd36..310c860f59b45 100644 --- a/tests/ui/consts/control-flow/issue-46843.stderr +++ b/tests/ui/consts/control-flow/issue-46843.stderr @@ -2,14 +2,15 @@ error[E0015]: cannot call non-const function `non_const` in constants --> $DIR/issue-46843.rs:10:26 | LL | pub const Q: i32 = match non_const() { - | ^^^^^^^^^^^ + | ---------------- ^^^^^^^^^^^ + | | + | calls in constants are limited to constant functions, tuple structs and tuple variants | note: function `non_const` is not const --> $DIR/issue-46843.rs:6:1 | LL | fn non_const() -> Thing { | ^^^^^^^^^^^^^^^^^^^^^^^ - = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/consts/issue-16538.stderr b/tests/ui/consts/issue-16538.stderr index fd97b4360a468..e78d95dcd186f 100644 --- a/tests/ui/consts/issue-16538.stderr +++ b/tests/ui/consts/issue-16538.stderr @@ -2,14 +2,15 @@ error[E0015]: cannot call non-const function `Y::foo` in statics --> $DIR/issue-16538.rs:11:23 | LL | static foo: &Y::X = &*Y::foo(Y::x as *const Y::X); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ----------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | | + | calls in statics are limited to constant functions, tuple structs and tuple variants | note: function `foo` is not const --> $DIR/issue-16538.rs:6:5 | LL | pub fn foo(value: *const X) -> *const X { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error[E0133]: dereference of raw pointer is unsafe and requires unsafe function or block diff --git a/tests/ui/consts/issue-32829-2.stderr b/tests/ui/consts/issue-32829-2.stderr index b201454866ed5..52398af41eeef 100644 --- a/tests/ui/consts/issue-32829-2.stderr +++ b/tests/ui/consts/issue-32829-2.stderr @@ -1,6 +1,9 @@ error[E0015]: cannot call non-const function `invalid` in constants --> $DIR/issue-32829-2.rs:10:9 | +LL | const bad_two : u32 = { + | ------------------- calls in constants are limited to constant functions, tuple structs and tuple variants +LL | { LL | invalid(); | ^^^^^^^^^ | @@ -9,11 +12,13 @@ note: function `invalid` is not const | LL | fn invalid() {} | ^^^^^^^^^^^^ - = note: calls in constants are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const function `invalid` in statics --> $DIR/issue-32829-2.rs:32:9 | +LL | static bad_five : u32 = { + | --------------------- calls in statics are limited to constant functions, tuple structs and tuple variants +LL | { LL | invalid(); | ^^^^^^^^^ | @@ -22,12 +27,14 @@ note: function `invalid` is not const | LL | fn invalid() {} | ^^^^^^^^^^^^ - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error[E0015]: cannot call non-const function `invalid` in statics --> $DIR/issue-32829-2.rs:54:9 | +LL | static mut bad_eight : u32 = { + | -------------------------- calls in statics are limited to constant functions, tuple structs and tuple variants +LL | { LL | invalid(); | ^^^^^^^^^ | @@ -36,7 +43,6 @@ note: function `invalid` is not const | LL | fn invalid() {} | ^^^^^^^^^^^^ - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error: aborting due to 3 previous errors diff --git a/tests/ui/consts/issue-43105.stderr b/tests/ui/consts/issue-43105.stderr index 7ec0a2b73afc5..442fbdd107fab 100644 --- a/tests/ui/consts/issue-43105.stderr +++ b/tests/ui/consts/issue-43105.stderr @@ -2,14 +2,15 @@ error[E0015]: cannot call non-const function `xyz` in constants --> $DIR/issue-43105.rs:3:17 | LL | const NUM: u8 = xyz(); - | ^^^^^ + | ------------- ^^^^^ + | | + | calls in constants are limited to constant functions, tuple structs and tuple variants | note: function `xyz` is not const --> $DIR/issue-43105.rs:1:1 | LL | fn xyz() -> u8 { 42 } | ^^^^^^^^^^^^^^ - = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/consts/min_const_fn/bad_const_fn_body_ice.stderr b/tests/ui/consts/min_const_fn/bad_const_fn_body_ice.stderr index 8e52a7aa35e1e..c65abc530bc2b 100644 --- a/tests/ui/consts/min_const_fn/bad_const_fn_body_ice.stderr +++ b/tests/ui/consts/min_const_fn/bad_const_fn_body_ice.stderr @@ -9,10 +9,11 @@ LL | vec![1, 2, 3] error[E0015]: cannot call non-const method `slice::::into_vec::` in constant functions --> $DIR/bad_const_fn_body_ice.rs:2:5 | +LL | const fn foo(a: i32) -> Vec { + | -------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | vec![1, 2, 3] | ^^^^^^^^^^^^^ | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 2 previous errors diff --git a/tests/ui/consts/mir_check_nonconst.stderr b/tests/ui/consts/mir_check_nonconst.stderr index bb0940ee789b9..ad2056a737078 100644 --- a/tests/ui/consts/mir_check_nonconst.stderr +++ b/tests/ui/consts/mir_check_nonconst.stderr @@ -2,14 +2,15 @@ error[E0015]: cannot call non-const function `bar` in statics --> $DIR/mir_check_nonconst.rs:8:19 | LL | static foo: Foo = bar(); - | ^^^^^ + | --------------- ^^^^^ + | | + | calls in statics are limited to constant functions, tuple structs and tuple variants | note: function `bar` is not const --> $DIR/mir_check_nonconst.rs:4:1 | LL | fn bar() -> Foo { | ^^^^^^^^^^^^^^^ - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error: aborting due to 1 previous error diff --git a/tests/ui/error-codes/E0010-teach.stderr b/tests/ui/error-codes/E0010-teach.stderr index 82bbe01aef792..237efbefcf6ef 100644 --- a/tests/ui/error-codes/E0010-teach.stderr +++ b/tests/ui/error-codes/E0010-teach.stderr @@ -11,9 +11,10 @@ error[E0015]: cannot call non-const method `slice::::into_vec:: $DIR/E0010-teach.rs:5:23 | LL | const CON: Vec = vec![1, 2, 3]; - | ^^^^^^^^^^^^^ + | ------------------- ^^^^^^^^^^^^^ + | | + | calls in constants are limited to constant functions, tuple structs and tuple variants | - = note: calls in constants are limited to constant functions, tuple structs and tuple variants = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 2 previous errors diff --git a/tests/ui/error-codes/E0010.stderr b/tests/ui/error-codes/E0010.stderr index 87b722b5f6566..2bb87118d242d 100644 --- a/tests/ui/error-codes/E0010.stderr +++ b/tests/ui/error-codes/E0010.stderr @@ -10,9 +10,10 @@ error[E0015]: cannot call non-const method `slice::::into_vec:: $DIR/E0010.rs:3:23 | LL | const CON: Vec = vec![1, 2, 3]; - | ^^^^^^^^^^^^^ + | ------------------- ^^^^^^^^^^^^^ + | | + | calls in constants are limited to constant functions, tuple structs and tuple variants | - = note: calls in constants are limited to constant functions, tuple structs and tuple variants = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 2 previous errors diff --git a/tests/ui/error-codes/E0015.stderr b/tests/ui/error-codes/E0015.stderr index bc457aefaecb0..4331d7c34b3ca 100644 --- a/tests/ui/error-codes/E0015.stderr +++ b/tests/ui/error-codes/E0015.stderr @@ -2,14 +2,15 @@ error[E0015]: cannot call non-const function `create_some` in constants --> $DIR/E0015.rs:5:25 | LL | const FOO: Option = create_some(); - | ^^^^^^^^^^^^^ + | --------------------- ^^^^^^^^^^^^^ + | | + | calls in constants are limited to constant functions, tuple structs and tuple variants | note: function `create_some` is not const --> $DIR/E0015.rs:1:1 | LL | fn create_some() -> Option { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/explicit-tail-calls/constck.stderr b/tests/ui/explicit-tail-calls/constck.stderr index 2fc2fb7f9338b..84d7bc3a1bf13 100644 --- a/tests/ui/explicit-tail-calls/constck.stderr +++ b/tests/ui/explicit-tail-calls/constck.stderr @@ -1,6 +1,9 @@ error[E0015]: cannot call non-const function `not_const` in constant functions --> $DIR/constck.rs:6:16 | +LL | const fn f() { + | ------------ calls in constant functions are limited to constant functions, tuple structs and tuple variants +LL | if false { LL | become not_const(); | ^^^^^^^^^^^ | @@ -9,11 +12,13 @@ note: function `not_const` is not const | LL | fn not_const() {} | ^^^^^^^^^^^^^^ - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const function `not_const` in constant functions --> $DIR/constck.rs:13:26 | +LL | const fn g((): ()) { + | ------------------ calls in constant functions are limited to constant functions, tuple structs and tuple variants +LL | if false { LL | become yes_const(not_const()); | ^^^^^^^^^^^ | @@ -22,7 +27,6 @@ note: function `not_const` is not const | LL | fn not_const() {} | ^^^^^^^^^^^^^^ - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 2 previous errors diff --git a/tests/ui/issues/issue-7364.stderr b/tests/ui/issues/issue-7364.stderr index a47a90c90ce16..fc442a62501fe 100644 --- a/tests/ui/issues/issue-7364.stderr +++ b/tests/ui/issues/issue-7364.stderr @@ -15,9 +15,10 @@ error[E0015]: cannot call non-const associated function `Box::>:: --> $DIR/issue-7364.rs:4:37 | LL | static boxed: Box> = Box::new(RefCell::new(0)); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | --------------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^ + | | + | calls in statics are limited to constant functions, tuple structs and tuple variants | - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error: aborting due to 2 previous errors diff --git a/tests/ui/resolve/issue-39559-2.stderr b/tests/ui/resolve/issue-39559-2.stderr index 8b8b68c7c8c3d..8c19fb23d8e9a 100644 --- a/tests/ui/resolve/issue-39559-2.stderr +++ b/tests/ui/resolve/issue-39559-2.stderr @@ -2,7 +2,7 @@ error[E0015]: cannot call non-const associated function `::dim` in --> $DIR/issue-39559-2.rs:14:24 | LL | let array: [usize; Dim3::dim()] - | ^^^^^^^^^^^ + | ^^^^^^^^^^^ calls in constants are limited to constant functions, tuple structs and tuple variants | note: associated function `dim` is not const because trait `Dim` is not const --> $DIR/issue-39559-2.rs:1:1 @@ -11,7 +11,6 @@ LL | trait Dim { | ^^^^^^^^^ this trait is not const LL | fn dim() -> usize; | ------------------ this associated function is not const - = note: calls in constants are limited to constant functions, tuple structs and tuple variants help: consider making trait `Dim` const | LL + #[const_trait] @@ -22,7 +21,7 @@ error[E0015]: cannot call non-const associated function `::dim` in --> $DIR/issue-39559-2.rs:16:15 | LL | = [0; Dim3::dim()]; - | ^^^^^^^^^^^ + | ^^^^^^^^^^^ calls in constants are limited to constant functions, tuple structs and tuple variants | note: associated function `dim` is not const because trait `Dim` is not const --> $DIR/issue-39559-2.rs:1:1 @@ -31,7 +30,6 @@ LL | trait Dim { | ^^^^^^^^^ this trait is not const LL | fn dim() -> usize; | ------------------ this associated function is not const - = note: calls in constants are limited to constant functions, tuple structs and tuple variants help: consider making trait `Dim` const | LL + #[const_trait] diff --git a/tests/ui/static/static-mut-not-constant.stderr b/tests/ui/static/static-mut-not-constant.stderr index f28ea0b1689ab..7e64d36b26d17 100644 --- a/tests/ui/static/static-mut-not-constant.stderr +++ b/tests/ui/static/static-mut-not-constant.stderr @@ -2,9 +2,10 @@ error[E0015]: cannot call non-const associated function `Box::::new` in s --> $DIR/static-mut-not-constant.rs:1:28 | LL | static mut a: Box = Box::new(3); - | ^^^^^^^^^^^ + | ------------------------ ^^^^^^^^^^^ + | | + | calls in statics are limited to constant functions, tuple structs and tuple variants | - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error: aborting due to 1 previous error diff --git a/tests/ui/static/static-vec-repeat-not-constant.stderr b/tests/ui/static/static-vec-repeat-not-constant.stderr index fa4033f6a4076..24f0986ccc494 100644 --- a/tests/ui/static/static-vec-repeat-not-constant.stderr +++ b/tests/ui/static/static-vec-repeat-not-constant.stderr @@ -2,14 +2,15 @@ error[E0015]: cannot call non-const function `foo` in statics --> $DIR/static-vec-repeat-not-constant.rs:3:25 | LL | static a: [isize; 2] = [foo(); 2]; - | ^^^^^ + | -------------------- ^^^^^ + | | + | calls in statics are limited to constant functions, tuple structs and tuple variants | note: function `foo` is not const --> $DIR/static-vec-repeat-not-constant.rs:1:1 | LL | fn foo() -> isize { 23 } | ^^^^^^^^^^^^^^^^^ - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error: aborting due to 1 previous error diff --git a/tests/ui/statics/check-values-constraints.stderr b/tests/ui/statics/check-values-constraints.stderr index c54f4830533ae..dfbb1f6e985c3 100644 --- a/tests/ui/statics/check-values-constraints.stderr +++ b/tests/ui/statics/check-values-constraints.stderr @@ -23,15 +23,19 @@ error[E0015]: cannot call non-const method `slice::::into_vec::< --> $DIR/check-values-constraints.rs:81:33 | LL | static STATIC11: Vec = vec![MyOwned]; - | ^^^^^^^^^^^^^ + | ----------------------------- ^^^^^^^^^^^^^ + | | + | calls in statics are limited to constant functions, tuple structs and tuple variants | - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) error[E0015]: cannot call non-const method `::to_string` in statics --> $DIR/check-values-constraints.rs:92:38 | +LL | static mut STATIC14: SafeStruct = SafeStruct { + | ------------------------------- calls in statics are limited to constant functions, tuple structs and tuple variants +LL | field1: SafeEnum::Variant1, LL | field2: SafeEnum::Variant4("str".to_string()), | ^^^^^^^^^^^ | @@ -42,7 +46,6 @@ note: method `to_string` is not const because trait `ToString` is not const ::: $SRC_DIR/alloc/src/string.rs:LL:COL | = note: this method is not const - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error[E0010]: allocations are not allowed in statics @@ -56,10 +59,11 @@ LL | vec![MyOwned], error[E0015]: cannot call non-const method `slice::::into_vec::` in statics --> $DIR/check-values-constraints.rs:96:5 | +LL | static STATIC15: &'static [Vec] = &[ + | ---------------------------------------- calls in statics are limited to constant functions, tuple structs and tuple variants LL | vec![MyOwned], | ^^^^^^^^^^^^^ | - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -74,10 +78,12 @@ LL | vec![MyOwned], error[E0015]: cannot call non-const method `slice::::into_vec::` in statics --> $DIR/check-values-constraints.rs:98:5 | +LL | static STATIC15: &'static [Vec] = &[ + | ---------------------------------------- calls in statics are limited to constant functions, tuple structs and tuple variants +... LL | vec![MyOwned], | ^^^^^^^^^^^^^ | - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -92,10 +98,11 @@ LL | &vec![MyOwned], error[E0015]: cannot call non-const method `slice::::into_vec::` in statics --> $DIR/check-values-constraints.rs:103:6 | +LL | static STATIC16: (&'static Vec, &'static Vec) = ( + | --------------------------------------------------------------- calls in statics are limited to constant functions, tuple structs and tuple variants LL | &vec![MyOwned], | ^^^^^^^^^^^^^ | - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -110,10 +117,12 @@ LL | &vec![MyOwned], error[E0015]: cannot call non-const method `slice::::into_vec::` in statics --> $DIR/check-values-constraints.rs:105:6 | +LL | static STATIC16: (&'static Vec, &'static Vec) = ( + | --------------------------------------------------------------- calls in statics are limited to constant functions, tuple structs and tuple variants +... LL | &vec![MyOwned], | ^^^^^^^^^^^^^ | - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -129,9 +138,10 @@ error[E0015]: cannot call non-const method `slice::::into_vec:: $DIR/check-values-constraints.rs:111:31 | LL | static STATIC19: Vec = vec![3]; - | ^^^^^^^ + | --------------------------- ^^^^^^^ + | | + | calls in statics are limited to constant functions, tuple structs and tuple variants | - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -147,9 +157,10 @@ error[E0015]: cannot call non-const method `slice::::into_vec:: $DIR/check-values-constraints.rs:117:32 | LL | static x: Vec = vec![3]; - | ^^^^^^^ + | -------------------- ^^^^^^^ + | | + | calls in statics are limited to constant functions, tuple structs and tuple variants | - = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/traits/const-traits/const-check-fns-in-const-impl.stderr b/tests/ui/traits/const-traits/const-check-fns-in-const-impl.stderr index 1a7ec35f3ddba..70704780ddce7 100644 --- a/tests/ui/traits/const-traits/const-check-fns-in-const-impl.stderr +++ b/tests/ui/traits/const-traits/const-check-fns-in-const-impl.stderr @@ -2,14 +2,15 @@ error[E0015]: cannot call non-const function `non_const` in constant functions --> $DIR/const-check-fns-in-const-impl.rs:14:16 | LL | fn foo() { non_const() } - | ^^^^^^^^^^^ + | -------- ^^^^^^^^^^^ + | | + | calls in constant functions are limited to constant functions, tuple structs and tuple variants | note: function `non_const` is not const --> $DIR/const-check-fns-in-const-impl.rs:11:1 | LL | fn non_const() {} | ^^^^^^^^^^^^^^ - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-gate.stderr b/tests/ui/traits/const-traits/const_derives/derive-const-gate.stderr index cbc62d602a473..ac393825ec720 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-gate.stderr +++ b/tests/ui/traits/const-traits/const_derives/derive-const-gate.stderr @@ -21,9 +21,7 @@ error[E0015]: cannot call non-const method `Formatter::<'_>::write_str` in const --> $DIR/derive-const-gate.rs:1:16 | LL | #[derive_const(Debug)] - | ^^^^^ - | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants + | ^^^^^ calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 3 previous errors diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr b/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr index 93638801895da..9f620fcf81b7c 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr +++ b/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr @@ -11,9 +11,7 @@ error[E0015]: cannot call non-const method `Formatter::<'_>::debug_tuple_field1_ --> $DIR/derive-const-non-const-type.rs:12:16 | LL | #[derive_const(Debug)] - | ^^^^^ - | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants + | ^^^^^ calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 2 previous errors diff --git a/tests/ui/traits/const-traits/cross-crate.stock.stderr b/tests/ui/traits/const-traits/cross-crate.stock.stderr index 44a60c99ae9ea..89278ff56ad0c 100644 --- a/tests/ui/traits/const-traits/cross-crate.stock.stderr +++ b/tests/ui/traits/const-traits/cross-crate.stock.stderr @@ -1,10 +1,12 @@ error[E0658]: cannot call conditionally-const method `::func` in constant functions --> $DIR/cross-crate.rs:22:11 | +LL | const fn const_context() { + | ------------------------ calls in constant functions are limited to constant functions, tuple structs and tuple variants +... LL | Const.func(); | ^^^^^^ | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: see issue #143874 for more information = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date diff --git a/tests/ui/traits/const-traits/cross-crate.stocknc.stderr b/tests/ui/traits/const-traits/cross-crate.stocknc.stderr index 766c20aa8211f..6269e74fd1d2b 100644 --- a/tests/ui/traits/const-traits/cross-crate.stocknc.stderr +++ b/tests/ui/traits/const-traits/cross-crate.stocknc.stderr @@ -1,18 +1,21 @@ error[E0015]: cannot call non-const method `::func` in constant functions --> $DIR/cross-crate.rs:19:14 | +LL | const fn const_context() { + | ------------------------ calls in constant functions are limited to constant functions, tuple structs and tuple variants +LL | #[cfg(any(stocknc, gatednc))] LL | NonConst.func(); | ^^^^^^ - | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error[E0658]: cannot call conditionally-const method `::func` in constant functions --> $DIR/cross-crate.rs:22:11 | +LL | const fn const_context() { + | ------------------------ calls in constant functions are limited to constant functions, tuple structs and tuple variants +... LL | Const.func(); | ^^^^^^ | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: see issue #143874 for more information = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date diff --git a/tests/ui/traits/const-traits/inline-incorrect-early-bound-in-ctfe.stderr b/tests/ui/traits/const-traits/inline-incorrect-early-bound-in-ctfe.stderr index ca73ae845550d..092a5ac05b823 100644 --- a/tests/ui/traits/const-traits/inline-incorrect-early-bound-in-ctfe.stderr +++ b/tests/ui/traits/const-traits/inline-incorrect-early-bound-in-ctfe.stderr @@ -10,6 +10,8 @@ LL | fn foo(self) { error[E0015]: cannot call non-const method `<() as Trait>::foo` in constant functions --> $DIR/inline-incorrect-early-bound-in-ctfe.rs:26:8 | +LL | const fn foo() { + | -------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | ().foo(); | ^^^^^ | @@ -20,7 +22,6 @@ LL | trait Trait { | ^^^^^^^^^^^ this trait is not const LL | fn foo(self); | ------------- this method is not const - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Trait` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/issue-79450.stderr b/tests/ui/traits/const-traits/issue-79450.stderr index d8a9e18980687..dd78b464e7825 100644 --- a/tests/ui/traits/const-traits/issue-79450.stderr +++ b/tests/ui/traits/const-traits/issue-79450.stderr @@ -1,12 +1,13 @@ error[E0015]: cannot call non-const function `_print` in constant functions --> $DIR/issue-79450.rs:9:9 | +LL | fn prov(&self) { + | -------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | println!("lul"); | ^^^^^^^^^^^^^^^ | note: function `_print` is not const --> $SRC_DIR/std/src/io/stdio.rs:LL:COL - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: this error originates in the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/issue-88155.stderr b/tests/ui/traits/const-traits/issue-88155.stderr index 4a912cc8274a7..2df4a0004b6a6 100644 --- a/tests/ui/traits/const-traits/issue-88155.stderr +++ b/tests/ui/traits/const-traits/issue-88155.stderr @@ -1,6 +1,8 @@ error[E0015]: cannot call non-const associated function `::assoc` in constant functions --> $DIR/issue-88155.rs:8:5 | +LL | pub const fn foo() -> bool { + | -------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | T::assoc() | ^^^^^^^^^^ | @@ -11,7 +13,6 @@ LL | pub trait A { | ^^^^^^^^^^^ this trait is not const LL | fn assoc() -> bool; | ------------------- this associated function is not const - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `A` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/staged-api-user-crate.stderr b/tests/ui/traits/const-traits/staged-api-user-crate.stderr index 81611da9e748c..1baa8b308284e 100644 --- a/tests/ui/traits/const-traits/staged-api-user-crate.stderr +++ b/tests/ui/traits/const-traits/staged-api-user-crate.stderr @@ -1,10 +1,11 @@ error[E0658]: cannot call conditionally-const associated function `::func` in constant functions --> $DIR/staged-api-user-crate.rs:12:5 | +LL | const fn stable_const_context() { + | ------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | Unstable::func(); | ^^^^^^^^^^^^^^^^ | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: see issue #143874 for more information = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date diff --git a/tests/ui/traits/const-traits/std-impl-gate.stock.stderr b/tests/ui/traits/const-traits/std-impl-gate.stock.stderr index 261f68bebdb25..3f40f602eefe2 100644 --- a/tests/ui/traits/const-traits/std-impl-gate.stock.stderr +++ b/tests/ui/traits/const-traits/std-impl-gate.stock.stderr @@ -1,10 +1,11 @@ error[E0658]: cannot call conditionally-const associated function ` as Default>::default` in constant functions --> $DIR/std-impl-gate.rs:13:5 | +LL | const fn const_context() -> Vec { + | -------------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | Default::default() | ^^^^^^^^^^^^^^^^^^ | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: see issue #143874 for more information = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date diff --git a/tests/ui/traits/const-traits/super-traits-fail-2.nn.stderr b/tests/ui/traits/const-traits/super-traits-fail-2.nn.stderr index c9dc239bef334..84fc743e4a2b7 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-2.nn.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-2.nn.stderr @@ -48,6 +48,8 @@ LL | #[const_trait] trait Foo { error[E0015]: cannot call non-const method `::a` in constant functions --> $DIR/super-traits-fail-2.rs:20:7 | +LL | const fn foo(x: &T) { + | --------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | x.a(); | ^^^ | @@ -58,7 +60,6 @@ LL | trait Foo { | ^^^^^^^^^ this trait is not const LL | fn a(&self); | ------------ this method is not const - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/super-traits-fail-2.ny.stderr b/tests/ui/traits/const-traits/super-traits-fail-2.ny.stderr index bfbf6980ab833..9d72e149aab28 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-2.ny.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-2.ny.stderr @@ -60,6 +60,8 @@ LL | #[const_trait] trait Foo { error[E0015]: cannot call non-const method `::a` in constant functions --> $DIR/super-traits-fail-2.rs:20:7 | +LL | const fn foo(x: &T) { + | --------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | x.a(); | ^^^ | @@ -70,7 +72,6 @@ LL | trait Foo { | ^^^^^^^^^ this trait is not const LL | fn a(&self); | ------------ this method is not const - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr index 97e79f28515d0..8a35dd966425a 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr @@ -91,6 +91,9 @@ LL | #[const_trait] trait Bar: [const] Foo {} error[E0015]: cannot call non-const method `::a` in constant functions --> $DIR/super-traits-fail-3.rs:36:7 | +LL | const fn foo(x: &T) { + | ----------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants +... LL | x.a(); | ^^^ | @@ -101,7 +104,6 @@ LL | trait Foo { | ^^^^^^^^^ this trait is not const LL | fn a(&self); | ------------ this method is not const - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr index 97e79f28515d0..8a35dd966425a 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr @@ -91,6 +91,9 @@ LL | #[const_trait] trait Bar: [const] Foo {} error[E0015]: cannot call non-const method `::a` in constant functions --> $DIR/super-traits-fail-3.rs:36:7 | +LL | const fn foo(x: &T) { + | ----------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants +... LL | x.a(); | ^^^ | @@ -101,7 +104,6 @@ LL | trait Foo { | ^^^^^^^^^ this trait is not const LL | fn a(&self); | ------------ this method is not const - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.nyn.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.nyn.stderr index b00ad706a5fa1..155263656e368 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.nyn.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.nyn.stderr @@ -41,10 +41,12 @@ LL | #[cfg_attr(any(yyy, yny, nyy, nyn), const_trait)] error[E0658]: cannot call conditionally-const method `::a` in constant functions --> $DIR/super-traits-fail-3.rs:36:7 | +LL | const fn foo(x: &T) { + | ----------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants +... LL | x.a(); | ^^^ | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: see issue #143874 for more information = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.nyy.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.nyy.stderr index b00ad706a5fa1..155263656e368 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.nyy.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.nyy.stderr @@ -41,10 +41,12 @@ LL | #[cfg_attr(any(yyy, yny, nyy, nyn), const_trait)] error[E0658]: cannot call conditionally-const method `::a` in constant functions --> $DIR/super-traits-fail-3.rs:36:7 | +LL | const fn foo(x: &T) { + | ----------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants +... LL | x.a(); | ^^^ | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: see issue #143874 for more information = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.ynn.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.ynn.stderr index 5951caebe7335..4895b5b0cd08b 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.ynn.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.ynn.stderr @@ -71,6 +71,9 @@ LL | #[const_trait] trait Bar: [const] Foo {} error[E0015]: cannot call non-const method `::a` in constant functions --> $DIR/super-traits-fail-3.rs:36:7 | +LL | const fn foo(x: &T) { + | ----------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants +... LL | x.a(); | ^^^ | @@ -81,7 +84,6 @@ LL | trait Foo { | ^^^^^^^^^ this trait is not const LL | fn a(&self); | ------------ this method is not const - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.yny.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.yny.stderr index 563495204ad7b..29bce84326cab 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.yny.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.yny.stderr @@ -60,6 +60,9 @@ LL | #[const_trait] trait Foo { error[E0015]: cannot call non-const method `::a` in constant functions --> $DIR/super-traits-fail-3.rs:36:7 | +LL | const fn foo(x: &T) { + | ----------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants +... LL | x.a(); | ^^^ | @@ -70,7 +73,6 @@ LL | trait Foo { | ^^^^^^^^^ this trait is not const LL | fn a(&self); | ------------ this method is not const - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/ui/typeck/typeck_type_placeholder_item.stderr b/tests/ui/typeck/typeck_type_placeholder_item.stderr index 76e028bcc0019..a58ee60a11471 100644 --- a/tests/ui/typeck/typeck_type_placeholder_item.stderr +++ b/tests/ui/typeck/typeck_type_placeholder_item.stderr @@ -630,20 +630,23 @@ error[E0015]: cannot call non-const function `map::` in constants --> $DIR/typeck_type_placeholder_item.rs:231:22 | LL | const _: Option<_> = map(value); - | ^^^^^^^^^^ + | ------------------ ^^^^^^^^^^ + | | + | calls in constants are limited to constant functions, tuple structs and tuple variants | note: function `map` is not const --> $DIR/typeck_type_placeholder_item.rs:222:1 | LL | fn map(_: fn() -> Option<&'static T>) -> Option { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - = note: calls in constants are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const method ` as Iterator>::filter::<{closure@$DIR/typeck_type_placeholder_item.rs:240:29: 240:32}>` in constants --> $DIR/typeck_type_placeholder_item.rs:240:22 | LL | const _: _ = (1..10).filter(|x| x % 2 == 0).map(|x| x * x); - | ^^^^^^^^^^^^^^^^^^^^^^ + | ---------- ^^^^^^^^^^^^^^^^^^^^^^ + | | + | calls in constants are limited to constant functions, tuple structs and tuple variants | note: method `filter` is not const because trait `Iterator` is not const --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL @@ -652,13 +655,14 @@ note: method `filter` is not const because trait `Iterator` is not const ::: $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL | = note: this method is not const - = note: calls in constants are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const method `, {closure@$DIR/typeck_type_placeholder_item.rs:240:29: 240:32}> as Iterator>::map::` in constants --> $DIR/typeck_type_placeholder_item.rs:240:45 | LL | const _: _ = (1..10).filter(|x| x % 2 == 0).map(|x| x * x); - | ^^^^^^^^^^^^^^ + | ---------- ^^^^^^^^^^^^^^ + | | + | calls in constants are limited to constant functions, tuple structs and tuple variants | note: method `map` is not const because trait `Iterator` is not const --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL @@ -667,7 +671,6 @@ note: method `map` is not const because trait `Iterator` is not const ::: $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL | = note: this method is not const - = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 83 previous errors From fd07c3f9d79c7a969f29a37ff7926789fb52d9e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Sat, 19 Jul 2025 21:42:15 +0000 Subject: [PATCH 5/6] Account for `#![feature(const_trait_impl)]` state --- .../rustc_const_eval/src/check_consts/ops.rs | 10 +++++++++- .../const-super-trait-nightly-disabled.stderr | 16 +++++++++++++++- .../const-super-trait-nightly-enabled.stderr | 15 ++++++++++++++- .../const-super-trait-stable-disabled.stderr | 11 ++++++++++- .../const-super-trait-stable-enabled.stderr | 11 ++++++++++- tests/ui/resolve/issue-39559-2.stderr | 2 ++ .../const-traits/super-traits-fail-3.nnn.stderr | 1 + .../const-traits/super-traits-fail-3.nny.stderr | 1 + 8 files changed, 62 insertions(+), 5 deletions(-) diff --git a/compiler/rustc_const_eval/src/check_consts/ops.rs b/compiler/rustc_const_eval/src/check_consts/ops.rs index 45ec3a838ace8..af4f94afeaf60 100644 --- a/compiler/rustc_const_eval/src/check_consts/ops.rs +++ b/compiler/rustc_const_eval/src/check_consts/ops.rs @@ -393,7 +393,13 @@ fn build_error_for_const_call<'tcx>( `{trait_name}` is not const", ), ); - if parent.is_local() { + if parent.is_local() && ccx.tcx.sess.is_nightly_build() { + if !ccx.tcx.features().const_trait_impl() { + err.help( + "add `#![feature(const_trait_impl)]` to the crate attributes to \ + enable `#[const_trait]`", + ); + } let indentation = ccx .tcx .sess @@ -406,6 +412,8 @@ fn build_error_for_const_call<'tcx>( format!("#[const_trait]\n{indentation}"), Applicability::MachineApplicable, ); + } else if !ccx.tcx.sess.is_nightly_build() { + err.help("const traits are not yet supported on stable Rust"); } } } else if ccx.tcx.constness(callee) != hir::Constness::Const { diff --git a/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-disabled.stderr b/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-disabled.stderr index 464208f989e35..cd39ce0a1d48c 100644 --- a/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-disabled.stderr +++ b/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-disabled.stderr @@ -55,10 +55,24 @@ LL | #[const_trait] trait Bar: ~const Foo {} error[E0015]: cannot call non-const method `::a` in constant functions --> const-super-trait.rs:10:7 | +LL | const fn foo(x: &T) { + | ---------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | x.a(); | ^^^ | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants +note: method `a` is not const because trait `Foo` is not const + --> const-super-trait.rs:3:1 + | +LL | trait Foo { + | ^^^^^^^^^ this trait is not const +LL | fn a(&self); + | ------------ this method is not const + = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable `#[const_trait]` +help: consider making trait `Foo` const + | +LL + #[const_trait] +LL | trait Foo { + | error: aborting due to 6 previous errors diff --git a/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-enabled.stderr b/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-enabled.stderr index 569e559186f76..bdfe040bb83bb 100644 --- a/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-enabled.stderr +++ b/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-enabled.stderr @@ -35,10 +35,23 @@ LL | #[const_trait] trait Bar: ~const Foo {} error[E0015]: cannot call non-const method `::a` in constant functions --> const-super-trait.rs:10:7 | +LL | const fn foo(x: &T) { + | ---------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | x.a(); | ^^^ | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants +note: method `a` is not const because trait `Foo` is not const + --> const-super-trait.rs:3:1 + | +LL | trait Foo { + | ^^^^^^^^^ this trait is not const +LL | fn a(&self); + | ------------ this method is not const +help: consider making trait `Foo` const + | +LL + #[const_trait] +LL | trait Foo { + | error: aborting due to 4 previous errors diff --git a/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-disabled.stderr b/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-disabled.stderr index 694e06fb6ea2b..d35656c060d06 100644 --- a/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-disabled.stderr +++ b/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-disabled.stderr @@ -53,10 +53,19 @@ note: `Bar` can't be used with `[const]` because it isn't `const` error[E0015]: cannot call non-const method `::a` in constant functions --> const-super-trait.rs:10:7 | +9 | const fn foo(x: &T) { + | ---------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants 10 | x.a(); | ^^^ | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants +note: method `a` is not const because trait `Foo` is not const + --> const-super-trait.rs:3:1 + | +3 | trait Foo { + | ^^^^^^^^^ this trait is not const +4 | fn a(&self); + | ------------ this method is not const + = help: const traits are not yet supported on stable Rust error: aborting due to 6 previous errors diff --git a/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-enabled.stderr b/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-enabled.stderr index 2109f0deb7291..c279c7a413cae 100644 --- a/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-enabled.stderr +++ b/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-enabled.stderr @@ -43,10 +43,19 @@ note: `Bar` can't be used with `[const]` because it isn't `const` error[E0015]: cannot call non-const method `::a` in constant functions --> const-super-trait.rs:10:7 | +9 | const fn foo(x: &T) { + | ---------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants 10 | x.a(); | ^^^ | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants +note: method `a` is not const because trait `Foo` is not const + --> const-super-trait.rs:3:1 + | +3 | trait Foo { + | ^^^^^^^^^ this trait is not const +4 | fn a(&self); + | ------------ this method is not const + = help: const traits are not yet supported on stable Rust error: aborting due to 5 previous errors diff --git a/tests/ui/resolve/issue-39559-2.stderr b/tests/ui/resolve/issue-39559-2.stderr index 8c19fb23d8e9a..fbbcaa663ae0d 100644 --- a/tests/ui/resolve/issue-39559-2.stderr +++ b/tests/ui/resolve/issue-39559-2.stderr @@ -11,6 +11,7 @@ LL | trait Dim { | ^^^^^^^^^ this trait is not const LL | fn dim() -> usize; | ------------------ this associated function is not const + = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable `#[const_trait]` help: consider making trait `Dim` const | LL + #[const_trait] @@ -30,6 +31,7 @@ LL | trait Dim { | ^^^^^^^^^ this trait is not const LL | fn dim() -> usize; | ------------------ this associated function is not const + = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable `#[const_trait]` help: consider making trait `Dim` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr index 8a35dd966425a..2625f94460616 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr @@ -104,6 +104,7 @@ LL | trait Foo { | ^^^^^^^^^ this trait is not const LL | fn a(&self); | ------------ this method is not const + = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable `#[const_trait]` help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr index 8a35dd966425a..2625f94460616 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr @@ -104,6 +104,7 @@ LL | trait Foo { | ^^^^^^^^^ this trait is not const LL | fn a(&self); | ------------ this method is not const + = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable `#[const_trait]` help: consider making trait `Foo` const | LL + #[const_trait] From c2d7915ce685dfbb7afe32580ff2658667f8d1a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Wed, 23 Jul 2025 18:46:03 +0000 Subject: [PATCH 6/6] review comments --- .../rustc_const_eval/src/check_consts/ops.rs | 31 ++++++----------- .../const-super-trait-nightly-disabled.stderr | 3 +- .../const-super-trait-nightly-enabled.stderr | 3 +- .../const-super-trait-stable-disabled.stderr | 3 +- .../const-super-trait-stable-enabled.stderr | 3 +- tests/ui/asm/non-const.stderr | 3 +- tests/ui/borrowck/issue-64453.stderr | 5 ++- .../ui/const-generics/nested-type.full.stderr | 15 +++------ .../ui/const-generics/nested-type.min.stderr | 15 +++------ tests/ui/consts/const-call.stderr | 3 +- tests/ui/consts/const-eval/format.stderr | 3 +- .../const-extern-fn-call-extern-fn.stderr | 8 ++--- .../consts/const-fn-not-safe-for-const.stderr | 3 +- .../ui/consts/control-flow/issue-46843.stderr | 5 ++- tests/ui/consts/issue-16538.stderr | 5 ++- tests/ui/consts/issue-32829-2.stderr | 12 ++----- tests/ui/consts/issue-43105.stderr | 5 ++- .../min_const_fn/bad_const_fn_body_ice.stderr | 3 +- tests/ui/consts/mir_check_nonconst.stderr | 5 ++- tests/ui/error-codes/E0010-teach.stderr | 5 ++- tests/ui/error-codes/E0010.stderr | 5 ++- tests/ui/error-codes/E0015.stderr | 5 ++- tests/ui/explicit-tail-calls/constck.stderr | 8 ++--- tests/ui/issues/issue-7364.stderr | 5 ++- tests/ui/resolve/issue-39559-2.stderr | 6 ++-- .../ui/static/static-mut-not-constant.stderr | 5 ++- .../static-vec-repeat-not-constant.stderr | 5 ++- .../statics/check-values-constraints.stderr | 33 +++++++------------ .../const-check-fns-in-const-impl.stderr | 5 ++- .../const_derives/derive-const-gate.stderr | 4 ++- .../derive-const-non-const-type.stderr | 4 ++- .../const-traits/cross-crate.stock.stderr | 4 +-- .../const-traits/cross-crate.stocknc.stderr | 9 ++--- ...nline-incorrect-early-bound-in-ctfe.stderr | 3 +- .../ui/traits/const-traits/issue-79450.stderr | 3 +- .../ui/traits/const-traits/issue-88155.stderr | 3 +- .../const-traits/staged-api-user-crate.stderr | 3 +- .../const-traits/std-impl-gate.stock.stderr | 3 +- .../super-traits-fail-2.nn.stderr | 3 +- .../super-traits-fail-2.ny.stderr | 3 +- .../super-traits-fail-3.nnn.stderr | 4 +-- .../super-traits-fail-3.nny.stderr | 4 +-- .../super-traits-fail-3.nyn.stderr | 4 +-- .../super-traits-fail-3.nyy.stderr | 4 +-- .../super-traits-fail-3.ynn.stderr | 4 +-- .../super-traits-fail-3.yny.stderr | 4 +-- .../typeck_type_placeholder_item.stderr | 15 ++++----- 47 files changed, 104 insertions(+), 192 deletions(-) diff --git a/compiler/rustc_const_eval/src/check_consts/ops.rs b/compiler/rustc_const_eval/src/check_consts/ops.rs index af4f94afeaf60..b3bb0466ec3f4 100644 --- a/compiler/rustc_const_eval/src/check_consts/ops.rs +++ b/compiler/rustc_const_eval/src/check_consts/ops.rs @@ -4,7 +4,6 @@ use hir::{ConstContext, LangItem}; use rustc_errors::codes::*; use rustc_errors::{Applicability, Diag, MultiSpan}; use rustc_hir as hir; -use rustc_hir::def::DefKind; use rustc_hir::def_id::DefId; use rustc_infer::infer::TyCtxtInferExt; use rustc_infer::traits::{ImplSource, Obligation, ObligationCause}; @@ -12,8 +11,8 @@ use rustc_middle::mir::CallSource; use rustc_middle::span_bug; use rustc_middle::ty::print::{PrintTraitRefExt as _, with_no_trimmed_paths}; use rustc_middle::ty::{ - self, Closure, FnDef, FnPtr, GenericArgKind, GenericArgsRef, Param, TraitRef, Ty, - suggest_constraining_type_param, + self, AssocItemContainer, Closure, FnDef, FnPtr, GenericArgKind, GenericArgsRef, Param, + TraitRef, Ty, suggest_constraining_type_param, }; use rustc_session::parse::add_feature_diagnostics; use rustc_span::{BytePos, Pos, Span, Symbol, sym}; @@ -212,7 +211,6 @@ fn build_error_for_const_call<'tcx>( debug!(?call_kind); - let mut note = true; let mut err = match call_kind { CallKind::Normal { desugaring: Some((kind, self_ty)), .. } => { macro_rules! error { @@ -366,16 +364,9 @@ fn build_error_for_const_call<'tcx>( kind: ccx.const_kind(), non_or_conditionally, }); - let context_span = ccx.tcx.def_span(ccx.def_id()); - err.span_label(context_span, format!( - "calls in {}s are limited to constant functions, tuple structs and tuple variants", - ccx.const_kind(), - )); - note = false; - let def_kind = ccx.tcx.def_kind(callee); - if let DefKind::AssocTy | DefKind::AssocConst | DefKind::AssocFn = def_kind { - let parent = ccx.tcx.parent(callee); - if let DefKind::Trait = ccx.tcx.def_kind(parent) + if let Some(item) = ccx.tcx.opt_associated_item(callee) { + if let AssocItemContainer::Trait = item.container + && let parent = item.container_id(ccx.tcx) && !ccx.tcx.is_const_trait(parent) { let assoc_span = ccx.tcx.def_span(callee); @@ -410,7 +401,7 @@ fn build_error_for_const_call<'tcx>( trait_span.shrink_to_lo(), format!("consider making trait `{trait_name}` const"), format!("#[const_trait]\n{indentation}"), - Applicability::MachineApplicable, + Applicability::MaybeIncorrect, ); } else if !ccx.tcx.sess.is_nightly_build() { err.help("const traits are not yet supported on stable Rust"); @@ -427,12 +418,10 @@ fn build_error_for_const_call<'tcx>( } }; - if note { - err.note(format!( - "calls in {}s are limited to constant functions, tuple structs and tuple variants", - ccx.const_kind(), - )); - } + err.note(format!( + "calls in {}s are limited to constant functions, tuple structs and tuple variants", + ccx.const_kind(), + )); err } diff --git a/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-disabled.stderr b/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-disabled.stderr index cd39ce0a1d48c..4ce0052c81140 100644 --- a/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-disabled.stderr +++ b/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-disabled.stderr @@ -55,8 +55,6 @@ LL | #[const_trait] trait Bar: ~const Foo {} error[E0015]: cannot call non-const method `::a` in constant functions --> const-super-trait.rs:10:7 | -LL | const fn foo(x: &T) { - | ---------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | x.a(); | ^^^ | @@ -68,6 +66,7 @@ LL | trait Foo { LL | fn a(&self); | ------------ this method is not const = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable `#[const_trait]` + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-enabled.stderr b/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-enabled.stderr index bdfe040bb83bb..43e064a7597cd 100644 --- a/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-enabled.stderr +++ b/tests/run-make/const-trait-stable-toolchain/const-super-trait-nightly-enabled.stderr @@ -35,8 +35,6 @@ LL | #[const_trait] trait Bar: ~const Foo {} error[E0015]: cannot call non-const method `::a` in constant functions --> const-super-trait.rs:10:7 | -LL | const fn foo(x: &T) { - | ---------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | x.a(); | ^^^ | @@ -47,6 +45,7 @@ LL | trait Foo { | ^^^^^^^^^ this trait is not const LL | fn a(&self); | ------------ this method is not const + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-disabled.stderr b/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-disabled.stderr index d35656c060d06..c3f3495cdced3 100644 --- a/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-disabled.stderr +++ b/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-disabled.stderr @@ -53,8 +53,6 @@ note: `Bar` can't be used with `[const]` because it isn't `const` error[E0015]: cannot call non-const method `::a` in constant functions --> const-super-trait.rs:10:7 | -9 | const fn foo(x: &T) { - | ---------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants 10 | x.a(); | ^^^ | @@ -66,6 +64,7 @@ note: method `a` is not const because trait `Foo` is not const 4 | fn a(&self); | ------------ this method is not const = help: const traits are not yet supported on stable Rust + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 6 previous errors diff --git a/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-enabled.stderr b/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-enabled.stderr index c279c7a413cae..a9ea8afea57a7 100644 --- a/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-enabled.stderr +++ b/tests/run-make/const-trait-stable-toolchain/const-super-trait-stable-enabled.stderr @@ -43,8 +43,6 @@ note: `Bar` can't be used with `[const]` because it isn't `const` error[E0015]: cannot call non-const method `::a` in constant functions --> const-super-trait.rs:10:7 | -9 | const fn foo(x: &T) { - | ---------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants 10 | x.a(); | ^^^ | @@ -56,6 +54,7 @@ note: method `a` is not const because trait `Foo` is not const 4 | fn a(&self); | ------------ this method is not const = help: const traits are not yet supported on stable Rust + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 5 previous errors diff --git a/tests/ui/asm/non-const.stderr b/tests/ui/asm/non-const.stderr index da881a12f120f..d7a901ba20ee5 100644 --- a/tests/ui/asm/non-const.stderr +++ b/tests/ui/asm/non-const.stderr @@ -2,13 +2,14 @@ error[E0015]: cannot call non-const function `non_const_fn` in constants --> $DIR/non-const.rs:10:31 | LL | global_asm!("/* {} */", const non_const_fn(0)); - | ^^^^^^^^^^^^^^^ calls in constants are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^^^^^ | note: function `non_const_fn` is not const --> $DIR/non-const.rs:8:1 | LL | fn non_const_fn(x: i32) -> i32 { x } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/borrowck/issue-64453.stderr b/tests/ui/borrowck/issue-64453.stderr index 47d9082765555..29a7363705cd7 100644 --- a/tests/ui/borrowck/issue-64453.stderr +++ b/tests/ui/borrowck/issue-64453.stderr @@ -2,12 +2,11 @@ error[E0015]: cannot call non-const function `format` in statics --> $DIR/issue-64453.rs:4:31 | LL | static settings_dir: String = format!(""); - | --------------------------- ^^^^^^^^^^^ - | | - | calls in statics are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^ | note: function `format` is not const --> $SRC_DIR/alloc/src/fmt.rs:LL:COL + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `format` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/const-generics/nested-type.full.stderr b/tests/ui/const-generics/nested-type.full.stderr index 587de095452d1..e5a1f230380d3 100644 --- a/tests/ui/const-generics/nested-type.full.stderr +++ b/tests/ui/const-generics/nested-type.full.stderr @@ -1,17 +1,10 @@ error[E0015]: cannot call non-const associated function `Foo::{constant#0}::Foo::<17>::value` in constants --> $DIR/nested-type.rs:15:5 | -LL | struct Foo; -LL | | -LL | | impl Foo { -... | -LL | | Foo::<17>::value() - | | ^^^^^^^^^^^^^^^^^^ -LL | | -LL | | }]>; - | |_- calls in constants are limited to constant functions, tuple structs and tuple variants +LL | Foo::<17>::value() + | ^^^^^^^^^^^^^^^^^^ + | + = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/const-generics/nested-type.min.stderr b/tests/ui/const-generics/nested-type.min.stderr index e7d21f8a98949..8282acd4ea7b1 100644 --- a/tests/ui/const-generics/nested-type.min.stderr +++ b/tests/ui/const-generics/nested-type.min.stderr @@ -1,17 +1,10 @@ error[E0015]: cannot call non-const associated function `Foo::{constant#0}::Foo::<17>::value` in constants --> $DIR/nested-type.rs:15:5 | -LL | struct Foo; -LL | | -LL | | impl Foo { -... | -LL | | Foo::<17>::value() - | | ^^^^^^^^^^^^^^^^^^ -LL | | -LL | | }]>; - | |_- calls in constants are limited to constant functions, tuple structs and tuple variants +LL | Foo::<17>::value() + | ^^^^^^^^^^^^^^^^^^ + | + = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: `[u8; { struct Foo; diff --git a/tests/ui/consts/const-call.stderr b/tests/ui/consts/const-call.stderr index db375f80b6c67..cc80f73d0bb61 100644 --- a/tests/ui/consts/const-call.stderr +++ b/tests/ui/consts/const-call.stderr @@ -2,13 +2,14 @@ error[E0015]: cannot call non-const function `f` in constants --> $DIR/const-call.rs:6:17 | LL | let _ = [0; f(2)]; - | ^^^^ calls in constants are limited to constant functions, tuple structs and tuple variants + | ^^^^ | note: function `f` is not const --> $DIR/const-call.rs:1:1 | LL | fn f(x: usize) -> usize { | ^^^^^^^^^^^^^^^^^^^^^^^ + = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/consts/const-eval/format.stderr b/tests/ui/consts/const-eval/format.stderr index 97b4436a058ee..ea191eb5c0989 100644 --- a/tests/ui/consts/const-eval/format.stderr +++ b/tests/ui/consts/const-eval/format.stderr @@ -18,13 +18,12 @@ LL | println!("{:?}", 0); error[E0015]: cannot call non-const function `_print` in constant functions --> $DIR/format.rs:7:5 | -LL | const fn print() { - | ---------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | println!("{:?}", 0); | ^^^^^^^^^^^^^^^^^^^ | note: function `_print` is not const --> $SRC_DIR/std/src/io/stdio.rs:LL:COL + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: this error originates in the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info) error[E0015]: cannot call non-const formatting macro in constant functions diff --git a/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr b/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr index 8f07e038e1994..ac0d344d8f480 100644 --- a/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr +++ b/tests/ui/consts/const-extern-fn/const-extern-fn-call-extern-fn.stderr @@ -1,9 +1,6 @@ error[E0015]: cannot call non-const function `regular_in_block` in constant functions --> $DIR/const-extern-fn-call-extern-fn.rs:7:9 | -LL | const extern "C" fn bar() { - | ------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants -LL | unsafe { LL | regular_in_block(); | ^^^^^^^^^^^^^^^^^^ | @@ -12,13 +9,11 @@ note: function `regular_in_block` is not const | LL | fn regular_in_block(); | ^^^^^^^^^^^^^^^^^^^^^^ + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const function `regular` in constant functions --> $DIR/const-extern-fn-call-extern-fn.rs:16:9 | -LL | const extern "C" fn foo() { - | ------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants -LL | unsafe { LL | regular(); | ^^^^^^^^^ | @@ -27,6 +22,7 @@ note: function `regular` is not const | LL | extern "C" fn regular() {} | ^^^^^^^^^^^^^^^^^^^^^^^ + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 2 previous errors diff --git a/tests/ui/consts/const-fn-not-safe-for-const.stderr b/tests/ui/consts/const-fn-not-safe-for-const.stderr index 068c06601c8b6..8fd27df5367e0 100644 --- a/tests/ui/consts/const-fn-not-safe-for-const.stderr +++ b/tests/ui/consts/const-fn-not-safe-for-const.stderr @@ -1,8 +1,6 @@ error[E0015]: cannot call non-const function `random` in constant functions --> $DIR/const-fn-not-safe-for-const.rs:14:5 | -LL | const fn sub1() -> u32 { - | ---------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | random() | ^^^^^^^^ | @@ -11,6 +9,7 @@ note: function `random` is not const | LL | fn random() -> u32 { | ^^^^^^^^^^^^^^^^^^ + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/consts/control-flow/issue-46843.stderr b/tests/ui/consts/control-flow/issue-46843.stderr index 310c860f59b45..46b2a6bf1fd36 100644 --- a/tests/ui/consts/control-flow/issue-46843.stderr +++ b/tests/ui/consts/control-flow/issue-46843.stderr @@ -2,15 +2,14 @@ error[E0015]: cannot call non-const function `non_const` in constants --> $DIR/issue-46843.rs:10:26 | LL | pub const Q: i32 = match non_const() { - | ---------------- ^^^^^^^^^^^ - | | - | calls in constants are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^ | note: function `non_const` is not const --> $DIR/issue-46843.rs:6:1 | LL | fn non_const() -> Thing { | ^^^^^^^^^^^^^^^^^^^^^^^ + = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/consts/issue-16538.stderr b/tests/ui/consts/issue-16538.stderr index e78d95dcd186f..fd97b4360a468 100644 --- a/tests/ui/consts/issue-16538.stderr +++ b/tests/ui/consts/issue-16538.stderr @@ -2,15 +2,14 @@ error[E0015]: cannot call non-const function `Y::foo` in statics --> $DIR/issue-16538.rs:11:23 | LL | static foo: &Y::X = &*Y::foo(Y::x as *const Y::X); - | ----------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | calls in statics are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: function `foo` is not const --> $DIR/issue-16538.rs:6:5 | LL | pub fn foo(value: *const X) -> *const X { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error[E0133]: dereference of raw pointer is unsafe and requires unsafe function or block diff --git a/tests/ui/consts/issue-32829-2.stderr b/tests/ui/consts/issue-32829-2.stderr index 52398af41eeef..b201454866ed5 100644 --- a/tests/ui/consts/issue-32829-2.stderr +++ b/tests/ui/consts/issue-32829-2.stderr @@ -1,9 +1,6 @@ error[E0015]: cannot call non-const function `invalid` in constants --> $DIR/issue-32829-2.rs:10:9 | -LL | const bad_two : u32 = { - | ------------------- calls in constants are limited to constant functions, tuple structs and tuple variants -LL | { LL | invalid(); | ^^^^^^^^^ | @@ -12,13 +9,11 @@ note: function `invalid` is not const | LL | fn invalid() {} | ^^^^^^^^^^^^ + = note: calls in constants are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const function `invalid` in statics --> $DIR/issue-32829-2.rs:32:9 | -LL | static bad_five : u32 = { - | --------------------- calls in statics are limited to constant functions, tuple structs and tuple variants -LL | { LL | invalid(); | ^^^^^^^^^ | @@ -27,14 +22,12 @@ note: function `invalid` is not const | LL | fn invalid() {} | ^^^^^^^^^^^^ + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error[E0015]: cannot call non-const function `invalid` in statics --> $DIR/issue-32829-2.rs:54:9 | -LL | static mut bad_eight : u32 = { - | -------------------------- calls in statics are limited to constant functions, tuple structs and tuple variants -LL | { LL | invalid(); | ^^^^^^^^^ | @@ -43,6 +36,7 @@ note: function `invalid` is not const | LL | fn invalid() {} | ^^^^^^^^^^^^ + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error: aborting due to 3 previous errors diff --git a/tests/ui/consts/issue-43105.stderr b/tests/ui/consts/issue-43105.stderr index 442fbdd107fab..7ec0a2b73afc5 100644 --- a/tests/ui/consts/issue-43105.stderr +++ b/tests/ui/consts/issue-43105.stderr @@ -2,15 +2,14 @@ error[E0015]: cannot call non-const function `xyz` in constants --> $DIR/issue-43105.rs:3:17 | LL | const NUM: u8 = xyz(); - | ------------- ^^^^^ - | | - | calls in constants are limited to constant functions, tuple structs and tuple variants + | ^^^^^ | note: function `xyz` is not const --> $DIR/issue-43105.rs:1:1 | LL | fn xyz() -> u8 { 42 } | ^^^^^^^^^^^^^^ + = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/consts/min_const_fn/bad_const_fn_body_ice.stderr b/tests/ui/consts/min_const_fn/bad_const_fn_body_ice.stderr index c65abc530bc2b..8e52a7aa35e1e 100644 --- a/tests/ui/consts/min_const_fn/bad_const_fn_body_ice.stderr +++ b/tests/ui/consts/min_const_fn/bad_const_fn_body_ice.stderr @@ -9,11 +9,10 @@ LL | vec![1, 2, 3] error[E0015]: cannot call non-const method `slice::::into_vec::` in constant functions --> $DIR/bad_const_fn_body_ice.rs:2:5 | -LL | const fn foo(a: i32) -> Vec { - | -------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | vec![1, 2, 3] | ^^^^^^^^^^^^^ | + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 2 previous errors diff --git a/tests/ui/consts/mir_check_nonconst.stderr b/tests/ui/consts/mir_check_nonconst.stderr index ad2056a737078..bb0940ee789b9 100644 --- a/tests/ui/consts/mir_check_nonconst.stderr +++ b/tests/ui/consts/mir_check_nonconst.stderr @@ -2,15 +2,14 @@ error[E0015]: cannot call non-const function `bar` in statics --> $DIR/mir_check_nonconst.rs:8:19 | LL | static foo: Foo = bar(); - | --------------- ^^^^^ - | | - | calls in statics are limited to constant functions, tuple structs and tuple variants + | ^^^^^ | note: function `bar` is not const --> $DIR/mir_check_nonconst.rs:4:1 | LL | fn bar() -> Foo { | ^^^^^^^^^^^^^^^ + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error: aborting due to 1 previous error diff --git a/tests/ui/error-codes/E0010-teach.stderr b/tests/ui/error-codes/E0010-teach.stderr index 237efbefcf6ef..82bbe01aef792 100644 --- a/tests/ui/error-codes/E0010-teach.stderr +++ b/tests/ui/error-codes/E0010-teach.stderr @@ -11,10 +11,9 @@ error[E0015]: cannot call non-const method `slice::::into_vec:: $DIR/E0010-teach.rs:5:23 | LL | const CON: Vec = vec![1, 2, 3]; - | ------------------- ^^^^^^^^^^^^^ - | | - | calls in constants are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^^^ | + = note: calls in constants are limited to constant functions, tuple structs and tuple variants = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 2 previous errors diff --git a/tests/ui/error-codes/E0010.stderr b/tests/ui/error-codes/E0010.stderr index 2bb87118d242d..87b722b5f6566 100644 --- a/tests/ui/error-codes/E0010.stderr +++ b/tests/ui/error-codes/E0010.stderr @@ -10,10 +10,9 @@ error[E0015]: cannot call non-const method `slice::::into_vec:: $DIR/E0010.rs:3:23 | LL | const CON: Vec = vec![1, 2, 3]; - | ------------------- ^^^^^^^^^^^^^ - | | - | calls in constants are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^^^ | + = note: calls in constants are limited to constant functions, tuple structs and tuple variants = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 2 previous errors diff --git a/tests/ui/error-codes/E0015.stderr b/tests/ui/error-codes/E0015.stderr index 4331d7c34b3ca..bc457aefaecb0 100644 --- a/tests/ui/error-codes/E0015.stderr +++ b/tests/ui/error-codes/E0015.stderr @@ -2,15 +2,14 @@ error[E0015]: cannot call non-const function `create_some` in constants --> $DIR/E0015.rs:5:25 | LL | const FOO: Option = create_some(); - | --------------------- ^^^^^^^^^^^^^ - | | - | calls in constants are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^^^ | note: function `create_some` is not const --> $DIR/E0015.rs:1:1 | LL | fn create_some() -> Option { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/explicit-tail-calls/constck.stderr b/tests/ui/explicit-tail-calls/constck.stderr index 84d7bc3a1bf13..2fc2fb7f9338b 100644 --- a/tests/ui/explicit-tail-calls/constck.stderr +++ b/tests/ui/explicit-tail-calls/constck.stderr @@ -1,9 +1,6 @@ error[E0015]: cannot call non-const function `not_const` in constant functions --> $DIR/constck.rs:6:16 | -LL | const fn f() { - | ------------ calls in constant functions are limited to constant functions, tuple structs and tuple variants -LL | if false { LL | become not_const(); | ^^^^^^^^^^^ | @@ -12,13 +9,11 @@ note: function `not_const` is not const | LL | fn not_const() {} | ^^^^^^^^^^^^^^ + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const function `not_const` in constant functions --> $DIR/constck.rs:13:26 | -LL | const fn g((): ()) { - | ------------------ calls in constant functions are limited to constant functions, tuple structs and tuple variants -LL | if false { LL | become yes_const(not_const()); | ^^^^^^^^^^^ | @@ -27,6 +22,7 @@ note: function `not_const` is not const | LL | fn not_const() {} | ^^^^^^^^^^^^^^ + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 2 previous errors diff --git a/tests/ui/issues/issue-7364.stderr b/tests/ui/issues/issue-7364.stderr index fc442a62501fe..a47a90c90ce16 100644 --- a/tests/ui/issues/issue-7364.stderr +++ b/tests/ui/issues/issue-7364.stderr @@ -15,10 +15,9 @@ error[E0015]: cannot call non-const associated function `Box::>:: --> $DIR/issue-7364.rs:4:37 | LL | static boxed: Box> = Box::new(RefCell::new(0)); - | --------------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | calls in statics are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^^^^^^^^^^^^^^^ | + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error: aborting due to 2 previous errors diff --git a/tests/ui/resolve/issue-39559-2.stderr b/tests/ui/resolve/issue-39559-2.stderr index fbbcaa663ae0d..4bfa1d1b1322f 100644 --- a/tests/ui/resolve/issue-39559-2.stderr +++ b/tests/ui/resolve/issue-39559-2.stderr @@ -2,7 +2,7 @@ error[E0015]: cannot call non-const associated function `::dim` in --> $DIR/issue-39559-2.rs:14:24 | LL | let array: [usize; Dim3::dim()] - | ^^^^^^^^^^^ calls in constants are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^ | note: associated function `dim` is not const because trait `Dim` is not const --> $DIR/issue-39559-2.rs:1:1 @@ -12,6 +12,7 @@ LL | trait Dim { LL | fn dim() -> usize; | ------------------ this associated function is not const = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable `#[const_trait]` + = note: calls in constants are limited to constant functions, tuple structs and tuple variants help: consider making trait `Dim` const | LL + #[const_trait] @@ -22,7 +23,7 @@ error[E0015]: cannot call non-const associated function `::dim` in --> $DIR/issue-39559-2.rs:16:15 | LL | = [0; Dim3::dim()]; - | ^^^^^^^^^^^ calls in constants are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^ | note: associated function `dim` is not const because trait `Dim` is not const --> $DIR/issue-39559-2.rs:1:1 @@ -32,6 +33,7 @@ LL | trait Dim { LL | fn dim() -> usize; | ------------------ this associated function is not const = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable `#[const_trait]` + = note: calls in constants are limited to constant functions, tuple structs and tuple variants help: consider making trait `Dim` const | LL + #[const_trait] diff --git a/tests/ui/static/static-mut-not-constant.stderr b/tests/ui/static/static-mut-not-constant.stderr index 7e64d36b26d17..f28ea0b1689ab 100644 --- a/tests/ui/static/static-mut-not-constant.stderr +++ b/tests/ui/static/static-mut-not-constant.stderr @@ -2,10 +2,9 @@ error[E0015]: cannot call non-const associated function `Box::::new` in s --> $DIR/static-mut-not-constant.rs:1:28 | LL | static mut a: Box = Box::new(3); - | ------------------------ ^^^^^^^^^^^ - | | - | calls in statics are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^ | + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error: aborting due to 1 previous error diff --git a/tests/ui/static/static-vec-repeat-not-constant.stderr b/tests/ui/static/static-vec-repeat-not-constant.stderr index 24f0986ccc494..fa4033f6a4076 100644 --- a/tests/ui/static/static-vec-repeat-not-constant.stderr +++ b/tests/ui/static/static-vec-repeat-not-constant.stderr @@ -2,15 +2,14 @@ error[E0015]: cannot call non-const function `foo` in statics --> $DIR/static-vec-repeat-not-constant.rs:3:25 | LL | static a: [isize; 2] = [foo(); 2]; - | -------------------- ^^^^^ - | | - | calls in statics are limited to constant functions, tuple structs and tuple variants + | ^^^^^ | note: function `foo` is not const --> $DIR/static-vec-repeat-not-constant.rs:1:1 | LL | fn foo() -> isize { 23 } | ^^^^^^^^^^^^^^^^^ + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error: aborting due to 1 previous error diff --git a/tests/ui/statics/check-values-constraints.stderr b/tests/ui/statics/check-values-constraints.stderr index dfbb1f6e985c3..c54f4830533ae 100644 --- a/tests/ui/statics/check-values-constraints.stderr +++ b/tests/ui/statics/check-values-constraints.stderr @@ -23,19 +23,15 @@ error[E0015]: cannot call non-const method `slice::::into_vec::< --> $DIR/check-values-constraints.rs:81:33 | LL | static STATIC11: Vec = vec![MyOwned]; - | ----------------------------- ^^^^^^^^^^^^^ - | | - | calls in statics are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^^^ | + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) error[E0015]: cannot call non-const method `::to_string` in statics --> $DIR/check-values-constraints.rs:92:38 | -LL | static mut STATIC14: SafeStruct = SafeStruct { - | ------------------------------- calls in statics are limited to constant functions, tuple structs and tuple variants -LL | field1: SafeEnum::Variant1, LL | field2: SafeEnum::Variant4("str".to_string()), | ^^^^^^^^^^^ | @@ -46,6 +42,7 @@ note: method `to_string` is not const because trait `ToString` is not const ::: $SRC_DIR/alloc/src/string.rs:LL:COL | = note: this method is not const + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` error[E0010]: allocations are not allowed in statics @@ -59,11 +56,10 @@ LL | vec![MyOwned], error[E0015]: cannot call non-const method `slice::::into_vec::` in statics --> $DIR/check-values-constraints.rs:96:5 | -LL | static STATIC15: &'static [Vec] = &[ - | ---------------------------------------- calls in statics are limited to constant functions, tuple structs and tuple variants LL | vec![MyOwned], | ^^^^^^^^^^^^^ | + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -78,12 +74,10 @@ LL | vec![MyOwned], error[E0015]: cannot call non-const method `slice::::into_vec::` in statics --> $DIR/check-values-constraints.rs:98:5 | -LL | static STATIC15: &'static [Vec] = &[ - | ---------------------------------------- calls in statics are limited to constant functions, tuple structs and tuple variants -... LL | vec![MyOwned], | ^^^^^^^^^^^^^ | + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -98,11 +92,10 @@ LL | &vec![MyOwned], error[E0015]: cannot call non-const method `slice::::into_vec::` in statics --> $DIR/check-values-constraints.rs:103:6 | -LL | static STATIC16: (&'static Vec, &'static Vec) = ( - | --------------------------------------------------------------- calls in statics are limited to constant functions, tuple structs and tuple variants LL | &vec![MyOwned], | ^^^^^^^^^^^^^ | + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -117,12 +110,10 @@ LL | &vec![MyOwned], error[E0015]: cannot call non-const method `slice::::into_vec::` in statics --> $DIR/check-values-constraints.rs:105:6 | -LL | static STATIC16: (&'static Vec, &'static Vec) = ( - | --------------------------------------------------------------- calls in statics are limited to constant functions, tuple structs and tuple variants -... LL | &vec![MyOwned], | ^^^^^^^^^^^^^ | + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -138,10 +129,9 @@ error[E0015]: cannot call non-const method `slice::::into_vec:: $DIR/check-values-constraints.rs:111:31 | LL | static STATIC19: Vec = vec![3]; - | --------------------------- ^^^^^^^ - | | - | calls in statics are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^ | + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -157,10 +147,9 @@ error[E0015]: cannot call non-const method `slice::::into_vec:: $DIR/check-values-constraints.rs:117:32 | LL | static x: Vec = vec![3]; - | -------------------- ^^^^^^^ - | | - | calls in statics are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^ | + = note: calls in statics are limited to constant functions, tuple structs and tuple variants = note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)` = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/traits/const-traits/const-check-fns-in-const-impl.stderr b/tests/ui/traits/const-traits/const-check-fns-in-const-impl.stderr index 70704780ddce7..1a7ec35f3ddba 100644 --- a/tests/ui/traits/const-traits/const-check-fns-in-const-impl.stderr +++ b/tests/ui/traits/const-traits/const-check-fns-in-const-impl.stderr @@ -2,15 +2,14 @@ error[E0015]: cannot call non-const function `non_const` in constant functions --> $DIR/const-check-fns-in-const-impl.rs:14:16 | LL | fn foo() { non_const() } - | -------- ^^^^^^^^^^^ - | | - | calls in constant functions are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^ | note: function `non_const` is not const --> $DIR/const-check-fns-in-const-impl.rs:11:1 | LL | fn non_const() {} | ^^^^^^^^^^^^^^ + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-gate.stderr b/tests/ui/traits/const-traits/const_derives/derive-const-gate.stderr index ac393825ec720..cbc62d602a473 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-gate.stderr +++ b/tests/ui/traits/const-traits/const_derives/derive-const-gate.stderr @@ -21,7 +21,9 @@ error[E0015]: cannot call non-const method `Formatter::<'_>::write_str` in const --> $DIR/derive-const-gate.rs:1:16 | LL | #[derive_const(Debug)] - | ^^^^^ calls in constant functions are limited to constant functions, tuple structs and tuple variants + | ^^^^^ + | + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 3 previous errors diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr b/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr index 9f620fcf81b7c..93638801895da 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr +++ b/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr @@ -11,7 +11,9 @@ error[E0015]: cannot call non-const method `Formatter::<'_>::debug_tuple_field1_ --> $DIR/derive-const-non-const-type.rs:12:16 | LL | #[derive_const(Debug)] - | ^^^^^ calls in constant functions are limited to constant functions, tuple structs and tuple variants + | ^^^^^ + | + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 2 previous errors diff --git a/tests/ui/traits/const-traits/cross-crate.stock.stderr b/tests/ui/traits/const-traits/cross-crate.stock.stderr index 89278ff56ad0c..44a60c99ae9ea 100644 --- a/tests/ui/traits/const-traits/cross-crate.stock.stderr +++ b/tests/ui/traits/const-traits/cross-crate.stock.stderr @@ -1,12 +1,10 @@ error[E0658]: cannot call conditionally-const method `::func` in constant functions --> $DIR/cross-crate.rs:22:11 | -LL | const fn const_context() { - | ------------------------ calls in constant functions are limited to constant functions, tuple structs and tuple variants -... LL | Const.func(); | ^^^^^^ | + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: see issue #143874 for more information = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date diff --git a/tests/ui/traits/const-traits/cross-crate.stocknc.stderr b/tests/ui/traits/const-traits/cross-crate.stocknc.stderr index 6269e74fd1d2b..766c20aa8211f 100644 --- a/tests/ui/traits/const-traits/cross-crate.stocknc.stderr +++ b/tests/ui/traits/const-traits/cross-crate.stocknc.stderr @@ -1,21 +1,18 @@ error[E0015]: cannot call non-const method `::func` in constant functions --> $DIR/cross-crate.rs:19:14 | -LL | const fn const_context() { - | ------------------------ calls in constant functions are limited to constant functions, tuple structs and tuple variants -LL | #[cfg(any(stocknc, gatednc))] LL | NonConst.func(); | ^^^^^^ + | + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error[E0658]: cannot call conditionally-const method `::func` in constant functions --> $DIR/cross-crate.rs:22:11 | -LL | const fn const_context() { - | ------------------------ calls in constant functions are limited to constant functions, tuple structs and tuple variants -... LL | Const.func(); | ^^^^^^ | + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: see issue #143874 for more information = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date diff --git a/tests/ui/traits/const-traits/inline-incorrect-early-bound-in-ctfe.stderr b/tests/ui/traits/const-traits/inline-incorrect-early-bound-in-ctfe.stderr index 092a5ac05b823..ca73ae845550d 100644 --- a/tests/ui/traits/const-traits/inline-incorrect-early-bound-in-ctfe.stderr +++ b/tests/ui/traits/const-traits/inline-incorrect-early-bound-in-ctfe.stderr @@ -10,8 +10,6 @@ LL | fn foo(self) { error[E0015]: cannot call non-const method `<() as Trait>::foo` in constant functions --> $DIR/inline-incorrect-early-bound-in-ctfe.rs:26:8 | -LL | const fn foo() { - | -------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | ().foo(); | ^^^^^ | @@ -22,6 +20,7 @@ LL | trait Trait { | ^^^^^^^^^^^ this trait is not const LL | fn foo(self); | ------------- this method is not const + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Trait` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/issue-79450.stderr b/tests/ui/traits/const-traits/issue-79450.stderr index dd78b464e7825..d8a9e18980687 100644 --- a/tests/ui/traits/const-traits/issue-79450.stderr +++ b/tests/ui/traits/const-traits/issue-79450.stderr @@ -1,13 +1,12 @@ error[E0015]: cannot call non-const function `_print` in constant functions --> $DIR/issue-79450.rs:9:9 | -LL | fn prov(&self) { - | -------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | println!("lul"); | ^^^^^^^^^^^^^^^ | note: function `_print` is not const --> $SRC_DIR/std/src/io/stdio.rs:LL:COL + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: this error originates in the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 1 previous error diff --git a/tests/ui/traits/const-traits/issue-88155.stderr b/tests/ui/traits/const-traits/issue-88155.stderr index 2df4a0004b6a6..4a912cc8274a7 100644 --- a/tests/ui/traits/const-traits/issue-88155.stderr +++ b/tests/ui/traits/const-traits/issue-88155.stderr @@ -1,8 +1,6 @@ error[E0015]: cannot call non-const associated function `::assoc` in constant functions --> $DIR/issue-88155.rs:8:5 | -LL | pub const fn foo() -> bool { - | -------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | T::assoc() | ^^^^^^^^^^ | @@ -13,6 +11,7 @@ LL | pub trait A { | ^^^^^^^^^^^ this trait is not const LL | fn assoc() -> bool; | ------------------- this associated function is not const + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `A` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/staged-api-user-crate.stderr b/tests/ui/traits/const-traits/staged-api-user-crate.stderr index 1baa8b308284e..81611da9e748c 100644 --- a/tests/ui/traits/const-traits/staged-api-user-crate.stderr +++ b/tests/ui/traits/const-traits/staged-api-user-crate.stderr @@ -1,11 +1,10 @@ error[E0658]: cannot call conditionally-const associated function `::func` in constant functions --> $DIR/staged-api-user-crate.rs:12:5 | -LL | const fn stable_const_context() { - | ------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | Unstable::func(); | ^^^^^^^^^^^^^^^^ | + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: see issue #143874 for more information = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date diff --git a/tests/ui/traits/const-traits/std-impl-gate.stock.stderr b/tests/ui/traits/const-traits/std-impl-gate.stock.stderr index 3f40f602eefe2..261f68bebdb25 100644 --- a/tests/ui/traits/const-traits/std-impl-gate.stock.stderr +++ b/tests/ui/traits/const-traits/std-impl-gate.stock.stderr @@ -1,11 +1,10 @@ error[E0658]: cannot call conditionally-const associated function ` as Default>::default` in constant functions --> $DIR/std-impl-gate.rs:13:5 | -LL | const fn const_context() -> Vec { - | -------------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | Default::default() | ^^^^^^^^^^^^^^^^^^ | + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: see issue #143874 for more information = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date diff --git a/tests/ui/traits/const-traits/super-traits-fail-2.nn.stderr b/tests/ui/traits/const-traits/super-traits-fail-2.nn.stderr index 84fc743e4a2b7..c9dc239bef334 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-2.nn.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-2.nn.stderr @@ -48,8 +48,6 @@ LL | #[const_trait] trait Foo { error[E0015]: cannot call non-const method `::a` in constant functions --> $DIR/super-traits-fail-2.rs:20:7 | -LL | const fn foo(x: &T) { - | --------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | x.a(); | ^^^ | @@ -60,6 +58,7 @@ LL | trait Foo { | ^^^^^^^^^ this trait is not const LL | fn a(&self); | ------------ this method is not const + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/super-traits-fail-2.ny.stderr b/tests/ui/traits/const-traits/super-traits-fail-2.ny.stderr index 9d72e149aab28..bfbf6980ab833 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-2.ny.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-2.ny.stderr @@ -60,8 +60,6 @@ LL | #[const_trait] trait Foo { error[E0015]: cannot call non-const method `::a` in constant functions --> $DIR/super-traits-fail-2.rs:20:7 | -LL | const fn foo(x: &T) { - | --------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants LL | x.a(); | ^^^ | @@ -72,6 +70,7 @@ LL | trait Foo { | ^^^^^^^^^ this trait is not const LL | fn a(&self); | ------------ this method is not const + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr index 2625f94460616..ea487cbd563f2 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.nnn.stderr @@ -91,9 +91,6 @@ LL | #[const_trait] trait Bar: [const] Foo {} error[E0015]: cannot call non-const method `::a` in constant functions --> $DIR/super-traits-fail-3.rs:36:7 | -LL | const fn foo(x: &T) { - | ----------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants -... LL | x.a(); | ^^^ | @@ -105,6 +102,7 @@ LL | trait Foo { LL | fn a(&self); | ------------ this method is not const = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable `#[const_trait]` + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr index 2625f94460616..ea487cbd563f2 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.nny.stderr @@ -91,9 +91,6 @@ LL | #[const_trait] trait Bar: [const] Foo {} error[E0015]: cannot call non-const method `::a` in constant functions --> $DIR/super-traits-fail-3.rs:36:7 | -LL | const fn foo(x: &T) { - | ----------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants -... LL | x.a(); | ^^^ | @@ -105,6 +102,7 @@ LL | trait Foo { LL | fn a(&self); | ------------ this method is not const = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable `#[const_trait]` + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.nyn.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.nyn.stderr index 155263656e368..b00ad706a5fa1 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.nyn.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.nyn.stderr @@ -41,12 +41,10 @@ LL | #[cfg_attr(any(yyy, yny, nyy, nyn), const_trait)] error[E0658]: cannot call conditionally-const method `::a` in constant functions --> $DIR/super-traits-fail-3.rs:36:7 | -LL | const fn foo(x: &T) { - | ----------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants -... LL | x.a(); | ^^^ | + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: see issue #143874 for more information = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.nyy.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.nyy.stderr index 155263656e368..b00ad706a5fa1 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.nyy.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.nyy.stderr @@ -41,12 +41,10 @@ LL | #[cfg_attr(any(yyy, yny, nyy, nyn), const_trait)] error[E0658]: cannot call conditionally-const method `::a` in constant functions --> $DIR/super-traits-fail-3.rs:36:7 | -LL | const fn foo(x: &T) { - | ----------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants -... LL | x.a(); | ^^^ | + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants = note: see issue #143874 for more information = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.ynn.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.ynn.stderr index 4895b5b0cd08b..5951caebe7335 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.ynn.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.ynn.stderr @@ -71,9 +71,6 @@ LL | #[const_trait] trait Bar: [const] Foo {} error[E0015]: cannot call non-const method `::a` in constant functions --> $DIR/super-traits-fail-3.rs:36:7 | -LL | const fn foo(x: &T) { - | ----------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants -... LL | x.a(); | ^^^ | @@ -84,6 +81,7 @@ LL | trait Foo { | ^^^^^^^^^ this trait is not const LL | fn a(&self); | ------------ this method is not const + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/ui/traits/const-traits/super-traits-fail-3.yny.stderr b/tests/ui/traits/const-traits/super-traits-fail-3.yny.stderr index 29bce84326cab..563495204ad7b 100644 --- a/tests/ui/traits/const-traits/super-traits-fail-3.yny.stderr +++ b/tests/ui/traits/const-traits/super-traits-fail-3.yny.stderr @@ -60,9 +60,6 @@ LL | #[const_trait] trait Foo { error[E0015]: cannot call non-const method `::a` in constant functions --> $DIR/super-traits-fail-3.rs:36:7 | -LL | const fn foo(x: &T) { - | ----------------------------------- calls in constant functions are limited to constant functions, tuple structs and tuple variants -... LL | x.a(); | ^^^ | @@ -73,6 +70,7 @@ LL | trait Foo { | ^^^^^^^^^ this trait is not const LL | fn a(&self); | ------------ this method is not const + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants help: consider making trait `Foo` const | LL + #[const_trait] diff --git a/tests/ui/typeck/typeck_type_placeholder_item.stderr b/tests/ui/typeck/typeck_type_placeholder_item.stderr index a58ee60a11471..76e028bcc0019 100644 --- a/tests/ui/typeck/typeck_type_placeholder_item.stderr +++ b/tests/ui/typeck/typeck_type_placeholder_item.stderr @@ -630,23 +630,20 @@ error[E0015]: cannot call non-const function `map::` in constants --> $DIR/typeck_type_placeholder_item.rs:231:22 | LL | const _: Option<_> = map(value); - | ------------------ ^^^^^^^^^^ - | | - | calls in constants are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^ | note: function `map` is not const --> $DIR/typeck_type_placeholder_item.rs:222:1 | LL | fn map(_: fn() -> Option<&'static T>) -> Option { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = note: calls in constants are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const method ` as Iterator>::filter::<{closure@$DIR/typeck_type_placeholder_item.rs:240:29: 240:32}>` in constants --> $DIR/typeck_type_placeholder_item.rs:240:22 | LL | const _: _ = (1..10).filter(|x| x % 2 == 0).map(|x| x * x); - | ---------- ^^^^^^^^^^^^^^^^^^^^^^ - | | - | calls in constants are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^^^^^^^^^^^^ | note: method `filter` is not const because trait `Iterator` is not const --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL @@ -655,14 +652,13 @@ note: method `filter` is not const because trait `Iterator` is not const ::: $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL | = note: this method is not const + = note: calls in constants are limited to constant functions, tuple structs and tuple variants error[E0015]: cannot call non-const method `, {closure@$DIR/typeck_type_placeholder_item.rs:240:29: 240:32}> as Iterator>::map::` in constants --> $DIR/typeck_type_placeholder_item.rs:240:45 | LL | const _: _ = (1..10).filter(|x| x % 2 == 0).map(|x| x * x); - | ---------- ^^^^^^^^^^^^^^ - | | - | calls in constants are limited to constant functions, tuple structs and tuple variants + | ^^^^^^^^^^^^^^ | note: method `map` is not const because trait `Iterator` is not const --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL @@ -671,6 +667,7 @@ note: method `map` is not const because trait `Iterator` is not const ::: $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL | = note: this method is not const + = note: calls in constants are limited to constant functions, tuple structs and tuple variants error: aborting due to 83 previous errors