stabilize const_fn_floating_point_arithmetic
This commit is contained in:
parent
a32d4a0e82
commit
ebfa3e3f62
@ -575,10 +575,8 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
|
||||
|
||||
Rvalue::UnaryOp(_, operand) => {
|
||||
let ty = operand.ty(self.body, self.tcx);
|
||||
if is_int_bool_or_char(ty) {
|
||||
// Int, bool, and char operations are fine.
|
||||
} else if ty.is_floating_point() {
|
||||
self.check_op(ops::FloatingPointOp);
|
||||
if is_int_bool_float_or_char(ty) {
|
||||
// Int, bool, float, and char operations are fine.
|
||||
} else {
|
||||
span_bug!(self.span, "non-primitive type in `Rvalue::UnaryOp`: {:?}", ty);
|
||||
}
|
||||
@ -588,8 +586,8 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
|
||||
let lhs_ty = lhs.ty(self.body, self.tcx);
|
||||
let rhs_ty = rhs.ty(self.body, self.tcx);
|
||||
|
||||
if is_int_bool_or_char(lhs_ty) && is_int_bool_or_char(rhs_ty) {
|
||||
// Int, bool, and char operations are fine.
|
||||
if is_int_bool_float_or_char(lhs_ty) && is_int_bool_float_or_char(rhs_ty) {
|
||||
// Int, bool, float, and char operations are fine.
|
||||
} else if lhs_ty.is_fn_ptr() || lhs_ty.is_unsafe_ptr() {
|
||||
assert_matches!(
|
||||
op,
|
||||
@ -603,8 +601,6 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
|
||||
);
|
||||
|
||||
self.check_op(ops::RawPtrComparison);
|
||||
} else if lhs_ty.is_floating_point() || rhs_ty.is_floating_point() {
|
||||
self.check_op(ops::FloatingPointOp);
|
||||
} else {
|
||||
span_bug!(
|
||||
self.span,
|
||||
@ -1009,8 +1005,8 @@ fn place_as_reborrow<'tcx>(
|
||||
}
|
||||
}
|
||||
|
||||
fn is_int_bool_or_char(ty: Ty<'_>) -> bool {
|
||||
ty.is_bool() || ty.is_integral() || ty.is_char()
|
||||
fn is_int_bool_float_or_char(ty: Ty<'_>) -> bool {
|
||||
ty.is_bool() || ty.is_integral() || ty.is_char() || ty.is_floating_point()
|
||||
}
|
||||
|
||||
fn emit_unstable_in_stable_error(ccx: &ConstCx<'_, '_>, span: Span, gate: Symbol) {
|
||||
|
@ -55,28 +55,6 @@ pub trait NonConstOp<'tcx>: std::fmt::Debug {
|
||||
fn build_error(&self, ccx: &ConstCx<'_, 'tcx>, span: Span) -> Diag<'tcx>;
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct FloatingPointOp;
|
||||
impl<'tcx> NonConstOp<'tcx> for FloatingPointOp {
|
||||
fn status_in_item(&self, ccx: &ConstCx<'_, 'tcx>) -> Status {
|
||||
if ccx.const_kind() == hir::ConstContext::ConstFn {
|
||||
Status::Unstable(sym::const_fn_floating_point_arithmetic)
|
||||
} else {
|
||||
Status::Allowed
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(rustc::untranslatable_diagnostic)] // FIXME: make this translatable
|
||||
fn build_error(&self, ccx: &ConstCx<'_, 'tcx>, span: Span) -> Diag<'tcx> {
|
||||
feature_err(
|
||||
&ccx.tcx.sess,
|
||||
sym::const_fn_floating_point_arithmetic,
|
||||
span,
|
||||
format!("floating point arithmetic is not allowed in {}s", ccx.const_kind()),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/// A function call where the callee is a pointer.
|
||||
#[derive(Debug)]
|
||||
pub struct FnCallIndirect;
|
||||
@ -440,22 +418,12 @@ impl<'tcx> NonConstOp<'tcx> for CellBorrow {
|
||||
DiagImportance::Secondary
|
||||
}
|
||||
fn build_error(&self, ccx: &ConstCx<'_, 'tcx>, span: Span) -> Diag<'tcx> {
|
||||
// FIXME: Maybe a more elegant solution to this if else case
|
||||
if let hir::ConstContext::Static(_) = ccx.const_kind() {
|
||||
ccx.dcx().create_err(errors::InteriorMutableDataRefer {
|
||||
span,
|
||||
opt_help: true,
|
||||
kind: ccx.const_kind(),
|
||||
teach: ccx.tcx.sess.teach(E0492),
|
||||
})
|
||||
} else {
|
||||
ccx.dcx().create_err(errors::InteriorMutableDataRefer {
|
||||
span,
|
||||
opt_help: false,
|
||||
kind: ccx.const_kind(),
|
||||
teach: ccx.tcx.sess.teach(E0492),
|
||||
})
|
||||
}
|
||||
ccx.dcx().create_err(errors::InteriorMutableDataRefer {
|
||||
span,
|
||||
opt_help: matches!(ccx.const_kind(), hir::ConstContext::Static(_)),
|
||||
kind: ccx.const_kind(),
|
||||
teach: ccx.tcx.sess.teach(E0492),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -115,6 +115,8 @@ declare_features! (
|
||||
(accepted, conservative_impl_trait, "1.26.0", Some(34511)),
|
||||
/// Allows calling constructor functions in `const fn`.
|
||||
(accepted, const_constructor, "1.40.0", Some(61456)),
|
||||
/// Allows basic arithmetic on floating point types in a `const fn`.
|
||||
(accepted, const_fn_floating_point_arithmetic, "CURRENT_RUSTC_VERSION", Some(57241)),
|
||||
/// Allows using and casting function pointers in a `const fn`.
|
||||
(accepted, const_fn_fn_ptr_basics, "1.61.0", Some(57563)),
|
||||
/// Allows trait bounds in `const fn`.
|
||||
|
@ -400,8 +400,6 @@ declare_features! (
|
||||
(incomplete, const_closures, "1.68.0", Some(106003)),
|
||||
/// Allows the definition of `const extern fn` and `const unsafe extern fn`.
|
||||
(unstable, const_extern_fn, "1.40.0", Some(64926)),
|
||||
/// Allows basic arithmetic on floating point types in a `const fn`.
|
||||
(unstable, const_fn_floating_point_arithmetic, "1.48.0", Some(57241)),
|
||||
/// Allows `for _ in _` loops in const contexts.
|
||||
(unstable, const_for, "1.56.0", Some(87575)),
|
||||
/// Allows using `&mut` in constant functions.
|
||||
|
@ -194,6 +194,7 @@
|
||||
// Language features:
|
||||
// tidy-alphabetical-start
|
||||
#![cfg_attr(bootstrap, feature(asm_const))]
|
||||
#![cfg_attr(bootstrap, feature(const_fn_floating_point_arithmetic))]
|
||||
#![cfg_attr(bootstrap, feature(min_exhaustive_patterns))]
|
||||
#![feature(abi_unadjusted)]
|
||||
#![feature(adt_const_params)]
|
||||
@ -203,7 +204,6 @@
|
||||
#![feature(cfg_sanitize)]
|
||||
#![feature(cfg_target_has_atomic)]
|
||||
#![feature(cfg_target_has_atomic_equal_alignment)]
|
||||
#![feature(const_fn_floating_point_arithmetic)]
|
||||
#![feature(const_for)]
|
||||
#![feature(const_mut_refs)]
|
||||
#![feature(const_precise_live_drops)]
|
||||
|
@ -1,4 +1,3 @@
|
||||
#![feature(const_fn_floating_point_arithmetic)]
|
||||
#![warn(clippy::suboptimal_flops)]
|
||||
|
||||
/// Allow suboptimal ops in constant context
|
||||
|
@ -1,4 +1,3 @@
|
||||
#![feature(const_fn_floating_point_arithmetic)]
|
||||
#![warn(clippy::suboptimal_flops)]
|
||||
|
||||
/// Allow suboptimal ops in constant context
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: manual implementation of `abs` method
|
||||
--> tests/ui/floating_point_abs.rs:15:5
|
||||
--> tests/ui/floating_point_abs.rs:14:5
|
||||
|
|
||||
LL | if num >= 0.0 { num } else { -num }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `num.abs()`
|
||||
@ -8,43 +8,43 @@ LL | if num >= 0.0 { num } else { -num }
|
||||
= help: to override `-D warnings` add `#[allow(clippy::suboptimal_flops)]`
|
||||
|
||||
error: manual implementation of `abs` method
|
||||
--> tests/ui/floating_point_abs.rs:19:5
|
||||
--> tests/ui/floating_point_abs.rs:18:5
|
||||
|
|
||||
LL | if 0.0 < num { num } else { -num }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `num.abs()`
|
||||
|
||||
error: manual implementation of `abs` method
|
||||
--> tests/ui/floating_point_abs.rs:23:5
|
||||
--> tests/ui/floating_point_abs.rs:22:5
|
||||
|
|
||||
LL | if a.a > 0.0 { a.a } else { -a.a }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `a.a.abs()`
|
||||
|
||||
error: manual implementation of `abs` method
|
||||
--> tests/ui/floating_point_abs.rs:27:5
|
||||
--> tests/ui/floating_point_abs.rs:26:5
|
||||
|
|
||||
LL | if 0.0 >= num { -num } else { num }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `num.abs()`
|
||||
|
||||
error: manual implementation of `abs` method
|
||||
--> tests/ui/floating_point_abs.rs:31:5
|
||||
--> tests/ui/floating_point_abs.rs:30:5
|
||||
|
|
||||
LL | if a.a < 0.0 { -a.a } else { a.a }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `a.a.abs()`
|
||||
|
||||
error: manual implementation of negation of `abs` method
|
||||
--> tests/ui/floating_point_abs.rs:35:5
|
||||
--> tests/ui/floating_point_abs.rs:34:5
|
||||
|
|
||||
LL | if num < 0.0 { num } else { -num }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `-num.abs()`
|
||||
|
||||
error: manual implementation of negation of `abs` method
|
||||
--> tests/ui/floating_point_abs.rs:39:5
|
||||
--> tests/ui/floating_point_abs.rs:38:5
|
||||
|
|
||||
LL | if 0.0 >= num { num } else { -num }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `-num.abs()`
|
||||
|
||||
error: manual implementation of negation of `abs` method
|
||||
--> tests/ui/floating_point_abs.rs:44:12
|
||||
--> tests/ui/floating_point_abs.rs:43:12
|
||||
|
|
||||
LL | a: if a.a >= 0.0 { -a.a } else { a.a },
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `-a.a.abs()`
|
||||
|
@ -1,4 +1,3 @@
|
||||
#![feature(const_fn_floating_point_arithmetic)]
|
||||
#![warn(clippy::suboptimal_flops)]
|
||||
|
||||
/// Allow suboptimal_ops in constant context
|
||||
|
@ -1,4 +1,3 @@
|
||||
#![feature(const_fn_floating_point_arithmetic)]
|
||||
#![warn(clippy::suboptimal_flops)]
|
||||
|
||||
/// Allow suboptimal_ops in constant context
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: multiply and add expressions can be calculated more efficiently and accurately
|
||||
--> tests/ui/floating_point_mul_add.rs:20:13
|
||||
--> tests/ui/floating_point_mul_add.rs:19:13
|
||||
|
|
||||
LL | let _ = a * b + c;
|
||||
| ^^^^^^^^^ help: consider using: `a.mul_add(b, c)`
|
||||
@ -8,73 +8,73 @@ LL | let _ = a * b + c;
|
||||
= help: to override `-D warnings` add `#[allow(clippy::suboptimal_flops)]`
|
||||
|
||||
error: multiply and add expressions can be calculated more efficiently and accurately
|
||||
--> tests/ui/floating_point_mul_add.rs:21:13
|
||||
--> tests/ui/floating_point_mul_add.rs:20:13
|
||||
|
|
||||
LL | let _ = a * b - c;
|
||||
| ^^^^^^^^^ help: consider using: `a.mul_add(b, -c)`
|
||||
|
||||
error: multiply and add expressions can be calculated more efficiently and accurately
|
||||
--> tests/ui/floating_point_mul_add.rs:22:13
|
||||
--> tests/ui/floating_point_mul_add.rs:21:13
|
||||
|
|
||||
LL | let _ = c + a * b;
|
||||
| ^^^^^^^^^ help: consider using: `a.mul_add(b, c)`
|
||||
|
||||
error: multiply and add expressions can be calculated more efficiently and accurately
|
||||
--> tests/ui/floating_point_mul_add.rs:23:13
|
||||
--> tests/ui/floating_point_mul_add.rs:22:13
|
||||
|
|
||||
LL | let _ = c - a * b;
|
||||
| ^^^^^^^^^ help: consider using: `a.mul_add(-b, c)`
|
||||
|
||||
error: multiply and add expressions can be calculated more efficiently and accurately
|
||||
--> tests/ui/floating_point_mul_add.rs:24:13
|
||||
--> tests/ui/floating_point_mul_add.rs:23:13
|
||||
|
|
||||
LL | let _ = a + 2.0 * 4.0;
|
||||
| ^^^^^^^^^^^^^ help: consider using: `2.0f64.mul_add(4.0, a)`
|
||||
|
||||
error: multiply and add expressions can be calculated more efficiently and accurately
|
||||
--> tests/ui/floating_point_mul_add.rs:25:13
|
||||
--> tests/ui/floating_point_mul_add.rs:24:13
|
||||
|
|
||||
LL | let _ = a + 2. * 4.;
|
||||
| ^^^^^^^^^^^ help: consider using: `2.0f64.mul_add(4., a)`
|
||||
|
||||
error: multiply and add expressions can be calculated more efficiently and accurately
|
||||
--> tests/ui/floating_point_mul_add.rs:27:13
|
||||
--> tests/ui/floating_point_mul_add.rs:26:13
|
||||
|
|
||||
LL | let _ = (a * b) + c;
|
||||
| ^^^^^^^^^^^ help: consider using: `a.mul_add(b, c)`
|
||||
|
||||
error: multiply and add expressions can be calculated more efficiently and accurately
|
||||
--> tests/ui/floating_point_mul_add.rs:28:13
|
||||
--> tests/ui/floating_point_mul_add.rs:27:13
|
||||
|
|
||||
LL | let _ = c + (a * b);
|
||||
| ^^^^^^^^^^^ help: consider using: `a.mul_add(b, c)`
|
||||
|
||||
error: multiply and add expressions can be calculated more efficiently and accurately
|
||||
--> tests/ui/floating_point_mul_add.rs:29:13
|
||||
--> tests/ui/floating_point_mul_add.rs:28:13
|
||||
|
|
||||
LL | let _ = a * b * c + d;
|
||||
| ^^^^^^^^^^^^^ help: consider using: `(a * b).mul_add(c, d)`
|
||||
|
||||
error: multiply and add expressions can be calculated more efficiently and accurately
|
||||
--> tests/ui/floating_point_mul_add.rs:31:13
|
||||
--> tests/ui/floating_point_mul_add.rs:30:13
|
||||
|
|
||||
LL | let _ = a.mul_add(b, c) * a.mul_add(b, c) + a.mul_add(b, c) + c;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `a.mul_add(b, c).mul_add(a.mul_add(b, c), a.mul_add(b, c))`
|
||||
|
||||
error: multiply and add expressions can be calculated more efficiently and accurately
|
||||
--> tests/ui/floating_point_mul_add.rs:32:13
|
||||
--> tests/ui/floating_point_mul_add.rs:31:13
|
||||
|
|
||||
LL | let _ = 1234.567_f64 * 45.67834_f64 + 0.0004_f64;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `1234.567_f64.mul_add(45.67834_f64, 0.0004_f64)`
|
||||
|
||||
error: multiply and add expressions can be calculated more efficiently and accurately
|
||||
--> tests/ui/floating_point_mul_add.rs:34:13
|
||||
--> tests/ui/floating_point_mul_add.rs:33:13
|
||||
|
|
||||
LL | let _ = (a * a + b).sqrt();
|
||||
| ^^^^^^^^^^^ help: consider using: `a.mul_add(a, b)`
|
||||
|
||||
error: multiply and add expressions can be calculated more efficiently and accurately
|
||||
--> tests/ui/floating_point_mul_add.rs:37:13
|
||||
--> tests/ui/floating_point_mul_add.rs:36:13
|
||||
|
|
||||
LL | let _ = a - (b * u as f64);
|
||||
| ^^^^^^^^^^^^^^^^^^ help: consider using: `b.mul_add(-(u as f64), a)`
|
||||
|
@ -1,4 +1,3 @@
|
||||
#![feature(const_fn_floating_point_arithmetic)]
|
||||
#![warn(clippy::suboptimal_flops)]
|
||||
|
||||
/// Allow suboptimal_flops in constant context
|
||||
|
@ -1,4 +1,3 @@
|
||||
#![feature(const_fn_floating_point_arithmetic)]
|
||||
#![warn(clippy::suboptimal_flops)]
|
||||
|
||||
/// Allow suboptimal_flops in constant context
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: conversion to radians can be done more accurately
|
||||
--> tests/ui/floating_point_rad.rs:11:13
|
||||
--> tests/ui/floating_point_rad.rs:10:13
|
||||
|
|
||||
LL | let _ = degrees as f64 * std::f64::consts::PI / 180.0;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `(degrees as f64).to_radians()`
|
||||
@ -8,43 +8,43 @@ LL | let _ = degrees as f64 * std::f64::consts::PI / 180.0;
|
||||
= help: to override `-D warnings` add `#[allow(clippy::suboptimal_flops)]`
|
||||
|
||||
error: conversion to degrees can be done more accurately
|
||||
--> tests/ui/floating_point_rad.rs:12:13
|
||||
--> tests/ui/floating_point_rad.rs:11:13
|
||||
|
|
||||
LL | let _ = degrees as f64 * 180.0 / std::f64::consts::PI;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `(degrees as f64).to_degrees()`
|
||||
|
||||
error: conversion to degrees can be done more accurately
|
||||
--> tests/ui/floating_point_rad.rs:17:13
|
||||
--> tests/ui/floating_point_rad.rs:16:13
|
||||
|
|
||||
LL | let _ = x * 180f32 / std::f32::consts::PI;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `x.to_degrees()`
|
||||
|
||||
error: conversion to degrees can be done more accurately
|
||||
--> tests/ui/floating_point_rad.rs:18:13
|
||||
--> tests/ui/floating_point_rad.rs:17:13
|
||||
|
|
||||
LL | let _ = 90. * 180f64 / std::f64::consts::PI;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `90.0_f64.to_degrees()`
|
||||
|
||||
error: conversion to degrees can be done more accurately
|
||||
--> tests/ui/floating_point_rad.rs:19:13
|
||||
--> tests/ui/floating_point_rad.rs:18:13
|
||||
|
|
||||
LL | let _ = 90.5 * 180f64 / std::f64::consts::PI;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `90.5_f64.to_degrees()`
|
||||
|
||||
error: conversion to radians can be done more accurately
|
||||
--> tests/ui/floating_point_rad.rs:20:13
|
||||
--> tests/ui/floating_point_rad.rs:19:13
|
||||
|
|
||||
LL | let _ = x * std::f32::consts::PI / 180f32;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `x.to_radians()`
|
||||
|
||||
error: conversion to radians can be done more accurately
|
||||
--> tests/ui/floating_point_rad.rs:21:13
|
||||
--> tests/ui/floating_point_rad.rs:20:13
|
||||
|
|
||||
LL | let _ = 90. * std::f32::consts::PI / 180f32;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `90.0_f64.to_radians()`
|
||||
|
||||
error: conversion to radians can be done more accurately
|
||||
--> tests/ui/floating_point_rad.rs:22:13
|
||||
--> tests/ui/floating_point_rad.rs:21:13
|
||||
|
|
||||
LL | let _ = 90.5 * std::f32::consts::PI / 180f32;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `90.5_f64.to_radians()`
|
||||
|
@ -1,9 +1,5 @@
|
||||
#![feature(const_extern_fn)]
|
||||
|
||||
const extern "C" fn unsize(x: &[u8; 3]) -> &[u8] { x }
|
||||
const unsafe extern "C" fn closure() -> fn() { || {} }
|
||||
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; }
|
||||
//~^ ERROR pointers cannot be cast to integers
|
||||
|
||||
|
@ -1,15 +1,5 @@
|
||||
error[E0658]: floating point arithmetic is not allowed in constant functions
|
||||
--> $DIR/const-extern-fn-min-const-fn.rs:5:42
|
||||
|
|
||||
LL | const unsafe extern "C" fn use_float() { 1.0 + 1.0; }
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: see issue #57241 <https://github.com/rust-lang/rust/issues/57241> for more information
|
||||
= help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
|
||||
error: pointers cannot be cast to integers during const eval
|
||||
--> $DIR/const-extern-fn-min-const-fn.rs:7:48
|
||||
--> $DIR/const-extern-fn-min-const-fn.rs:3:48
|
||||
|
|
||||
LL | const extern "C" fn ptr_cast(val: *const u8) { val as usize; }
|
||||
| ^^^^^^^^^^^^
|
||||
@ -17,6 +7,5 @@ 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 2 previous errors
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
@ -17,6 +17,19 @@ const unsafe extern "C" fn bar2(val: bool) -> bool {
|
||||
!val
|
||||
}
|
||||
|
||||
#[allow(improper_ctypes_definitions)]
|
||||
const extern "C" fn unsize(x: &[u8; 3]) -> &[u8] {
|
||||
x
|
||||
}
|
||||
|
||||
#[allow(improper_ctypes_definitions)]
|
||||
const unsafe extern "C" fn closure() -> fn() {
|
||||
|| {}
|
||||
}
|
||||
|
||||
const unsafe extern "C" fn use_float() -> f32 {
|
||||
1.0 + 1.0
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let a: [u8; foo1(25) as usize] = [0; 26];
|
||||
@ -32,4 +45,8 @@ fn main() {
|
||||
let _foo2_cast: extern "C" fn(u8) -> u8 = foo2;
|
||||
let _bar1_cast: unsafe extern "C" fn(bool) -> bool = bar1;
|
||||
let _bar2_cast: unsafe extern "C" fn(bool) -> bool = bar2;
|
||||
|
||||
unsize(&[0, 1, 2]);
|
||||
unsafe { closure(); }
|
||||
unsafe { use_float(); }
|
||||
}
|
||||
|
@ -1,8 +0,0 @@
|
||||
error: fatal error triggered by #[rustc_error]
|
||||
--> $DIR/const_fn_floating_point_arithmetic.rs:20:1
|
||||
|
|
||||
LL | fn main() {}
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
@ -1,20 +0,0 @@
|
||||
// gate-test-const_fn_floating_point_arithmetic
|
||||
|
||||
//@ revisions: stock gated
|
||||
|
||||
#![feature(rustc_attrs)]
|
||||
#![cfg_attr(gated, feature(const_fn_floating_point_arithmetic))]
|
||||
|
||||
const fn add(f: f32) -> f32 { f + 2.0 }
|
||||
//[stock]~^ floating point arithmetic
|
||||
const fn sub(f: f32) -> f32 { 2.0 - f }
|
||||
//[stock]~^ floating point arithmetic
|
||||
const fn mul(f: f32, g: f32) -> f32 { f * g }
|
||||
//[stock]~^ floating point arithmetic
|
||||
const fn div(f: f32, g: f32) -> f32 { f / g }
|
||||
//[stock]~^ floating point arithmetic
|
||||
const fn neg(f: f32) -> f32 { -f }
|
||||
//[stock]~^ floating point arithmetic
|
||||
|
||||
#[rustc_error]
|
||||
fn main() {} //[gated]~ fatal error triggered by #[rustc_error]
|
@ -1,53 +0,0 @@
|
||||
error[E0658]: floating point arithmetic is not allowed in constant functions
|
||||
--> $DIR/const_fn_floating_point_arithmetic.rs:8:31
|
||||
|
|
||||
LL | const fn add(f: f32) -> f32 { f + 2.0 }
|
||||
| ^^^^^^^
|
||||
|
|
||||
= note: see issue #57241 <https://github.com/rust-lang/rust/issues/57241> for more information
|
||||
= help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
|
||||
error[E0658]: floating point arithmetic is not allowed in constant functions
|
||||
--> $DIR/const_fn_floating_point_arithmetic.rs:10:31
|
||||
|
|
||||
LL | const fn sub(f: f32) -> f32 { 2.0 - f }
|
||||
| ^^^^^^^
|
||||
|
|
||||
= note: see issue #57241 <https://github.com/rust-lang/rust/issues/57241> for more information
|
||||
= help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
|
||||
error[E0658]: floating point arithmetic is not allowed in constant functions
|
||||
--> $DIR/const_fn_floating_point_arithmetic.rs:12:39
|
||||
|
|
||||
LL | const fn mul(f: f32, g: f32) -> f32 { f * g }
|
||||
| ^^^^^
|
||||
|
|
||||
= note: see issue #57241 <https://github.com/rust-lang/rust/issues/57241> for more information
|
||||
= help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
|
||||
error[E0658]: floating point arithmetic is not allowed in constant functions
|
||||
--> $DIR/const_fn_floating_point_arithmetic.rs:14:39
|
||||
|
|
||||
LL | const fn div(f: f32, g: f32) -> f32 { f / g }
|
||||
| ^^^^^
|
||||
|
|
||||
= note: see issue #57241 <https://github.com/rust-lang/rust/issues/57241> for more information
|
||||
= help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
|
||||
error[E0658]: floating point arithmetic is not allowed in constant functions
|
||||
--> $DIR/const_fn_floating_point_arithmetic.rs:16:31
|
||||
|
|
||||
LL | const fn neg(f: f32) -> f32 { -f }
|
||||
| ^^
|
||||
|
|
||||
= note: see issue #57241 <https://github.com/rust-lang/rust/issues/57241> for more information
|
||||
= help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
@ -1,7 +1,5 @@
|
||||
//@ run-pass
|
||||
|
||||
#![feature(const_fn_floating_point_arithmetic)]
|
||||
|
||||
struct Foo<T>(T);
|
||||
struct Bar<T> { x: T }
|
||||
struct W(f32);
|
||||
|
@ -3,7 +3,7 @@
|
||||
we're apparently really bad at it",
|
||||
issue = "none")]
|
||||
|
||||
#![feature(const_fn_floating_point_arithmetic, foo, foo2)]
|
||||
#![feature(const_refs_to_cell, foo, foo2)]
|
||||
#![feature(staged_api)]
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
@ -25,9 +25,13 @@ const fn bar2() -> u32 { foo2() } //~ ERROR not yet stable as a const fn
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_stable(feature = "rust1", since = "1.0.0")]
|
||||
// Const-stable functions cannot rely on unstable const-eval features.
|
||||
const fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||
//~^ ERROR const-stable function cannot use `#[feature(const_fn_floating_point_arithmetic)]`
|
||||
// conformity is required
|
||||
const fn bar3() -> u32 {
|
||||
let x = std::cell::Cell::new(0u32);
|
||||
x.get()
|
||||
//~^ ERROR const-stable function cannot use `#[feature(const_refs_to_cell)]`
|
||||
//~| ERROR cannot call non-const fn
|
||||
}
|
||||
|
||||
// check whether this function cannot be called even with the feature gate active
|
||||
#[unstable(feature = "foo2", issue = "none")]
|
||||
|
@ -14,30 +14,39 @@ LL | const fn bar2() -> u32 { foo2() }
|
||||
|
|
||||
= help: const-stable functions can only call other const-stable functions
|
||||
|
||||
error: const-stable function cannot use `#[feature(const_fn_floating_point_arithmetic)]`
|
||||
--> $DIR/min_const_fn_libstd_stability.rs:29:26
|
||||
error: const-stable function cannot use `#[feature(const_refs_to_cell)]`
|
||||
--> $DIR/min_const_fn_libstd_stability.rs:31:5
|
||||
|
|
||||
LL | const fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||
| ^^^^^^^^^^^^^
|
||||
LL | x.get()
|
||||
| ^
|
||||
|
|
||||
help: if it is not part of the public API, make this function unstably const
|
||||
|
|
||||
LL + #[rustc_const_unstable(feature = "...", issue = "...")]
|
||||
LL | const fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||
LL | const fn bar3() -> u32 {
|
||||
|
|
||||
help: otherwise `#[rustc_allow_const_fn_unstable]` can be used to bypass stability checks
|
||||
|
|
||||
LL + #[rustc_allow_const_fn_unstable(const_fn_floating_point_arithmetic)]
|
||||
LL | const fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||
LL + #[rustc_allow_const_fn_unstable(const_refs_to_cell)]
|
||||
LL | const fn bar3() -> u32 {
|
||||
|
|
||||
|
||||
error[E0015]: cannot call non-const fn `Cell::<u32>::get` in constant functions
|
||||
--> $DIR/min_const_fn_libstd_stability.rs:31:7
|
||||
|
|
||||
LL | x.get()
|
||||
| ^^^^^
|
||||
|
|
||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||
|
||||
error: `foo2_gated` is not yet stable as a const fn
|
||||
--> $DIR/min_const_fn_libstd_stability.rs:39:32
|
||||
--> $DIR/min_const_fn_libstd_stability.rs:43:32
|
||||
|
|
||||
LL | const fn bar2_gated() -> u32 { foo2_gated() }
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= help: const-stable functions can only call other const-stable functions
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0015`.
|
||||
|
@ -3,7 +3,7 @@
|
||||
we're apparently really bad at it",
|
||||
issue = "none")]
|
||||
|
||||
#![feature(const_fn_floating_point_arithmetic, foo, foo2)]
|
||||
#![feature(const_refs_to_cell, foo, foo2)]
|
||||
#![feature(staged_api)]
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
@ -23,12 +23,6 @@ const unsafe fn foo2() -> u32 { 42 }
|
||||
// can't call non-min_const_fn
|
||||
const unsafe fn bar2() -> u32 { unsafe { foo2() } } //~ ERROR not yet stable as a const fn
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_stable(feature = "rust1", since = "1.0.0")]
|
||||
// conformity is required
|
||||
const unsafe fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||
//~^ ERROR const-stable function cannot use `#[feature(const_fn_floating_point_arithmetic)]`
|
||||
|
||||
// check whether this function cannot be called even with the feature gate active
|
||||
#[unstable(feature = "foo2", issue = "none")]
|
||||
const unsafe fn foo2_gated() -> u32 { 42 }
|
||||
|
@ -14,30 +14,13 @@ LL | const unsafe fn bar2() -> u32 { unsafe { foo2() } }
|
||||
|
|
||||
= help: const-stable functions can only call other const-stable functions
|
||||
|
||||
error: const-stable function cannot use `#[feature(const_fn_floating_point_arithmetic)]`
|
||||
--> $DIR/min_const_unsafe_fn_libstd_stability.rs:29:33
|
||||
|
|
||||
LL | const unsafe fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
help: if it is not part of the public API, make this function unstably const
|
||||
|
|
||||
LL + #[rustc_const_unstable(feature = "...", issue = "...")]
|
||||
LL | const unsafe fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||
|
|
||||
help: otherwise `#[rustc_allow_const_fn_unstable]` can be used to bypass stability checks
|
||||
|
|
||||
LL + #[rustc_allow_const_fn_unstable(const_fn_floating_point_arithmetic)]
|
||||
LL | const unsafe fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||
|
|
||||
|
||||
error: `foo2_gated` is not yet stable as a const fn
|
||||
--> $DIR/min_const_unsafe_fn_libstd_stability.rs:39:48
|
||||
--> $DIR/min_const_unsafe_fn_libstd_stability.rs:33:48
|
||||
|
|
||||
LL | const unsafe fn bar2_gated() -> u32 { unsafe { foo2_gated() } }
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= help: const-stable functions can only call other const-stable functions
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
@ -1,13 +0,0 @@
|
||||
// Don't allow unstable features in stable functions without `allow_internal_unstable`.
|
||||
|
||||
#![stable(feature = "rust1", since = "1.0.0")]
|
||||
#![feature(staged_api)]
|
||||
#![feature(const_fn_floating_point_arithmetic)]
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_stable(feature = "rust1", since = "1.0.0")]
|
||||
pub const fn foo() -> f32 {
|
||||
1.0 + 1.0 //~ ERROR const-stable function cannot use `#[feature(const_fn_floating_point_arithmetic)]`
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -1,19 +0,0 @@
|
||||
error: const-stable function cannot use `#[feature(const_fn_floating_point_arithmetic)]`
|
||||
--> $DIR/internal-unstable-const.rs:10:5
|
||||
|
|
||||
LL | 1.0 + 1.0
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
help: if it is not part of the public API, make this function unstably const
|
||||
|
|
||||
LL + #[rustc_const_unstable(feature = "...", issue = "...")]
|
||||
LL | pub const fn foo() -> f32 {
|
||||
|
|
||||
help: otherwise `#[rustc_allow_const_fn_unstable]` can be used to bypass stability checks
|
||||
|
|
||||
LL + #[rustc_allow_const_fn_unstable(const_fn_floating_point_arithmetic)]
|
||||
LL | pub const fn foo() -> f32 {
|
||||
|
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
Loading…
x
Reference in New Issue
Block a user