mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 00:34:06 +00:00
Check freeze with right param-env
This commit is contained in:
parent
8a778ca1e3
commit
e28e19034f
@ -9,7 +9,7 @@ use rustc_hir::def_id::LocalDefId;
|
||||
use rustc_index::bit_set::BitSet;
|
||||
use rustc_middle::mir::visit::{NonMutatingUseContext, PlaceContext, Visitor};
|
||||
use rustc_middle::mir::{Body, Local, Location, Operand, Terminator, TerminatorKind, RETURN_PLACE};
|
||||
use rustc_middle::ty::{self, DeducedParamAttrs, ParamEnv, Ty, TyCtxt};
|
||||
use rustc_middle::ty::{self, DeducedParamAttrs, Ty, TyCtxt};
|
||||
use rustc_session::config::OptLevel;
|
||||
|
||||
/// A visitor that determines which arguments have been mutated. We can't use the mutability field
|
||||
@ -198,11 +198,12 @@ pub fn deduced_param_attrs<'tcx>(
|
||||
// see [1].
|
||||
//
|
||||
// [1]: https://github.com/rust-lang/rust/pull/103172#discussion_r999139997
|
||||
let param_env = tcx.param_env_reveal_all_normalized(def_id);
|
||||
let mut deduced_param_attrs = tcx.arena.alloc_from_iter(
|
||||
body.local_decls.iter().skip(1).take(body.arg_count).enumerate().map(
|
||||
|(arg_index, local_decl)| DeducedParamAttrs {
|
||||
read_only: !deduce_read_only.mutable_args.contains(arg_index)
|
||||
&& local_decl.ty.is_freeze(tcx, ParamEnv::reveal_all()),
|
||||
&& local_decl.ty.is_freeze(tcx, param_env),
|
||||
},
|
||||
),
|
||||
);
|
||||
|
19
tests/ui/codegen/freeze-on-polymorphic-projection.rs
Normal file
19
tests/ui/codegen/freeze-on-polymorphic-projection.rs
Normal file
@ -0,0 +1,19 @@
|
||||
// build-pass
|
||||
// compile-flags: -Copt-level=1 --crate-type=lib
|
||||
|
||||
#![feature(specialization)]
|
||||
//~^ WARN the feature `specialization` is incomplete
|
||||
|
||||
pub unsafe trait Storage {
|
||||
type Handle;
|
||||
}
|
||||
|
||||
pub unsafe trait MultipleStorage: Storage {}
|
||||
|
||||
default unsafe impl<S> Storage for S where S: MultipleStorage {}
|
||||
|
||||
// Make sure that we call is_freeze on `(S::Handle,)` in the param-env of `ice`,
|
||||
// instead of in an empty, reveal-all param-env.
|
||||
pub fn ice<S: Storage>(boxed: (S::Handle,)) -> (S::Handle,) {
|
||||
boxed
|
||||
}
|
12
tests/ui/codegen/freeze-on-polymorphic-projection.stderr
Normal file
12
tests/ui/codegen/freeze-on-polymorphic-projection.stderr
Normal file
@ -0,0 +1,12 @@
|
||||
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/freeze-on-polymorphic-projection.rs:4:12
|
||||
|
|
||||
LL | #![feature(specialization)]
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #31844 <https://github.com/rust-lang/rust/issues/31844> for more information
|
||||
= help: consider using `min_specialization` instead, which is more stable and complete
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
Loading…
Reference in New Issue
Block a user