diff --git a/compiler/rustc_const_eval/src/transform/check_consts/check.rs b/compiler/rustc_const_eval/src/transform/check_consts/check.rs index b78924490ca..7dc279cc840 100644 --- a/compiler/rustc_const_eval/src/transform/check_consts/check.rs +++ b/compiler/rustc_const_eval/src/transform/check_consts/check.rs @@ -230,8 +230,6 @@ impl<'mir, 'tcx> Checker<'mir, 'tcx> { } } - self.check_item_predicates(); - for (idx, local) in body.local_decls.iter_enumerated() { // Handle the return place below. if idx == RETURN_PLACE || local.internal { @@ -358,83 +356,11 @@ impl<'mir, 'tcx> Checker<'mir, 'tcx> { match *ty.kind() { ty::Ref(_, _, hir::Mutability::Mut) => self.check_op(ops::ty::MutRef(kind)), - ty::Opaque(..) => self.check_op(ops::ty::ImplTrait), - ty::FnPtr(..) => self.check_op(ops::ty::FnPtr(kind)), - - ty::Dynamic(preds, _) => { - for pred in preds.iter() { - match pred.skip_binder() { - ty::ExistentialPredicate::AutoTrait(_) - | ty::ExistentialPredicate::Projection(_) => { - self.check_op(ops::ty::DynTrait(kind)) - } - ty::ExistentialPredicate::Trait(trait_ref) => { - if Some(trait_ref.def_id) != self.tcx.lang_items().sized_trait() { - self.check_op(ops::ty::DynTrait(kind)) - } - } - } - } - } _ => {} } } } - fn check_item_predicates(&mut self) { - let ConstCx { tcx, .. } = *self.ccx; - - let mut current = self.def_id().to_def_id(); - loop { - let predicates = tcx.predicates_of(current); - for (predicate, _) in predicates.predicates { - match predicate.kind().skip_binder() { - ty::PredicateKind::RegionOutlives(_) - | ty::PredicateKind::TypeOutlives(_) - | ty::PredicateKind::WellFormed(_) - | ty::PredicateKind::Projection(_) - | ty::PredicateKind::ConstEvaluatable(..) - | ty::PredicateKind::ConstEquate(..) - | ty::PredicateKind::TypeWellFormedFromEnv(..) => continue, - ty::PredicateKind::ObjectSafe(_) => { - bug!("object safe predicate on function: {:#?}", predicate) - } - ty::PredicateKind::ClosureKind(..) => { - bug!("closure kind predicate on function: {:#?}", predicate) - } - ty::PredicateKind::Subtype(_) | ty::PredicateKind::Coerce(_) => { - bug!("subtype/coerce predicate on function: {:#?}", predicate) - } - ty::PredicateKind::Trait(pred) => { - if Some(pred.def_id()) == tcx.lang_items().sized_trait() { - continue; - } - match pred.self_ty().kind() { - ty::Param(p) => { - let generics = tcx.generics_of(current); - let def = generics.type_param(p, tcx); - let span = tcx.def_span(def.def_id); - - // These are part of the function signature, so treat them like - // arguments when determining importance. - let kind = LocalKind::Arg; - - self.check_op_spanned(ops::ty::TraitBound(kind), span); - } - // other kinds of bounds are either tautologies - // or cause errors in other passes - _ => continue, - } - } - } - } - match predicates.parent { - Some(parent) => current = parent, - None => break, - } - } - } - fn check_mut_borrow(&mut self, local: Local, kind: hir::BorrowKind) { match self.const_kind() { // In a const fn all borrows are transient or point to the places given via @@ -613,7 +539,9 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> { ), _, _, - ) => self.check_op(ops::FnPtrCast), + ) => { + // Nothing to do here. Function pointer casts are allowed now. + } Rvalue::Cast(CastKind::Pointer(PointerCast::Unsize), _, _) => { // Nothing to check here (`check_local_or_return_ty` ensures no trait objects occur diff --git a/compiler/rustc_const_eval/src/transform/check_consts/ops.rs b/compiler/rustc_const_eval/src/transform/check_consts/ops.rs index f6b92df92c0..ba248a3b6cb 100644 --- a/compiler/rustc_const_eval/src/transform/check_consts/ops.rs +++ b/compiler/rustc_const_eval/src/transform/check_consts/ops.rs @@ -355,31 +355,6 @@ impl<'tcx> NonConstOp<'tcx> for FnCallUnstable { } } -#[derive(Debug)] -pub struct FnPtrCast; -impl<'tcx> NonConstOp<'tcx> for FnPtrCast { - fn status_in_item(&self, ccx: &ConstCx<'_, 'tcx>) -> Status { - if ccx.const_kind() != hir::ConstContext::ConstFn { - Status::Allowed - } else { - Status::Unstable(sym::const_fn_fn_ptr_basics) - } - } - - fn build_error( - &self, - ccx: &ConstCx<'_, 'tcx>, - span: Span, - ) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> { - feature_err( - &ccx.tcx.sess.parse_sess, - sym::const_fn_fn_ptr_basics, - span, - &format!("function pointer casts are not allowed in {}s", ccx.const_kind()), - ) - } -} - #[derive(Debug)] pub struct Generator(pub hir::GeneratorKind); impl<'tcx> NonConstOp<'tcx> for Generator { @@ -820,167 +795,4 @@ pub mod ty { ) } } - - #[derive(Debug)] - pub struct FnPtr(pub mir::LocalKind); - impl<'tcx> NonConstOp<'tcx> for FnPtr { - fn importance(&self) -> DiagnosticImportance { - match self.0 { - mir::LocalKind::Var | mir::LocalKind::Temp => DiagnosticImportance::Secondary, - mir::LocalKind::ReturnPointer | mir::LocalKind::Arg => { - DiagnosticImportance::Primary - } - } - } - - fn status_in_item(&self, ccx: &ConstCx<'_, 'tcx>) -> Status { - if ccx.const_kind() != hir::ConstContext::ConstFn { - Status::Allowed - } else { - Status::Unstable(sym::const_fn_fn_ptr_basics) - } - } - - fn build_error( - &self, - ccx: &ConstCx<'_, 'tcx>, - span: Span, - ) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> { - feature_err( - &ccx.tcx.sess.parse_sess, - sym::const_fn_fn_ptr_basics, - span, - &format!("function pointers cannot appear in {}s", ccx.const_kind()), - ) - } - } - - #[derive(Debug)] - pub struct ImplTrait; - impl<'tcx> NonConstOp<'tcx> for ImplTrait { - fn status_in_item(&self, _: &ConstCx<'_, '_>) -> Status { - Status::Unstable(sym::const_impl_trait) - } - - fn build_error( - &self, - ccx: &ConstCx<'_, 'tcx>, - span: Span, - ) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> { - feature_err( - &ccx.tcx.sess.parse_sess, - sym::const_impl_trait, - span, - &format!("`impl Trait` is not allowed in {}s", ccx.const_kind()), - ) - } - } - - #[derive(Debug)] - pub struct TraitBound(pub mir::LocalKind); - impl<'tcx> NonConstOp<'tcx> for TraitBound { - fn importance(&self) -> DiagnosticImportance { - match self.0 { - mir::LocalKind::Var | mir::LocalKind::Temp => DiagnosticImportance::Secondary, - mir::LocalKind::ReturnPointer | mir::LocalKind::Arg => { - DiagnosticImportance::Primary - } - } - } - - fn status_in_item(&self, ccx: &ConstCx<'_, 'tcx>) -> Status { - if ccx.const_kind() != hir::ConstContext::ConstFn { - Status::Allowed - } else { - Status::Unstable(sym::const_fn_trait_bound) - } - } - - fn build_error( - &self, - ccx: &ConstCx<'_, 'tcx>, - span: Span, - ) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> { - let mut err = feature_err( - &ccx.tcx.sess.parse_sess, - sym::const_fn_trait_bound, - span, - "trait bounds other than `Sized` on const fn parameters are unstable", - ); - - match ccx.fn_sig() { - Some(fn_sig) if !fn_sig.span.contains(span) => { - err.span_label(fn_sig.span, "function declared as const here"); - } - _ => {} - } - - err - } - } - - #[derive(Debug)] - pub struct DynTrait(pub mir::LocalKind); - impl<'tcx> NonConstOp<'tcx> for DynTrait { - fn importance(&self) -> DiagnosticImportance { - match self.0 { - mir::LocalKind::Var | mir::LocalKind::Temp => DiagnosticImportance::Secondary, - mir::LocalKind::ReturnPointer | mir::LocalKind::Arg => { - DiagnosticImportance::Primary - } - } - } - - fn status_in_item(&self, ccx: &ConstCx<'_, 'tcx>) -> Status { - if ccx.const_kind() != hir::ConstContext::ConstFn { - Status::Allowed - } else { - Status::Unstable(sym::const_fn_trait_bound) - } - } - - fn build_error( - &self, - ccx: &ConstCx<'_, 'tcx>, - span: Span, - ) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> { - let mut err = feature_err( - &ccx.tcx.sess.parse_sess, - sym::const_fn_trait_bound, - span, - "trait objects in const fn are unstable", - ); - - match ccx.fn_sig() { - Some(fn_sig) if !fn_sig.span.contains(span) => { - err.span_label(fn_sig.span, "function declared as const here"); - } - _ => {} - } - - err - } - } - - /// A trait bound with the `?const Trait` opt-out - #[derive(Debug)] - pub struct TraitBoundNotConst; - impl<'tcx> NonConstOp<'tcx> for TraitBoundNotConst { - fn status_in_item(&self, _: &ConstCx<'_, 'tcx>) -> Status { - Status::Unstable(sym::const_trait_bound_opt_out) - } - - fn build_error( - &self, - ccx: &ConstCx<'_, 'tcx>, - span: Span, - ) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> { - feature_err( - &ccx.tcx.sess.parse_sess, - sym::const_trait_bound_opt_out, - span, - "`?const Trait` syntax is unstable", - ) - } - } } diff --git a/compiler/rustc_feature/src/accepted.rs b/compiler/rustc_feature/src/accepted.rs index d43f926d0a5..fc2ac75d609 100644 --- a/compiler/rustc_feature/src/accepted.rs +++ b/compiler/rustc_feature/src/accepted.rs @@ -86,6 +86,10 @@ declare_features! ( (accepted, conservative_impl_trait, "1.26.0", Some(34511), None), /// Allows calling constructor functions in `const fn`. (accepted, const_constructor, "1.40.0", Some(61456), None), + /// Allows using and casting function pointers in a `const fn`. + (accepted, const_fn_fn_ptr_basics, "1.61.0", Some(57563), None), + /// Allows trait bounds in `const fn`. + (accepted, const_fn_trait_bound, "1.61.0", Some(93706), None), /// Allows calling `transmute` in const fn (accepted, const_fn_transmute, "1.56.0", Some(53605), None), /// Allows accessing fields of unions inside `const` functions. @@ -96,6 +100,8 @@ declare_features! ( (accepted, const_generics_defaults, "1.59.0", Some(44580), None), /// Allows the use of `if` and `match` in constants. (accepted, const_if_match, "1.46.0", Some(49146), None), + /// Allows argument and return position `impl Trait` in a `const fn`. + (accepted, const_impl_trait, "1.61.0", Some(77463), None), /// Allows indexing into constant arrays. (accepted, const_indexing, "1.26.0", Some(29947), None), /// Allows let bindings, assignments and destructuring in `const` functions and constants. diff --git a/compiler/rustc_feature/src/active.rs b/compiler/rustc_feature/src/active.rs index 1f7dc769512..a69d28b184a 100644 --- a/compiler/rustc_feature/src/active.rs +++ b/compiler/rustc_feature/src/active.rs @@ -338,14 +338,8 @@ declare_features! ( (active, const_extern_fn, "1.40.0", Some(64926), None), /// Allows basic arithmetic on floating point types in a `const fn`. (active, const_fn_floating_point_arithmetic, "1.48.0", Some(57241), None), - /// Allows using and casting function pointers in a `const fn`. - (active, const_fn_fn_ptr_basics, "1.48.0", Some(57563), None), - /// Allows trait bounds in `const fn`. - (active, const_fn_trait_bound, "1.53.0", Some(93706), None), /// Allows `for _ in _` loops in const contexts. (active, const_for, "1.56.0", Some(87575), None), - /// Allows argument and return position `impl Trait` in a `const fn`. - (active, const_impl_trait, "1.48.0", Some(77463), None), /// Allows using `&mut` in constant functions. (active, const_mut_refs, "1.41.0", Some(57349), None), /// Be more precise when looking for live drops in a const context. diff --git a/library/alloc/src/lib.rs b/library/alloc/src/lib.rs index 82493f9c398..0a180b83355 100644 --- a/library/alloc/src/lib.rs +++ b/library/alloc/src/lib.rs @@ -140,7 +140,7 @@ #![feature(box_syntax)] #![feature(cfg_sanitize)] #![feature(const_deref)] -#![feature(const_fn_trait_bound)] +#![cfg_attr(bootstrap, feature(const_fn_trait_bound))] #![feature(const_mut_refs)] #![feature(const_ptr_write)] #![feature(const_precise_live_drops)] diff --git a/library/core/src/lib.rs b/library/core/src/lib.rs index 45fbcf44b35..f436afbee44 100644 --- a/library/core/src/lib.rs +++ b/library/core/src/lib.rs @@ -158,9 +158,9 @@ #![feature(cfg_target_has_atomic)] #![feature(cfg_target_has_atomic_equal_alignment)] #![feature(const_fn_floating_point_arithmetic)] -#![feature(const_fn_fn_ptr_basics)] -#![feature(const_fn_trait_bound)] -#![feature(const_impl_trait)] +#![cfg_attr(bootstrap, feature(const_fn_fn_ptr_basics))] +#![cfg_attr(bootstrap, feature(const_fn_trait_bound))] +#![cfg_attr(bootstrap, feature(const_impl_trait))] #![feature(const_mut_refs)] #![feature(const_precise_live_drops)] #![feature(const_refs_to_cell)] diff --git a/library/proc_macro/src/lib.rs b/library/proc_macro/src/lib.rs index c5afca6d56a..31900912df4 100644 --- a/library/proc_macro/src/lib.rs +++ b/library/proc_macro/src/lib.rs @@ -20,8 +20,8 @@ #![feature(rustc_allow_const_fn_unstable)] #![feature(nll)] #![feature(staged_api)] -#![feature(const_fn_trait_bound)] -#![feature(const_fn_fn_ptr_basics)] +#![cfg_attr(bootstrap, feature(const_fn_trait_bound))] +#![cfg_attr(bootstrap, feature(const_fn_fn_ptr_basics))] #![feature(allow_internal_unstable)] #![feature(decl_macro)] #![feature(extern_types)] diff --git a/library/std/src/lib.rs b/library/std/src/lib.rs index 36e6032b5e4..5b02e711aab 100644 --- a/library/std/src/lib.rs +++ b/library/std/src/lib.rs @@ -242,8 +242,8 @@ #![feature(char_internals)] #![feature(concat_bytes)] #![feature(concat_idents)] -#![feature(const_fn_fn_ptr_basics)] -#![feature(const_fn_trait_bound)] +#![cfg_attr(bootstrap, feature(const_fn_fn_ptr_basics))] +#![cfg_attr(bootstrap, feature(const_fn_trait_bound))] #![feature(const_format_args)] #![feature(const_io_structs)] #![feature(const_ip)] diff --git a/src/test/ui/borrowck/issue-88434-minimal-example.rs b/src/test/ui/borrowck/issue-88434-minimal-example.rs index db348a50aa4..632f8dc3ad6 100644 --- a/src/test/ui/borrowck/issue-88434-minimal-example.rs +++ b/src/test/ui/borrowck/issue-88434-minimal-example.rs @@ -1,4 +1,3 @@ -#![feature(const_fn_trait_bound)] // Regression test related to issue 88434 const _CONST: &() = &f(&|_| {}); diff --git a/src/test/ui/borrowck/issue-88434-minimal-example.stderr b/src/test/ui/borrowck/issue-88434-minimal-example.stderr index 845e1bdba8f..d9635e1ee46 100644 --- a/src/test/ui/borrowck/issue-88434-minimal-example.stderr +++ b/src/test/ui/borrowck/issue-88434-minimal-example.stderr @@ -1,14 +1,14 @@ error[E0080]: evaluation of constant value failed - --> $DIR/issue-88434-minimal-example.rs:10:5 + --> $DIR/issue-88434-minimal-example.rs:9:5 | LL | const _CONST: &() = &f(&|_| {}); - | ---------- inside `_CONST` at $DIR/issue-88434-minimal-example.rs:4:22 + | ---------- inside `_CONST` at $DIR/issue-88434-minimal-example.rs:3:22 ... LL | panic!() | ^^^^^^^^ | | - | the evaluated program panicked at 'explicit panic', $DIR/issue-88434-minimal-example.rs:10:5 - | inside `f::<[closure@$DIR/issue-88434-minimal-example.rs:4:25: 4:31]>` at $SRC_DIR/std/src/panic.rs:LL:COL + | the evaluated program panicked at 'explicit panic', $DIR/issue-88434-minimal-example.rs:9:5 + | inside `f::<[closure@$DIR/issue-88434-minimal-example.rs:3:25: 3:31]>` at $SRC_DIR/std/src/panic.rs:LL:COL | = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/src/test/ui/borrowck/issue-88434-removal-index-should-be-less.rs b/src/test/ui/borrowck/issue-88434-removal-index-should-be-less.rs index 4db073c66b1..f0a6dcd4eb3 100644 --- a/src/test/ui/borrowck/issue-88434-removal-index-should-be-less.rs +++ b/src/test/ui/borrowck/issue-88434-removal-index-should-be-less.rs @@ -1,4 +1,3 @@ -#![feature(const_fn_trait_bound)] // Regression test for issue 88434 const _CONST: &[u8] = &f(&[], |_| {}); diff --git a/src/test/ui/borrowck/issue-88434-removal-index-should-be-less.stderr b/src/test/ui/borrowck/issue-88434-removal-index-should-be-less.stderr index 8cbb6a6340c..44e244ae9cc 100644 --- a/src/test/ui/borrowck/issue-88434-removal-index-should-be-less.stderr +++ b/src/test/ui/borrowck/issue-88434-removal-index-should-be-less.stderr @@ -1,14 +1,14 @@ error[E0080]: evaluation of constant value failed - --> $DIR/issue-88434-removal-index-should-be-less.rs:10:5 + --> $DIR/issue-88434-removal-index-should-be-less.rs:9:5 | LL | const _CONST: &[u8] = &f(&[], |_| {}); - | -------------- inside `_CONST` at $DIR/issue-88434-removal-index-should-be-less.rs:4:24 + | -------------- inside `_CONST` at $DIR/issue-88434-removal-index-should-be-less.rs:3:24 ... LL | panic!() | ^^^^^^^^ | | - | the evaluated program panicked at 'explicit panic', $DIR/issue-88434-removal-index-should-be-less.rs:10:5 - | inside `f::<[closure@$DIR/issue-88434-removal-index-should-be-less.rs:4:31: 4:37]>` at $SRC_DIR/std/src/panic.rs:LL:COL + | the evaluated program panicked at 'explicit panic', $DIR/issue-88434-removal-index-should-be-less.rs:9:5 + | inside `f::<[closure@$DIR/issue-88434-removal-index-should-be-less.rs:3:31: 3:37]>` at $SRC_DIR/std/src/panic.rs:LL:COL | = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/src/test/ui/const-generics/generic_const_exprs/issue-85848.rs b/src/test/ui/const-generics/generic_const_exprs/issue-85848.rs index 771e68b0db5..e86ffbf1075 100644 --- a/src/test/ui/const-generics/generic_const_exprs/issue-85848.rs +++ b/src/test/ui/const-generics/generic_const_exprs/issue-85848.rs @@ -1,4 +1,4 @@ -#![feature(const_fn_trait_bound, generic_const_exprs)] +#![feature(generic_const_exprs)] #![allow(incomplete_features)] trait _Contains { diff --git a/src/test/ui/const-generics/issues/issue-79674.rs b/src/test/ui/const-generics/issues/issue-79674.rs index 2f196533dd8..ff141d328e6 100644 --- a/src/test/ui/const-generics/issues/issue-79674.rs +++ b/src/test/ui/const-generics/issues/issue-79674.rs @@ -1,4 +1,4 @@ -#![feature(const_fn_trait_bound, generic_const_exprs)] +#![feature(generic_const_exprs)] #![allow(incomplete_features)] trait MiniTypeId { diff --git a/src/test/ui/consts/auxiliary/const_fn_lib.rs b/src/test/ui/consts/auxiliary/const_fn_lib.rs index bf0b01a2ecf..88cea60e1b8 100644 --- a/src/test/ui/consts/auxiliary/const_fn_lib.rs +++ b/src/test/ui/consts/auxiliary/const_fn_lib.rs @@ -1,6 +1,5 @@ // Crate that exports a const fn. Used for testing cross-crate. -#![feature(const_fn_fn_ptr_basics)] #![crate_type="rlib"] pub const fn foo() -> usize { 22 } diff --git a/src/test/ui/consts/const-block-const-bound.rs b/src/test/ui/consts/const-block-const-bound.rs index f3c82c5f968..1ccd0ee9370 100644 --- a/src/test/ui/consts/const-block-const-bound.rs +++ b/src/test/ui/consts/const-block-const-bound.rs @@ -1,5 +1,5 @@ #![allow(unused)] -#![feature(const_fn_trait_bound, const_trait_impl, inline_const, negative_impls)] +#![feature(const_trait_impl, inline_const, negative_impls)] const fn f(x: T) {} diff --git a/src/test/ui/consts/const-eval/const_fn_ptr.stderr b/src/test/ui/consts/const-eval/const_fn_ptr.stderr index a16ac7b2a24..ca1585f8837 100644 --- a/src/test/ui/consts/const-eval/const_fn_ptr.stderr +++ b/src/test/ui/consts/const-eval/const_fn_ptr.stderr @@ -10,23 +10,11 @@ help: skipping check that does not even have a feature gate | LL | X_CONST(x) | ^^^^^^^^^^ -help: skipping check for `const_fn_fn_ptr_basics` feature - --> $DIR/const_fn_ptr.rs:18:14 - | -LL | const fn foo(x: fn(usize) -> usize, y: usize) -> usize { - | ^ -help: skipping check for `const_fn_fn_ptr_basics` feature - --> $DIR/const_fn_ptr.rs:19:5 - | -LL | x(y) - | ^ help: skipping check that does not even have a feature gate --> $DIR/const_fn_ptr.rs:19:5 | LL | x(y) | ^^^^ -error: `-Zunleash-the-miri-inside-of-you` may not be used to circumvent feature gates, except when testing error paths in the CTFE engine - -error: aborting due to previous error; 1 warning emitted +warning: 1 warning emitted diff --git a/src/test/ui/consts/const-eval/const_fn_ptr_fail2.stderr b/src/test/ui/consts/const-eval/const_fn_ptr_fail2.stderr index 4f7a771f418..c17166263ba 100644 --- a/src/test/ui/consts/const-eval/const_fn_ptr_fail2.stderr +++ b/src/test/ui/consts/const-eval/const_fn_ptr_fail2.stderr @@ -12,16 +12,6 @@ LL | assert_eq!(Z, 4); warning: skipping const checks | -help: skipping check for `const_fn_fn_ptr_basics` feature - --> $DIR/const_fn_ptr_fail2.rs:11:14 - | -LL | const fn bar(x: fn(usize) -> usize, y: usize) -> usize { - | ^ -help: skipping check for `const_fn_fn_ptr_basics` feature - --> $DIR/const_fn_ptr_fail2.rs:12:5 - | -LL | x(y) - | ^ help: skipping check that does not even have a feature gate --> $DIR/const_fn_ptr_fail2.rs:12:5 | diff --git a/src/test/ui/consts/const-eval/issue-49296.rs b/src/test/ui/consts/const-eval/issue-49296.rs index 80f6bbec2a1..917777a32ff 100644 --- a/src/test/ui/consts/const-eval/issue-49296.rs +++ b/src/test/ui/consts/const-eval/issue-49296.rs @@ -1,7 +1,5 @@ // issue-49296: Unsafe shenigans in constants can result in missing errors -#![feature(const_fn_trait_bound)] - use std::mem::transmute; const fn wat(x: u64) -> &'static u64 { diff --git a/src/test/ui/consts/const-eval/issue-49296.stderr b/src/test/ui/consts/const-eval/issue-49296.stderr index bc3074b10be..1864a284579 100644 --- a/src/test/ui/consts/const-eval/issue-49296.stderr +++ b/src/test/ui/consts/const-eval/issue-49296.stderr @@ -1,5 +1,5 @@ error[E0080]: evaluation of constant value failed - --> $DIR/issue-49296.rs:11:16 + --> $DIR/issue-49296.rs:9:16 | LL | const X: u64 = *wat(42); | ^^^^^^^^ pointer to alloc2 was dereferenced after this allocation got freed diff --git a/src/test/ui/consts/const-eval/issue-70804-fn-subtyping.rs b/src/test/ui/consts/const-eval/issue-70804-fn-subtyping.rs index bf8bae5ea2c..abd1d32abe2 100644 --- a/src/test/ui/consts/const-eval/issue-70804-fn-subtyping.rs +++ b/src/test/ui/consts/const-eval/issue-70804-fn-subtyping.rs @@ -1,5 +1,4 @@ // check-pass -#![feature(const_fn_fn_ptr_basics)] const fn nested(x: (for<'a> fn(&'a ()), String)) -> (fn(&'static ()), String) { x diff --git a/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.rs b/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.rs index 46748673067..c7078e46fa6 100644 --- a/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.rs +++ b/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.rs @@ -2,8 +2,6 @@ const extern "C" fn unsize(x: &[u8; 3]) -> &[u8] { x } const unsafe extern "C" fn closure() -> fn() { || {} } -//~^ ERROR function pointer -//~| ERROR function pointer cast const unsafe extern "C" fn use_float() { 1.0 + 1.0; } //~^ ERROR floating point arithmetic const extern "C" fn ptr_cast(val: *const u8) { val as usize; } diff --git a/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.stderr b/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.stderr index 2b2d23477f6..4bab466fb95 100644 --- a/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.stderr +++ b/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.stderr @@ -1,23 +1,5 @@ -error[E0658]: function pointers cannot appear in constant functions - --> $DIR/const-extern-fn-min-const-fn.rs:4:41 - | -LL | const unsafe extern "C" fn closure() -> fn() { || {} } - | ^^^^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error[E0658]: function pointer casts are not allowed in constant functions - --> $DIR/const-extern-fn-min-const-fn.rs:4:48 - | -LL | const unsafe extern "C" fn closure() -> fn() { || {} } - | ^^^^^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - error[E0658]: floating point arithmetic is not allowed in constant functions - --> $DIR/const-extern-fn-min-const-fn.rs:7:42 + --> $DIR/const-extern-fn-min-const-fn.rs:5:42 | LL | const unsafe extern "C" fn use_float() { 1.0 + 1.0; } | ^^^^^^^^^ @@ -26,7 +8,7 @@ LL | const unsafe extern "C" fn use_float() { 1.0 + 1.0; } = help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable error: pointers cannot be cast to integers during const eval - --> $DIR/const-extern-fn-min-const-fn.rs:9:48 + --> $DIR/const-extern-fn-min-const-fn.rs:7:48 | LL | const extern "C" fn ptr_cast(val: *const u8) { val as usize; } | ^^^^^^^^^^^^ @@ -34,6 +16,6 @@ LL | const extern "C" fn ptr_cast(val: *const u8) { val as usize; } = note: at compile-time, pointers do not have an integer value = note: avoiding this restriction via `transmute`, `union`, or raw pointers leads to compile-time undefined behavior -error: aborting due to 4 previous errors +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/const-fn.rs b/src/test/ui/consts/const-fn.rs index 1928c51885e..59680e6e4a8 100644 --- a/src/test/ui/consts/const-fn.rs +++ b/src/test/ui/consts/const-fn.rs @@ -4,7 +4,6 @@ // A very basic test of const fn functionality. #![feature(const_indexing)] -#![feature(const_fn_trait_bound)] const fn add(x: u32, y: u32) -> u32 { x + y diff --git a/src/test/ui/consts/const_fn_trait_bound.gated.stderr b/src/test/ui/consts/const_fn_trait_bound.gated.stderr deleted file mode 100644 index ded05cb17c5..00000000000 --- a/src/test/ui/consts/const_fn_trait_bound.gated.stderr +++ /dev/null @@ -1,8 +0,0 @@ -error: fatal error triggered by #[rustc_error] - --> $DIR/const_fn_trait_bound.rs:17:1 - | -LL | fn main() {} - | ^^^^^^^^^ - -error: aborting due to previous error - diff --git a/src/test/ui/consts/const_fn_trait_bound.rs b/src/test/ui/consts/const_fn_trait_bound.rs deleted file mode 100644 index 19c08b62144..00000000000 --- a/src/test/ui/consts/const_fn_trait_bound.rs +++ /dev/null @@ -1,17 +0,0 @@ -// gate-test-const_fn_trait_bound - -// revisions: stock gated - -#![feature(rustc_attrs)] -#![cfg_attr(gated, feature(const_fn_trait_bound))] - -const fn test1() {} -//[stock]~^ trait bounds -const fn test2(_x: &dyn Send) {} -//[stock]~^ trait objects in const fn are unstable -const fn test3() -> &'static dyn Send { loop {} } -//[stock]~^ trait objects in const fn are unstable - - -#[rustc_error] -fn main() {} //[gated]~ fatal error triggered by #[rustc_error] diff --git a/src/test/ui/consts/const_fn_trait_bound.stock.stderr b/src/test/ui/consts/const_fn_trait_bound.stock.stderr deleted file mode 100644 index 7d9e18cb341..00000000000 --- a/src/test/ui/consts/const_fn_trait_bound.stock.stderr +++ /dev/null @@ -1,30 +0,0 @@ -error[E0658]: trait bounds other than `Sized` on const fn parameters are unstable - --> $DIR/const_fn_trait_bound.rs:8:16 - | -LL | const fn test1() {} - | ^ - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error[E0658]: trait objects in const fn are unstable - --> $DIR/const_fn_trait_bound.rs:10:16 - | -LL | const fn test2(_x: &dyn Send) {} - | ^^ - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error[E0658]: trait objects in const fn are unstable - --> $DIR/const_fn_trait_bound.rs:12:21 - | -LL | const fn test3() -> &'static dyn Send { loop {} } - | ^^^^^^^^^^^^^^^^^ - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error: aborting due to 3 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/issue-37550-1.rs b/src/test/ui/consts/issue-37550-1.rs index 35b63bddca2..4d00ac7fd0d 100644 --- a/src/test/ui/consts/issue-37550-1.rs +++ b/src/test/ui/consts/issue-37550-1.rs @@ -1,6 +1,8 @@ +// check-pass + const fn x() { let t = true; - let x = || t; //~ ERROR function pointer + let x = || t; } fn main() {} diff --git a/src/test/ui/consts/issue-37550-1.stderr b/src/test/ui/consts/issue-37550-1.stderr deleted file mode 100644 index f66d7067870..00000000000 --- a/src/test/ui/consts/issue-37550-1.stderr +++ /dev/null @@ -1,12 +0,0 @@ -error[E0658]: function pointers cannot appear in constant functions - --> $DIR/issue-37550-1.rs:3:9 - | -LL | let x = || t; - | ^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/issue-37550.rs b/src/test/ui/consts/issue-37550.rs index 15877c53747..724eb28291e 100644 --- a/src/test/ui/consts/issue-37550.rs +++ b/src/test/ui/consts/issue-37550.rs @@ -2,8 +2,6 @@ #![allow(dead_code)] #![allow(unused_variables)] -#![feature(const_fn_fn_ptr_basics)] - const fn x() { let t = true; let x = || t; diff --git a/src/test/ui/consts/issue-46553.rs b/src/test/ui/consts/issue-46553.rs index 0a1e835672d..9438df1937b 100644 --- a/src/test/ui/consts/issue-46553.rs +++ b/src/test/ui/consts/issue-46553.rs @@ -1,5 +1,4 @@ // run-pass -#![feature(const_fn_fn_ptr_basics)] #![deny(const_err)] pub struct Data { diff --git a/src/test/ui/consts/issue-56164.rs b/src/test/ui/consts/issue-56164.rs index 9c673d20b2a..22ac75514f6 100644 --- a/src/test/ui/consts/issue-56164.rs +++ b/src/test/ui/consts/issue-56164.rs @@ -1,5 +1,3 @@ -#![feature(const_fn_fn_ptr_basics)] - const fn foo() { (||{})() } //~^ ERROR cannot call non-const closure diff --git a/src/test/ui/consts/issue-56164.stderr b/src/test/ui/consts/issue-56164.stderr index 62a7c7db6b8..803424eedf3 100644 --- a/src/test/ui/consts/issue-56164.stderr +++ b/src/test/ui/consts/issue-56164.stderr @@ -1,5 +1,5 @@ error[E0015]: cannot call non-const closure in constant functions - --> $DIR/issue-56164.rs:3:18 + --> $DIR/issue-56164.rs:1:18 | LL | const fn foo() { (||{})() } | ^^^^^^^^ @@ -8,7 +8,7 @@ LL | const fn foo() { (||{})() } = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: function pointers are not allowed in const fn - --> $DIR/issue-56164.rs:7:5 + --> $DIR/issue-56164.rs:5:5 | LL | input() | ^^^^^^^ diff --git a/src/test/ui/consts/issue-88071.rs b/src/test/ui/consts/issue-88071.rs index a2d4a642128..1c38c43e6c0 100644 --- a/src/test/ui/consts/issue-88071.rs +++ b/src/test/ui/consts/issue-88071.rs @@ -3,7 +3,6 @@ // regression test for #88071 #![feature(const_btree_new)] -#![feature(const_fn_trait_bound)] use std::collections::BTreeMap; diff --git a/src/test/ui/consts/min_const_fn/allow_const_fn_ptr.rs b/src/test/ui/consts/min_const_fn/allow_const_fn_ptr.rs deleted file mode 100644 index a0870ea6de3..00000000000 --- a/src/test/ui/consts/min_const_fn/allow_const_fn_ptr.rs +++ /dev/null @@ -1,15 +0,0 @@ -#![feature(rustc_attrs, staged_api, rustc_allow_const_fn_unstable)] -#![feature(const_fn_fn_ptr_basics)] -#![stable(feature = "rust1", since = "1.0.0")] - -#[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_stable(since="1.0.0", feature = "mep")] -const fn error(_: fn()) {} -//~^ ERROR const-stable function cannot use `#[feature(const_fn_fn_ptr_basics)]` - -#[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_stable(since="1.0.0", feature = "mep")] -#[rustc_allow_const_fn_unstable(const_fn_fn_ptr_basics)] -const fn compiles(_: fn()) {} - -fn main() {} diff --git a/src/test/ui/consts/min_const_fn/allow_const_fn_ptr.stderr b/src/test/ui/consts/min_const_fn/allow_const_fn_ptr.stderr deleted file mode 100644 index 3523cab49fd..00000000000 --- a/src/test/ui/consts/min_const_fn/allow_const_fn_ptr.stderr +++ /dev/null @@ -1,17 +0,0 @@ -error: const-stable function cannot use `#[feature(const_fn_fn_ptr_basics)]` - --> $DIR/allow_const_fn_ptr.rs:7:16 - | -LL | const fn error(_: fn()) {} - | ^ - | -help: if it is not part of the public API, make this function unstably const - | -LL | #[rustc_const_unstable(feature = "...", issue = "...")] - | -help: otherwise `#[rustc_allow_const_fn_unstable]` can be used to bypass stability checks - | -LL | #[rustc_allow_const_fn_unstable(const_fn_fn_ptr_basics)] - | - -error: aborting due to previous error - diff --git a/src/test/ui/consts/min_const_fn/allow_const_fn_ptr_run_pass.rs b/src/test/ui/consts/min_const_fn/allow_const_fn_ptr_run_pass.rs index 430e911aacd..2dbc424d3ba 100644 --- a/src/test/ui/consts/min_const_fn/allow_const_fn_ptr_run_pass.rs +++ b/src/test/ui/consts/min_const_fn/allow_const_fn_ptr_run_pass.rs @@ -1,13 +1,11 @@ // run-pass #![feature(rustc_allow_const_fn_unstable)] -#![feature(const_fn_fn_ptr_basics)] #![feature(rustc_attrs, staged_api)] #![stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")] #[rustc_const_stable(since="1.0.0", feature = "mep")] -#[rustc_allow_const_fn_unstable(const_fn_fn_ptr_basics)] const fn takes_fn_ptr(_: fn()) {} const FN: fn() = || (); diff --git a/src/test/ui/consts/min_const_fn/cast_errors.rs b/src/test/ui/consts/min_const_fn/cast_errors.rs deleted file mode 100644 index b68f47f5cbc..00000000000 --- a/src/test/ui/consts/min_const_fn/cast_errors.rs +++ /dev/null @@ -1,17 +0,0 @@ -fn main() {} - -const fn unsize(x: &[u8; 3]) -> &[u8] { x } -const fn closure() -> fn() { || {} } -//~^ ERROR function pointer -//~| ERROR function pointer cast -const fn closure2() { - (|| {}) as fn(); -//~^ ERROR function pointer -} -const fn reify(f: fn()) -> unsafe fn() { f } -//~^ ERROR function pointer -//~| ERROR function pointer -//~| ERROR function pointer cast -const fn reify2() { main as unsafe fn(); } -//~^ ERROR function pointer -//~| ERROR function pointer cast diff --git a/src/test/ui/consts/min_const_fn/cast_errors.stderr b/src/test/ui/consts/min_const_fn/cast_errors.stderr deleted file mode 100644 index fb962bdf906..00000000000 --- a/src/test/ui/consts/min_const_fn/cast_errors.stderr +++ /dev/null @@ -1,75 +0,0 @@ -error[E0658]: function pointers cannot appear in constant functions - --> $DIR/cast_errors.rs:4:23 - | -LL | const fn closure() -> fn() { || {} } - | ^^^^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error[E0658]: function pointer casts are not allowed in constant functions - --> $DIR/cast_errors.rs:4:30 - | -LL | const fn closure() -> fn() { || {} } - | ^^^^^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error[E0658]: function pointer casts are not allowed in constant functions - --> $DIR/cast_errors.rs:8:5 - | -LL | (|| {}) as fn(); - | ^^^^^^^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error[E0658]: function pointers cannot appear in constant functions - --> $DIR/cast_errors.rs:11:16 - | -LL | const fn reify(f: fn()) -> unsafe fn() { f } - | ^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error[E0658]: function pointers cannot appear in constant functions - --> $DIR/cast_errors.rs:11:28 - | -LL | const fn reify(f: fn()) -> unsafe fn() { f } - | ^^^^^^^^^^^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error[E0658]: function pointer casts are not allowed in constant functions - --> $DIR/cast_errors.rs:11:42 - | -LL | const fn reify(f: fn()) -> unsafe fn() { f } - | ^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error[E0658]: function pointer casts are not allowed in constant functions - --> $DIR/cast_errors.rs:15:21 - | -LL | const fn reify2() { main as unsafe fn(); } - | ^^^^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error[E0658]: function pointer casts are not allowed in constant functions - --> $DIR/cast_errors.rs:15:21 - | -LL | const fn reify2() { main as unsafe fn(); } - | ^^^^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error: aborting due to 8 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/min_const_fn/cast_fn.rs b/src/test/ui/consts/min_const_fn/cast_fn.rs new file mode 100644 index 00000000000..85802a51490 --- /dev/null +++ b/src/test/ui/consts/min_const_fn/cast_fn.rs @@ -0,0 +1,11 @@ +// check-pass + +fn main() {} + +const fn unsize(x: &[u8; 3]) -> &[u8] { x } +const fn closure() -> fn() { || {} } +const fn closure2() { + (|| {}) as fn(); +} +const fn reify(f: fn()) -> unsafe fn() { f } +const fn reify2() { main as unsafe fn(); } diff --git a/src/test/ui/consts/min_const_fn/cmp_fn_pointers.rs b/src/test/ui/consts/min_const_fn/cmp_fn_pointers.rs index 638ff1d8b9c..e07b269c386 100644 --- a/src/test/ui/consts/min_const_fn/cmp_fn_pointers.rs +++ b/src/test/ui/consts/min_const_fn/cmp_fn_pointers.rs @@ -1,6 +1,4 @@ const fn cmp(x: fn(), y: fn()) -> bool { - //~^ ERROR function pointer - //~| ERROR function pointer unsafe { x == y } //~^ ERROR pointers cannot be reliably compared } diff --git a/src/test/ui/consts/min_const_fn/cmp_fn_pointers.stderr b/src/test/ui/consts/min_const_fn/cmp_fn_pointers.stderr index 5d8483cd111..3845068d841 100644 --- a/src/test/ui/consts/min_const_fn/cmp_fn_pointers.stderr +++ b/src/test/ui/consts/min_const_fn/cmp_fn_pointers.stderr @@ -1,29 +1,10 @@ -error[E0658]: function pointers cannot appear in constant functions - --> $DIR/cmp_fn_pointers.rs:1:14 - | -LL | const fn cmp(x: fn(), y: fn()) -> bool { - | ^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error[E0658]: function pointers cannot appear in constant functions - --> $DIR/cmp_fn_pointers.rs:1:23 - | -LL | const fn cmp(x: fn(), y: fn()) -> bool { - | ^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - error: pointers cannot be reliably compared during const eval - --> $DIR/cmp_fn_pointers.rs:4:14 + --> $DIR/cmp_fn_pointers.rs:2:14 | LL | unsafe { x == y } | ^^^^^^ | = note: see issue #53020 for more information -error: aborting due to 3 previous errors +error: aborting due to previous error -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/min_const_fn/min_const_fn.rs b/src/test/ui/consts/min_const_fn/min_const_fn.rs index 10347a02074..0bafaf2e81f 100644 --- a/src/test/ui/consts/min_const_fn/min_const_fn.rs +++ b/src/test/ui/consts/min_const_fn/min_const_fn.rs @@ -80,11 +80,10 @@ const unsafe fn ret_i32_no_unsafe() -> i32 { 42 } const unsafe fn ret_null_ptr_no_unsafe() -> *const T { core::ptr::null() } const unsafe fn ret_null_mut_ptr_no_unsafe() -> *mut T { core::ptr::null_mut() } -// not ok const fn foo11(t: T) -> T { t } -//~^ ERROR trait bounds other than `Sized` on const fn parameters are unstable const fn foo11_2(t: T) -> T { t } -//~^ ERROR trait bounds other than `Sized` on const fn parameters are unstable + +// not ok static BAR: u32 = 42; const fn foo25() -> u32 { BAR } //~ ERROR cannot refer to statics @@ -108,41 +107,28 @@ const fn foo37(a: bool, b: bool) -> bool { a || b } fn main() {} impl Foo { -//~^ ERROR trait bounds other than `Sized` on const fn parameters are unstable const fn foo(&self) {} } impl Foo { -//~^ ERROR trait bounds other than `Sized` on const fn parameters are unstable const fn foo2(&self) {} } impl Foo { -//~^ ERROR trait bounds other than `Sized` on const fn parameters are unstable const fn foo3(&self) {} } struct AlanTuring(T); const fn no_apit2(_x: AlanTuring) {} -//~^ ERROR trait bounds other than `Sized` -//~| ERROR destructor +//~^ ERROR destructor const fn no_apit(_x: impl std::fmt::Debug) {} -//~^ ERROR trait bounds other than `Sized` -//~| ERROR destructor +//~^ ERROR destructor const fn no_dyn_trait(_x: &dyn std::fmt::Debug) {} -//~^ ERROR trait objects in const fn are unstable const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() } -//~^ ERROR trait objects in const fn are unstable const fn no_unsafe() { unsafe {} } -const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1 } -//~^ ERROR trait objects in const fn are unstable -//~| ERROR trait objects in const fn are unstable -//~| ERROR trait objects in const fn are unstable +const fn traits_are_ok_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1 } -const fn no_fn_ptrs(_x: fn()) {} -//~^ ERROR function pointer -const fn no_fn_ptrs2() -> fn() { fn foo() {} foo } -//~^ ERROR function pointer -//~| ERROR function pointer cast +const fn fn_ptrs(_x: fn()) {} +const fn fn_ptrs2() -> fn() { fn foo() {} foo } diff --git a/src/test/ui/consts/min_const_fn/min_const_fn.stderr b/src/test/ui/consts/min_const_fn/min_const_fn.stderr index 67cb604b6a7..4ad17602c84 100644 --- a/src/test/ui/consts/min_const_fn/min_const_fn.stderr +++ b/src/test/ui/consts/min_const_fn/min_const_fn.stderr @@ -130,26 +130,8 @@ LL | const fn get_mut_sq(&mut self) -> &mut T { &mut self.0 } = note: see issue #57349 for more information = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable -error[E0658]: trait bounds other than `Sized` on const fn parameters are unstable - --> $DIR/min_const_fn.rs:84:16 - | -LL | const fn foo11(t: T) -> T { t } - | ^ - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error[E0658]: trait bounds other than `Sized` on const fn parameters are unstable - --> $DIR/min_const_fn.rs:86:18 - | -LL | const fn foo11_2(t: T) -> T { t } - | ^ - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - error[E0013]: constant functions cannot refer to statics - --> $DIR/min_const_fn.rs:90:27 + --> $DIR/min_const_fn.rs:89:27 | LL | const fn foo25() -> u32 { BAR } | ^^^ @@ -157,7 +139,7 @@ LL | const fn foo25() -> u32 { BAR } = help: consider extracting the value of the `static` to a `const`, and referring to that error[E0013]: constant functions cannot refer to statics - --> $DIR/min_const_fn.rs:91:37 + --> $DIR/min_const_fn.rs:90:37 | LL | const fn foo26() -> &'static u32 { &BAR } | ^^^ @@ -165,7 +147,7 @@ LL | const fn foo26() -> &'static u32 { &BAR } = help: consider extracting the value of the `static` to a `const`, and referring to that error: pointers cannot be cast to integers during const eval - --> $DIR/min_const_fn.rs:92:42 + --> $DIR/min_const_fn.rs:91:42 | LL | const fn foo30(x: *const u32) -> usize { x as usize } | ^^^^^^^^^^ @@ -174,7 +156,7 @@ LL | const fn foo30(x: *const u32) -> usize { x as usize } = note: avoiding this restriction via `transmute`, `union`, or raw pointers leads to compile-time undefined behavior error: pointers cannot be cast to integers during const eval - --> $DIR/min_const_fn.rs:94:63 + --> $DIR/min_const_fn.rs:93:63 | LL | const fn foo30_with_unsafe(x: *const u32) -> usize { unsafe { x as usize } } | ^^^^^^^^^^ @@ -183,7 +165,7 @@ LL | const fn foo30_with_unsafe(x: *const u32) -> usize { unsafe { x as usize } = note: avoiding this restriction via `transmute`, `union`, or raw pointers leads to compile-time undefined behavior error: pointers cannot be cast to integers during const eval - --> $DIR/min_const_fn.rs:96:42 + --> $DIR/min_const_fn.rs:95:42 | LL | const fn foo30_2(x: *mut u32) -> usize { x as usize } | ^^^^^^^^^^ @@ -192,7 +174,7 @@ LL | const fn foo30_2(x: *mut u32) -> usize { x as usize } = note: avoiding this restriction via `transmute`, `union`, or raw pointers leads to compile-time undefined behavior error: pointers cannot be cast to integers during const eval - --> $DIR/min_const_fn.rs:98:63 + --> $DIR/min_const_fn.rs:97:63 | LL | const fn foo30_2_with_unsafe(x: *mut u32) -> usize { unsafe { x as usize } } | ^^^^^^^^^^ @@ -201,7 +183,7 @@ LL | const fn foo30_2_with_unsafe(x: *mut u32) -> usize { unsafe { x as usize } = note: avoiding this restriction via `transmute`, `union`, or raw pointers leads to compile-time undefined behavior error[E0658]: mutable references are not allowed in constant functions - --> $DIR/min_const_fn.rs:101:14 + --> $DIR/min_const_fn.rs:100:14 | LL | const fn inc(x: &mut i32) { *x += 1 } | ^ @@ -209,155 +191,23 @@ LL | const fn inc(x: &mut i32) { *x += 1 } = note: see issue #57349 for more information = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable -error[E0658]: trait bounds other than `Sized` on const fn parameters are unstable - --> $DIR/min_const_fn.rs:110:6 - | -LL | impl Foo { - | ^ -LL | -LL | const fn foo(&self) {} - | ------------------- function declared as const here - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error[E0658]: trait bounds other than `Sized` on const fn parameters are unstable - --> $DIR/min_const_fn.rs:115:6 - | -LL | impl Foo { - | ^ -LL | -LL | const fn foo2(&self) {} - | -------------------- function declared as const here - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error[E0658]: trait bounds other than `Sized` on const fn parameters are unstable - --> $DIR/min_const_fn.rs:120:6 - | -LL | impl Foo { - | ^ -LL | -LL | const fn foo3(&self) {} - | -------------------- function declared as const here - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error[E0658]: trait bounds other than `Sized` on const fn parameters are unstable - --> $DIR/min_const_fn.rs:126:34 - | -LL | const fn no_apit2(_x: AlanTuring) {} - | ^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - error[E0493]: destructors cannot be evaluated at compile-time - --> $DIR/min_const_fn.rs:126:19 + --> $DIR/min_const_fn.rs:122:19 | LL | const fn no_apit2(_x: AlanTuring) {} | ^^ - value is dropped here | | | constant functions cannot evaluate destructors -error[E0658]: trait bounds other than `Sized` on const fn parameters are unstable - --> $DIR/min_const_fn.rs:129:22 - | -LL | const fn no_apit(_x: impl std::fmt::Debug) {} - | ^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - error[E0493]: destructors cannot be evaluated at compile-time - --> $DIR/min_const_fn.rs:129:18 + --> $DIR/min_const_fn.rs:124:18 | LL | const fn no_apit(_x: impl std::fmt::Debug) {} | ^^ - value is dropped here | | | constant functions cannot evaluate destructors -error[E0658]: trait objects in const fn are unstable - --> $DIR/min_const_fn.rs:132:23 - | -LL | const fn no_dyn_trait(_x: &dyn std::fmt::Debug) {} - | ^^ - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error[E0658]: trait objects in const fn are unstable - --> $DIR/min_const_fn.rs:134:32 - | -LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() } - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error[E0658]: trait objects in const fn are unstable - --> $DIR/min_const_fn.rs:139:41 - | -LL | const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1 } - | ------------------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | function declared as const here - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error[E0658]: trait objects in const fn are unstable - --> $DIR/min_const_fn.rs:139:42 - | -LL | const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1 } - | ------------------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | function declared as const here - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error[E0658]: trait objects in const fn are unstable - --> $DIR/min_const_fn.rs:139:42 - | -LL | const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1 } - | ------------------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | function declared as const here - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error[E0658]: function pointers cannot appear in constant functions - --> $DIR/min_const_fn.rs:144:21 - | -LL | const fn no_fn_ptrs(_x: fn()) {} - | ^^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error[E0658]: function pointers cannot appear in constant functions - --> $DIR/min_const_fn.rs:146:27 - | -LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo } - | ^^^^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error[E0658]: function pointer casts are not allowed in constant functions - --> $DIR/min_const_fn.rs:146:46 - | -LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo } - | ^^^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error: aborting due to 39 previous errors +error: aborting due to 24 previous errors Some errors have detailed explanations: E0013, E0493, E0658. For more information about an error, try `rustc --explain E0013`. diff --git a/src/test/ui/consts/min_const_fn/min_const_fn_dyn.rs b/src/test/ui/consts/min_const_fn/min_const_fn_dyn.rs index 1ab8253b414..36c8880093e 100644 --- a/src/test/ui/consts/min_const_fn/min_const_fn_dyn.rs +++ b/src/test/ui/consts/min_const_fn/min_const_fn_dyn.rs @@ -1,3 +1,5 @@ +// check-pass + struct HasDyn { field: &'static dyn std::fmt::Debug, } @@ -7,9 +9,7 @@ struct Hide(HasDyn); const fn no_inner_dyn_trait(_x: Hide) {} const fn no_inner_dyn_trait2(x: Hide) { x.0.field; -//~^ ERROR trait objects in const fn are unstable } const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasDyn { field: &0 }) } -//~^ ERROR trait objects in const fn are unstable fn main() {} diff --git a/src/test/ui/consts/min_const_fn/min_const_fn_dyn.stderr b/src/test/ui/consts/min_const_fn/min_const_fn_dyn.stderr deleted file mode 100644 index 4c2199101d3..00000000000 --- a/src/test/ui/consts/min_const_fn/min_const_fn_dyn.stderr +++ /dev/null @@ -1,25 +0,0 @@ -error[E0658]: trait objects in const fn are unstable - --> $DIR/min_const_fn_dyn.rs:9:5 - | -LL | const fn no_inner_dyn_trait2(x: Hide) { - | ------------------------------------- function declared as const here -LL | x.0.field; - | ^^^^^^^^^ - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error[E0658]: trait objects in const fn are unstable - --> $DIR/min_const_fn_dyn.rs:12:66 - | -LL | const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasDyn { field: &0 }) } - | ----------------------------------------- ^^ - | | - | function declared as const here - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/min_const_fn/min_const_fn_fn_ptr.rs b/src/test/ui/consts/min_const_fn/min_const_fn_fn_ptr.rs deleted file mode 100644 index bc6fe89222b..00000000000 --- a/src/test/ui/consts/min_const_fn/min_const_fn_fn_ptr.rs +++ /dev/null @@ -1,19 +0,0 @@ -// gate-test-const_fn_fn_ptr_basics - -struct HasPtr { - field: fn(), -} - -struct Hide(HasPtr); - -fn field() {} - -const fn no_inner_dyn_trait(_x: Hide) {} -const fn no_inner_dyn_trait2(x: Hide) { - x.0.field; -//~^ ERROR function pointer -} -const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasPtr { field }) } -//~^ ERROR function pointer - -fn main() {} diff --git a/src/test/ui/consts/min_const_fn/min_const_fn_fn_ptr.stderr b/src/test/ui/consts/min_const_fn/min_const_fn_fn_ptr.stderr deleted file mode 100644 index 8d82674bbf2..00000000000 --- a/src/test/ui/consts/min_const_fn/min_const_fn_fn_ptr.stderr +++ /dev/null @@ -1,21 +0,0 @@ -error[E0658]: function pointers cannot appear in constant functions - --> $DIR/min_const_fn_fn_ptr.rs:13:5 - | -LL | x.0.field; - | ^^^^^^^^^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error[E0658]: function pointer casts are not allowed in constant functions - --> $DIR/min_const_fn_fn_ptr.rs:16:59 - | -LL | const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasPtr { field }) } - | ^^^^^ - | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/min_const_fn/min_const_fn_impl_trait.rs b/src/test/ui/consts/min_const_fn/min_const_fn_impl_trait.rs deleted file mode 100644 index e062c9f0aa3..00000000000 --- a/src/test/ui/consts/min_const_fn/min_const_fn_impl_trait.rs +++ /dev/null @@ -1,10 +0,0 @@ -// gate-test-const_impl_trait - -struct AlanTuring(T); -const fn no_rpit2() -> AlanTuring { //~ `impl Trait` - AlanTuring(0) -} - -const fn no_rpit() -> impl std::fmt::Debug {} //~ `impl Trait` - -fn main() {} diff --git a/src/test/ui/consts/min_const_fn/min_const_fn_impl_trait.stderr b/src/test/ui/consts/min_const_fn/min_const_fn_impl_trait.stderr deleted file mode 100644 index 01c797cd96b..00000000000 --- a/src/test/ui/consts/min_const_fn/min_const_fn_impl_trait.stderr +++ /dev/null @@ -1,21 +0,0 @@ -error[E0658]: `impl Trait` is not allowed in constant functions - --> $DIR/min_const_fn_impl_trait.rs:4:24 - | -LL | const fn no_rpit2() -> AlanTuring { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #77463 for more information - = help: add `#![feature(const_impl_trait)]` to the crate attributes to enable - -error[E0658]: `impl Trait` is not allowed in constant functions - --> $DIR/min_const_fn_impl_trait.rs:8:23 - | -LL | const fn no_rpit() -> impl std::fmt::Debug {} - | ^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #77463 for more information - = help: add `#![feature(const_impl_trait)]` to the crate attributes to enable - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/miri_unleashed/abi-mismatch.stderr b/src/test/ui/consts/miri_unleashed/abi-mismatch.stderr index e2f9708ddcb..aaba19c2c8b 100644 --- a/src/test/ui/consts/miri_unleashed/abi-mismatch.stderr +++ b/src/test/ui/consts/miri_unleashed/abi-mismatch.stderr @@ -12,16 +12,6 @@ LL | static VAL: () = call_rust_fn(unsafe { std::mem::transmute(c_fn as extern " warning: skipping const checks | -help: skipping check for `const_fn_fn_ptr_basics` feature - --> $DIR/abi-mismatch.rs:9:23 - | -LL | const fn call_rust_fn(my_fn: extern "Rust" fn()) { - | ^^^^^ -help: skipping check for `const_fn_fn_ptr_basics` feature - --> $DIR/abi-mismatch.rs:10:5 - | -LL | my_fn(); - | ^^^^^ help: skipping check that does not even have a feature gate --> $DIR/abi-mismatch.rs:10:5 | diff --git a/src/test/ui/consts/unstable-const-fn-in-libcore.rs b/src/test/ui/consts/unstable-const-fn-in-libcore.rs index 8ee1270805e..16b36c8d56d 100644 --- a/src/test/ui/consts/unstable-const-fn-in-libcore.rs +++ b/src/test/ui/consts/unstable-const-fn-in-libcore.rs @@ -5,7 +5,6 @@ #![stable(feature = "core", since = "1.6.0")] #![feature(staged_api)] -#![feature(const_fn_trait_bound)] enum Opt { Some(T), diff --git a/src/test/ui/consts/unstable-const-fn-in-libcore.stderr b/src/test/ui/consts/unstable-const-fn-in-libcore.stderr index 3ec9971b8e1..180f9f10cc6 100644 --- a/src/test/ui/consts/unstable-const-fn-in-libcore.stderr +++ b/src/test/ui/consts/unstable-const-fn-in-libcore.stderr @@ -1,5 +1,5 @@ error[E0015]: cannot call non-const closure in constant functions - --> $DIR/unstable-const-fn-in-libcore.rs:23:26 + --> $DIR/unstable-const-fn-in-libcore.rs:22:26 | LL | Opt::None => f(), | ^^^ @@ -11,7 +11,7 @@ LL | const fn unwrap_or_else T + ~const std::ops::FnOnce<()>> | +++++++++++++++++++++++++++++ error[E0493]: destructors cannot be evaluated at compile-time - --> $DIR/unstable-const-fn-in-libcore.rs:18:53 + --> $DIR/unstable-const-fn-in-libcore.rs:17:53 | LL | const fn unwrap_or_else T>(self, f: F) -> T { | ^ constant functions cannot evaluate destructors @@ -20,7 +20,7 @@ LL | } | - value is dropped here error[E0493]: destructors cannot be evaluated at compile-time - --> $DIR/unstable-const-fn-in-libcore.rs:18:47 + --> $DIR/unstable-const-fn-in-libcore.rs:17:47 | LL | const fn unwrap_or_else T>(self, f: F) -> T { | ^^^^ constant functions cannot evaluate destructors diff --git a/src/test/ui/nll/issue-55825-const-fn.rs b/src/test/ui/nll/issue-55825-const-fn.rs index c9efccd15b7..17c4a0496b6 100644 --- a/src/test/ui/nll/issue-55825-const-fn.rs +++ b/src/test/ui/nll/issue-55825-const-fn.rs @@ -1,8 +1,10 @@ // Regression test for issue #55825 // Tests that we don't emit a spurious warning in NLL mode +// check-pass + #![feature(nll)] -const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() } //~ ERROR const +const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() } fn main() { } diff --git a/src/test/ui/nll/issue-55825-const-fn.stderr b/src/test/ui/nll/issue-55825-const-fn.stderr deleted file mode 100644 index c834f8bd9c4..00000000000 --- a/src/test/ui/nll/issue-55825-const-fn.stderr +++ /dev/null @@ -1,12 +0,0 @@ -error[E0658]: trait objects in const fn are unstable - --> $DIR/issue-55825-const-fn.rs:6:32 - | -LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() } - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #93706 for more information - = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/rfc-2091-track-caller/caller-location-fnptr-rt-ctfe-equiv.stderr b/src/test/ui/rfc-2091-track-caller/caller-location-fnptr-rt-ctfe-equiv.stderr index 0291a526333..cf8ca57714c 100644 --- a/src/test/ui/rfc-2091-track-caller/caller-location-fnptr-rt-ctfe-equiv.stderr +++ b/src/test/ui/rfc-2091-track-caller/caller-location-fnptr-rt-ctfe-equiv.stderr @@ -1,27 +1,10 @@ warning: skipping const checks | -help: skipping check for `const_fn_fn_ptr_basics` feature - --> $DIR/caller-location-fnptr-rt-ctfe-equiv.rs:20:9 - | -LL | let ptr: fn() -> L = attributed; - | ^^^ -help: skipping check for `const_fn_fn_ptr_basics` feature - --> $DIR/caller-location-fnptr-rt-ctfe-equiv.rs:21:5 - | -LL | ptr() - | ^^^ -help: skipping check for `const_fn_fn_ptr_basics` feature - --> $DIR/caller-location-fnptr-rt-ctfe-equiv.rs:20:26 - | -LL | let ptr: fn() -> L = attributed; - | ^^^^^^^^^^ help: skipping check that does not even have a feature gate --> $DIR/caller-location-fnptr-rt-ctfe-equiv.rs:21:5 | LL | ptr() | ^^^^^ -error: `-Zunleash-the-miri-inside-of-you` may not be used to circumvent feature gates, except when testing error paths in the CTFE engine - -error: aborting due to previous error; 1 warning emitted +warning: 1 warning emitted diff --git a/src/test/ui/rfc-2632-const-trait-impl/auxiliary/cross-crate.rs b/src/test/ui/rfc-2632-const-trait-impl/auxiliary/cross-crate.rs index 2d049277d7f..34934d1e01d 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/auxiliary/cross-crate.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/auxiliary/cross-crate.rs @@ -1,4 +1,3 @@ -#![feature(const_fn_trait_bound)] #![feature(const_trait_impl)] pub trait MyTrait { diff --git a/src/test/ui/rfc-2632-const-trait-impl/call-generic-in-impl.rs b/src/test/ui/rfc-2632-const-trait-impl/call-generic-in-impl.rs index 4b706a190e6..89dc47aad3d 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/call-generic-in-impl.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/call-generic-in-impl.rs @@ -1,5 +1,4 @@ // check-pass -#![feature(const_fn_trait_bound)] #![feature(const_trait_impl)] trait MyPartialEq { diff --git a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-chain.rs b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-chain.rs index adf8d4f9ea5..b00ff1f2fac 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-chain.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-chain.rs @@ -3,7 +3,6 @@ // check-pass #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] struct S; diff --git a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-dup-bound.rs b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-dup-bound.rs index cc24dbd96d2..c8ded0fa7ea 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-dup-bound.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-dup-bound.rs @@ -1,7 +1,6 @@ // check-pass #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] struct S; diff --git a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-fail.rs b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-fail.rs index e81e0d1e571..8df68225d44 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-fail.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-fail.rs @@ -1,4 +1,3 @@ -#![feature(const_fn_trait_bound)] #![feature(const_trait_impl)] pub const fn equals_self(t: &T) -> bool { diff --git a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-fail.stderr b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-fail.stderr index 3963f64ad32..cf114334cc3 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-fail.stderr +++ b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-fail.stderr @@ -1,17 +1,17 @@ error[E0277]: can't compare `T` with `T` in const contexts - --> $DIR/call-generic-method-fail.rs:5:5 + --> $DIR/call-generic-method-fail.rs:4:5 | LL | *t == *t | ^^^^^^^^ no implementation for `T == T` | note: the trait `PartialEq` is implemented for `T`, but that implementation is not `const` - --> $DIR/call-generic-method-fail.rs:5:5 + --> $DIR/call-generic-method-fail.rs:4:5 | LL | *t == *t | ^^^^^^^^ error[E0015]: cannot call non-const operator in constant functions - --> $DIR/call-generic-method-fail.rs:5:5 + --> $DIR/call-generic-method-fail.rs:4:5 | LL | *t == *t | ^^^^^^^^ diff --git a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst-bound.rs b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst-bound.rs index 585b65988f3..e197c8b73c5 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst-bound.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst-bound.rs @@ -1,7 +1,5 @@ // check-pass -#![feature(const_fn_trait_bound)] - struct S; impl PartialEq for S { diff --git a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst.rs b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst.rs index 6881db0aa02..d3e14a53a2f 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst.rs @@ -1,5 +1,4 @@ #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] struct S; diff --git a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst.stderr b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst.stderr index 35b7fe8e401..b0af45acda1 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst.stderr +++ b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-nonconst.stderr @@ -1,5 +1,5 @@ error[E0277]: can't compare `S` with `S` in const contexts - --> $DIR/call-generic-method-nonconst.rs:19:34 + --> $DIR/call-generic-method-nonconst.rs:18:34 | LL | pub const EQ: bool = equals_self(&S); | ----------- ^^ no implementation for `S == S` @@ -8,12 +8,12 @@ LL | pub const EQ: bool = equals_self(&S); | = help: the trait `~const PartialEq` is not implemented for `S` note: the trait `PartialEq` is implemented for `S`, but that implementation is not `const` - --> $DIR/call-generic-method-nonconst.rs:19:34 + --> $DIR/call-generic-method-nonconst.rs:18:34 | LL | pub const EQ: bool = equals_self(&S); | ^^ note: required by a bound in `equals_self` - --> $DIR/call-generic-method-nonconst.rs:12:25 + --> $DIR/call-generic-method-nonconst.rs:11:25 | LL | const fn equals_self(t: &T) -> bool { | ^^^^^^^^^^^^^^^^ required by this bound in `equals_self` diff --git a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-pass.rs b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-pass.rs index aa9bd4d824e..40565d1b76a 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-pass.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/call-generic-method-pass.rs @@ -3,7 +3,6 @@ // check-pass #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] struct S; diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-closures.rs b/src/test/ui/rfc-2632-const-trait-impl/const-closures.rs index 99e608797ff..755d8539839 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/const-closures.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/const-closures.rs @@ -1,7 +1,6 @@ // run-pass #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] const fn answer_p1(f: &F) -> u8 where diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-default-method-bodies.rs b/src/test/ui/rfc-2632-const-trait-impl/const-default-method-bodies.rs index 3e87787a091..3c82fe1ad6c 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/const-default-method-bodies.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/const-default-method-bodies.rs @@ -1,5 +1,4 @@ #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] // FIXME is this needed? trait ConstDefaultFn: Sized { fn b(self); diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-default-method-bodies.stderr b/src/test/ui/rfc-2632-const-trait-impl/const-default-method-bodies.stderr index 948830d6def..fe788b43a54 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/const-default-method-bodies.stderr +++ b/src/test/ui/rfc-2632-const-trait-impl/const-default-method-bodies.stderr @@ -1,17 +1,17 @@ error[E0277]: the trait bound `NonConstImpl: ~const ConstDefaultFn` is not satisfied - --> $DIR/const-default-method-bodies.rs:25:18 + --> $DIR/const-default-method-bodies.rs:24:18 | LL | NonConstImpl.a(); | ^^^ the trait `~const ConstDefaultFn` is not implemented for `NonConstImpl` | note: the trait `ConstDefaultFn` is implemented for `NonConstImpl`, but that implementation is not `const` - --> $DIR/const-default-method-bodies.rs:25:18 + --> $DIR/const-default-method-bodies.rs:24:18 | LL | NonConstImpl.a(); | ^^^ error[E0015]: cannot call non-const fn `::a` in constant functions - --> $DIR/const-default-method-bodies.rs:25:18 + --> $DIR/const-default-method-bodies.rs:24:18 | LL | NonConstImpl.a(); | ^^^ diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-drop-bound.rs b/src/test/ui/rfc-2632-const-trait-impl/const-drop-bound.rs index 83fa32bf092..a1cfee6b6e7 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/const-drop-bound.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/const-drop-bound.rs @@ -1,7 +1,6 @@ // check-pass #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] #![feature(const_precise_live_drops)] const fn foo(res: Result) -> Option where E: ~const Drop { diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.precise.stderr b/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.precise.stderr index d280cd2556f..d88bcdc89ad 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.precise.stderr +++ b/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.precise.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `NonTrivialDrop: ~const Drop` is not satisfied - --> $DIR/const-drop-fail.rs:44:5 + --> $DIR/const-drop-fail.rs:43:5 | LL | const _: () = check($exp); | ----- required by a bound introduced by this call @@ -8,7 +8,7 @@ LL | NonTrivialDrop, | ^^^^^^^^^^^^^^ expected an implementor of trait `~const Drop` | note: required by a bound in `check` - --> $DIR/const-drop-fail.rs:35:19 + --> $DIR/const-drop-fail.rs:34:19 | LL | const fn check(_: T) {} | ^^^^^^^^^^^ required by this bound in `check` @@ -20,7 +20,7 @@ LL | &mut NonTrivialDrop, | ++++ error[E0277]: the trait bound `NonTrivialDrop: ~const Drop` is not satisfied in `ConstImplWithDropGlue` - --> $DIR/const-drop-fail.rs:46:5 + --> $DIR/const-drop-fail.rs:45:5 | LL | const _: () = check($exp); | ----- required by a bound introduced by this call @@ -29,23 +29,23 @@ LL | ConstImplWithDropGlue(NonTrivialDrop), | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ within `ConstImplWithDropGlue`, the trait `~const Drop` is not implemented for `NonTrivialDrop` | note: the trait `Drop` is implemented for `NonTrivialDrop`, but that implementation is not `const` - --> $DIR/const-drop-fail.rs:46:5 + --> $DIR/const-drop-fail.rs:45:5 | LL | ConstImplWithDropGlue(NonTrivialDrop), | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: required because it appears within the type `ConstImplWithDropGlue` - --> $DIR/const-drop-fail.rs:17:8 + --> $DIR/const-drop-fail.rs:16:8 | LL | struct ConstImplWithDropGlue(NonTrivialDrop); | ^^^^^^^^^^^^^^^^^^^^^ note: required by a bound in `check` - --> $DIR/const-drop-fail.rs:35:19 + --> $DIR/const-drop-fail.rs:34:19 | LL | const fn check(_: T) {} | ^^^^^^^^^^^ required by this bound in `check` error[E0277]: the trait bound `ConstDropImplWithBounds: ~const Drop` is not satisfied - --> $DIR/const-drop-fail.rs:48:5 + --> $DIR/const-drop-fail.rs:47:5 | LL | const _: () = check($exp); | ----- required by a bound introduced by this call @@ -54,12 +54,12 @@ LL | ConstDropImplWithBounds::(PhantomData), | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected an implementor of trait `~const Drop` | note: required because of the requirements on the impl of `~const Drop` for `ConstDropImplWithBounds` - --> $DIR/const-drop-fail.rs:29:25 + --> $DIR/const-drop-fail.rs:28:25 | LL | impl const Drop for ConstDropImplWithBounds { | ^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ note: required by a bound in `check` - --> $DIR/const-drop-fail.rs:35:19 + --> $DIR/const-drop-fail.rs:34:19 | LL | const fn check(_: T) {} | ^^^^^^^^^^^ required by this bound in `check` diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.rs b/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.rs index 4622723c189..49968b47dbe 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.rs @@ -1,7 +1,6 @@ // revisions: stock precise #![feature(const_trait_impl)] #![feature(const_mut_refs)] -#![feature(const_fn_trait_bound)] #![cfg_attr(precise, feature(const_precise_live_drops))] use std::marker::PhantomData; diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.stock.stderr b/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.stock.stderr index d280cd2556f..d88bcdc89ad 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.stock.stderr +++ b/src/test/ui/rfc-2632-const-trait-impl/const-drop-fail.stock.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `NonTrivialDrop: ~const Drop` is not satisfied - --> $DIR/const-drop-fail.rs:44:5 + --> $DIR/const-drop-fail.rs:43:5 | LL | const _: () = check($exp); | ----- required by a bound introduced by this call @@ -8,7 +8,7 @@ LL | NonTrivialDrop, | ^^^^^^^^^^^^^^ expected an implementor of trait `~const Drop` | note: required by a bound in `check` - --> $DIR/const-drop-fail.rs:35:19 + --> $DIR/const-drop-fail.rs:34:19 | LL | const fn check(_: T) {} | ^^^^^^^^^^^ required by this bound in `check` @@ -20,7 +20,7 @@ LL | &mut NonTrivialDrop, | ++++ error[E0277]: the trait bound `NonTrivialDrop: ~const Drop` is not satisfied in `ConstImplWithDropGlue` - --> $DIR/const-drop-fail.rs:46:5 + --> $DIR/const-drop-fail.rs:45:5 | LL | const _: () = check($exp); | ----- required by a bound introduced by this call @@ -29,23 +29,23 @@ LL | ConstImplWithDropGlue(NonTrivialDrop), | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ within `ConstImplWithDropGlue`, the trait `~const Drop` is not implemented for `NonTrivialDrop` | note: the trait `Drop` is implemented for `NonTrivialDrop`, but that implementation is not `const` - --> $DIR/const-drop-fail.rs:46:5 + --> $DIR/const-drop-fail.rs:45:5 | LL | ConstImplWithDropGlue(NonTrivialDrop), | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: required because it appears within the type `ConstImplWithDropGlue` - --> $DIR/const-drop-fail.rs:17:8 + --> $DIR/const-drop-fail.rs:16:8 | LL | struct ConstImplWithDropGlue(NonTrivialDrop); | ^^^^^^^^^^^^^^^^^^^^^ note: required by a bound in `check` - --> $DIR/const-drop-fail.rs:35:19 + --> $DIR/const-drop-fail.rs:34:19 | LL | const fn check(_: T) {} | ^^^^^^^^^^^ required by this bound in `check` error[E0277]: the trait bound `ConstDropImplWithBounds: ~const Drop` is not satisfied - --> $DIR/const-drop-fail.rs:48:5 + --> $DIR/const-drop-fail.rs:47:5 | LL | const _: () = check($exp); | ----- required by a bound introduced by this call @@ -54,12 +54,12 @@ LL | ConstDropImplWithBounds::(PhantomData), | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected an implementor of trait `~const Drop` | note: required because of the requirements on the impl of `~const Drop` for `ConstDropImplWithBounds` - --> $DIR/const-drop-fail.rs:29:25 + --> $DIR/const-drop-fail.rs:28:25 | LL | impl const Drop for ConstDropImplWithBounds { | ^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ note: required by a bound in `check` - --> $DIR/const-drop-fail.rs:35:19 + --> $DIR/const-drop-fail.rs:34:19 | LL | const fn check(_: T) {} | ^^^^^^^^^^^ required by this bound in `check` diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-drop.rs b/src/test/ui/rfc-2632-const-trait-impl/const-drop.rs index 13363c506d5..20b9d772147 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/const-drop.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/const-drop.rs @@ -1,7 +1,6 @@ // run-pass // revisions: stock precise #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] #![feature(const_mut_refs)] #![feature(never_type)] #![cfg_attr(precise, feature(const_precise_live_drops))] diff --git a/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-body-checking.rs b/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-body-checking.rs index 76ea17159ac..17c88e44296 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-body-checking.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-body-checking.rs @@ -1,4 +1,3 @@ -#![feature(const_fn_trait_bound)] #![feature(const_trait_impl)] trait Tr {} diff --git a/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-body-checking.stderr b/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-body-checking.stderr index bc807507fd6..668e166c298 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-body-checking.stderr +++ b/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-body-checking.stderr @@ -1,16 +1,16 @@ error[E0277]: the trait bound `(): ~const Tr` is not satisfied - --> $DIR/default-method-body-is-const-body-checking.rs:12:15 + --> $DIR/default-method-body-is-const-body-checking.rs:11:15 | LL | foo::<()>(); | ^^ the trait `~const Tr` is not implemented for `()` | note: the trait `Tr` is implemented for `()`, but that implementation is not `const` - --> $DIR/default-method-body-is-const-body-checking.rs:12:15 + --> $DIR/default-method-body-is-const-body-checking.rs:11:15 | LL | foo::<()>(); | ^^ note: required by a bound in `foo` - --> $DIR/default-method-body-is-const-body-checking.rs:7:28 + --> $DIR/default-method-body-is-const-body-checking.rs:6:28 | LL | const fn foo() where T: ~const Tr {} | ^^^^^^^^^ required by this bound in `foo` diff --git a/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-same-trait-ck.rs b/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-same-trait-ck.rs index 4d087b5180b..be2f3f6d623 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-same-trait-ck.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-same-trait-ck.rs @@ -1,4 +1,3 @@ -#![feature(const_fn_trait_bound)] #![feature(const_trait_impl)] pub trait Tr { diff --git a/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-same-trait-ck.stderr b/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-same-trait-ck.stderr index db4d61f88ab..cf357971951 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-same-trait-ck.stderr +++ b/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-same-trait-ck.stderr @@ -1,17 +1,17 @@ error[E0277]: the trait bound `(): ~const Tr` is not satisfied - --> $DIR/default-method-body-is-const-same-trait-ck.rs:10:12 + --> $DIR/default-method-body-is-const-same-trait-ck.rs:9:12 | LL | ().a() | ^^^ the trait `~const Tr` is not implemented for `()` | note: the trait `Tr` is implemented for `()`, but that implementation is not `const` - --> $DIR/default-method-body-is-const-same-trait-ck.rs:10:12 + --> $DIR/default-method-body-is-const-same-trait-ck.rs:9:12 | LL | ().a() | ^^^ error[E0015]: cannot call non-const fn `<() as Tr>::a` in constant functions - --> $DIR/default-method-body-is-const-same-trait-ck.rs:10:12 + --> $DIR/default-method-body-is-const-same-trait-ck.rs:9:12 | LL | ().a() | ^^^ diff --git a/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-with-staged-api.rs b/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-with-staged-api.rs index d5b1a9073ac..7f6d86d3375 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-with-staged-api.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/default-method-body-is-const-with-staged-api.rs @@ -7,7 +7,6 @@ #![feature(staged_api)] #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] #![stable(since = "1", feature = "foo")] trait Tr { diff --git a/src/test/ui/rfc-2632-const-trait-impl/generic-bound.rs b/src/test/ui/rfc-2632-const-trait-impl/generic-bound.rs index 91c3d2d5920..5495b531cff 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/generic-bound.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/generic-bound.rs @@ -1,7 +1,6 @@ // run-pass #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] use std::marker::PhantomData; diff --git a/src/test/ui/rfc-2632-const-trait-impl/impl-with-default-fn-fail.rs b/src/test/ui/rfc-2632-const-trait-impl/impl-with-default-fn-fail.rs index 8eefb375b8c..eba8b665ceb 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/impl-with-default-fn-fail.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/impl-with-default-fn-fail.rs @@ -1,5 +1,4 @@ #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] trait Tr { fn req(&self); diff --git a/src/test/ui/rfc-2632-const-trait-impl/impl-with-default-fn-fail.stderr b/src/test/ui/rfc-2632-const-trait-impl/impl-with-default-fn-fail.stderr index a0916797041..4ec6f929ffc 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/impl-with-default-fn-fail.stderr +++ b/src/test/ui/rfc-2632-const-trait-impl/impl-with-default-fn-fail.stderr @@ -1,5 +1,5 @@ error: const trait implementations may not use non-const default functions - --> $DIR/impl-with-default-fn-fail.rs:18:1 + --> $DIR/impl-with-default-fn-fail.rs:17:1 | LL | / impl const Tr for S { LL | | fn req(&self) {} @@ -9,7 +9,7 @@ LL | | } = note: `prov` not implemented error: const trait implementations may not use non-const default functions - --> $DIR/impl-with-default-fn-fail.rs:28:1 + --> $DIR/impl-with-default-fn-fail.rs:27:1 | LL | / impl const Tr for u32 { LL | | fn req(&self) {} @@ -20,7 +20,7 @@ LL | | } = note: `prov` not implemented error[E0046]: not all trait items implemented, missing: `req` - --> $DIR/impl-with-default-fn-fail.rs:22:1 + --> $DIR/impl-with-default-fn-fail.rs:21:1 | LL | fn req(&self); | -------------- `req` from trait diff --git a/src/test/ui/rfc-2632-const-trait-impl/impl-with-default-fn-pass.rs b/src/test/ui/rfc-2632-const-trait-impl/impl-with-default-fn-pass.rs index ba3fec0882b..2e4664714a7 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/impl-with-default-fn-pass.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/impl-with-default-fn-pass.rs @@ -1,7 +1,6 @@ // check-pass #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] trait Tr { fn req(&self); diff --git a/src/test/ui/rfc-2632-const-trait-impl/inherent-impl-const-bounds.rs b/src/test/ui/rfc-2632-const-trait-impl/inherent-impl-const-bounds.rs index fe1015b3bf7..2cef803a90e 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/inherent-impl-const-bounds.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/inherent-impl-const-bounds.rs @@ -1,6 +1,5 @@ // check-pass #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] struct S; diff --git a/src/test/ui/rfc-2632-const-trait-impl/issue-88155.rs b/src/test/ui/rfc-2632-const-trait-impl/issue-88155.rs index cbe3fe0ce5f..b132c395ac7 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/issue-88155.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/issue-88155.rs @@ -1,4 +1,3 @@ -#![feature(const_fn_trait_bound)] #![feature(const_trait_impl)] pub trait A { diff --git a/src/test/ui/rfc-2632-const-trait-impl/issue-88155.stderr b/src/test/ui/rfc-2632-const-trait-impl/issue-88155.stderr index 931c0b3658f..95592350520 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/issue-88155.stderr +++ b/src/test/ui/rfc-2632-const-trait-impl/issue-88155.stderr @@ -1,17 +1,17 @@ error[E0277]: the trait bound `T: ~const A` is not satisfied - --> $DIR/issue-88155.rs:9:5 + --> $DIR/issue-88155.rs:8:5 | LL | T::assoc() | ^^^^^^^^^^ the trait `~const A` is not implemented for `T` | note: the trait `A` is implemented for `T`, but that implementation is not `const` - --> $DIR/issue-88155.rs:9:5 + --> $DIR/issue-88155.rs:8:5 | LL | T::assoc() | ^^^^^^^^^^ error[E0015]: cannot call non-const fn `::assoc` in constant functions - --> $DIR/issue-88155.rs:9:5 + --> $DIR/issue-88155.rs:8:5 | LL | T::assoc() | ^^^^^^^^^^ diff --git a/src/test/ui/rfc-2632-const-trait-impl/issue-92111.rs b/src/test/ui/rfc-2632-const-trait-impl/issue-92111.rs index 9bf0886084f..da7147acdd7 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/issue-92111.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/issue-92111.rs @@ -10,7 +10,6 @@ // check-pass #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] pub trait Tr {} diff --git a/src/test/ui/rfc-2632-const-trait-impl/issue-92230-wf-super-trait-env.rs b/src/test/ui/rfc-2632-const-trait-impl/issue-92230-wf-super-trait-env.rs index 158c628c3e0..97c27ce1a1c 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/issue-92230-wf-super-trait-env.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/issue-92230-wf-super-trait-env.rs @@ -2,7 +2,6 @@ // // check-pass -#![feature(const_fn_trait_bound)] #![feature(const_trait_impl)] pub trait Super {} diff --git a/src/test/ui/rfc-2632-const-trait-impl/non-const-op-in-closure-in-const.rs b/src/test/ui/rfc-2632-const-trait-impl/non-const-op-in-closure-in-const.rs index ef74ef8e426..defef9e0409 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/non-const-op-in-closure-in-const.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/non-const-op-in-closure-in-const.rs @@ -1,7 +1,6 @@ // check-pass #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] trait Convert { fn to(self) -> T; diff --git a/src/test/ui/rfc-2632-const-trait-impl/trait-default-body-stability.rs b/src/test/ui/rfc-2632-const-trait-impl/trait-default-body-stability.rs index cbfdf89b7bd..f4a5d0133ce 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/trait-default-body-stability.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/trait-default-body-stability.rs @@ -2,7 +2,6 @@ #![feature(staged_api)] #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] #![feature(const_t_try)] #![feature(const_try)] #![feature(try_trait_v2)] diff --git a/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause-run.rs b/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause-run.rs index 0cde5b6f842..e47c5c7bd66 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause-run.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause-run.rs @@ -1,7 +1,6 @@ // run-pass #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] trait Bar { fn bar() -> u8; diff --git a/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause-self-referential.rs b/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause-self-referential.rs index ae9ab26cdc0..acea58eaecb 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause-self-referential.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause-self-referential.rs @@ -1,7 +1,6 @@ // check-pass #![feature(const_trait_impl)] -#![feature(const_fn_trait_bound)] trait Foo { fn bar() where Self: ~const Foo; diff --git a/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause.rs b/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause.rs index d64822d7ce8..d37ed3bb8dd 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause.rs +++ b/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause.rs @@ -1,4 +1,3 @@ -#![feature(const_fn_trait_bound)] #![feature(const_trait_impl)] trait Bar {} diff --git a/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause.stderr b/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause.stderr index f9b5d81c63b..d5b2d269730 100644 --- a/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause.stderr +++ b/src/test/ui/rfc-2632-const-trait-impl/trait-where-clause.stderr @@ -1,16 +1,16 @@ error[E0277]: the trait bound `T: ~const Bar` is not satisfied - --> $DIR/trait-where-clause.rs:14:5 + --> $DIR/trait-where-clause.rs:13:5 | LL | T::b(); | ^^^^ the trait `~const Bar` is not implemented for `T` | note: the trait `Bar` is implemented for `T`, but that implementation is not `const` - --> $DIR/trait-where-clause.rs:14:5 + --> $DIR/trait-where-clause.rs:13:5 | LL | T::b(); | ^^^^ note: required by a bound in `Foo::b` - --> $DIR/trait-where-clause.rs:8:24 + --> $DIR/trait-where-clause.rs:7:24 | LL | fn b() where Self: ~const Bar; | ^^^^^^^^^^ required by this bound in `Foo::b` @@ -20,18 +20,18 @@ LL | const fn test1() { | ++++++++++++ error[E0277]: the trait bound `T: ~const Bar` is not satisfied - --> $DIR/trait-where-clause.rs:16:5 + --> $DIR/trait-where-clause.rs:15:5 | LL | T::c::(); | ^^^^^^^^^ the trait `~const Bar` is not implemented for `T` | note: the trait `Bar` is implemented for `T`, but that implementation is not `const` - --> $DIR/trait-where-clause.rs:16:5 + --> $DIR/trait-where-clause.rs:15:5 | LL | T::c::(); | ^^^^^^^^^ note: required by a bound in `Foo::c` - --> $DIR/trait-where-clause.rs:9:13 + --> $DIR/trait-where-clause.rs:8:13 | LL | fn c(); | ^^^^^^^^^^ required by this bound in `Foo::c` @@ -41,13 +41,13 @@ LL | const fn test1() { | ++++++++++++ error[E0277]: the trait bound `T: Bar` is not satisfied - --> $DIR/trait-where-clause.rs:28:5 + --> $DIR/trait-where-clause.rs:27:5 | LL | T::b(); | ^^^^ the trait `Bar` is not implemented for `T` | note: required by a bound in `Foo::b` - --> $DIR/trait-where-clause.rs:8:24 + --> $DIR/trait-where-clause.rs:7:24 | LL | fn b() where Self: ~const Bar; | ^^^^^^^^^^ required by this bound in `Foo::b` @@ -57,13 +57,13 @@ LL | fn test3() { | +++++ error[E0277]: the trait bound `T: Bar` is not satisfied - --> $DIR/trait-where-clause.rs:30:5 + --> $DIR/trait-where-clause.rs:29:5 | LL | T::c::(); | ^^^^^^^^^ the trait `Bar` is not implemented for `T` | note: required by a bound in `Foo::c` - --> $DIR/trait-where-clause.rs:9:13 + --> $DIR/trait-where-clause.rs:8:13 | LL | fn c(); | ^^^^^^^^^^ required by this bound in `Foo::c` diff --git a/src/test/ui/type-alias-impl-trait/issue-53096.rs b/src/test/ui/type-alias-impl-trait/issue-53096.rs index 792bd16527b..007dcf3bcb6 100644 --- a/src/test/ui/type-alias-impl-trait/issue-53096.rs +++ b/src/test/ui/type-alias-impl-trait/issue-53096.rs @@ -1,4 +1,4 @@ -#![feature(const_impl_trait, const_fn_fn_ptr_basics, rustc_attrs)] +#![feature(rustc_attrs)] #![feature(type_alias_impl_trait)] type Foo = impl Fn() -> usize; diff --git a/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.rs b/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.rs index 176118200e5..a3f126d56cf 100644 --- a/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.rs +++ b/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.rs @@ -1,4 +1,4 @@ -#![feature(const_impl_trait, generators, generator_trait, rustc_attrs)] +#![feature(generators, generator_trait, rustc_attrs)] #![feature(type_alias_impl_trait)] use std::ops::Generator; diff --git a/src/test/ui/type-alias-impl-trait/structural-match-no-leak.rs b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.rs index 51a7b6454c3..219837aa04b 100644 --- a/src/test/ui/type-alias-impl-trait/structural-match-no-leak.rs +++ b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.rs @@ -1,4 +1,3 @@ -#![feature(const_impl_trait)] #![feature(type_alias_impl_trait)] type Bar = impl Send; diff --git a/src/test/ui/type-alias-impl-trait/structural-match-no-leak.stderr b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.stderr index 7e41b374452..889c4fd4b04 100644 --- a/src/test/ui/type-alias-impl-trait/structural-match-no-leak.stderr +++ b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.stderr @@ -1,5 +1,5 @@ error: `impl Send` cannot be used in patterns - --> $DIR/structural-match-no-leak.rs:15:9 + --> $DIR/structural-match-no-leak.rs:14:9 | LL | LEAK_FREE => (), | ^^^^^^^^^ diff --git a/src/test/ui/type-alias-impl-trait/structural-match.rs b/src/test/ui/type-alias-impl-trait/structural-match.rs index 73558d39ad5..c9e669cad60 100644 --- a/src/test/ui/type-alias-impl-trait/structural-match.rs +++ b/src/test/ui/type-alias-impl-trait/structural-match.rs @@ -1,4 +1,3 @@ -#![feature(const_impl_trait)] #![feature(type_alias_impl_trait)] type Foo = impl Send; diff --git a/src/test/ui/type-alias-impl-trait/structural-match.stderr b/src/test/ui/type-alias-impl-trait/structural-match.stderr index b43f2148dea..262fd072613 100644 --- a/src/test/ui/type-alias-impl-trait/structural-match.stderr +++ b/src/test/ui/type-alias-impl-trait/structural-match.stderr @@ -1,5 +1,5 @@ error: `impl Send` cannot be used in patterns - --> $DIR/structural-match.rs:16:9 + --> $DIR/structural-match.rs:15:9 | LL | VALUE => (), | ^^^^^ diff --git a/src/tools/clippy/clippy_lints/src/missing_const_for_fn.rs b/src/tools/clippy/clippy_lints/src/missing_const_for_fn.rs index bad9e0be82e..ecc9acf4445 100644 --- a/src/tools/clippy/clippy_lints/src/missing_const_for_fn.rs +++ b/src/tools/clippy/clippy_lints/src/missing_const_for_fn.rs @@ -3,6 +3,7 @@ use clippy_utils::qualify_min_const_fn::is_min_const_fn; use clippy_utils::ty::has_drop; use clippy_utils::{fn_has_unsatisfiable_preds, is_entrypoint_fn, meets_msrv, msrvs, trait_ref_of_method}; use rustc_hir as hir; +use rustc_hir::def_id::CRATE_DEF_ID; use rustc_hir::intravisit::FnKind; use rustc_hir::{Body, Constness, FnDecl, GenericParamKind, HirId}; use rustc_lint::{LateContext, LateLintPass}; @@ -131,6 +132,18 @@ impl<'tcx> LateLintPass<'tcx> for MissingConstForFn { FnKind::Closure => return, } + // Const fns are not allowed as methods in a trait. + { + let parent = cx.tcx.hir().get_parent_item(hir_id); + if parent != CRATE_DEF_ID { + if let hir::Node::Item(item) = cx.tcx.hir().get_by_def_id(parent) { + if let hir::ItemKind::Trait(..) = &item.kind { + return; + } + } + } + } + let mir = cx.tcx.optimized_mir(def_id); if let Err((span, err)) = is_min_const_fn(cx.tcx, mir, self.msrv.as_ref()) { diff --git a/src/tools/clippy/clippy_utils/src/qualify_min_const_fn.rs b/src/tools/clippy/clippy_utils/src/qualify_min_const_fn.rs index c039fec955d..891531951c1 100644 --- a/src/tools/clippy/clippy_utils/src/qualify_min_const_fn.rs +++ b/src/tools/clippy/clippy_utils/src/qualify_min_const_fn.rs @@ -32,32 +32,12 @@ pub fn is_min_const_fn<'a, 'tcx>(tcx: TyCtxt<'tcx>, body: &'a Body<'tcx>, msrv: | ty::PredicateKind::Projection(_) | ty::PredicateKind::ConstEvaluatable(..) | ty::PredicateKind::ConstEquate(..) + | ty::PredicateKind::Trait(..) | ty::PredicateKind::TypeWellFormedFromEnv(..) => continue, ty::PredicateKind::ObjectSafe(_) => panic!("object safe predicate on function: {:#?}", predicate), ty::PredicateKind::ClosureKind(..) => panic!("closure kind predicate on function: {:#?}", predicate), ty::PredicateKind::Subtype(_) => panic!("subtype predicate on function: {:#?}", predicate), ty::PredicateKind::Coerce(_) => panic!("coerce predicate on function: {:#?}", predicate), - ty::PredicateKind::Trait(pred) => { - if Some(pred.def_id()) == tcx.lang_items().sized_trait() { - continue; - } - match pred.self_ty().kind() { - ty::Param(ref p) => { - let generics = tcx.generics_of(current); - let def = generics.type_param(p, tcx); - let span = tcx.def_span(def.def_id); - return Err(( - span, - "trait bounds other than `Sized` \ - on const fn parameters are unstable" - .into(), - )); - }, - // other kinds of bounds are either tautologies - // or cause errors in other passes - _ => continue, - } - }, } } match predicates.parent { diff --git a/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.rs b/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.rs index baa7eec0546..88f6935d224 100644 --- a/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.rs +++ b/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.rs @@ -49,8 +49,6 @@ fn sub(x: u32) -> usize { unsafe { transmute(&x) } } -// NOTE: This is currently not yet allowed to be const -// Once implemented, Clippy should be able to suggest this as const, too. fn generic_arr(t: [T; 1]) -> T { t[0] } diff --git a/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.stderr b/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.stderr index b89cc6451bb..3eb52b68274 100644 --- a/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.stderr +++ b/src/tools/clippy/tests/ui/missing_const_for_fn/could_be_const.stderr @@ -58,7 +58,15 @@ LL | | } | |_^ error: this could be a `const fn` - --> $DIR/could_be_const.rs:67:9 + --> $DIR/could_be_const.rs:52:1 + | +LL | / fn generic_arr(t: [T; 1]) -> T { +LL | | t[0] +LL | | } + | |_^ + +error: this could be a `const fn` + --> $DIR/could_be_const.rs:65:9 | LL | / pub fn b(self, a: &A) -> B { LL | | B @@ -66,12 +74,12 @@ LL | | } | |_________^ error: this could be a `const fn` - --> $DIR/could_be_const.rs:77:5 + --> $DIR/could_be_const.rs:75:5 | LL | / fn const_fn_stabilized_before_msrv(byte: u8) { LL | | byte.is_ascii_digit(); LL | | } | |_____^ -error: aborting due to 9 previous errors +error: aborting due to 10 previous errors