From 5f0dd6db94a8a6368f1aa00e50196b31f0d9ab23 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 10 Jul 2021 11:33:42 +0200 Subject: [PATCH 1/3] remove const_raw_ptr_to_usize_cast feature --- compiler/rustc_feature/src/active.rs | 3 -- compiler/rustc_feature/src/removed.rs | 4 +++ .../src/transform/check_consts/ops.rs | 25 +++++++++------ .../rustc_mir/src/transform/check_unsafety.rs | 31 +------------------ .../rustc_mir_build/src/check_unsafety.rs | 21 ------------- .../ui/cast/cast-ptr-to-int-const.mir.stderr | 19 ------------ src/test/ui/cast/cast-ptr-to-int-const.rs | 19 ------------ .../ui/cast/cast-ptr-to-int-const.thir.stderr | 19 ------------ ...eature-gate-const_raw_ptr_to_usize_cast.rs | 13 -------- ...re-gate-const_raw_ptr_to_usize_cast.stderr | 30 ------------------ src/test/ui/const-ptr/ptr_to_usize_cast.rs | 13 -------- .../ui/const-ptr/ptr_to_usize_cast.stderr | 14 --------- .../consts/const-eval/const_raw_ptr_ops2.rs | 12 +++---- .../const-eval/const_raw_ptr_ops2.stderr | 19 +++--------- src/test/ui/consts/const-eval/issue-52442.rs | 2 +- .../ui/consts/const-eval/issue-52442.stderr | 7 ++--- .../consts/const-eval/match-test-ptr-null.rs | 2 +- .../const-eval/match-test-ptr-null.stderr | 7 ++--- .../consts/const-eval/promoted_raw_ptr_ops.rs | 2 +- .../const-extern-fn-min-const-fn.rs | 2 +- .../const-extern-fn-min-const-fn.stderr | 6 ++-- src/test/ui/consts/issue-17458.rs | 2 +- src/test/ui/consts/issue-17458.stderr | 7 ++--- src/test/ui/consts/issue-51559.rs | 8 ----- src/test/ui/consts/issue-51559.stderr | 14 --------- .../issue-52023-array-size-pointer-cast.rs | 2 +- ...issue-52023-array-size-pointer-cast.stderr | 7 ++--- src/test/ui/consts/issue-52432.rs | 10 ------ src/test/ui/consts/issue-52432.stderr | 28 ----------------- .../ui/consts/min_const_fn/min_const_fn.rs | 8 ++--- .../consts/min_const_fn/min_const_fn.stderr | 24 +++++++------- 31 files changed, 65 insertions(+), 315 deletions(-) delete mode 100644 src/test/ui/cast/cast-ptr-to-int-const.mir.stderr delete mode 100644 src/test/ui/cast/cast-ptr-to-int-const.rs delete mode 100644 src/test/ui/cast/cast-ptr-to-int-const.thir.stderr delete mode 100644 src/test/ui/cast/feature-gate-const_raw_ptr_to_usize_cast.rs delete mode 100644 src/test/ui/cast/feature-gate-const_raw_ptr_to_usize_cast.stderr delete mode 100644 src/test/ui/const-ptr/ptr_to_usize_cast.rs delete mode 100644 src/test/ui/const-ptr/ptr_to_usize_cast.stderr delete mode 100644 src/test/ui/consts/issue-51559.rs delete mode 100644 src/test/ui/consts/issue-51559.stderr delete mode 100644 src/test/ui/consts/issue-52432.rs delete mode 100644 src/test/ui/consts/issue-52432.stderr diff --git a/compiler/rustc_feature/src/active.rs b/compiler/rustc_feature/src/active.rs index d01804aca88b2..9eaf4693811ca 100644 --- a/compiler/rustc_feature/src/active.rs +++ b/compiler/rustc_feature/src/active.rs @@ -416,9 +416,6 @@ declare_features! ( /// Allows accessing fields of unions inside `const` functions. (active, const_fn_union, "1.27.0", Some(51909), None), - /// Allows casting raw pointers to `usize` during const eval. - (active, const_raw_ptr_to_usize_cast, "1.27.0", Some(51910), None), - /// Allows dereferencing raw pointers during const eval. (active, const_raw_ptr_deref, "1.27.0", Some(51911), None), diff --git a/compiler/rustc_feature/src/removed.rs b/compiler/rustc_feature/src/removed.rs index 71c10eb650754..6d3e2b9c51713 100644 --- a/compiler/rustc_feature/src/removed.rs +++ b/compiler/rustc_feature/src/removed.rs @@ -144,6 +144,10 @@ declare_features! ( (removed, external_doc, "1.54.0", Some(44732), None, Some("use #[doc = include_str!(\"filename\")] instead, which handles macro invocations")), + /// Allows casting raw pointers to `usize` during const eval. + (removed, const_raw_ptr_to_usize_cast, "1.55.0", Some(51910), None, + Some("at compile-time, pointers do not have an integer value, so these casts cannot be properly supported")), + // ------------------------------------------------------------------------- // feature-group-end: removed features // ------------------------------------------------------------------------- diff --git a/compiler/rustc_mir/src/transform/check_consts/ops.rs b/compiler/rustc_mir/src/transform/check_consts/ops.rs index dcbc9c523dc19..fd72ec4340f9f 100644 --- a/compiler/rustc_mir/src/transform/check_consts/ops.rs +++ b/compiler/rustc_mir/src/transform/check_consts/ops.rs @@ -397,6 +397,9 @@ impl NonConstOp for PanicNonStr { } } +/// Comparing raw pointers for equality. +/// Not currently intended to ever be allowed, even behind a feature gate: operation depends on +/// allocation base addresses that are not known at compile-time. #[derive(Debug)] pub struct RawPtrComparison; impl NonConstOp for RawPtrComparison { @@ -430,20 +433,22 @@ impl NonConstOp for RawPtrDeref { } } +/// Casting raw pointer or function pointer to an integer. +/// Not currently intended to ever be allowed, even behind a feature gate: operation depends on +/// allocation base addresses that are not known at compile-time. #[derive(Debug)] pub struct RawPtrToIntCast; impl NonConstOp for RawPtrToIntCast { - fn status_in_item(&self, _: &ConstCx<'_, '_>) -> Status { - Status::Unstable(sym::const_raw_ptr_to_usize_cast) - } - fn build_error(&self, ccx: &ConstCx<'_, 'tcx>, span: Span) -> DiagnosticBuilder<'tcx> { - feature_err( - &ccx.tcx.sess.parse_sess, - sym::const_raw_ptr_to_usize_cast, - span, - &format!("casting pointers to integers in {}s is unstable", ccx.const_kind(),), - ) + let mut err = ccx + .tcx + .sess + .struct_span_err(span, "pointers cannot be cast to integers during const eval."); + err.note("at compile-time, pointers do not have an integer value"); + err.note( + "avoiding this restriction via `transmute`, `union`, or raw pointers leads to compile-time undefined behavior", + ); + err } } diff --git a/compiler/rustc_mir/src/transform/check_unsafety.rs b/compiler/rustc_mir/src/transform/check_unsafety.rs index 103ddda1a1d26..1ff9bd1572108 100644 --- a/compiler/rustc_mir/src/transform/check_unsafety.rs +++ b/compiler/rustc_mir/src/transform/check_unsafety.rs @@ -7,7 +7,6 @@ use rustc_hir::intravisit; use rustc_hir::Node; use rustc_middle::mir::visit::{MutatingUseContext, PlaceContext, Visitor}; use rustc_middle::mir::*; -use rustc_middle::ty::cast::CastTy; use rustc_middle::ty::query::Providers; use rustc_middle::ty::{self, TyCtxt}; use rustc_session::lint::builtin::{UNSAFE_OP_IN_UNSAFE_FN, UNUSED_UNSAFE}; @@ -18,7 +17,6 @@ use std::ops::Bound; pub struct UnsafetyChecker<'a, 'tcx> { body: &'a Body<'tcx>, body_did: LocalDefId, - const_context: bool, violations: Vec, source_info: SourceInfo, tcx: TyCtxt<'tcx>, @@ -30,7 +28,6 @@ pub struct UnsafetyChecker<'a, 'tcx> { impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> { fn new( - const_context: bool, body: &'a Body<'tcx>, body_did: LocalDefId, tcx: TyCtxt<'tcx>, @@ -39,7 +36,6 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> { Self { body, body_did, - const_context, violations: vec![], source_info: SourceInfo::outermost(body.span), tcx, @@ -136,25 +132,6 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> { self.register_violations(&violations, &unsafe_blocks); } }, - // casting pointers to ints is unsafe in const fn because the const evaluator cannot - // possibly know what the result of various operations like `address / 2` would be - // pointers during const evaluation have no integral address, only an abstract one - Rvalue::Cast(CastKind::Misc, ref operand, cast_ty) - if self.const_context && self.tcx.features().const_raw_ptr_to_usize_cast => - { - let operand_ty = operand.ty(self.body, self.tcx); - let cast_in = CastTy::from_ty(operand_ty).expect("bad input type for cast"); - let cast_out = CastTy::from_ty(cast_ty).expect("bad output type for cast"); - match (cast_in, cast_out) { - (CastTy::Ptr(_) | CastTy::FnPtr, CastTy::Int(_)) => { - self.require_unsafe( - UnsafetyViolationKind::General, - UnsafetyViolationDetails::CastOfPointerToInt, - ); - } - _ => {} - } - } _ => {} } self.super_rvalue(rvalue, location); @@ -469,13 +446,7 @@ fn unsafety_check_result<'tcx>( let param_env = tcx.param_env(def.did); - let id = tcx.hir().local_def_id_to_hir_id(def.did); - let const_context = match tcx.hir().body_owner_kind(id) { - hir::BodyOwnerKind::Closure => false, - hir::BodyOwnerKind::Fn => tcx.is_const_fn_raw(def.did.to_def_id()), - hir::BodyOwnerKind::Const | hir::BodyOwnerKind::Static(_) => true, - }; - let mut checker = UnsafetyChecker::new(const_context, body, def.did, tcx, param_env); + let mut checker = UnsafetyChecker::new(body, def.did, tcx, param_env); checker.visit_body(&body); check_unused_unsafe(tcx, def.did, &checker.used_unsafe, &mut checker.inherited_blocks); diff --git a/compiler/rustc_mir_build/src/check_unsafety.rs b/compiler/rustc_mir_build/src/check_unsafety.rs index c3af98fae9d59..38111527a4ec7 100644 --- a/compiler/rustc_mir_build/src/check_unsafety.rs +++ b/compiler/rustc_mir_build/src/check_unsafety.rs @@ -25,7 +25,6 @@ struct UnsafetyVisitor<'a, 'tcx> { /// The `#[target_feature]` attributes of the body. Used for checking /// calls to functions with `#[target_feature]` (RFC 2396). body_target_features: &'tcx Vec, - is_const: bool, in_possible_lhs_union_assign: bool, in_union_destructure: bool, } @@ -315,16 +314,6 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> { (Bound::Unbounded, Bound::Unbounded) => {} _ => self.requires_unsafe(expr.span, InitializingTypeWith), }, - ExprKind::Cast { source } => { - let source = &self.thir[source]; - if self.tcx.features().const_raw_ptr_to_usize_cast - && self.is_const - && (source.ty.is_unsafe_ptr() || source.ty.is_fn_ptr()) - && expr.ty.is_integral() - { - self.requires_unsafe(expr.span, CastOfPointerToInt); - } - } ExprKind::Closure { closure_id, substs: _, @@ -413,7 +402,6 @@ enum UnsafeOpKind { CallToUnsafeFunction, UseOfInlineAssembly, InitializingTypeWith, - CastOfPointerToInt, UseOfMutableStatic, UseOfExternStatic, DerefOfRawPointer, @@ -446,9 +434,6 @@ impl UnsafeOpKind { "initializing a layout restricted type's field with a value outside the valid \ range is undefined behavior", ), - CastOfPointerToInt => { - ("cast of pointer to int", "casting pointers to integers in constants") - } UseOfMutableStatic => ( "use of mutable static", "mutable statics can be mutated by multiple threads: aliasing violations or data \ @@ -526,11 +511,6 @@ pub fn check_unsafety<'tcx>(tcx: TyCtxt<'tcx>, def: ty::WithOptConstParam false, - hir::BodyOwnerKind::Fn => tcx.is_const_fn_raw(def.did.to_def_id()), - hir::BodyOwnerKind::Const | hir::BodyOwnerKind::Static(_) => true, - }; let mut visitor = UnsafetyVisitor { tcx, thir, @@ -538,7 +518,6 @@ pub fn check_unsafety<'tcx>(tcx: TyCtxt<'tcx>, def: ty::WithOptConstParam $DIR/cast-ptr-to-int-const.rs:10:9 - | -LL | &Y as *const u32 as usize - | ^^^^^^^^^^^^^^^^^^^^^^^^^ cast of pointer to int - | - = note: casting pointers to integers in constants - -error[E0133]: cast of pointer to int is unsafe and requires unsafe function or block - --> $DIR/cast-ptr-to-int-const.rs:17:5 - | -LL | &0 as *const i32 as usize - | ^^^^^^^^^^^^^^^^^^^^^^^^^ cast of pointer to int - | - = note: casting pointers to integers in constants - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0133`. diff --git a/src/test/ui/cast/cast-ptr-to-int-const.rs b/src/test/ui/cast/cast-ptr-to-int-const.rs deleted file mode 100644 index 01ea627679d13..0000000000000 --- a/src/test/ui/cast/cast-ptr-to-int-const.rs +++ /dev/null @@ -1,19 +0,0 @@ -// revisions: mir thir -// [thir]compile-flags: -Z thir-unsafeck - -#![feature(const_raw_ptr_to_usize_cast)] - -fn main() { - const Y: u32 = 0; - // Cast in `const` without `unsafe` block - const SAFE: usize = { - &Y as *const u32 as usize - //~^ ERROR cast of pointer to int is unsafe and requires unsafe - }; -} - -// Cast in `const fn` without `unsafe` block -const fn test() -> usize { - &0 as *const i32 as usize - //~^ ERROR cast of pointer to int is unsafe and requires unsafe -} diff --git a/src/test/ui/cast/cast-ptr-to-int-const.thir.stderr b/src/test/ui/cast/cast-ptr-to-int-const.thir.stderr deleted file mode 100644 index dcc9a243f0f39..0000000000000 --- a/src/test/ui/cast/cast-ptr-to-int-const.thir.stderr +++ /dev/null @@ -1,19 +0,0 @@ -error[E0133]: cast of pointer to int is unsafe and requires unsafe function or block - --> $DIR/cast-ptr-to-int-const.rs:10:9 - | -LL | &Y as *const u32 as usize - | ^^^^^^^^^^^^^^^^^^^^^^^^^ cast of pointer to int - | - = note: casting pointers to integers in constants - -error[E0133]: cast of pointer to int is unsafe and requires unsafe function or block - --> $DIR/cast-ptr-to-int-const.rs:17:5 - | -LL | &0 as *const i32 as usize - | ^^^^^^^^^^^^^^^^^^^^^^^^^ cast of pointer to int - | - = note: casting pointers to integers in constants - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0133`. diff --git a/src/test/ui/cast/feature-gate-const_raw_ptr_to_usize_cast.rs b/src/test/ui/cast/feature-gate-const_raw_ptr_to_usize_cast.rs deleted file mode 100644 index 03e99eb752740..0000000000000 --- a/src/test/ui/cast/feature-gate-const_raw_ptr_to_usize_cast.rs +++ /dev/null @@ -1,13 +0,0 @@ -fn main() { - const X: usize = unsafe { - main as usize //~ ERROR casting pointers to integers in constants is unstable - }; - const Y: u32 = 0; - const Z: usize = unsafe { - &Y as *const u32 as usize //~ ERROR is unstable - }; -} - -const fn test() -> usize { - &0 as *const i32 as usize //~ ERROR is unstable -} diff --git a/src/test/ui/cast/feature-gate-const_raw_ptr_to_usize_cast.stderr b/src/test/ui/cast/feature-gate-const_raw_ptr_to_usize_cast.stderr deleted file mode 100644 index 4a0b424e1816b..0000000000000 --- a/src/test/ui/cast/feature-gate-const_raw_ptr_to_usize_cast.stderr +++ /dev/null @@ -1,30 +0,0 @@ -error[E0658]: casting pointers to integers in constants is unstable - --> $DIR/feature-gate-const_raw_ptr_to_usize_cast.rs:3:9 - | -LL | main as usize - | ^^^^^^^^^^^^^ - | - = note: see issue #51910 for more information - = help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable - -error[E0658]: casting pointers to integers in constants is unstable - --> $DIR/feature-gate-const_raw_ptr_to_usize_cast.rs:7:9 - | -LL | &Y as *const u32 as usize - | ^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #51910 for more information - = 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 - --> $DIR/feature-gate-const_raw_ptr_to_usize_cast.rs:12:5 - | -LL | &0 as *const i32 as usize - | ^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #51910 for more information - = help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable - -error: aborting due to 3 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/const-ptr/ptr_to_usize_cast.rs b/src/test/ui/const-ptr/ptr_to_usize_cast.rs deleted file mode 100644 index bf1e790b5dc29..0000000000000 --- a/src/test/ui/const-ptr/ptr_to_usize_cast.rs +++ /dev/null @@ -1,13 +0,0 @@ -#![feature(const_raw_ptr_to_usize_cast)] - -fn main() { - const OK: usize = unsafe { 0 as *const i32 as usize }; - - const _ERROR: usize = unsafe { &0 as *const i32 as usize }; - //~^ ERROR [const_err] - //~| NOTE cannot cast pointer to integer because it was not created by cast from integer - //~| NOTE - //~| NOTE `#[deny(const_err)]` on by default - //~| WARN this was previously accepted by the compiler but is being phased out - //~| NOTE see issue #71800 -} diff --git a/src/test/ui/const-ptr/ptr_to_usize_cast.stderr b/src/test/ui/const-ptr/ptr_to_usize_cast.stderr deleted file mode 100644 index 48255860bb53f..0000000000000 --- a/src/test/ui/const-ptr/ptr_to_usize_cast.stderr +++ /dev/null @@ -1,14 +0,0 @@ -error: any use of this value will cause an error - --> $DIR/ptr_to_usize_cast.rs:6:36 - | -LL | const _ERROR: usize = unsafe { &0 as *const i32 as usize }; - | -------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^--- - | | - | cannot cast pointer to integer because it was not created by cast from integer - | - = note: `#[deny(const_err)]` on by default - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #71800 - -error: aborting due to previous error - diff --git a/src/test/ui/consts/const-eval/const_raw_ptr_ops2.rs b/src/test/ui/consts/const-eval/const_raw_ptr_ops2.rs index c6a623b293276..a177ed6b3413e 100644 --- a/src/test/ui/consts/const-eval/const_raw_ptr_ops2.rs +++ b/src/test/ui/consts/const-eval/const_raw_ptr_ops2.rs @@ -1,15 +1,11 @@ -#![feature(const_raw_ptr_to_usize_cast, const_raw_ptr_deref)] +#![feature(const_raw_ptr_deref)] fn main() {} -// unconst and fine -const Y: usize = unsafe { 42usize as *const i32 as usize + 1 }; -// unconst and bad, will thus error in miri -const Y2: usize = unsafe { &1 as *const i32 as usize + 1 }; //~ ERROR any use of this -//~| WARN this was previously accepted by the compiler but is being phased out -// unconst and fine +// fine const Z: i32 = unsafe { *(&1 as *const i32) }; -// unconst and bad, will thus error in miri + +// bad, will thus error in miri const Z2: i32 = unsafe { *(42 as *const i32) }; //~ ERROR any use of this value will cause //~| WARN this was previously accepted by the compiler but is being phased out const Z3: i32 = unsafe { *(44 as *const i32) }; //~ ERROR any use of this value will cause diff --git a/src/test/ui/consts/const-eval/const_raw_ptr_ops2.stderr b/src/test/ui/consts/const-eval/const_raw_ptr_ops2.stderr index df8b33a0898f6..de54ea3b9fbd0 100644 --- a/src/test/ui/consts/const-eval/const_raw_ptr_ops2.stderr +++ b/src/test/ui/consts/const-eval/const_raw_ptr_ops2.stderr @@ -1,28 +1,17 @@ error: any use of this value will cause an error - --> $DIR/const_raw_ptr_ops2.rs:8:28 - | -LL | const Y2: usize = unsafe { &1 as *const i32 as usize + 1 }; - | ---------------------------^^^^^^^^^^^^^^^^^^^^^^^^^------- - | | - | cannot cast pointer to integer because it was not created by cast from integer - | - = note: `#[deny(const_err)]` on by default - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #71800 - -error: any use of this value will cause an error - --> $DIR/const_raw_ptr_ops2.rs:13:26 + --> $DIR/const_raw_ptr_ops2.rs:9:26 | LL | const Z2: i32 = unsafe { *(42 as *const i32) }; | -------------------------^^^^^^^^^^^^^^^^^^^--- | | | unable to turn bytes into a pointer | + = note: `#[deny(const_err)]` on by default = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #71800 error: any use of this value will cause an error - --> $DIR/const_raw_ptr_ops2.rs:15:26 + --> $DIR/const_raw_ptr_ops2.rs:11:26 | LL | const Z3: i32 = unsafe { *(44 as *const i32) }; | -------------------------^^^^^^^^^^^^^^^^^^^--- @@ -32,5 +21,5 @@ LL | const Z3: i32 = unsafe { *(44 as *const i32) }; = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #71800 -error: aborting due to 3 previous errors +error: aborting due to 2 previous errors diff --git a/src/test/ui/consts/const-eval/issue-52442.rs b/src/test/ui/consts/const-eval/issue-52442.rs index 159b48d42b6c6..c7c5b1a2f626b 100644 --- a/src/test/ui/consts/const-eval/issue-52442.rs +++ b/src/test/ui/consts/const-eval/issue-52442.rs @@ -1,4 +1,4 @@ fn main() { [(); { &loop { break } as *const _ as usize } ]; - //~^ ERROR casting pointers to integers in constants is unstable + //~^ ERROR pointers cannot be cast to integers during const eval } diff --git a/src/test/ui/consts/const-eval/issue-52442.stderr b/src/test/ui/consts/const-eval/issue-52442.stderr index 2a8f34279c3db..aa080937c6ce6 100644 --- a/src/test/ui/consts/const-eval/issue-52442.stderr +++ b/src/test/ui/consts/const-eval/issue-52442.stderr @@ -1,12 +1,11 @@ -error[E0658]: casting pointers to integers in constants is unstable +error: pointers cannot be cast to integers during const eval. --> $DIR/issue-52442.rs:2:13 | LL | [(); { &loop { break } as *const _ as usize } ]; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: see issue #51910 for more information - = help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable + = 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 previous error -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/const-eval/match-test-ptr-null.rs b/src/test/ui/consts/const-eval/match-test-ptr-null.rs index d980eb92a243e..4af97b5487929 100644 --- a/src/test/ui/consts/const-eval/match-test-ptr-null.rs +++ b/src/test/ui/consts/const-eval/match-test-ptr-null.rs @@ -4,7 +4,7 @@ fn main() { // bytes. let _: [u8; 0] = [4; { match &1 as *const i32 as usize { - //~^ ERROR casting pointers to integers in constants + //~^ ERROR pointers cannot be cast to integers during const eval 0 => 42, n => n, } diff --git a/src/test/ui/consts/const-eval/match-test-ptr-null.stderr b/src/test/ui/consts/const-eval/match-test-ptr-null.stderr index 22d6bb16944b5..4e55b36da7392 100644 --- a/src/test/ui/consts/const-eval/match-test-ptr-null.stderr +++ b/src/test/ui/consts/const-eval/match-test-ptr-null.stderr @@ -1,12 +1,11 @@ -error[E0658]: casting pointers to integers in constants is unstable +error: pointers cannot be cast to integers during const eval. --> $DIR/match-test-ptr-null.rs:6:15 | LL | match &1 as *const i32 as usize { | ^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: see issue #51910 for more information - = help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable + = 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 previous error -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/const-eval/promoted_raw_ptr_ops.rs b/src/test/ui/consts/const-eval/promoted_raw_ptr_ops.rs index d724fe3060b21..c7d84303fe54c 100644 --- a/src/test/ui/consts/const-eval/promoted_raw_ptr_ops.rs +++ b/src/test/ui/consts/const-eval/promoted_raw_ptr_ops.rs @@ -1,4 +1,4 @@ -#![feature(const_raw_ptr_to_usize_cast, const_raw_ptr_deref)] +#![feature(const_raw_ptr_deref)] fn main() { let x: &'static bool = &(42 as *const i32 == 43 as *const i32); diff --git a/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.rs b/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.rs index 76380ebcb6599..46748673067ce 100644 --- a/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.rs +++ b/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.rs @@ -7,7 +7,7 @@ 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 casting pointers to integers +//~^ ERROR pointers cannot be cast to integers fn main() {} diff --git a/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.stderr b/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.stderr index 80d234b0e881e..2e52bae2b676c 100644 --- a/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.stderr +++ b/src/test/ui/consts/const-extern-fn/const-extern-fn-min-const-fn.stderr @@ -25,14 +25,14 @@ LL | const unsafe extern "C" fn use_float() { 1.0 + 1.0; } = note: see issue #57241 for more information = 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: pointers cannot be cast to integers during const eval. --> $DIR/const-extern-fn-min-const-fn.rs:9:48 | LL | const extern "C" fn ptr_cast(val: *const u8) { val as usize; } | ^^^^^^^^^^^^ | - = note: see issue #51910 for more information - = help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable + = note: at compile-time, pointers do not have an integer value + = note: avoiding this restriction via `transmute`, `union`, or raw pointers leads to compile-time undefined behavior error: aborting due to 4 previous errors diff --git a/src/test/ui/consts/issue-17458.rs b/src/test/ui/consts/issue-17458.rs index d56ffebad7d5a..44125a1c3df8d 100644 --- a/src/test/ui/consts/issue-17458.rs +++ b/src/test/ui/consts/issue-17458.rs @@ -1,5 +1,5 @@ static X: usize = unsafe { core::ptr::null::() as usize }; -//~^ ERROR: casting pointers to integers in statics is unstable +//~^ ERROR: pointers cannot be cast to integers during const eval fn main() { assert_eq!(X, 0); diff --git a/src/test/ui/consts/issue-17458.stderr b/src/test/ui/consts/issue-17458.stderr index 68e86ea21bd96..aab7d798db2e7 100644 --- a/src/test/ui/consts/issue-17458.stderr +++ b/src/test/ui/consts/issue-17458.stderr @@ -1,12 +1,11 @@ -error[E0658]: casting pointers to integers in statics is unstable +error: pointers cannot be cast to integers during const eval. --> $DIR/issue-17458.rs:1:28 | LL | static X: usize = unsafe { core::ptr::null::() as usize }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: see issue #51910 for more information - = help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable + = 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 previous error -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/issue-51559.rs b/src/test/ui/consts/issue-51559.rs deleted file mode 100644 index cc644404f7d73..0000000000000 --- a/src/test/ui/consts/issue-51559.rs +++ /dev/null @@ -1,8 +0,0 @@ -#![feature(const_raw_ptr_to_usize_cast)] - -const BAR: *mut () = ((|| 3) as fn() -> i32) as *mut (); -pub const FOO: usize = unsafe { BAR as usize }; -//~^ ERROR any use of this value will cause an error -//~| WARN this was previously accepted by the compiler but is being phased out - -fn main() {} diff --git a/src/test/ui/consts/issue-51559.stderr b/src/test/ui/consts/issue-51559.stderr deleted file mode 100644 index d571eb549630f..0000000000000 --- a/src/test/ui/consts/issue-51559.stderr +++ /dev/null @@ -1,14 +0,0 @@ -error: any use of this value will cause an error - --> $DIR/issue-51559.rs:4:33 - | -LL | pub const FOO: usize = unsafe { BAR as usize }; - | --------------------------------^^^^^^^^^^^^--- - | | - | cannot cast pointer to integer because it was not created by cast from integer - | - = note: `#[deny(const_err)]` on by default - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #71800 - -error: aborting due to previous error - diff --git a/src/test/ui/consts/issue-52023-array-size-pointer-cast.rs b/src/test/ui/consts/issue-52023-array-size-pointer-cast.rs index cc756ce815f15..2249d9879f5dc 100644 --- a/src/test/ui/consts/issue-52023-array-size-pointer-cast.rs +++ b/src/test/ui/consts/issue-52023-array-size-pointer-cast.rs @@ -1,3 +1,3 @@ fn main() { - let _ = [0; (&0 as *const i32) as usize]; //~ ERROR casting pointers to integers in constants + let _ = [0; (&0 as *const i32) as usize]; //~ ERROR pointers cannot be cast to integers during const eval } diff --git a/src/test/ui/consts/issue-52023-array-size-pointer-cast.stderr b/src/test/ui/consts/issue-52023-array-size-pointer-cast.stderr index 68b5cbd9bd7c7..363c7b2c8e462 100644 --- a/src/test/ui/consts/issue-52023-array-size-pointer-cast.stderr +++ b/src/test/ui/consts/issue-52023-array-size-pointer-cast.stderr @@ -1,12 +1,11 @@ -error[E0658]: casting pointers to integers in constants is unstable +error: pointers cannot be cast to integers during const eval. --> $DIR/issue-52023-array-size-pointer-cast.rs:2:17 | LL | let _ = [0; (&0 as *const i32) as usize]; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: see issue #51910 for more information - = help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable + = 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 previous error -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/issue-52432.rs b/src/test/ui/consts/issue-52432.rs deleted file mode 100644 index d719bf1b97161..0000000000000 --- a/src/test/ui/consts/issue-52432.rs +++ /dev/null @@ -1,10 +0,0 @@ -#![feature(const_raw_ptr_to_usize_cast)] - -fn main() { - [(); &(static |x| {}) as *const _ as usize]; - //~^ ERROR: closures cannot be static - //~| ERROR: type annotations needed - [(); &(static || {}) as *const _ as usize]; - //~^ ERROR: closures cannot be static - //~| ERROR evaluation of constant value failed -} diff --git a/src/test/ui/consts/issue-52432.stderr b/src/test/ui/consts/issue-52432.stderr deleted file mode 100644 index 29998950552cd..0000000000000 --- a/src/test/ui/consts/issue-52432.stderr +++ /dev/null @@ -1,28 +0,0 @@ -error[E0697]: closures cannot be static - --> $DIR/issue-52432.rs:4:12 - | -LL | [(); &(static |x| {}) as *const _ as usize]; - | ^^^^^^^^^^ - -error[E0697]: closures cannot be static - --> $DIR/issue-52432.rs:7:12 - | -LL | [(); &(static || {}) as *const _ as usize]; - | ^^^^^^^^^ - -error[E0282]: type annotations needed - --> $DIR/issue-52432.rs:4:20 - | -LL | [(); &(static |x| {}) as *const _ as usize]; - | ^ consider giving this closure parameter a type - -error[E0080]: evaluation of constant value failed - --> $DIR/issue-52432.rs:7:10 - | -LL | [(); &(static || {}) as *const _ as usize]; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot cast pointer to integer because it was not created by cast from integer - -error: aborting due to 4 previous errors - -Some errors have detailed explanations: E0080, E0282, E0697. -For more information about an error, try `rustc --explain E0080`. diff --git a/src/test/ui/consts/min_const_fn/min_const_fn.rs b/src/test/ui/consts/min_const_fn/min_const_fn.rs index b7904e6841b5d..bb525d5719778 100644 --- a/src/test/ui/consts/min_const_fn/min_const_fn.rs +++ b/src/test/ui/consts/min_const_fn/min_const_fn.rs @@ -90,13 +90,13 @@ static BAR: u32 = 42; const fn foo25() -> u32 { BAR } //~ ERROR cannot refer to statics const fn foo26() -> &'static u32 { &BAR } //~ ERROR cannot refer to statics const fn foo30(x: *const u32) -> usize { x as usize } -//~^ ERROR casting pointers to integers +//~^ ERROR pointers cannot be cast to integers const fn foo30_with_unsafe(x: *const u32) -> usize { unsafe { x as usize } } -//~^ ERROR casting pointers to integers +//~^ ERROR pointers cannot be cast to integers const fn foo30_2(x: *mut u32) -> usize { x as usize } -//~^ ERROR casting pointers to integers +//~^ ERROR pointers cannot be cast to integers const fn foo30_2_with_unsafe(x: *mut u32) -> usize { unsafe { x as usize } } -//~^ ERROR casting pointers to integers +//~^ ERROR pointers cannot be cast to integers const fn foo30_6() -> bool { let x = true; x } const fn inc(x: &mut i32) { *x += 1 } //~^ ERROR mutable references diff --git a/src/test/ui/consts/min_const_fn/min_const_fn.stderr b/src/test/ui/consts/min_const_fn/min_const_fn.stderr index d31d412193698..fcbf39d38690b 100644 --- a/src/test/ui/consts/min_const_fn/min_const_fn.stderr +++ b/src/test/ui/consts/min_const_fn/min_const_fn.stderr @@ -164,41 +164,41 @@ LL | const fn foo26() -> &'static u32 { &BAR } | = 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: pointers cannot be cast to integers during const eval. --> $DIR/min_const_fn.rs:92:42 | LL | const fn foo30(x: *const u32) -> usize { x as usize } | ^^^^^^^^^^ | - = note: see issue #51910 for more information - = help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable + = 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[E0658]: casting pointers to integers in constant functions is unstable +error: pointers cannot be cast to integers during const eval. --> $DIR/min_const_fn.rs:94:63 | LL | const fn foo30_with_unsafe(x: *const u32) -> usize { unsafe { x as usize } } | ^^^^^^^^^^ | - = note: see issue #51910 for more information - = help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable + = 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[E0658]: casting pointers to integers in constant functions is unstable +error: pointers cannot be cast to integers during const eval. --> $DIR/min_const_fn.rs:96:42 | LL | const fn foo30_2(x: *mut u32) -> usize { x as usize } | ^^^^^^^^^^ | - = note: see issue #51910 for more information - = help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable + = 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[E0658]: casting pointers to integers in constant functions is unstable +error: pointers cannot be cast to integers during const eval. --> $DIR/min_const_fn.rs:98:63 | LL | const fn foo30_2_with_unsafe(x: *mut u32) -> usize { unsafe { x as usize } } | ^^^^^^^^^^ | - = note: see issue #51910 for more information - = help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable + = 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[E0658]: mutable references are not allowed in constant functions --> $DIR/min_const_fn.rs:101:14 From fb010c9004252bbd4d16727a3477f2f1d8ac41b6 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 10 Jul 2021 13:03:35 +0200 Subject: [PATCH 2/3] bless missing tests --- src/test/ui/issues/issue-18294.rs | 2 +- src/test/ui/issues/issue-18294.stderr | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/test/ui/issues/issue-18294.rs b/src/test/ui/issues/issue-18294.rs index 1c2229fb9eae4..77355f0d7c994 100644 --- a/src/test/ui/issues/issue-18294.rs +++ b/src/test/ui/issues/issue-18294.rs @@ -1,5 +1,5 @@ fn main() { const X: u32 = 1; - const Y: usize = unsafe { &X as *const u32 as usize }; //~ ERROR is unstable + const Y: usize = unsafe { &X as *const u32 as usize }; //~ ERROR pointers cannot be cast to integers println!("{}", Y); } diff --git a/src/test/ui/issues/issue-18294.stderr b/src/test/ui/issues/issue-18294.stderr index 52df558bfce5e..432e9a6518765 100644 --- a/src/test/ui/issues/issue-18294.stderr +++ b/src/test/ui/issues/issue-18294.stderr @@ -1,12 +1,11 @@ -error[E0658]: casting pointers to integers in constants is unstable +error: pointers cannot be cast to integers during const eval. --> $DIR/issue-18294.rs:3:31 | LL | const Y: usize = unsafe { &X as *const u32 as usize }; | ^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: see issue #51910 for more information - = help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable + = 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 previous error -For more information about this error, try `rustc --explain E0658`. From f5094aa5d6600ef8f47883ee831909cf88c0e955 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 10 Jul 2021 13:48:44 +0200 Subject: [PATCH 3/3] remove duplicate test --- src/test/ui/consts/const-eval/issue-52442.rs | 4 ---- src/test/ui/consts/const-eval/issue-52442.stderr | 11 ----------- 2 files changed, 15 deletions(-) delete mode 100644 src/test/ui/consts/const-eval/issue-52442.rs delete mode 100644 src/test/ui/consts/const-eval/issue-52442.stderr diff --git a/src/test/ui/consts/const-eval/issue-52442.rs b/src/test/ui/consts/const-eval/issue-52442.rs deleted file mode 100644 index c7c5b1a2f626b..0000000000000 --- a/src/test/ui/consts/const-eval/issue-52442.rs +++ /dev/null @@ -1,4 +0,0 @@ -fn main() { - [(); { &loop { break } as *const _ as usize } ]; - //~^ ERROR pointers cannot be cast to integers during const eval -} diff --git a/src/test/ui/consts/const-eval/issue-52442.stderr b/src/test/ui/consts/const-eval/issue-52442.stderr deleted file mode 100644 index aa080937c6ce6..0000000000000 --- a/src/test/ui/consts/const-eval/issue-52442.stderr +++ /dev/null @@ -1,11 +0,0 @@ -error: pointers cannot be cast to integers during const eval. - --> $DIR/issue-52442.rs:2:13 - | -LL | [(); { &loop { break } as *const _ 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 previous error -