Skip to content

Commit 883a4ba

Browse files
committed
Begin to use ConstArgKind::Path for all paths, not just params
The test error changes are undesired and need to be investigated.
1 parent a5c8e99 commit 883a4ba

File tree

8 files changed

+114
-134
lines changed

8 files changed

+114
-134
lines changed

compiler/rustc_ast_lowering/src/lib.rs

+10-47
Original file line numberDiff line numberDiff line change
@@ -2343,56 +2343,19 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
23432343
ty_id: NodeId,
23442344
span: Span,
23452345
) -> &'hir hir::ConstArg<'hir> {
2346-
let ct_kind = match res {
2347-
Res::Def(DefKind::ConstParam, _) => {
2348-
let qpath = self.lower_qpath(
2349-
ty_id,
2350-
&None,
2351-
path,
2352-
ParamMode::Optional,
2353-
AllowReturnTypeNotation::No,
2354-
ImplTraitContext::Disallowed(ImplTraitPosition::Path),
2355-
None,
2356-
);
2357-
hir::ConstArgKind::Path(qpath)
2358-
}
2359-
_ => {
2360-
// Construct an AnonConst where the expr is the "ty"'s path.
2361-
2362-
let parent_def_id = self.current_def_id_parent;
2363-
let node_id = self.next_node_id();
2364-
let span = self.lower_span(span);
2365-
2366-
// Add a definition for the in-band const def.
2367-
let def_id =
2368-
self.create_def(parent_def_id, node_id, kw::Empty, DefKind::AnonConst, span);
2369-
let hir_id = self.lower_node_id(node_id);
2370-
2371-
let path_expr = Expr {
2372-
id: ty_id,
2373-
kind: ExprKind::Path(None, path.clone()),
2374-
span,
2375-
attrs: AttrVec::new(),
2376-
tokens: None,
2377-
};
2378-
2379-
let ct = self.with_new_scopes(span, |this| {
2380-
self.arena.alloc(hir::AnonConst {
2381-
def_id,
2382-
hir_id,
2383-
body: this.with_def_id_parent(def_id, |this| {
2384-
this.lower_const_body(path_expr.span, Some(&path_expr))
2385-
}),
2386-
span,
2387-
})
2388-
});
2389-
hir::ConstArgKind::Anon(ct)
2390-
}
2391-
};
2346+
let qpath = self.lower_qpath(
2347+
ty_id,
2348+
&None,
2349+
path,
2350+
ParamMode::Optional,
2351+
AllowReturnTypeNotation::No,
2352+
ImplTraitContext::Disallowed(ImplTraitPosition::Path),
2353+
None,
2354+
);
23922355

23932356
self.arena.alloc(hir::ConstArg {
23942357
hir_id: self.next_id(),
2395-
kind: ct_kind,
2358+
kind: hir::ConstArgKind::Path(qpath),
23962359
is_desugared_from_effects: false,
23972360
})
23982361
}

compiler/rustc_hir_analysis/src/hir_ty_lowering/generics.rs

+5-10
Original file line numberDiff line numberDiff line change
@@ -115,17 +115,12 @@ fn generic_arg_mismatch_err(
115115
}
116116
}
117117
(GenericArg::Const(cnst), GenericParamDefKind::Type { .. }) => {
118-
// FIXME(min_generic_const_args): once ConstArgKind::Path is used for non-params too,
119-
// this should match against that instead of ::Anon
120-
if let hir::ConstArgKind::Anon(anon) = cnst.kind
121-
&& let body = tcx.hir().body(anon.body)
122-
&& let rustc_hir::ExprKind::Path(rustc_hir::QPath::Resolved(_, path)) =
123-
body.value.kind
118+
if let hir::ConstArgKind::Path(qpath) = cnst.kind
119+
&& let rustc_hir::QPath::Resolved(_, path) = qpath
120+
&& let Res::Def(DefKind::Fn { .. }, id) = path.res
124121
{
125-
if let Res::Def(DefKind::Fn { .. }, id) = path.res {
126-
err.help(format!("`{}` is a function item, not a type", tcx.item_name(id)));
127-
err.help("function item types cannot be named directly");
128-
}
122+
err.help(format!("`{}` is a function item, not a type", tcx.item_name(id)));
123+
err.help("function item types cannot be named directly");
129124
}
130125
}
131126
_ => {}

compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs

+39-18
Original file line numberDiff line numberDiff line change
@@ -2038,41 +2038,62 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
20382038
}
20392039

20402040
match const_arg.kind {
2041-
hir::ConstArgKind::Path(qpath) => {
2042-
// FIXME(min_generic_const_args): for now only params are lowered to ConstArgKind::Path
2043-
self.lower_const_arg_param(qpath, const_arg.hir_id)
2044-
}
2041+
hir::ConstArgKind::Path(qpath) => self.lower_const_arg_path(qpath, const_arg.hir_id),
20452042
hir::ConstArgKind::Anon(anon) => Const::from_anon_const(tcx, anon.def_id),
20462043
}
20472044
}
20482045

2049-
/// Lower a use of a const param to a [`Const`].
2050-
///
2051-
/// IMPORTANT: `qpath` must be a const param, otherwise this will panic
2052-
fn lower_const_arg_param(&self, qpath: hir::QPath<'tcx>, hir_id: HirId) -> Const<'tcx> {
2046+
/// Lower a const path to a [`Const`].
2047+
fn lower_const_arg_path(&self, qpath: hir::QPath<'tcx>, hir_id: HirId) -> Const<'tcx> {
20532048
let tcx = self.tcx();
20542049

2055-
let hir::QPath::Resolved(_, &hir::Path { res: Res::Def(DefKind::ConstParam, def_id), .. }) =
2056-
qpath
2057-
else {
2058-
span_bug!(qpath.span(), "non-param {qpath:?} passed to Const::from_param")
2059-
};
2050+
// TODO: handle path args properly
2051+
match qpath {
2052+
hir::QPath::Resolved(_, &hir::Path { res: Res::Def(DefKind::ConstParam, did), .. }) => {
2053+
self.lower_const_arg_param(did, hir_id)
2054+
}
2055+
hir::QPath::Resolved(
2056+
_,
2057+
&hir::Path { res: Res::Def(DefKind::Fn | DefKind::AssocFn, _), .. },
2058+
) => ty::Const::new_error_with_message(
2059+
tcx,
2060+
qpath.span(),
2061+
"fn's cannot be used as const args",
2062+
),
2063+
hir::QPath::Resolved(_, path @ &hir::Path { res: Res::Def(_, did), .. }) => {
2064+
let (item_segment, _) = path.segments.split_last().unwrap();
2065+
let args = self.lower_generic_args_of_path_segment(path.span, did, item_segment);
2066+
ty::Const::new_unevaluated(tcx, ty::UnevaluatedConst::new(did, args))
2067+
}
2068+
// TODO: type-relative paths
2069+
_ => ty::Const::new_error_with_message(
2070+
tcx,
2071+
qpath.span(),
2072+
"Const::lower_const_arg_path: invalid qpath",
2073+
),
2074+
}
2075+
}
20602076

2061-
match tcx.named_bound_var(hir_id) {
2077+
/// Lower a const param to a [`Const`]. This is only meant as a helper for [`Self::lower_const_arg_path`].
2078+
/// FIXME: dedup with lower_const_param
2079+
fn lower_const_arg_param(&self, param_def_id: DefId, path_hir_id: HirId) -> Const<'tcx> {
2080+
let tcx = self.tcx();
2081+
2082+
match tcx.named_bound_var(path_hir_id) {
20622083
Some(rbv::ResolvedArg::EarlyBound(_)) => {
20632084
// Find the name and index of the const parameter by indexing the generics of
20642085
// the parent item and construct a `ParamConst`.
2065-
let item_def_id = tcx.parent(def_id);
2086+
let item_def_id = tcx.parent(param_def_id);
20662087
let generics = tcx.generics_of(item_def_id);
2067-
let index = generics.param_def_id_to_index[&def_id];
2068-
let name = tcx.item_name(def_id);
2088+
let index = generics.param_def_id_to_index[&param_def_id];
2089+
let name = tcx.item_name(param_def_id);
20692090
ty::Const::new_param(tcx, ty::ParamConst::new(index, name))
20702091
}
20712092
Some(rbv::ResolvedArg::LateBound(debruijn, index, _)) => {
20722093
ty::Const::new_bound(tcx, debruijn, ty::BoundVar::from_u32(index))
20732094
}
20742095
Some(rbv::ResolvedArg::Error(guar)) => ty::Const::new_error(tcx, guar),
2075-
arg => bug!("unexpected bound var resolution for {:?}: {arg:?}", hir_id),
2096+
arg => bug!("unexpected bound var resolution for {:?}: {arg:?}", path_hir_id),
20762097
}
20772098
}
20782099

tests/ui/const-generics/fn-const-param-infer.adt_const_params.stderr

+3-14
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,7 @@ LL | let _ = Checked::<{ generic_arg::<u32> }>;
1313
= note: expected fn pointer `fn(usize) -> _`
1414
found fn item `fn(u32) -> _ {generic_arg::<u32>}`
1515

16-
error[E0282]: type annotations needed
17-
--> $DIR/fn-const-param-infer.rs:35:23
18-
|
19-
LL | let _ = Checked::<generic>;
20-
| ^^^^^^^ cannot infer type of the type parameter `T` declared on the function `generic`
21-
|
22-
help: consider specifying the generic argument
23-
|
24-
LL | let _ = Checked::<generic::<T>>;
25-
| +++++
26-
27-
error: aborting due to 3 previous errors
16+
error: aborting due to 2 previous errors
2817

29-
Some errors have detailed explanations: E0282, E0308, E0741.
30-
For more information about an error, try `rustc --explain E0282`.
18+
Some errors have detailed explanations: E0308, E0741.
19+
For more information about an error, try `rustc --explain E0308`.

tests/ui/const-generics/fn-const-param-infer.full.stderr

+3-14
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,7 @@ LL | let _ = Checked::<{ generic_arg::<u32> }>;
1313
= note: expected fn pointer `fn(usize) -> _`
1414
found fn item `fn(u32) -> _ {generic_arg::<u32>}`
1515

16-
error[E0282]: type annotations needed
17-
--> $DIR/fn-const-param-infer.rs:35:23
18-
|
19-
LL | let _ = Checked::<generic>;
20-
| ^^^^^^^ cannot infer type of the type parameter `T` declared on the function `generic`
21-
|
22-
help: consider specifying the generic argument
23-
|
24-
LL | let _ = Checked::<generic::<T>>;
25-
| +++++
26-
27-
error: aborting due to 3 previous errors
16+
error: aborting due to 2 previous errors
2817

29-
Some errors have detailed explanations: E0282, E0308, E0741.
30-
For more information about an error, try `rustc --explain E0282`.
18+
Some errors have detailed explanations: E0308, E0741.
19+
For more information about an error, try `rustc --explain E0308`.

tests/ui/const-generics/fn-const-param-infer.min.stderr

+2-14
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,6 @@ LL | let _ = Checked::<{ generic_arg::<u32> }>;
1515
= note: expected fn pointer `fn(usize) -> _`
1616
found fn item `fn(u32) -> _ {generic_arg::<u32>}`
1717

18-
error[E0282]: type annotations needed
19-
--> $DIR/fn-const-param-infer.rs:35:23
20-
|
21-
LL | let _ = Checked::<generic>;
22-
| ^^^^^^^ cannot infer type of the type parameter `T` declared on the function `generic`
23-
|
24-
help: consider specifying the generic argument
25-
|
26-
LL | let _ = Checked::<generic::<T>>;
27-
| +++++
28-
29-
error: aborting due to 3 previous errors
18+
error: aborting due to 2 previous errors
3019

31-
Some errors have detailed explanations: E0282, E0308.
32-
For more information about an error, try `rustc --explain E0282`.
20+
For more information about this error, try `rustc --explain E0308`.

tests/ui/const-generics/generic_const_exprs/unevaluated-const-ice-119731.stderr

+8-8
Original file line numberDiff line numberDiff line change
@@ -72,17 +72,17 @@ help: add `#![feature(adt_const_params)]` to the crate attributes to enable more
7272
LL + #![feature(adt_const_params)]
7373
|
7474

75-
error: maximum number of nodes exceeded in constant v20::v17::<v10, v2>::{constant#0}
76-
--> $DIR/unevaluated-const-ice-119731.rs:27:37
75+
error: maximum number of nodes exceeded in constant v20::v2
76+
--> $DIR/unevaluated-const-ice-119731.rs:11:5
7777
|
78-
LL | impl<const v10: usize> v17<v10, v2> {
79-
| ^^
78+
LL | const v2: v11 = [[256; v4]; v4];
79+
| ^^^^^^^^^^^^^
8080

81-
error: maximum number of nodes exceeded in constant v20::v17::<v10, v2>::{constant#0}
82-
--> $DIR/unevaluated-const-ice-119731.rs:27:37
81+
error: maximum number of nodes exceeded in constant v20::v2
82+
--> $DIR/unevaluated-const-ice-119731.rs:11:5
8383
|
84-
LL | impl<const v10: usize> v17<v10, v2> {
85-
| ^^
84+
LL | const v2: v11 = [[256; v4]; v4];
85+
| ^^^^^^^^^^^^^
8686
|
8787
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
8888

+44-9
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,50 @@
1-
error[E0308]: mismatched types
2-
--> $DIR/opaque_types2.rs:13:11
1+
error[E0391]: cycle detected when computing type of `Foo::{opaque#0}`
2+
--> $DIR/opaque_types2.rs:3:12
33
|
44
LL | type Foo = impl Sized;
5-
| ---------- the found opaque type
6-
...
7-
LL | foo::<C>();
8-
| ^ expected `u32`, found opaque type
5+
| ^^^^^^^^^^
96
|
10-
= note: expected type `u32`
11-
found opaque type `Foo`
7+
note: ...which requires computing type of opaque `Foo::{opaque#0}`...
8+
--> $DIR/opaque_types2.rs:3:12
9+
|
10+
LL | type Foo = impl Sized;
11+
| ^^^^^^^^^^
12+
note: ...which requires type-checking `bar`...
13+
--> $DIR/opaque_types2.rs:9:1
14+
|
15+
LL | / fn bar()
16+
LL | | where
17+
LL | | Foo:,
18+
| |_________^
19+
note: ...which requires evaluating type-level constant...
20+
--> $DIR/opaque_types2.rs:7:1
21+
|
22+
LL | const C: Foo = 42;
23+
| ^^^^^^^^^^^^
24+
note: ...which requires const-evaluating + checking `C`...
25+
--> $DIR/opaque_types2.rs:7:1
26+
|
27+
LL | const C: Foo = 42;
28+
| ^^^^^^^^^^^^
29+
note: ...which requires caching mir of `C` for CTFE...
30+
--> $DIR/opaque_types2.rs:7:1
31+
|
32+
LL | const C: Foo = 42;
33+
| ^^^^^^^^^^^^
34+
note: ...which requires elaborating drops for `C`...
35+
--> $DIR/opaque_types2.rs:7:1
36+
|
37+
LL | const C: Foo = 42;
38+
| ^^^^^^^^^^^^
39+
= note: ...which requires normalizing `Foo`...
40+
= note: ...which again requires computing type of `Foo::{opaque#0}`, completing the cycle
41+
note: cycle used when checking that `Foo::{opaque#0}` is well-formed
42+
--> $DIR/opaque_types2.rs:3:12
43+
|
44+
LL | type Foo = impl Sized;
45+
| ^^^^^^^^^^
46+
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
1247

1348
error: aborting due to 1 previous error
1449

15-
For more information about this error, try `rustc --explain E0308`.
50+
For more information about this error, try `rustc --explain E0391`.

0 commit comments

Comments
 (0)