Rollup merge of #77122 - ecstatic-morse:const-fn-arithmetic, r=RalfJung,oli-obk
Add `#![feature(const_fn_floating_point_arithmetic)]` cc #76618 This is a template for splitting up `const_fn` into granular feature gates. I think this will make it easier, both for us and for users, to track stabilization of each individual feature. We don't *have* to do this, however. We could also keep stabilizing things out from under `const_fn`. cc @rust-lang/wg-const-eval r? @oli-obk
This commit is contained in:
commit
3b544e73ae
|
@ -584,6 +584,9 @@ declare_features! (
|
||||||
/// Allows non trivial generic constants which have to be manually propageted upwards.
|
/// Allows non trivial generic constants which have to be manually propageted upwards.
|
||||||
(active, const_evaluatable_checked, "1.48.0", Some(76560), None),
|
(active, const_evaluatable_checked, "1.48.0", Some(76560), None),
|
||||||
|
|
||||||
|
/// Allows basic arithmetic on floating point types in a `const fn`.
|
||||||
|
(active, const_fn_floating_point_arithmetic, "1.48.0", Some(57241), None),
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// feature-group-end: actual feature gates
|
// feature-group-end: actual feature gates
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
|
|
|
@ -112,6 +112,30 @@ impl NonConstOp for Abort {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct FloatingPointOp;
|
||||||
|
impl NonConstOp for FloatingPointOp {
|
||||||
|
const STOPS_CONST_CHECKING: bool = true;
|
||||||
|
|
||||||
|
fn status_in_item(&self, ccx: &ConstCx<'_, '_>) -> Status {
|
||||||
|
if ccx.const_kind() == hir::ConstContext::ConstFn {
|
||||||
|
Status::Unstable(sym::const_fn_floating_point_arithmetic)
|
||||||
|
} else {
|
||||||
|
Status::Allowed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn emit_error(&self, ccx: &ConstCx<'_, '_>, span: Span) {
|
||||||
|
feature_err(
|
||||||
|
&ccx.tcx.sess.parse_sess,
|
||||||
|
sym::const_fn_floating_point_arithmetic,
|
||||||
|
span,
|
||||||
|
&format!("floating point arithmetic is not allowed in {}s", ccx.const_kind()),
|
||||||
|
)
|
||||||
|
.emit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct NonPrimitiveOp;
|
pub struct NonPrimitiveOp;
|
||||||
impl NonConstOp for NonPrimitiveOp {
|
impl NonConstOp for NonPrimitiveOp {
|
||||||
|
|
|
@ -540,8 +540,12 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> {
|
||||||
|
|
||||||
Rvalue::UnaryOp(_, ref operand) => {
|
Rvalue::UnaryOp(_, ref operand) => {
|
||||||
let ty = operand.ty(self.body, self.tcx);
|
let ty = operand.ty(self.body, self.tcx);
|
||||||
if !(ty.is_integral() || ty.is_bool()) {
|
if is_int_bool_or_char(ty) {
|
||||||
self.check_op(ops::NonPrimitiveOp)
|
// Int, bool, and char operations are fine.
|
||||||
|
} else if ty.is_floating_point() {
|
||||||
|
self.check_op(ops::FloatingPointOp);
|
||||||
|
} else {
|
||||||
|
span_bug!(self.span, "non-primitive type in `Rvalue::UnaryOp`: {:?}", ty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -550,7 +554,9 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> {
|
||||||
let lhs_ty = lhs.ty(self.body, self.tcx);
|
let lhs_ty = lhs.ty(self.body, self.tcx);
|
||||||
let rhs_ty = rhs.ty(self.body, self.tcx);
|
let rhs_ty = rhs.ty(self.body, self.tcx);
|
||||||
|
|
||||||
if let ty::RawPtr(_) | ty::FnPtr(..) = lhs_ty.kind() {
|
if is_int_bool_or_char(lhs_ty) && is_int_bool_or_char(rhs_ty) {
|
||||||
|
// Int, bool, and char operations are fine.
|
||||||
|
} else if lhs_ty.is_fn_ptr() || lhs_ty.is_unsafe_ptr() {
|
||||||
assert_eq!(lhs_ty, rhs_ty);
|
assert_eq!(lhs_ty, rhs_ty);
|
||||||
assert!(
|
assert!(
|
||||||
op == BinOp::Eq
|
op == BinOp::Eq
|
||||||
|
@ -563,12 +569,15 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> {
|
||||||
);
|
);
|
||||||
|
|
||||||
self.check_op(ops::RawPtrComparison);
|
self.check_op(ops::RawPtrComparison);
|
||||||
}
|
} else if lhs_ty.is_floating_point() || rhs_ty.is_floating_point() {
|
||||||
|
self.check_op(ops::FloatingPointOp);
|
||||||
if !(lhs_ty.is_integral() || lhs_ty.is_bool() || lhs_ty.is_char())
|
} else {
|
||||||
|| !(rhs_ty.is_integral() || rhs_ty.is_bool() || rhs_ty.is_char())
|
span_bug!(
|
||||||
{
|
self.span,
|
||||||
self.check_op(ops::NonPrimitiveOp)
|
"non-primitive type in `Rvalue::BinaryOp`: {:?} ⚬ {:?}",
|
||||||
|
lhs_ty,
|
||||||
|
rhs_ty
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -867,3 +876,7 @@ fn place_as_reborrow(
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_int_bool_or_char(ty: Ty<'_>) -> bool {
|
||||||
|
ty.is_bool() || ty.is_integral() || ty.is_char()
|
||||||
|
}
|
||||||
|
|
|
@ -352,6 +352,7 @@ symbols! {
|
||||||
const_evaluatable_checked,
|
const_evaluatable_checked,
|
||||||
const_extern_fn,
|
const_extern_fn,
|
||||||
const_fn,
|
const_fn,
|
||||||
|
const_fn_floating_point_arithmetic,
|
||||||
const_fn_transmute,
|
const_fn_transmute,
|
||||||
const_fn_union,
|
const_fn_union,
|
||||||
const_generics,
|
const_generics,
|
||||||
|
|
|
@ -82,6 +82,7 @@
|
||||||
#![feature(const_pin)]
|
#![feature(const_pin)]
|
||||||
#![feature(const_fn_union)]
|
#![feature(const_fn_union)]
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn)]
|
||||||
|
#![cfg_attr(not(bootstrap), feature(const_fn_floating_point_arithmetic))]
|
||||||
#![feature(const_generics)]
|
#![feature(const_generics)]
|
||||||
#![feature(const_option)]
|
#![feature(const_option)]
|
||||||
#![feature(const_precise_live_drops)]
|
#![feature(const_precise_live_drops)]
|
||||||
|
|
|
@ -236,6 +236,7 @@
|
||||||
#![feature(clamp)]
|
#![feature(clamp)]
|
||||||
#![feature(concat_idents)]
|
#![feature(concat_idents)]
|
||||||
#![feature(const_cstr_unchecked)]
|
#![feature(const_cstr_unchecked)]
|
||||||
|
#![cfg_attr(not(bootstrap), feature(const_fn_floating_point_arithmetic))]
|
||||||
#![feature(const_fn_transmute)]
|
#![feature(const_fn_transmute)]
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn)]
|
||||||
#![feature(const_ip)]
|
#![feature(const_ip)]
|
||||||
|
|
|
@ -4,7 +4,7 @@ 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 pointers in const fn are unstable
|
||||||
const unsafe extern fn use_float() { 1.0 + 1.0; }
|
const unsafe extern fn use_float() { 1.0 + 1.0; }
|
||||||
//~^ ERROR only int, `bool` and `char` operations are stable in const fn
|
//~^ 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; }
|
||||||
//~^ ERROR casting pointers to integers
|
//~^ ERROR casting pointers to integers
|
||||||
|
|
||||||
|
|
|
@ -7,14 +7,14 @@ 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)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: only int, `bool` and `char` operations are stable in const fn
|
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
|
||||||
|
|
|
|
||||||
LL | const unsafe extern fn use_float() { 1.0 + 1.0; }
|
LL | const unsafe extern fn use_float() { 1.0 + 1.0; }
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
= note: see issue #57241 <https://github.com/rust-lang/rust/issues/57241> for more information
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: casting pointers to integers in constant functions is unstable
|
error[E0658]: casting pointers to integers in constant functions is unstable
|
||||||
--> $DIR/const-extern-fn-min-const-fn.rs:8:48
|
--> $DIR/const-extern-fn-min-const-fn.rs:8:48
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
error: fatal error triggered by #[rustc_error]
|
||||||
|
--> $DIR/const_fn_floating_point_arithmetic.rs:20:1
|
||||||
|
|
|
||||||
|
LL | fn main() {}
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
// 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]
|
|
@ -0,0 +1,48 @@
|
||||||
|
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
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0658`.
|
|
@ -1,6 +1,6 @@
|
||||||
// build-pass (FIXME(62277): could be check-pass?)
|
// run-pass
|
||||||
|
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn_floating_point_arithmetic)]
|
||||||
|
|
||||||
struct Foo<T>(T);
|
struct Foo<T>(T);
|
||||||
struct Bar<T> { x: T }
|
struct Bar<T> { x: T }
|
||||||
|
|
|
@ -77,14 +77,6 @@ const fn foo11<T: std::fmt::Display>(t: T) -> T { t }
|
||||||
//~^ ERROR trait bounds other than `Sized` on const fn parameters are unstable
|
//~^ ERROR trait bounds other than `Sized` on const fn parameters are unstable
|
||||||
const fn foo11_2<T: Send>(t: T) -> T { t }
|
const fn foo11_2<T: Send>(t: T) -> T { t }
|
||||||
//~^ ERROR trait bounds other than `Sized` on const fn parameters are unstable
|
//~^ ERROR trait bounds other than `Sized` on const fn parameters are unstable
|
||||||
const fn foo19(f: f32) -> f32 { f * 2.0 }
|
|
||||||
//~^ ERROR int, `bool` and `char` operations
|
|
||||||
const fn foo19_2(f: f32) -> f32 { 2.0 - f }
|
|
||||||
//~^ ERROR int, `bool` and `char` operations
|
|
||||||
const fn foo19_3(f: f32) -> f32 { -f }
|
|
||||||
//~^ ERROR int, `bool` and `char` operations
|
|
||||||
const fn foo19_4(f: f32, g: f32) -> f32 { f / g }
|
|
||||||
//~^ ERROR int, `bool` and `char` operations
|
|
||||||
|
|
||||||
static BAR: u32 = 42;
|
static BAR: u32 = 42;
|
||||||
const fn foo25() -> u32 { BAR } //~ ERROR cannot refer to statics
|
const fn foo25() -> u32 { BAR } //~ ERROR cannot refer to statics
|
||||||
|
|
|
@ -76,44 +76,8 @@ LL | const fn foo11_2<T: Send>(t: T) -> T { 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)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: only int, `bool` and `char` operations are stable in const fn
|
|
||||||
--> $DIR/min_const_fn.rs:80:33
|
|
||||||
|
|
|
||||||
LL | const fn foo19(f: f32) -> f32 { f * 2.0 }
|
|
||||||
| ^^^^^^^
|
|
||||||
|
|
|
||||||
= 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
|
|
||||||
|
|
||||||
error[E0723]: only int, `bool` and `char` operations are stable in const fn
|
|
||||||
--> $DIR/min_const_fn.rs:82:35
|
|
||||||
|
|
|
||||||
LL | const fn foo19_2(f: f32) -> f32 { 2.0 - f }
|
|
||||||
| ^^^^^^^
|
|
||||||
|
|
|
||||||
= 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
|
|
||||||
|
|
||||||
error[E0723]: only int, `bool` and `char` operations are stable in const fn
|
|
||||||
--> $DIR/min_const_fn.rs:84:35
|
|
||||||
|
|
|
||||||
LL | const fn foo19_3(f: f32) -> f32 { -f }
|
|
||||||
| ^^
|
|
||||||
|
|
|
||||||
= 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
|
|
||||||
|
|
||||||
error[E0723]: only int, `bool` and `char` operations are stable in const fn
|
|
||||||
--> $DIR/min_const_fn.rs:86:43
|
|
||||||
|
|
|
||||||
LL | const fn foo19_4(f: f32, g: f32) -> f32 { f / g }
|
|
||||||
| ^^^^^
|
|
||||||
|
|
|
||||||
= 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
|
|
||||||
|
|
||||||
error[E0013]: constant functions cannot refer to statics
|
error[E0013]: constant functions cannot refer to statics
|
||||||
--> $DIR/min_const_fn.rs:90:27
|
--> $DIR/min_const_fn.rs:82:27
|
||||||
|
|
|
|
||||||
LL | const fn foo25() -> u32 { BAR }
|
LL | const fn foo25() -> u32 { BAR }
|
||||||
| ^^^
|
| ^^^
|
||||||
|
@ -121,7 +85,7 @@ LL | const fn foo25() -> u32 { BAR }
|
||||||
= help: consider extracting the value of the `static` to a `const`, and referring to that
|
= help: consider extracting the value of the `static` to a `const`, and referring to that
|
||||||
|
|
||||||
error[E0013]: constant functions cannot refer to statics
|
error[E0013]: constant functions cannot refer to statics
|
||||||
--> $DIR/min_const_fn.rs:91:37
|
--> $DIR/min_const_fn.rs:83:37
|
||||||
|
|
|
|
||||||
LL | const fn foo26() -> &'static u32 { &BAR }
|
LL | const fn foo26() -> &'static u32 { &BAR }
|
||||||
| ^^^
|
| ^^^
|
||||||
|
@ -129,7 +93,7 @@ LL | const fn foo26() -> &'static u32 { &BAR }
|
||||||
= help: consider extracting the value of the `static` to a `const`, and referring to that
|
= help: consider extracting the value of the `static` to a `const`, and referring to that
|
||||||
|
|
||||||
error[E0658]: casting pointers to integers in constant functions is unstable
|
error[E0658]: casting pointers to integers in constant functions is unstable
|
||||||
--> $DIR/min_const_fn.rs:92:42
|
--> $DIR/min_const_fn.rs:84:42
|
||||||
|
|
|
|
||||||
LL | const fn foo30(x: *const u32) -> usize { x as usize }
|
LL | const fn foo30(x: *const u32) -> usize { x as usize }
|
||||||
| ^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
|
@ -138,7 +102,7 @@ LL | const fn foo30(x: *const u32) -> usize { x as usize }
|
||||||
= help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable
|
= help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: casting pointers to integers in constant functions is unstable
|
error[E0658]: casting pointers to integers in constant functions is unstable
|
||||||
--> $DIR/min_const_fn.rs:94:63
|
--> $DIR/min_const_fn.rs:86:63
|
||||||
|
|
|
|
||||||
LL | const fn foo30_with_unsafe(x: *const u32) -> usize { unsafe { x as usize } }
|
LL | const fn foo30_with_unsafe(x: *const u32) -> usize { unsafe { x as usize } }
|
||||||
| ^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
|
@ -147,7 +111,7 @@ LL | const fn foo30_with_unsafe(x: *const u32) -> usize { unsafe { x as usize }
|
||||||
= help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable
|
= help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: casting pointers to integers in constant functions is unstable
|
error[E0658]: casting pointers to integers in constant functions is unstable
|
||||||
--> $DIR/min_const_fn.rs:96:42
|
--> $DIR/min_const_fn.rs:88:42
|
||||||
|
|
|
|
||||||
LL | const fn foo30_2(x: *mut u32) -> usize { x as usize }
|
LL | const fn foo30_2(x: *mut u32) -> usize { x as usize }
|
||||||
| ^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
|
@ -156,7 +120,7 @@ LL | const fn foo30_2(x: *mut u32) -> usize { x as usize }
|
||||||
= help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable
|
= help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: casting pointers to integers in constant functions is unstable
|
error[E0658]: casting pointers to integers in constant functions is unstable
|
||||||
--> $DIR/min_const_fn.rs:98:63
|
--> $DIR/min_const_fn.rs:90:63
|
||||||
|
|
|
|
||||||
LL | const fn foo30_2_with_unsafe(x: *mut u32) -> usize { unsafe { x as usize } }
|
LL | const fn foo30_2_with_unsafe(x: *mut u32) -> usize { unsafe { x as usize } }
|
||||||
| ^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
|
@ -165,7 +129,7 @@ LL | const fn foo30_2_with_unsafe(x: *mut u32) -> usize { unsafe { x as usize }
|
||||||
= help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable
|
= help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: mutable references are not allowed in constant functions
|
error[E0658]: mutable references are not allowed in constant functions
|
||||||
--> $DIR/min_const_fn.rs:101:14
|
--> $DIR/min_const_fn.rs:93:14
|
||||||
|
|
|
|
||||||
LL | const fn inc(x: &mut i32) { *x += 1 }
|
LL | const fn inc(x: &mut i32) { *x += 1 }
|
||||||
| ^
|
| ^
|
||||||
|
@ -174,7 +138,7 @@ LL | const fn inc(x: &mut i32) { *x += 1 }
|
||||||
= help: add `#![feature(const_mut_refs)]` to the crate attributes to enable
|
= help: add `#![feature(const_mut_refs)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||||
--> $DIR/min_const_fn.rs:110:6
|
--> $DIR/min_const_fn.rs:102:6
|
||||||
|
|
|
|
||||||
LL | impl<T: std::fmt::Debug> Foo<T> {
|
LL | impl<T: std::fmt::Debug> Foo<T> {
|
||||||
| ^
|
| ^
|
||||||
|
@ -183,7 +147,7 @@ LL | impl<T: std::fmt::Debug> Foo<T> {
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||||
--> $DIR/min_const_fn.rs:115:6
|
--> $DIR/min_const_fn.rs:107:6
|
||||||
|
|
|
|
||||||
LL | impl<T: std::fmt::Debug + Sized> Foo<T> {
|
LL | impl<T: std::fmt::Debug + Sized> Foo<T> {
|
||||||
| ^
|
| ^
|
||||||
|
@ -192,7 +156,7 @@ LL | impl<T: std::fmt::Debug + Sized> Foo<T> {
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||||
--> $DIR/min_const_fn.rs:120:6
|
--> $DIR/min_const_fn.rs:112:6
|
||||||
|
|
|
|
||||||
LL | impl<T: Sync + Sized> Foo<T> {
|
LL | impl<T: Sync + Sized> Foo<T> {
|
||||||
| ^
|
| ^
|
||||||
|
@ -201,7 +165,7 @@ LL | impl<T: Sync + Sized> Foo<T> {
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||||
--> $DIR/min_const_fn.rs:126:34
|
--> $DIR/min_const_fn.rs:118:34
|
||||||
|
|
|
|
||||||
LL | const fn no_apit2(_x: AlanTuring<impl std::fmt::Debug>) {}
|
LL | const fn no_apit2(_x: AlanTuring<impl std::fmt::Debug>) {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -210,7 +174,7 @@ LL | const fn no_apit2(_x: AlanTuring<impl std::fmt::Debug>) {}
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||||
--> $DIR/min_const_fn.rs:128:22
|
--> $DIR/min_const_fn.rs:120:22
|
||||||
|
|
|
|
||||||
LL | const fn no_apit(_x: impl std::fmt::Debug) {}
|
LL | const fn no_apit(_x: impl std::fmt::Debug) {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -219,7 +183,7 @@ LL | const fn no_apit(_x: impl std::fmt::Debug) {}
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||||
--> $DIR/min_const_fn.rs:129:23
|
--> $DIR/min_const_fn.rs:121:23
|
||||||
|
|
|
|
||||||
LL | const fn no_dyn_trait(_x: &dyn std::fmt::Debug) {}
|
LL | const fn no_dyn_trait(_x: &dyn std::fmt::Debug) {}
|
||||||
| ^^
|
| ^^
|
||||||
|
@ -228,7 +192,7 @@ LL | const fn no_dyn_trait(_x: &dyn std::fmt::Debug) {}
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||||
--> $DIR/min_const_fn.rs:130:32
|
--> $DIR/min_const_fn.rs:122:32
|
||||||
|
|
|
|
||||||
LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
|
LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -237,7 +201,7 @@ LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
|
||||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||||
--> $DIR/min_const_fn.rs:135:41
|
--> $DIR/min_const_fn.rs:127:41
|
||||||
|
|
|
|
||||||
LL | const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1 }
|
LL | const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1 }
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -246,7 +210,7 @@ LL | const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1
|
||||||
= 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[E0723]: function pointers in const fn are unstable
|
||||||
--> $DIR/min_const_fn.rs:138:21
|
--> $DIR/min_const_fn.rs:130:21
|
||||||
|
|
|
|
||||||
LL | const fn no_fn_ptrs(_x: fn()) {}
|
LL | const fn no_fn_ptrs(_x: fn()) {}
|
||||||
| ^^
|
| ^^
|
||||||
|
@ -255,7 +219,7 @@ LL | const fn no_fn_ptrs(_x: fn()) {}
|
||||||
= 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[E0723]: function pointers in const fn are unstable
|
||||||
--> $DIR/min_const_fn.rs:140: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 }
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
@ -263,7 +227,7 @@ 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)]` to the crate attributes to enable
|
||||||
|
|
||||||
error: aborting due to 30 previous errors
|
error: aborting due to 26 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0013, E0493, E0658, E0723.
|
Some errors have detailed explanations: E0013, E0493, E0658, E0723.
|
||||||
For more information about an error, try `rustc --explain E0013`.
|
For more information about an error, try `rustc --explain E0013`.
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
we're apparently really bad at it",
|
we're apparently really bad at it",
|
||||||
issue = "none")]
|
issue = "none")]
|
||||||
|
|
||||||
#![feature(const_fn, foo, foo2)]
|
#![feature(const_fn, const_fn_floating_point_arithmetic, foo, foo2)]
|
||||||
#![feature(staged_api)]
|
#![feature(staged_api)]
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
@ -25,9 +25,9 @@ const fn bar2() -> u32 { foo2() } //~ ERROR not yet stable as a const fn
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
#[rustc_const_stable(feature = "rust1", since = "1.0.0")]
|
#[rustc_const_stable(feature = "rust1", since = "1.0.0")]
|
||||||
// conformity is required, even with `const_fn` feature gate
|
// Const-stable functions cannot rely on unstable const-eval features.
|
||||||
const fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
const fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||||
//~^ ERROR const-stable function cannot use `#[feature(const_fn)]`
|
//~^ 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
|
// check whether this function cannot be called even with the feature gate active
|
||||||
#[unstable(feature = "foo2", issue = "none")]
|
#[unstable(feature = "foo2", issue = "none")]
|
||||||
|
|
|
@ -14,7 +14,7 @@ LL | const fn bar2() -> u32 { foo2() }
|
||||||
|
|
|
|
||||||
= help: Const-stable functions can only call other const-stable functions
|
= help: Const-stable functions can only call other const-stable functions
|
||||||
|
|
||||||
error: const-stable function cannot use `#[feature(const_fn)]`
|
error: const-stable function cannot use `#[feature(const_fn_floating_point_arithmetic)]`
|
||||||
--> $DIR/min_const_fn_libstd_stability.rs:29:26
|
--> $DIR/min_const_fn_libstd_stability.rs:29:26
|
||||||
|
|
|
|
||||||
LL | const fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
LL | const fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
we're apparently really bad at it",
|
we're apparently really bad at it",
|
||||||
issue = "none")]
|
issue = "none")]
|
||||||
|
|
||||||
#![feature(const_fn, foo, foo2)]
|
#![feature(const_fn, const_fn_floating_point_arithmetic, foo, foo2)]
|
||||||
#![feature(staged_api)]
|
#![feature(staged_api)]
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
@ -27,7 +27,7 @@ const unsafe fn bar2() -> u32 { unsafe { foo2() } } //~ ERROR not yet stable as
|
||||||
#[rustc_const_stable(feature = "rust1", since = "1.0.0")]
|
#[rustc_const_stable(feature = "rust1", since = "1.0.0")]
|
||||||
// conformity is required, even with `const_fn` feature gate
|
// conformity is required, even with `const_fn` feature gate
|
||||||
const unsafe fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
const unsafe fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||||
//~^ ERROR const-stable function cannot use `#[feature(const_fn)]`
|
//~^ 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
|
// check whether this function cannot be called even with the feature gate active
|
||||||
#[unstable(feature = "foo2", issue = "none")]
|
#[unstable(feature = "foo2", issue = "none")]
|
||||||
|
|
|
@ -14,7 +14,7 @@ LL | const unsafe fn bar2() -> u32 { unsafe { foo2() } }
|
||||||
|
|
|
|
||||||
= help: Const-stable functions can only call other const-stable functions
|
= help: Const-stable functions can only call other const-stable functions
|
||||||
|
|
||||||
error: const-stable function cannot use `#[feature(const_fn)]`
|
error: const-stable function cannot use `#[feature(const_fn_floating_point_arithmetic)]`
|
||||||
--> $DIR/min_const_unsafe_fn_libstd_stability.rs:29:33
|
--> $DIR/min_const_unsafe_fn_libstd_stability.rs:29:33
|
||||||
|
|
|
|
||||||
LL | const unsafe fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
LL | const unsafe fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||||
|
|
Loading…
Reference in New Issue