rustc_middle/middle/
deduced_param_attrs.rs1use rustc_macros::{Decodable, Encodable, HashStable};
2
3use crate::ty::{Ty, TyCtxt, TypingEnv};
4
5#[derive(Clone, Copy, PartialEq, Debug, Decodable, Encodable, HashStable)]
8pub struct DeducedReadOnlyParam(u8);
9
10bitflags::bitflags! {
11 impl DeducedReadOnlyParam: u8 {
12 const IF_NO_DROP = 1 << 0;
14 const IF_FREEZE = 1 << 1;
16 const MUTATED = 1 << 2;
18 }
19}
20
21#[derive(Clone, Copy, PartialEq, Debug, Decodable, Encodable, HashStable)]
30pub struct DeducedParamAttrs {
31 pub read_only: DeducedReadOnlyParam,
33}
34
35impl Default for DeducedParamAttrs {
37 #[inline]
38 fn default() -> DeducedParamAttrs {
39 DeducedParamAttrs { read_only: DeducedReadOnlyParam::MUTATED }
40 }
41}
42
43impl DeducedParamAttrs {
44 #[inline]
45 pub fn is_default(self) -> bool {
46 self.read_only.contains(DeducedReadOnlyParam::MUTATED)
47 }
48
49 pub fn read_only<'tcx>(
50 &self,
51 tcx: TyCtxt<'tcx>,
52 typing_env: TypingEnv<'tcx>,
53 ty: Ty<'tcx>,
54 ) -> bool {
55 let read_only = self.read_only;
56 if read_only.contains(DeducedReadOnlyParam::MUTATED) {
58 return false;
59 }
60 if read_only.contains(DeducedReadOnlyParam::IF_NO_DROP) && ty.needs_drop(tcx, typing_env) {
61 return false;
62 }
63 if read_only.contains(DeducedReadOnlyParam::IF_FREEZE) && !ty.is_freeze(tcx, typing_env) {
64 return false;
65 }
66 true
67 }
68}