pub feature: Symbol,
/// whether the function has a `#[rustc_promotable]` attribute
pub promotable: bool,
- /// whether the function has a `#[rustc_allow_const_fn_ptr]` attribute
- pub allow_const_fn_ptr: bool,
}
/// The available stability levels.
let mut stab: Option<Stability> = None;
let mut const_stab: Option<ConstStability> = None;
let mut promotable = false;
- let mut allow_const_fn_ptr = false;
let diagnostic = &sess.parse_sess.span_diagnostic;
'outer: for attr in attrs_iter {
sym::unstable,
sym::stable,
sym::rustc_promotable,
- sym::rustc_allow_const_fn_ptr,
]
.iter()
.any(|&s| attr.has_name(s))
if attr.has_name(sym::rustc_promotable) {
promotable = true;
}
- if attr.has_name(sym::rustc_allow_const_fn_ptr) {
- allow_const_fn_ptr = true;
- }
// attributes with data
else if let Some(MetaItem { kind: MetaItemKind::List(ref metas), .. }) = meta {
let meta = meta.as_ref().unwrap();
if sym::unstable == meta_name {
stab = Some(Stability { level, feature });
} else {
- const_stab = Some(ConstStability {
- level,
- feature,
- promotable: false,
- allow_const_fn_ptr: false,
- });
+ const_stab =
+ Some(ConstStability { level, feature, promotable: false });
}
}
(None, _, _) => {
if sym::stable == meta_name {
stab = Some(Stability { level, feature });
} else {
- const_stab = Some(ConstStability {
- level,
- feature,
- promotable: false,
- allow_const_fn_ptr: false,
- });
+ const_stab =
+ Some(ConstStability { level, feature, promotable: false });
}
}
(None, _) => {
}
// 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 {
stab.promotable = promotable;
- stab.allow_const_fn_ptr = allow_const_fn_ptr;
} else {
struct_span_err!(
diagnostic,
item_sp,
E0717,
- "rustc_promotable and rustc_allow_const_fn_ptr attributes \
- must be paired with either a rustc_const_unstable or a rustc_const_stable \
- attribute"
+ "`rustc_promotable` attribute must be paired with either a `rustc_const_unstable` \
+ or a `rustc_const_stable` attribute"
)
.emit();
}
// ==========================================================================
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),
// ==========================================================================
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 { ... }`).
query is_foreign_item(key: DefId) -> bool {
desc { |tcx| "checking if `{}` is a foreign item", tcx.def_path_str(key) }
}
}
-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) {
*providers = Providers {
is_const_fn_raw,
is_const_impl_raw: |tcx, def_id| is_const_impl_raw(tcx, def_id.expect_local()),
is_promotable_const_fn,
- const_fn_is_allowed_fn_ptr,
..*providers
};
}
/// associated task.
#[rustc_promotable]
#[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")]
#[cfg_attr(not(bootstrap), allow_internal_unstable(const_fn_fn_ptr_basics))]
+ #[cfg_attr(bootstrap, rustc_allow_const_fn_ptr)]
pub const fn new(
clone: unsafe fn(*const ()) -> RawWaker,
wake: unsafe fn(*const ()),