Rollup merge of #77170 - ecstatic-morse:const-fn-ptr, r=oli-obk
Remove `#[rustc_allow_const_fn_ptr]` and add `#![feature(const_fn_fn_ptr_basics)]` `rustc_allow_const_fn_ptr` was a hack to work around the lack of an escape hatch for the "min `const fn`" checks in const-stable functions. Now that we have co-opted `allow_internal_unstable` for this purpose, we no longer need a bespoke attribute. Now this functionality is gated under `const_fn_fn_ptr_basics` (how concise!), and `#[allow_internal_unstable(const_fn_fn_ptr_basics)]` replaces `#[rustc_allow_const_fn_ptr]`. `const_fn_fn_ptr_basics` allows function pointer types to appear in the arguments and locals of a `const fn` as well as function pointer casts to be performed inside a `const fn`. Both of these were allowed in constants and statics already. Notably, this does **not** allow users to invoke function pointers in a const context. Presumably, we will use a nicer name for that (`const_fn_ptr`?). r? @oli-obk
This commit is contained in:
commit
85a59d40f1
39 changed files with 146 additions and 135 deletions
|
@ -145,8 +145,6 @@ pub struct ConstStability {
|
||||||
pub feature: Symbol,
|
pub feature: Symbol,
|
||||||
/// whether the function has a `#[rustc_promotable]` attribute
|
/// whether the function has a `#[rustc_promotable]` attribute
|
||||||
pub promotable: bool,
|
pub promotable: bool,
|
||||||
/// whether the function has a `#[rustc_allow_const_fn_ptr]` attribute
|
|
||||||
pub allow_const_fn_ptr: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The available stability levels.
|
/// The available stability levels.
|
||||||
|
@ -190,7 +188,6 @@ where
|
||||||
let mut stab: Option<Stability> = None;
|
let mut stab: Option<Stability> = None;
|
||||||
let mut const_stab: Option<ConstStability> = None;
|
let mut const_stab: Option<ConstStability> = None;
|
||||||
let mut promotable = false;
|
let mut promotable = false;
|
||||||
let mut allow_const_fn_ptr = false;
|
|
||||||
let diagnostic = &sess.parse_sess.span_diagnostic;
|
let diagnostic = &sess.parse_sess.span_diagnostic;
|
||||||
|
|
||||||
'outer: for attr in attrs_iter {
|
'outer: for attr in attrs_iter {
|
||||||
|
@ -200,7 +197,6 @@ where
|
||||||
sym::unstable,
|
sym::unstable,
|
||||||
sym::stable,
|
sym::stable,
|
||||||
sym::rustc_promotable,
|
sym::rustc_promotable,
|
||||||
sym::rustc_allow_const_fn_ptr,
|
|
||||||
]
|
]
|
||||||
.iter()
|
.iter()
|
||||||
.any(|&s| attr.has_name(s))
|
.any(|&s| attr.has_name(s))
|
||||||
|
@ -215,9 +211,6 @@ where
|
||||||
if attr.has_name(sym::rustc_promotable) {
|
if attr.has_name(sym::rustc_promotable) {
|
||||||
promotable = true;
|
promotable = true;
|
||||||
}
|
}
|
||||||
if attr.has_name(sym::rustc_allow_const_fn_ptr) {
|
|
||||||
allow_const_fn_ptr = true;
|
|
||||||
}
|
|
||||||
// attributes with data
|
// attributes with data
|
||||||
else if let Some(MetaItem { kind: MetaItemKind::List(ref metas), .. }) = meta {
|
else if let Some(MetaItem { kind: MetaItemKind::List(ref metas), .. }) = meta {
|
||||||
let meta = meta.as_ref().unwrap();
|
let meta = meta.as_ref().unwrap();
|
||||||
|
@ -360,12 +353,8 @@ where
|
||||||
if sym::unstable == meta_name {
|
if sym::unstable == meta_name {
|
||||||
stab = Some(Stability { level, feature });
|
stab = Some(Stability { level, feature });
|
||||||
} else {
|
} else {
|
||||||
const_stab = Some(ConstStability {
|
const_stab =
|
||||||
level,
|
Some(ConstStability { level, feature, promotable: false });
|
||||||
feature,
|
|
||||||
promotable: false,
|
|
||||||
allow_const_fn_ptr: false,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(None, _, _) => {
|
(None, _, _) => {
|
||||||
|
@ -440,12 +429,8 @@ where
|
||||||
if sym::stable == meta_name {
|
if sym::stable == meta_name {
|
||||||
stab = Some(Stability { level, feature });
|
stab = Some(Stability { level, feature });
|
||||||
} else {
|
} else {
|
||||||
const_stab = Some(ConstStability {
|
const_stab =
|
||||||
level,
|
Some(ConstStability { level, feature, promotable: false });
|
||||||
feature,
|
|
||||||
promotable: false,
|
|
||||||
allow_const_fn_ptr: false,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(None, _) => {
|
(None, _) => {
|
||||||
|
@ -464,18 +449,16 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
// Merge the const-unstable info into the stability info
|
// Merge the const-unstable info into the stability info
|
||||||
if promotable || allow_const_fn_ptr {
|
if promotable {
|
||||||
if let Some(ref mut stab) = const_stab {
|
if let Some(ref mut stab) = const_stab {
|
||||||
stab.promotable = promotable;
|
stab.promotable = promotable;
|
||||||
stab.allow_const_fn_ptr = allow_const_fn_ptr;
|
|
||||||
} else {
|
} else {
|
||||||
struct_span_err!(
|
struct_span_err!(
|
||||||
diagnostic,
|
diagnostic,
|
||||||
item_sp,
|
item_sp,
|
||||||
E0717,
|
E0717,
|
||||||
"rustc_promotable and rustc_allow_const_fn_ptr attributes \
|
"`rustc_promotable` attribute must be paired with either a `rustc_const_unstable` \
|
||||||
must be paired with either a rustc_const_unstable or a rustc_const_stable \
|
or a `rustc_const_stable` attribute"
|
||||||
attribute"
|
|
||||||
)
|
)
|
||||||
.emit();
|
.emit();
|
||||||
}
|
}
|
||||||
|
|
|
@ -587,6 +587,9 @@ declare_features! (
|
||||||
/// Allows basic arithmetic on floating point types in a `const fn`.
|
/// Allows basic arithmetic on floating point types in a `const fn`.
|
||||||
(active, const_fn_floating_point_arithmetic, "1.48.0", Some(57241), None),
|
(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),
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// feature-group-end: actual feature gates
|
// feature-group-end: actual feature gates
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
|
|
|
@ -464,7 +464,6 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
rustc_attr!(rustc_promotable, AssumedUsed, template!(Word), IMPL_DETAIL),
|
rustc_attr!(rustc_promotable, AssumedUsed, template!(Word), IMPL_DETAIL),
|
||||||
rustc_attr!(rustc_allow_const_fn_ptr, AssumedUsed, template!(Word), IMPL_DETAIL),
|
|
||||||
rustc_attr!(rustc_args_required_const, AssumedUsed, template!(List: "N"), INTERNAL_UNSTABLE),
|
rustc_attr!(rustc_args_required_const, AssumedUsed, template!(List: "N"), INTERNAL_UNSTABLE),
|
||||||
|
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
|
@ -457,10 +457,6 @@ rustc_queries! {
|
||||||
desc { |tcx| "checking if item is promotable: `{}`", tcx.def_path_str(key) }
|
desc { |tcx| "checking if item is promotable: `{}`", tcx.def_path_str(key) }
|
||||||
}
|
}
|
||||||
|
|
||||||
query const_fn_is_allowed_fn_ptr(key: DefId) -> bool {
|
|
||||||
desc { |tcx| "checking if const fn allows `fn()` types: `{}`", tcx.def_path_str(key) }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns `true` if this is a foreign item (i.e., linked via `extern { ... }`).
|
/// Returns `true` if this is a foreign item (i.e., linked via `extern { ... }`).
|
||||||
query is_foreign_item(key: DefId) -> bool {
|
query is_foreign_item(key: DefId) -> bool {
|
||||||
desc { |tcx| "checking if `{}` is a foreign item", tcx.def_path_str(key) }
|
desc { |tcx| "checking if `{}` is a foreign item", tcx.def_path_str(key) }
|
||||||
|
|
|
@ -151,17 +151,11 @@ fn is_promotable_const_fn(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn const_fn_is_allowed_fn_ptr(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
|
|
||||||
is_const_fn(tcx, def_id)
|
|
||||||
&& tcx.lookup_const_stability(def_id).map(|stab| stab.allow_const_fn_ptr).unwrap_or(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn provide(providers: &mut Providers) {
|
pub fn provide(providers: &mut Providers) {
|
||||||
*providers = Providers {
|
*providers = Providers {
|
||||||
is_const_fn_raw,
|
is_const_fn_raw,
|
||||||
is_const_impl_raw: |tcx, def_id| is_const_impl_raw(tcx, def_id.expect_local()),
|
is_const_impl_raw: |tcx, def_id| is_const_impl_raw(tcx, def_id.expect_local()),
|
||||||
is_promotable_const_fn,
|
is_promotable_const_fn,
|
||||||
const_fn_is_allowed_fn_ptr,
|
|
||||||
..*providers
|
..*providers
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -213,11 +213,21 @@ impl NonConstOp for FnPtrCast {
|
||||||
const STOPS_CONST_CHECKING: bool = true;
|
const STOPS_CONST_CHECKING: bool = true;
|
||||||
|
|
||||||
fn status_in_item(&self, ccx: &ConstCx<'_, '_>) -> Status {
|
fn status_in_item(&self, ccx: &ConstCx<'_, '_>) -> Status {
|
||||||
mcf_status_in_item(ccx)
|
if ccx.const_kind() != hir::ConstContext::ConstFn {
|
||||||
|
Status::Allowed
|
||||||
|
} else {
|
||||||
|
Status::Unstable(sym::const_fn_fn_ptr_basics)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_error(&self, ccx: &ConstCx<'_, '_>, span: Span) {
|
fn emit_error(&self, ccx: &ConstCx<'_, '_>, span: Span) {
|
||||||
mcf_emit_error(ccx, span, "function pointer casts are not allowed in const fn");
|
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()),
|
||||||
|
)
|
||||||
|
.emit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -596,17 +606,21 @@ pub mod ty {
|
||||||
const STOPS_CONST_CHECKING: bool = true;
|
const STOPS_CONST_CHECKING: bool = true;
|
||||||
|
|
||||||
fn status_in_item(&self, ccx: &ConstCx<'_, '_>) -> Status {
|
fn status_in_item(&self, ccx: &ConstCx<'_, '_>) -> Status {
|
||||||
// FIXME: This attribute a hack to allow the specialization of the `futures` API. See
|
if ccx.const_kind() != hir::ConstContext::ConstFn {
|
||||||
// #59739. We should have a proper feature gate for this.
|
|
||||||
if ccx.tcx.has_attr(ccx.def_id.to_def_id(), sym::rustc_allow_const_fn_ptr) {
|
|
||||||
Status::Allowed
|
Status::Allowed
|
||||||
} else {
|
} else {
|
||||||
mcf_status_in_item(ccx)
|
Status::Unstable(sym::const_fn_fn_ptr_basics)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_error(&self, ccx: &ConstCx<'_, '_>, span: Span) {
|
fn emit_error(&self, ccx: &ConstCx<'_, '_>, span: Span) {
|
||||||
mcf_emit_error(ccx, span, "function pointers in const fn are unstable");
|
feature_err(
|
||||||
|
&ccx.tcx.sess.parse_sess,
|
||||||
|
sym::const_fn_fn_ptr_basics,
|
||||||
|
span,
|
||||||
|
&format!("function pointers cannot appear in {}s", ccx.const_kind()),
|
||||||
|
)
|
||||||
|
.emit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -353,6 +353,7 @@ symbols! {
|
||||||
const_extern_fn,
|
const_extern_fn,
|
||||||
const_fn,
|
const_fn,
|
||||||
const_fn_floating_point_arithmetic,
|
const_fn_floating_point_arithmetic,
|
||||||
|
const_fn_fn_ptr_basics,
|
||||||
const_fn_transmute,
|
const_fn_transmute,
|
||||||
const_fn_union,
|
const_fn_union,
|
||||||
const_generics,
|
const_generics,
|
||||||
|
@ -884,7 +885,6 @@ symbols! {
|
||||||
rustc,
|
rustc,
|
||||||
rustc_allocator,
|
rustc_allocator,
|
||||||
rustc_allocator_nounwind,
|
rustc_allocator_nounwind,
|
||||||
rustc_allow_const_fn_ptr,
|
|
||||||
rustc_args_required_const,
|
rustc_args_required_const,
|
||||||
rustc_attrs,
|
rustc_attrs,
|
||||||
rustc_builtin_macro,
|
rustc_builtin_macro,
|
||||||
|
|
|
@ -83,6 +83,7 @@
|
||||||
#![feature(const_fn_union)]
|
#![feature(const_fn_union)]
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn)]
|
||||||
#![cfg_attr(not(bootstrap), feature(const_fn_floating_point_arithmetic))]
|
#![cfg_attr(not(bootstrap), feature(const_fn_floating_point_arithmetic))]
|
||||||
|
#![cfg_attr(not(bootstrap), feature(const_fn_fn_ptr_basics))]
|
||||||
#![feature(const_generics)]
|
#![feature(const_generics)]
|
||||||
#![feature(const_option)]
|
#![feature(const_option)]
|
||||||
#![feature(const_precise_live_drops)]
|
#![feature(const_precise_live_drops)]
|
||||||
|
|
|
@ -129,13 +129,9 @@ impl RawWakerVTable {
|
||||||
/// associated task.
|
/// associated task.
|
||||||
#[rustc_promotable]
|
#[rustc_promotable]
|
||||||
#[stable(feature = "futures_api", since = "1.36.0")]
|
#[stable(feature = "futures_api", since = "1.36.0")]
|
||||||
// `rustc_allow_const_fn_ptr` is a hack that should not be used anywhere else
|
|
||||||
// without first consulting with T-Lang.
|
|
||||||
//
|
|
||||||
// FIXME: remove whenever we have a stable way to accept fn pointers from const fn
|
|
||||||
// (see https://github.com/rust-rfcs/const-eval/issues/19#issuecomment-472799062)
|
|
||||||
#[rustc_allow_const_fn_ptr]
|
|
||||||
#[rustc_const_stable(feature = "futures_api", since = "1.36.0")]
|
#[rustc_const_stable(feature = "futures_api", since = "1.36.0")]
|
||||||
|
#[cfg_attr(not(bootstrap), allow_internal_unstable(const_fn_fn_ptr_basics))]
|
||||||
|
#[cfg_attr(bootstrap, rustc_allow_const_fn_ptr)]
|
||||||
pub const fn new(
|
pub const fn new(
|
||||||
clone: unsafe fn(*const ()) -> RawWaker,
|
clone: unsafe fn(*const ()) -> RawWaker,
|
||||||
wake: unsafe fn(*const ()),
|
wake: unsafe fn(*const ()),
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#![feature(nll)]
|
#![feature(nll)]
|
||||||
#![feature(staged_api)]
|
#![feature(staged_api)]
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn)]
|
||||||
|
#![cfg_attr(not(bootstrap), feature(const_fn_fn_ptr_basics))]
|
||||||
#![feature(allow_internal_unstable)]
|
#![feature(allow_internal_unstable)]
|
||||||
#![feature(decl_macro)]
|
#![feature(decl_macro)]
|
||||||
#![feature(extern_types)]
|
#![feature(extern_types)]
|
||||||
|
|
|
@ -239,6 +239,7 @@
|
||||||
#![cfg_attr(not(bootstrap), feature(const_fn_floating_point_arithmetic))]
|
#![cfg_attr(not(bootstrap), feature(const_fn_floating_point_arithmetic))]
|
||||||
#![feature(const_fn_transmute)]
|
#![feature(const_fn_transmute)]
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn)]
|
||||||
|
#![cfg_attr(not(bootstrap), feature(const_fn_fn_ptr_basics))]
|
||||||
#![feature(const_ip)]
|
#![feature(const_ip)]
|
||||||
#![feature(const_ipv6)]
|
#![feature(const_ipv6)]
|
||||||
#![feature(const_raw_ptr_deref)]
|
#![feature(const_raw_ptr_deref)]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Crate that exports a const fn. Used for testing cross-crate.
|
// Crate that exports a const fn. Used for testing cross-crate.
|
||||||
|
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn_fn_ptr_basics)]
|
||||||
#![crate_type="rlib"]
|
#![crate_type="rlib"]
|
||||||
|
|
||||||
pub const fn foo() -> usize { 22 }
|
pub const fn foo() -> usize { 22 }
|
||||||
|
|
|
@ -10,11 +10,23 @@ help: skipping check that does not even have a feature gate
|
||||||
|
|
|
|
||||||
LL | X_CONST(x)
|
LL | X_CONST(x)
|
||||||
| ^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
|
help: skipping check for `const_fn_fn_ptr_basics` feature
|
||||||
|
--> $DIR/const_fn_ptr.rs:19: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:20:5
|
||||||
|
|
|
||||||
|
LL | x(y)
|
||||||
|
| ^
|
||||||
help: skipping check that does not even have a feature gate
|
help: skipping check that does not even have a feature gate
|
||||||
--> $DIR/const_fn_ptr.rs:20:5
|
--> $DIR/const_fn_ptr.rs:20:5
|
||||||
|
|
|
|
||||||
LL | x(y)
|
LL | x(y)
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
||||||
warning: 1 warning emitted
|
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
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,16 @@ LL | assert_eq!(Z, 4);
|
||||||
|
|
||||||
warning: skipping const checks
|
warning: skipping const checks
|
||||||
|
|
|
|
||||||
|
help: skipping check for `const_fn_fn_ptr_basics` feature
|
||||||
|
--> $DIR/const_fn_ptr_fail2.rs:12: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:13:5
|
||||||
|
|
|
||||||
|
LL | x(y)
|
||||||
|
| ^
|
||||||
help: skipping check that does not even have a feature gate
|
help: skipping check that does not even have a feature gate
|
||||||
--> $DIR/const_fn_ptr_fail2.rs:13:5
|
--> $DIR/const_fn_ptr_fail2.rs:13:5
|
||||||
|
|
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// check-pass
|
// check-pass
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn_fn_ptr_basics)]
|
||||||
|
|
||||||
const fn nested(x: (for<'a> fn(&'a ()), String)) -> (fn(&'static ()), String) {
|
const fn nested(x: (for<'a> fn(&'a ()), String)) -> (fn(&'static ()), String) {
|
||||||
x
|
x
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
const extern fn unsize(x: &[u8; 3]) -> &[u8] { x }
|
const extern fn unsize(x: &[u8; 3]) -> &[u8] { x }
|
||||||
const unsafe extern "C" fn closure() -> fn() { || {} }
|
const unsafe extern "C" fn closure() -> fn() { || {} }
|
||||||
//~^ ERROR function pointers in const fn are unstable
|
//~^ ERROR function pointer
|
||||||
const unsafe extern fn use_float() { 1.0 + 1.0; }
|
const unsafe extern fn use_float() { 1.0 + 1.0; }
|
||||||
//~^ ERROR floating point arithmetic
|
//~^ ERROR floating point arithmetic
|
||||||
const extern "C" fn ptr_cast(val: *const u8) { val as usize; }
|
const extern "C" fn ptr_cast(val: *const u8) { val as usize; }
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
error[E0723]: function pointers in const fn are unstable
|
error[E0658]: function pointers cannot appear in constant functions
|
||||||
--> $DIR/const-extern-fn-min-const-fn.rs:4:41
|
--> $DIR/const-extern-fn-min-const-fn.rs:4:41
|
||||||
|
|
|
|
||||||
LL | const unsafe extern "C" fn closure() -> fn() { || {} }
|
LL | const unsafe extern "C" fn closure() -> fn() { || {} }
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
|
|
||||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= 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
|
error[E0658]: floating point arithmetic is not allowed in constant functions
|
||||||
--> $DIR/const-extern-fn-min-const-fn.rs:6:38
|
--> $DIR/const-extern-fn-min-const-fn.rs:6:38
|
||||||
|
@ -27,5 +27,4 @@ LL | const extern "C" fn ptr_cast(val: *const u8) { val as usize; }
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0658, E0723.
|
For more information about this error, try `rustc --explain E0658`.
|
||||||
For more information about an error, try `rustc --explain E0658`.
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
#![allow(unused_variables)]
|
#![allow(unused_variables)]
|
||||||
|
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn_fn_ptr_basics)]
|
||||||
|
|
||||||
const fn x() {
|
const fn x() {
|
||||||
let t = true;
|
let t = true;
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn_fn_ptr_basics)]
|
||||||
|
|
||||||
const fn foo() { (||{})() }
|
const fn foo() { (||{})() }
|
||||||
//~^ ERROR calls in constant functions are limited to constant functions, tuple structs and tuple
|
//~^ ERROR calls in constant functions
|
||||||
// variants
|
|
||||||
|
|
||||||
const fn bad(input: fn()) {
|
const fn bad(input: fn()) {
|
||||||
input()
|
input()
|
||||||
//~^ ERROR function pointers are not allowed in const fn
|
//~^ ERROR function pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -5,7 +5,7 @@ LL | const fn foo() { (||{})() }
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
|
|
||||||
error: function pointers are not allowed in const fn
|
error: function pointers are not allowed in const fn
|
||||||
--> $DIR/issue-56164.rs:8:5
|
--> $DIR/issue-56164.rs:7:5
|
||||||
|
|
|
|
||||||
LL | input()
|
LL | input()
|
||||||
| ^^^^^^^
|
| ^^^^^^^
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
#![feature(rustc_attrs, staged_api)]
|
#![feature(rustc_attrs, staged_api, allow_internal_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")]
|
#[rustc_const_stable(since="1.0.0", feature = "mep")]
|
||||||
const fn error(_: fn()) {} //~ ERROR function pointers in const fn are unstable
|
const fn error(_: fn()) {}
|
||||||
|
//~^ ERROR const-stable function cannot use `#[feature(const_fn_fn_ptr_basics)]`
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
#[rustc_allow_const_fn_ptr]
|
|
||||||
#[rustc_const_stable(since="1.0.0", feature = "mep")]
|
#[rustc_const_stable(since="1.0.0", feature = "mep")]
|
||||||
|
#[allow_internal_unstable(const_fn_fn_ptr_basics)]
|
||||||
const fn compiles(_: fn()) {}
|
const fn compiles(_: fn()) {}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
error[E0723]: function pointers in const fn are unstable
|
error: const-stable function cannot use `#[feature(const_fn_fn_ptr_basics)]`
|
||||||
--> $DIR/allow_const_fn_ptr.rs:5:16
|
--> $DIR/allow_const_fn_ptr.rs:6:16
|
||||||
|
|
|
|
||||||
LL | const fn error(_: fn()) {}
|
LL | const fn error(_: fn()) {}
|
||||||
| ^
|
| ^
|
||||||
|
|
|
|
||||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
= note: otherwise `#[allow_internal_unstable]` can be used to bypass stability checks
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
help: if it is not part of the public API, make this function unstably const
|
||||||
|
|
|
||||||
|
LL | #[rustc_const_unstable(feature = "...", issue = "...")]
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0723`.
|
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
#![feature(staged_api)]
|
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
|
||||||
const fn error(_: fn()) {}
|
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
|
||||||
#[rustc_allow_const_fn_ptr]
|
|
||||||
//~^ ERROR internal implementation detail
|
|
||||||
const fn compiles(_: fn()) {}
|
|
||||||
|
|
||||||
fn main() {}
|
|
|
@ -1,11 +0,0 @@
|
||||||
error[E0658]: internal implementation detail
|
|
||||||
--> $DIR/allow_const_fn_ptr_feature_gate.rs:7:1
|
|
||||||
|
|
|
||||||
LL | #[rustc_allow_const_fn_ptr]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
|
|
@ -1,11 +1,13 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
|
#![feature(allow_internal_unstable)]
|
||||||
|
#![feature(const_fn_fn_ptr_basics)]
|
||||||
|
|
||||||
#![feature(rustc_attrs, staged_api)]
|
#![feature(rustc_attrs, staged_api)]
|
||||||
#![stable(feature = "rust1", since = "1.0.0")]
|
#![stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
#[rustc_allow_const_fn_ptr]
|
|
||||||
#[rustc_const_stable(since="1.0.0", feature = "mep")]
|
#[rustc_const_stable(since="1.0.0", feature = "mep")]
|
||||||
|
#[allow_internal_unstable(const_fn_fn_ptr_basics)]
|
||||||
const fn takes_fn_ptr(_: fn()) {}
|
const fn takes_fn_ptr(_: fn()) {}
|
||||||
|
|
||||||
const FN: fn() = || ();
|
const FN: fn() = || ();
|
||||||
|
|
|
@ -2,12 +2,12 @@ fn main() {}
|
||||||
|
|
||||||
const fn unsize(x: &[u8; 3]) -> &[u8] { x }
|
const fn unsize(x: &[u8; 3]) -> &[u8] { x }
|
||||||
const fn closure() -> fn() { || {} }
|
const fn closure() -> fn() { || {} }
|
||||||
//~^ ERROR function pointers in const fn are unstable
|
//~^ ERROR function pointer
|
||||||
const fn closure2() {
|
const fn closure2() {
|
||||||
(|| {}) as fn();
|
(|| {}) as fn();
|
||||||
//~^ ERROR function pointers in const fn are unstable
|
//~^ ERROR function pointer
|
||||||
}
|
}
|
||||||
const fn reify(f: fn()) -> unsafe fn() { f }
|
const fn reify(f: fn()) -> unsafe fn() { f }
|
||||||
//~^ ERROR function pointers in const fn are unstable
|
//~^ ERROR function pointer
|
||||||
const fn reify2() { main as unsafe fn(); }
|
const fn reify2() { main as unsafe fn(); }
|
||||||
//~^ ERROR function pointers in const fn are unstable
|
//~^ ERROR function pointer
|
||||||
|
|
|
@ -1,39 +1,39 @@
|
||||||
error[E0723]: function pointers in const fn are unstable
|
error[E0658]: function pointers cannot appear in constant functions
|
||||||
--> $DIR/cast_errors.rs:4:23
|
--> $DIR/cast_errors.rs:4:23
|
||||||
|
|
|
|
||||||
LL | const fn closure() -> fn() { || {} }
|
LL | const fn closure() -> fn() { || {} }
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
|
|
||||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: function pointers in const fn are unstable
|
error[E0658]: function pointers cannot appear in constant functions
|
||||||
--> $DIR/cast_errors.rs:7:5
|
--> $DIR/cast_errors.rs:7:5
|
||||||
|
|
|
|
||||||
LL | (|| {}) as fn();
|
LL | (|| {}) as fn();
|
||||||
| ^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: function pointers in const fn are unstable
|
error[E0658]: function pointers cannot appear in constant functions
|
||||||
--> $DIR/cast_errors.rs:10:28
|
--> $DIR/cast_errors.rs:10:28
|
||||||
|
|
|
|
||||||
LL | const fn reify(f: fn()) -> unsafe fn() { f }
|
LL | const fn reify(f: fn()) -> unsafe fn() { f }
|
||||||
| ^^^^^^^^^^^
|
| ^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: function pointers in const fn are unstable
|
error[E0658]: function pointers cannot appear in constant functions
|
||||||
--> $DIR/cast_errors.rs:12:21
|
--> $DIR/cast_errors.rs:12:21
|
||||||
|
|
|
|
||||||
LL | const fn reify2() { main as unsafe fn(); }
|
LL | const fn reify2() { main as unsafe fn(); }
|
||||||
| ^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0723`.
|
For more information about this error, try `rustc --explain E0658`.
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const fn cmp(x: fn(), y: fn()) -> bool { //~ ERROR function pointers in const fn are unstable
|
const fn cmp(x: fn(), y: fn()) -> bool { //~ ERROR function pointer
|
||||||
unsafe { x == y }
|
unsafe { x == y }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
error[E0723]: function pointers in const fn are unstable
|
error[E0658]: function pointers cannot appear in constant functions
|
||||||
--> $DIR/cmp_fn_pointers.rs:1:14
|
--> $DIR/cmp_fn_pointers.rs:1:14
|
||||||
|
|
|
|
||||||
LL | const fn cmp(x: fn(), y: fn()) -> bool {
|
LL | const fn cmp(x: fn(), y: fn()) -> bool {
|
||||||
| ^
|
| ^
|
||||||
|
|
|
|
||||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0723`.
|
For more information about this error, try `rustc --explain E0658`.
|
||||||
|
|
|
@ -128,6 +128,6 @@ const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1 }
|
||||||
//~^ ERROR trait bounds other than `Sized`
|
//~^ ERROR trait bounds other than `Sized`
|
||||||
|
|
||||||
const fn no_fn_ptrs(_x: fn()) {}
|
const fn no_fn_ptrs(_x: fn()) {}
|
||||||
//~^ ERROR function pointers in const fn are unstable
|
//~^ ERROR function pointer
|
||||||
const fn no_fn_ptrs2() -> fn() { fn foo() {} foo }
|
const fn no_fn_ptrs2() -> fn() { fn foo() {} foo }
|
||||||
//~^ ERROR function pointers in const fn are unstable
|
//~^ ERROR function pointer
|
||||||
|
|
|
@ -209,23 +209,23 @@ LL | const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1
|
||||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: function pointers in const fn are unstable
|
error[E0658]: function pointers cannot appear in constant functions
|
||||||
--> $DIR/min_const_fn.rs:130:21
|
--> $DIR/min_const_fn.rs:130:21
|
||||||
|
|
|
|
||||||
LL | const fn no_fn_ptrs(_x: fn()) {}
|
LL | const fn no_fn_ptrs(_x: fn()) {}
|
||||||
| ^^
|
| ^^
|
||||||
|
|
|
|
||||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: function pointers in const fn are unstable
|
error[E0658]: function pointers cannot appear in constant functions
|
||||||
--> $DIR/min_const_fn.rs:132:27
|
--> $DIR/min_const_fn.rs:132:27
|
||||||
|
|
|
|
||||||
LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo }
|
LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo }
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
|
|
||||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable
|
||||||
|
|
||||||
error: aborting due to 26 previous errors
|
error: aborting due to 26 previous errors
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
// gate-test-const_fn_fn_ptr_basics
|
||||||
|
|
||||||
struct HasPtr {
|
struct HasPtr {
|
||||||
field: fn(),
|
field: fn(),
|
||||||
}
|
}
|
||||||
|
@ -9,9 +11,9 @@ fn field() {}
|
||||||
const fn no_inner_dyn_trait(_x: Hide) {}
|
const fn no_inner_dyn_trait(_x: Hide) {}
|
||||||
const fn no_inner_dyn_trait2(x: Hide) {
|
const fn no_inner_dyn_trait2(x: Hide) {
|
||||||
x.0.field;
|
x.0.field;
|
||||||
//~^ ERROR function pointers in const fn
|
//~^ ERROR function pointer
|
||||||
}
|
}
|
||||||
const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasPtr { field }) }
|
const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasPtr { field }) }
|
||||||
//~^ ERROR function pointers in const fn
|
//~^ ERROR function pointer
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
error[E0723]: function pointers in const fn are unstable
|
error[E0658]: function pointers cannot appear in constant functions
|
||||||
--> $DIR/min_const_fn_fn_ptr.rs:11:5
|
--> $DIR/min_const_fn_fn_ptr.rs:13:5
|
||||||
|
|
|
|
||||||
LL | x.0.field;
|
LL | x.0.field;
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: function pointers in const fn are unstable
|
error[E0658]: function pointers cannot appear in constant functions
|
||||||
--> $DIR/min_const_fn_fn_ptr.rs:14:59
|
--> $DIR/min_const_fn_fn_ptr.rs:16:59
|
||||||
|
|
|
|
||||||
LL | const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasPtr { field }) }
|
LL | const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasPtr { field }) }
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
|
|
||||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0723`.
|
For more information about this error, try `rustc --explain E0658`.
|
||||||
|
|
|
@ -12,12 +12,12 @@ LL | static VAL: () = call_rust_fn(unsafe { std::mem::transmute(c_fn as extern "
|
||||||
|
|
||||||
warning: skipping const checks
|
warning: skipping const checks
|
||||||
|
|
|
|
||||||
help: skipping check for `const_fn` feature
|
help: skipping check for `const_fn_fn_ptr_basics` feature
|
||||||
--> $DIR/abi-mismatch.rs:9:23
|
--> $DIR/abi-mismatch.rs:9:23
|
||||||
|
|
|
|
||||||
LL | const fn call_rust_fn(my_fn: extern "Rust" fn()) {
|
LL | const fn call_rust_fn(my_fn: extern "Rust" fn()) {
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
help: skipping check for `const_fn` feature
|
help: skipping check for `const_fn_fn_ptr_basics` feature
|
||||||
--> $DIR/abi-mismatch.rs:10:5
|
--> $DIR/abi-mismatch.rs:10:5
|
||||||
|
|
|
|
||||||
LL | my_fn();
|
LL | my_fn();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
const fn x() {
|
const fn x() {
|
||||||
let t = true;
|
let t = true;
|
||||||
let x = || t; //~ ERROR function pointers in const fn are unstable
|
let x = || t; //~ ERROR function pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
error[E0723]: function pointers in const fn are unstable
|
error[E0658]: function pointers cannot appear in constant functions
|
||||||
--> $DIR/issue-37550.rs:3:9
|
--> $DIR/issue-37550.rs:3:9
|
||||||
|
|
|
|
||||||
LL | let x = || t;
|
LL | let x = || t;
|
||||||
| ^
|
| ^
|
||||||
|
|
|
|
||||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn_fn_ptr_basics)]` to the crate attributes to enable
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0723`.
|
For more information about this error, try `rustc --explain E0658`.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn_fn_ptr_basics)]
|
||||||
#![deny(const_err)]
|
#![deny(const_err)]
|
||||||
|
|
||||||
pub struct Data<T> {
|
pub struct Data<T> {
|
||||||
|
|
|
@ -1,10 +1,27 @@
|
||||||
warning: skipping const checks
|
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
|
help: skipping check that does not even have a feature gate
|
||||||
--> $DIR/caller-location-fnptr-rt-ctfe-equiv.rs:21:5
|
--> $DIR/caller-location-fnptr-rt-ctfe-equiv.rs:21:5
|
||||||
|
|
|
|
||||||
LL | ptr()
|
LL | ptr()
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
||||||
warning: 1 warning emitted
|
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
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// check-pass
|
// check-pass
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn, const_fn_fn_ptr_basics)]
|
||||||
#![feature(type_alias_impl_trait)]
|
#![feature(type_alias_impl_trait)]
|
||||||
|
|
||||||
type Foo = impl Fn() -> usize;
|
type Foo = impl Fn() -> usize;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue