Skip to content

Commit ab36a2f

Browse files
Revert "Unify tcx.constness and param env constness checks"
This reverts commit bef8681. This reverts commit c646c4d.
1 parent cb94675 commit ab36a2f

File tree

3 files changed

+99
-98
lines changed

3 files changed

+99
-98
lines changed

compiler/rustc_const_eval/src/const_eval/fn_queries.rs

+16-56
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ pub fn is_parent_const_impl_raw(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
2525
/// report whether said intrinsic has a `rustc_const_{un,}stable` attribute. Otherwise, return
2626
/// `Constness::NotConst`.
2727
fn constness(tcx: TyCtxt<'_>, def_id: DefId) -> hir::Constness {
28-
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local());
29-
match tcx.hir().get(hir_id) {
30-
hir::Node::Ctor(_) => hir::Constness::Const,
28+
let def_id = def_id.expect_local();
29+
let node = tcx.hir().get_by_def_id(def_id);
3130

31+
match node {
32+
hir::Node::Ctor(_) => hir::Constness::Const,
33+
hir::Node::Item(hir::Item { kind: hir::ItemKind::Impl(impl_), .. }) => impl_.constness,
3234
hir::Node::ForeignItem(hir::ForeignItem { kind: hir::ForeignItemKind::Fn(..), .. }) => {
3335
// Intrinsics use `rustc_const_{un,}stable` attributes to indicate constness. All other
3436
// foreign items cannot be evaluated at compile-time.
@@ -39,62 +41,20 @@ fn constness(tcx: TyCtxt<'_>, def_id: DefId) -> hir::Constness {
3941
};
4042
if is_const { hir::Constness::Const } else { hir::Constness::NotConst }
4143
}
44+
_ => {
45+
if let Some(fn_kind) = node.fn_kind() {
46+
if fn_kind.constness() == hir::Constness::Const {
47+
return hir::Constness::Const;
48+
}
4249

43-
hir::Node::TraitItem(hir::TraitItem { kind: hir::TraitItemKind::Fn(..), .. })
44-
if tcx.is_const_default_method(def_id) =>
45-
{
46-
hir::Constness::Const
47-
}
48-
49-
hir::Node::Item(hir::Item { kind: hir::ItemKind::Const(..), .. })
50-
| hir::Node::Item(hir::Item { kind: hir::ItemKind::Static(..), .. })
51-
| hir::Node::TraitItem(hir::TraitItem { kind: hir::TraitItemKind::Const(..), .. })
52-
| hir::Node::AnonConst(_)
53-
| hir::Node::ImplItem(hir::ImplItem { kind: hir::ImplItemKind::Const(..), .. })
54-
| hir::Node::ImplItem(hir::ImplItem {
55-
kind:
56-
hir::ImplItemKind::Fn(
57-
hir::FnSig {
58-
header: hir::FnHeader { constness: hir::Constness::Const, .. },
59-
..
60-
},
61-
..,
62-
),
63-
..
64-
}) => hir::Constness::Const,
65-
66-
hir::Node::ImplItem(hir::ImplItem {
67-
kind: hir::ImplItemKind::Type(..) | hir::ImplItemKind::Fn(..),
68-
..
69-
}) => {
70-
let parent_hir_id = tcx.hir().get_parent_node(hir_id);
71-
match tcx.hir().get(parent_hir_id) {
72-
hir::Node::Item(hir::Item {
73-
kind: hir::ItemKind::Impl(hir::Impl { constness, .. }),
74-
..
75-
}) => *constness,
76-
_ => span_bug!(
77-
tcx.def_span(parent_hir_id.owner),
78-
"impl item's parent node is not an impl",
79-
),
50+
// If the function itself is not annotated with `const`, it may still be a `const fn`
51+
// if it resides in a const trait impl.
52+
let is_const = is_parent_const_impl_raw(tcx, def_id);
53+
if is_const { hir::Constness::Const } else { hir::Constness::NotConst }
54+
} else {
55+
hir::Constness::NotConst
8056
}
8157
}
82-
83-
hir::Node::Item(hir::Item {
84-
kind: hir::ItemKind::Fn(hir::FnSig { header: hir::FnHeader { constness, .. }, .. }, ..),
85-
..
86-
})
87-
| hir::Node::TraitItem(hir::TraitItem {
88-
kind:
89-
hir::TraitItemKind::Fn(hir::FnSig { header: hir::FnHeader { constness, .. }, .. }, ..),
90-
..
91-
})
92-
| hir::Node::Item(hir::Item {
93-
kind: hir::ItemKind::Impl(hir::Impl { constness, .. }),
94-
..
95-
}) => *constness,
96-
97-
_ => hir::Constness::NotConst,
9858
}
9959
}
10060

compiler/rustc_metadata/src/rmeta/encoder.rs

+15-41
Original file line numberDiff line numberDiff line change
@@ -1059,43 +1059,6 @@ fn should_encode_const(def_kind: DefKind) -> bool {
10591059
}
10601060
}
10611061

1062-
fn should_encode_constness(def_kind: DefKind) -> bool {
1063-
match def_kind {
1064-
DefKind::Struct
1065-
| DefKind::Union
1066-
| DefKind::Enum
1067-
| DefKind::Trait
1068-
| DefKind::AssocTy
1069-
| DefKind::Fn
1070-
| DefKind::Const
1071-
| DefKind::Static(..)
1072-
| DefKind::Ctor(..)
1073-
| DefKind::AssocFn
1074-
| DefKind::AssocConst
1075-
| DefKind::AnonConst
1076-
| DefKind::InlineConst
1077-
| DefKind::OpaqueTy
1078-
| DefKind::ImplTraitPlaceholder
1079-
| DefKind::Impl
1080-
| DefKind::Closure
1081-
| DefKind::Generator
1082-
| DefKind::TyAlias => true,
1083-
DefKind::Variant
1084-
| DefKind::TraitAlias
1085-
| DefKind::ForeignTy
1086-
| DefKind::Field
1087-
| DefKind::TyParam
1088-
| DefKind::Mod
1089-
| DefKind::ForeignMod
1090-
| DefKind::ConstParam
1091-
| DefKind::Macro(..)
1092-
| DefKind::Use
1093-
| DefKind::LifetimeParam
1094-
| DefKind::GlobalAsm
1095-
| DefKind::ExternCrate => false,
1096-
}
1097-
}
1098-
10991062
fn should_encode_trait_impl_trait_tys<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> bool {
11001063
if tcx.def_kind(def_id) != DefKind::AssocFn {
11011064
return false;
@@ -1202,9 +1165,6 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
12021165
{
12031166
record!(self.tables.trait_impl_trait_tys[def_id] <- table);
12041167
}
1205-
if should_encode_constness(def_kind) {
1206-
self.tables.constness.set(def_id.index, tcx.constness(def_id));
1207-
}
12081168
}
12091169
let inherent_impls = tcx.crate_inherent_impls(());
12101170
for (def_id, implementations) in inherent_impls.inherent_impls.iter() {
@@ -1232,6 +1192,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
12321192
};
12331193

12341194
record!(self.tables.variant_data[def_id] <- data);
1195+
self.tables.constness.set(def_id.index, hir::Constness::Const);
12351196
record_array!(self.tables.children[def_id] <- variant.fields.iter().map(|f| {
12361197
assert!(f.did.is_local());
12371198
f.did.index
@@ -1259,6 +1220,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
12591220
};
12601221

12611222
record!(self.tables.variant_data[def_id] <- data);
1223+
self.tables.constness.set(def_id.index, hir::Constness::Const);
12621224
if variant.ctor_kind == CtorKind::Fn {
12631225
record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(def_id));
12641226
}
@@ -1322,6 +1284,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
13221284

13231285
record!(self.tables.repr_options[def_id] <- adt_def.repr());
13241286
record!(self.tables.variant_data[def_id] <- data);
1287+
self.tables.constness.set(def_id.index, hir::Constness::Const);
13251288
if variant.ctor_kind == CtorKind::Fn {
13261289
record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(def_id));
13271290
}
@@ -1357,6 +1320,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
13571320
}
13581321
};
13591322
self.tables.asyncness.set(def_id.index, m_sig.header.asyncness);
1323+
self.tables.constness.set(def_id.index, hir::Constness::NotConst);
13601324
}
13611325
ty::AssocKind::Type => {
13621326
self.encode_explicit_item_bounds(def_id);
@@ -1381,6 +1345,13 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
13811345
let hir::ImplItemKind::Fn(ref sig, body) = ast_item.kind else { bug!() };
13821346
self.tables.asyncness.set(def_id.index, sig.header.asyncness);
13831347
record_array!(self.tables.fn_arg_names[def_id] <- self.tcx.hir().body_param_names(body));
1348+
// Can be inside `impl const Trait`, so using sig.header.constness is not reliable
1349+
let constness = if self.tcx.is_const_fn_raw(def_id) {
1350+
hir::Constness::Const
1351+
} else {
1352+
hir::Constness::NotConst
1353+
};
1354+
self.tables.constness.set(def_id.index, constness);
13841355
}
13851356
ty::AssocKind::Const | ty::AssocKind::Type => {}
13861357
}
@@ -1503,6 +1474,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
15031474
hir::ItemKind::Fn(ref sig, .., body) => {
15041475
self.tables.asyncness.set(def_id.index, sig.header.asyncness);
15051476
record_array!(self.tables.fn_arg_names[def_id] <- self.tcx.hir().body_param_names(body));
1477+
self.tables.constness.set(def_id.index, sig.header.constness);
15061478
}
15071479
hir::ItemKind::Macro(ref macro_def, _) => {
15081480
if macro_def.macro_rules {
@@ -1523,6 +1495,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
15231495
hir::ItemKind::Struct(ref struct_def, _) => {
15241496
let adt_def = self.tcx.adt_def(def_id);
15251497
record!(self.tables.repr_options[def_id] <- adt_def.repr());
1498+
self.tables.constness.set(def_id.index, hir::Constness::Const);
15261499

15271500
// Encode def_ids for each field and method
15281501
// for methods, write all the stuff get_trait_method
@@ -1551,8 +1524,9 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
15511524
is_non_exhaustive: variant.is_field_list_non_exhaustive(),
15521525
});
15531526
}
1554-
hir::ItemKind::Impl(hir::Impl { defaultness, .. }) => {
1527+
hir::ItemKind::Impl(hir::Impl { defaultness, constness, .. }) => {
15551528
self.tables.impl_defaultness.set(def_id.index, *defaultness);
1529+
self.tables.constness.set(def_id.index, *constness);
15561530

15571531
let trait_ref = self.tcx.impl_trait_ref(def_id);
15581532
if let Some(trait_ref) = trait_ref {

compiler/rustc_ty_utils/src/ty.rs

+68-1
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,77 @@ fn param_env(tcx: TyCtxt<'_>, def_id: DefId) -> ty::ParamEnv<'_> {
137137
let local_did = def_id.as_local();
138138
let hir_id = local_did.map(|def_id| tcx.hir().local_def_id_to_hir_id(def_id));
139139

140+
let constness = match hir_id {
141+
Some(hir_id) => match tcx.hir().get(hir_id) {
142+
hir::Node::TraitItem(hir::TraitItem { kind: hir::TraitItemKind::Fn(..), .. })
143+
if tcx.is_const_default_method(def_id) =>
144+
{
145+
hir::Constness::Const
146+
}
147+
148+
hir::Node::Item(hir::Item { kind: hir::ItemKind::Const(..), .. })
149+
| hir::Node::Item(hir::Item { kind: hir::ItemKind::Static(..), .. })
150+
| hir::Node::TraitItem(hir::TraitItem {
151+
kind: hir::TraitItemKind::Const(..), ..
152+
})
153+
| hir::Node::AnonConst(_)
154+
| hir::Node::ImplItem(hir::ImplItem { kind: hir::ImplItemKind::Const(..), .. })
155+
| hir::Node::ImplItem(hir::ImplItem {
156+
kind:
157+
hir::ImplItemKind::Fn(
158+
hir::FnSig {
159+
header: hir::FnHeader { constness: hir::Constness::Const, .. },
160+
..
161+
},
162+
..,
163+
),
164+
..
165+
}) => hir::Constness::Const,
166+
167+
hir::Node::ImplItem(hir::ImplItem {
168+
kind: hir::ImplItemKind::Type(..) | hir::ImplItemKind::Fn(..),
169+
..
170+
}) => {
171+
let parent_hir_id = tcx.hir().get_parent_node(hir_id);
172+
match tcx.hir().get(parent_hir_id) {
173+
hir::Node::Item(hir::Item {
174+
kind: hir::ItemKind::Impl(hir::Impl { constness, .. }),
175+
..
176+
}) => *constness,
177+
_ => span_bug!(
178+
tcx.def_span(parent_hir_id.owner),
179+
"impl item's parent node is not an impl",
180+
),
181+
}
182+
}
183+
184+
hir::Node::Item(hir::Item {
185+
kind:
186+
hir::ItemKind::Fn(hir::FnSig { header: hir::FnHeader { constness, .. }, .. }, ..),
187+
..
188+
})
189+
| hir::Node::TraitItem(hir::TraitItem {
190+
kind:
191+
hir::TraitItemKind::Fn(
192+
hir::FnSig { header: hir::FnHeader { constness, .. }, .. },
193+
..,
194+
),
195+
..
196+
})
197+
| hir::Node::Item(hir::Item {
198+
kind: hir::ItemKind::Impl(hir::Impl { constness, .. }),
199+
..
200+
}) => *constness,
201+
202+
_ => hir::Constness::NotConst,
203+
},
204+
None => hir::Constness::NotConst,
205+
};
206+
140207
let unnormalized_env = ty::ParamEnv::new(
141208
tcx.intern_predicates(&predicates),
142209
traits::Reveal::UserFacing,
143-
tcx.constness(def_id),
210+
constness,
144211
);
145212

146213
let body_id =

0 commit comments

Comments
 (0)