Stabilize const_raw_ptr_deref for *const T

This stabilizes dereferencing immutable raw pointers in const contexts.
It does not stabilize `*mut T` dereferencing. This is placed behind the
`const_raw_mut_ptr_deref` feature gate.
This commit is contained in:
Jacob Pratt 2021-10-05 04:55:57 -04:00
parent 5ec7d1dad6
commit 0cdbeaa2a3
No known key found for this signature in database
GPG key ID: B80E19E4662B5AA4
62 changed files with 114 additions and 193 deletions

View file

@ -725,7 +725,7 @@ impl Visitor<'tcx> for Checker<'mir, 'tcx> {
match elem {
ProjectionElem::Deref => {
let base_ty = Place::ty_from(place_local, proj_base, self.body, self.tcx).ty;
if let ty::RawPtr(_) = base_ty.kind() {
if base_ty.is_unsafe_ptr() {
if proj_base.is_empty() {
let decl = &self.body.local_decls[place_local];
if let Some(box LocalInfo::StaticRef { def_id, .. }) = decl.local_info {
@ -734,7 +734,13 @@ impl Visitor<'tcx> for Checker<'mir, 'tcx> {
return;
}
}
self.check_op(ops::RawPtrDeref);
// `*const T` is stable, `*mut T` is not
if !base_ty.is_mutable_ptr() {
return;
}
self.check_op(ops::RawMutPtrDeref);
}
if context.is_mutating_use() {

View file

@ -400,18 +400,18 @@ impl NonConstOp for RawPtrComparison {
}
#[derive(Debug)]
pub struct RawPtrDeref;
impl NonConstOp for RawPtrDeref {
pub struct RawMutPtrDeref;
impl NonConstOp for RawMutPtrDeref {
fn status_in_item(&self, _: &ConstCx<'_, '_>) -> Status {
Status::Unstable(sym::const_raw_ptr_deref)
Status::Unstable(sym::const_mut_refs)
}
fn build_error(&self, ccx: &ConstCx<'_, 'tcx>, span: Span) -> DiagnosticBuilder<'tcx> {
feature_err(
&ccx.tcx.sess.parse_sess,
sym::const_raw_ptr_deref,
sym::const_mut_refs,
span,
&format!("dereferencing raw pointers in {}s is unstable", ccx.const_kind(),),
&format!("dereferencing raw mutable pointers in {}s is unstable", ccx.const_kind(),),
)
}
}