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:
commit
10e445c9c8
54 changed files with 475 additions and 12 deletions
|
|
@ -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(),
|
||||
));
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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(|| ...)`
|
||||
|
||||
|
|
|
|||
|
|
@ -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(|| ...)`
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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(|| ...)`
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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(|| ...)`
|
||||
|
||||
|
|
|
|||
|
|
@ -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(|| ...)`
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue