Rollup merge of #144194 - estebank:const-traits, r=davidtwco

Provide additional context to errors involving const traits

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<T: PointeeSized> 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<T: PointeeSized> PartialEq for *mut T {
     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```
This commit is contained in:
Stuart Cook 2025-11-03 11:52:39 +11:00 committed by GitHub
commit 10e445c9c8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
54 changed files with 475 additions and 12 deletions

View file

@ -1,8 +1,8 @@
//! 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_id::DefId;
use rustc_infer::infer::TyCtxtInferExt;
@ -11,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, AssocContainer, 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};
@ -352,18 +352,71 @@ 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,
});
if let Some(item) = ccx.tcx.opt_associated_item(callee) {
if let AssocContainer::Trait = item.container
&& let parent = item.container_id(ccx.tcx)
&& !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",
),
);
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
.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::MaybeIncorrect,
);
} 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 {
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!(
"calls in {}s are limited to constant functions, \
tuple structs and tuple variants",
"calls in {}s are limited to constant functions, tuple structs and tuple variants",
ccx.const_kind(),
));

View file

@ -839,6 +839,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.trait_ref.path.span.shrink_to_lo(),
format!("make the `impl` of trait `{trait_name}` `const`"),
"const ".to_string(),
Applicability::MaybeIncorrect,
);
} else {
diag.span_note(
impl_span,
format!("trait `{trait_name}` is implemented but not `const`"),
);
}
}
}
diag
}

View file

@ -58,7 +58,20 @@ error[E0015]: cannot call non-const method `<T as Foo>::a` in constant functions
LL | x.a();
| ^^^
|
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]`
= 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

View file

@ -38,7 +38,19 @@ error[E0015]: cannot call non-const method `<T as Foo>::a` in constant functions
LL | x.a();
| ^^^
|
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
= 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 4 previous errors

View file

@ -56,6 +56,14 @@ error[E0015]: cannot call non-const method `<T as Foo>::a` in constant functions
10 | x.a();
| ^^^
|
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
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
error: aborting due to 6 previous errors

View file

@ -46,6 +46,14 @@ error[E0015]: cannot call non-const method `<T as Foo>::a` in constant functions
10 | x.a();
| ^^^
|
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
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
error: aborting due to 5 previous errors

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -3,6 +3,9 @@ error[E0277]: the trait bound `TypeId: const PartialOrd` is not satisfied
|
LL | let _a = TypeId::of::<u8>() < TypeId::of::<u16>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: trait `PartialOrd` is implemented but not `const`
--> $SRC_DIR/core/src/any.rs:LL:COL
error: aborting due to 1 previous error

View file

@ -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

View file

@ -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(|| ...)`

View file

@ -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(|| ...)`

View file

@ -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

View file

@ -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(|| ...)`

View file

@ -4,6 +4,11 @@ error[E0015]: cannot call non-const function `create_some` in constants
LL | const FOO: Option<u8> = create_some();
| ^^^^^^^^^^^^^
|
note: function `create_some` is not const
--> $DIR/E0015.rs:1:1
|
LL | fn create_some() -> Option<u8> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
error: aborting due to 1 previous error

View file

@ -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

View file

@ -4,7 +4,20 @@ error[E0015]: cannot call non-const associated function `<Dim3 as Dim>::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
= 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]
LL | trait Dim {
|
error[E0015]: cannot call non-const associated function `<Dim3 as Dim>::dim` in constants
--> $DIR/issue-39559-2.rs:16:15
@ -12,7 +25,20 @@ error[E0015]: cannot call non-const associated function `<Dim3 as Dim>::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
= 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]
LL | trait Dim {
|
error: aborting due to 2 previous errors

View file

@ -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(|| ...)`

View file

@ -35,6 +35,13 @@ error[E0015]: cannot call non-const method `<str as ToString>::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(|| ...)`

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -11,6 +11,10 @@ note: required by a bound in `equals_self`
|
LL | const fn equals_self<T: [const] Foo>(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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -16,6 +16,10 @@ note: required by a bound in `check`
|
LL | const fn check<T: [const] Destruct>(_: 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

View file

@ -16,6 +16,10 @@ note: required by a bound in `check`
|
LL | const fn check<T: [const] Destruct>(_: 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

View file

@ -11,12 +11,21 @@ note: required by a bound in `bar`
|
LL | const fn bar<T: [const] Foo>(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

View file

@ -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

View file

@ -9,6 +9,10 @@ note: required by a bound in `foo`
|
LL | const fn foo<T>() 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

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -4,7 +4,19 @@ error[E0015]: cannot call non-const associated function `<T as A>::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

View file

@ -9,6 +9,10 @@ note: required by a bound in `Foo::Assoc`
|
LL | type Assoc<T>: [const] Bar
| ^^^^^^^^^^^ required by this bound in `Foo::Assoc`
help: make the `impl` of trait `Bar` `const`
|
LL | impl<T> const Bar for N<T> where T: Bar {}
| +++++
error[E0277]: the trait bound `T: [const] Bar` is not satisfied
--> $DIR/item-bound-entailment-fails.rs:24:21

View file

@ -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

View file

@ -11,6 +11,10 @@ note: required by a bound in `call_indirect`
|
LL | const fn call_indirect<T: [const] Fn()>(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

View file

@ -59,6 +59,11 @@ error[E0277]: the trait bound `(): const Bar` is not satisfied
|
LL | <() as Bar<false>>::bar();
| ^^
|
help: make the `impl` of trait `Bar` `const`
|
LL | impl const Bar for () {
| +++++
error: aborting due to 5 previous errors

View file

@ -3,6 +3,11 @@ error[E0277]: the trait bound `T: [const] A` is not satisfied
|
LL | <T as A>::a();
| ^
|
help: make the `impl` of trait `A` `const`
|
LL | impl<T: Default> const A for T {
| +++++
error: aborting due to 1 previous error

View file

@ -51,7 +51,19 @@ error[E0015]: cannot call non-const method `<T as Foo>::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

View file

@ -63,7 +63,19 @@ error[E0015]: cannot call non-const method `<T as Foo>::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

View file

@ -94,7 +94,20 @@ error[E0015]: cannot call non-const method `<T as Foo>::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
= 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]
LL | trait Foo {
|
error: aborting due to 9 previous errors

View file

@ -94,7 +94,20 @@ error[E0015]: cannot call non-const method `<T as Foo>::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
= 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]
LL | trait Foo {
|
error: aborting due to 9 previous errors

View file

@ -74,7 +74,19 @@ error[E0015]: cannot call non-const method `<T as Foo>::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

View file

@ -63,7 +63,19 @@ error[E0015]: cannot call non-const method `<T as Foo>::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

View file

@ -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

View file

@ -671,6 +671,11 @@ error[E0015]: cannot call non-const function `map::<u8>` in constants
LL | const _: Option<_> = map(value);
| ^^^^^^^^^^
|
note: function `map` is not const
--> $DIR/typeck_type_placeholder_item.rs:222:1
|
LL | fn map<T>(_: fn() -> Option<&'static T>) -> Option<T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
error[E0015]: cannot call non-const method `<std::ops::Range<i32> as Iterator>::filter::<{closure@$DIR/typeck_type_placeholder_item.rs:240:29: 240:32}>` in constants
@ -679,6 +684,13 @@ error[E0015]: cannot call non-const method `<std::ops::Range<i32> 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 `<Filter<std::ops::Range<i32>, {closure@$DIR/typeck_type_placeholder_item.rs:240:29: 240:32}> as Iterator>::map::<i32, {closure@$DIR/typeck_type_placeholder_item.rs:240:49: 240:52}>` in constants
@ -687,6 +699,13 @@ error[E0015]: cannot call non-const method `<Filter<std::ops::Range<i32>, {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