Skip to content

Commit 05467ca

Browse files
committed
Address review comments
1 parent bda2e5c commit 05467ca

File tree

10 files changed

+74
-83
lines changed

10 files changed

+74
-83
lines changed

compiler/rustc_ast_lowering/messages.ftl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ ast_lowering_coroutine_too_many_parameters =
5656
ast_lowering_default_field_in_tuple = default fields are not supported in tuple structs
5757
.label = default fields are only supported on structs
5858
59+
ast_lowering_delegation_cycle_in_signature_resolution = encountered a cycle during delegation signature resolution
60+
ast_lowering_delegation_unresolved_callee = failed to resolve delegation callee
5961
ast_lowering_does_not_support_modifiers =
6062
the `{$class_name}` register class does not support template modifiers
6163
@@ -175,7 +177,6 @@ ast_lowering_underscore_expr_lhs_assign =
175177
176178
ast_lowering_union_default_field_values = unions cannot have default field values
177179
178-
ast_lowering_unresolved_delegation_callee = failed to resolve delegation callee
179180
ast_lowering_unstable_inline_assembly = inline assembly is not stable yet on this architecture
180181
ast_lowering_unstable_inline_assembly_label_operand_with_outputs =
181182
using both label and output operands for inline assembly is unstable

compiler/rustc_ast_lowering/src/delegation.rs

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,13 @@ use rustc_hir::Target;
5050
use rustc_hir::attrs::{AttributeKind, InlineAttr};
5151
use rustc_hir::def_id::{DefId, LocalDefId};
5252
use rustc_middle::span_bug;
53-
use rustc_middle::ty::{
54-
Asyncness, DelegationFnSigAttrs, DelegationResolutionInfo, ResolverAstLowering,
55-
};
53+
use rustc_middle::ty::{Asyncness, DelegationFnSigAttrs, ResolverAstLowering};
5654
use rustc_span::symbol::kw;
5755
use rustc_span::{DUMMY_SP, Ident, Span, Symbol};
5856
use {rustc_ast as ast, rustc_hir as hir};
5957

6058
use super::{GenericArgsMode, ImplTraitContext, LoweringContext, ParamMode};
61-
use crate::errors::UnresolvedDelegationCallee;
59+
use crate::errors::{CycleInDelegationSignatureResolution, UnresolvedDelegationCallee};
6260
use crate::{AllowReturnTypeNotation, ImplTraitPosition, ResolverAstLoweringExt};
6361

6462
pub(crate) struct DelegationResults<'hir> {
@@ -126,10 +124,10 @@ impl<'hir> LoweringContext<'_, 'hir> {
126124
) -> DelegationResults<'hir> {
127125
let span = self.lower_span(delegation.path.segments.last().unwrap().ident.span);
128126

129-
let sig_id = self
130-
.delegation_res_info_or_err(&self.local_def_id(item_id), span)
131-
.map(|info| self.get_delegation_sig_id(info.sig_resolution_id, span))
132-
.flatten();
127+
let sig_id = self.get_delegation_sig_id(
128+
self.get_delegation_sig_node_id(&self.local_def_id(item_id)),
129+
span,
130+
);
133131

134132
match sig_id {
135133
Ok(sig_id) => {
@@ -263,11 +261,14 @@ impl<'hir> LoweringContext<'_, 'hir> {
263261
&& let Some(local_id) = def_id.as_local()
264262
&& !self.resolver.delegation_fn_sigs.contains_key(&local_id)
265263
{
266-
node_id = self.delegation_res_info_or_err(&local_id, span)?.sig_resolution_id;
264+
node_id = self.get_delegation_sig_node_id(&local_id);
267265
if visited.contains(&node_id) {
268266
// We encountered a cycle in the resolution, or delegation callee refers to non-existent
269267
// entity, in this case emit an error.
270-
return Err(self.dcx().emit_err(UnresolvedDelegationCallee { span }));
268+
return Err(match visited.len() {
269+
1 => self.dcx().emit_err(UnresolvedDelegationCallee { span }),
270+
_ => self.dcx().emit_err(CycleInDelegationSignatureResolution { span }),
271+
});
271272
}
272273

273274
continue;
@@ -278,17 +279,12 @@ impl<'hir> LoweringContext<'_, 'hir> {
278279
}
279280
}
280281

281-
fn delegation_res_info_or_err(
282-
&self,
283-
local_id: &LocalDefId,
284-
span: Span,
285-
) -> Result<&DelegationResolutionInfo, ErrorGuaranteed> {
286-
self.resolver.delegation_resolution_info.get(local_id).ok_or_else(|| {
287-
self.tcx.dcx().span_delayed_bug(span, format!(
288-
"There is no information about delegation resolution node id for LocalDefId {:?}",
289-
local_id
290-
))
291-
})
282+
fn get_delegation_sig_node_id(&self, local_id: &LocalDefId) -> NodeId {
283+
*self
284+
.resolver
285+
.delegation_sig_resolution_nodes
286+
.get(local_id)
287+
.expect("All delegations should have signature resolution NodeId")
292288
}
293289

294290
fn opt_get_partial_res_id(&self, node_id: NodeId) -> Option<DefId> {

compiler/rustc_ast_lowering/src/errors.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -477,8 +477,15 @@ pub(crate) struct UnionWithDefault {
477477
}
478478

479479
#[derive(Diagnostic)]
480-
#[diag(ast_lowering_unresolved_delegation_callee)]
480+
#[diag(ast_lowering_delegation_unresolved_callee)]
481481
pub(crate) struct UnresolvedDelegationCallee {
482482
#[primary_span]
483483
pub span: Span,
484484
}
485+
486+
#[derive(Diagnostic)]
487+
#[diag(ast_lowering_delegation_cycle_in_signature_resolution)]
488+
pub(crate) struct CycleInDelegationSignatureResolution {
489+
#[primary_span]
490+
pub span: Span,
491+
}

compiler/rustc_middle/src/ty/mod.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,8 @@ pub struct ResolverAstLowering {
220220

221221
/// Information about functions signatures for delegation items expansion
222222
pub delegation_fn_sigs: LocalDefIdMap<DelegationFnSig>,
223-
pub delegation_resolution_info: LocalDefIdMap<DelegationResolutionInfo>,
223+
// NodeIds for delegation signature resolution
224+
pub delegation_sig_resolution_nodes: LocalDefIdMap<ast::NodeId>,
224225
}
225226

226227
bitflags::bitflags! {
@@ -243,11 +244,6 @@ pub struct DelegationFnSig {
243244
pub to_inherit_attrs: AttrVec,
244245
}
245246

246-
#[derive(Debug)]
247-
pub struct DelegationResolutionInfo {
248-
pub sig_resolution_id: ast::NodeId,
249-
}
250-
251247
#[derive(Clone, Copy, Debug, HashStable)]
252248
pub struct MainDefinition {
253249
pub res: Res<ast::NodeId>,

compiler/rustc_resolve/src/late.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ use rustc_hir::def_id::{CRATE_DEF_ID, DefId, LOCAL_CRATE, LocalDefId};
2929
use rustc_hir::{MissingLifetimeKind, PrimTy, TraitCandidate};
3030
use rustc_middle::middle::resolve_bound_vars::Set1;
3131
use rustc_middle::ty::{
32-
AssocTag, DELEGATION_INHERIT_ATTRS_START, DelegationFnSig, DelegationFnSigAttrs,
33-
DelegationResolutionInfo, Visibility,
32+
AssocTag, DELEGATION_INHERIT_ATTRS_START, DelegationFnSig, DelegationFnSigAttrs, Visibility,
3433
};
3534
use rustc_middle::{bug, span_bug};
3635
use rustc_session::config::{CrateType, ResolveDocLinks};
@@ -3719,14 +3718,10 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
37193718

37203719
self.visit_path(&delegation.path);
37213720

3722-
if let Some(def_id) = self.r.opt_local_def_id(item_id) {
3723-
self.r.delegation_resolution_info.insert(
3724-
def_id,
3725-
DelegationResolutionInfo {
3726-
sig_resolution_id: if is_in_trait_impl { item_id } else { delegation.id },
3727-
},
3728-
);
3729-
}
3721+
self.r.delegation_sig_resolution_nodes.insert(
3722+
self.r.local_def_id(item_id),
3723+
if is_in_trait_impl { item_id } else { delegation.id },
3724+
);
37303725

37313726
let Some(body) = &delegation.body else { return };
37323727
self.with_rib(ValueNS, RibKind::FnOrCoroutine, |this| {

compiler/rustc_resolve/src/lib.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ use rustc_middle::middle::privacy::EffectiveVisibilities;
7070
use rustc_middle::query::Providers;
7171
use rustc_middle::span_bug;
7272
use rustc_middle::ty::{
73-
self, DelegationFnSig, DelegationResolutionInfo, Feed, MainDefinition, RegisteredTools,
74-
ResolverAstLowering, ResolverGlobalCtxt, TyCtxt, TyCtxtFeed, Visibility,
73+
self, DelegationFnSig, Feed, MainDefinition, RegisteredTools, ResolverAstLowering,
74+
ResolverGlobalCtxt, TyCtxt, TyCtxtFeed, Visibility,
7575
};
7676
use rustc_query_system::ich::StableHashingContext;
7777
use rustc_session::config::CrateType;
@@ -1276,7 +1276,7 @@ pub struct Resolver<'ra, 'tcx> {
12761276
/// Amount of lifetime parameters for each item in the crate.
12771277
item_generics_num_lifetimes: FxHashMap<LocalDefId, usize>,
12781278
delegation_fn_sigs: LocalDefIdMap<DelegationFnSig>,
1279-
delegation_resolution_info: LocalDefIdMap<DelegationResolutionInfo>,
1279+
delegation_sig_resolution_nodes: LocalDefIdMap<NodeId>,
12801280

12811281
main_def: Option<MainDefinition> = None,
12821282
trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>,
@@ -1695,7 +1695,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
16951695
current_crate_outer_attr_insert_span,
16961696
mods_with_parse_errors: Default::default(),
16971697
impl_trait_names: Default::default(),
1698-
delegation_resolution_info: Default::default(),
1698+
delegation_sig_resolution_nodes: Default::default(),
16991699
..
17001700
};
17011701

@@ -1824,7 +1824,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
18241824
lifetime_elision_allowed: self.lifetime_elision_allowed,
18251825
lint_buffer: Steal::new(self.lint_buffer),
18261826
delegation_fn_sigs: self.delegation_fn_sigs,
1827-
delegation_resolution_info: self.delegation_resolution_info,
1827+
delegation_sig_resolution_nodes: self.delegation_sig_resolution_nodes,
18281828
};
18291829
ResolverOutputs { global_ctxt, ast_lowering }
18301830
}
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
#![feature(fn_delegation)]
22
#![allow(incomplete_features)]
33

4-
fn foo() {
5-
6-
}
4+
fn foo() {}
75

86
reuse foo as bar;
97
pub reuse bar as goo;

tests/ui/delegation/recursive_delegation_errors.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,46 +11,46 @@ mod first_mod {
1111

1212
mod second_mod {
1313
reuse foo as bar;
14-
//~^ ERROR failed to resolve delegation callee
14+
//~^ ERROR encountered a cycle during delegation signature resolution
1515
reuse bar as foo;
16-
//~^ ERROR failed to resolve delegation callee
16+
//~^ ERROR encountered a cycle during delegation signature resolution
1717

1818
}
1919

2020
mod third_mod {
2121
reuse foo as foo1;
22-
//~^ ERROR failed to resolve delegation callee
22+
//~^ ERROR encountered a cycle during delegation signature resolution
2323
reuse foo1 as foo2;
24-
//~^ ERROR failed to resolve delegation callee
24+
//~^ ERROR encountered a cycle during delegation signature resolution
2525
reuse foo2 as foo3;
26-
//~^ ERROR failed to resolve delegation callee
26+
//~^ ERROR encountered a cycle during delegation signature resolution
2727
reuse foo3 as foo4;
28-
//~^ ERROR failed to resolve delegation callee
28+
//~^ ERROR encountered a cycle during delegation signature resolution
2929
reuse foo4 as foo5;
30-
//~^ ERROR failed to resolve delegation callee
30+
//~^ ERROR encountered a cycle during delegation signature resolution
3131
reuse foo5 as foo;
32-
//~^ ERROR failed to resolve delegation callee
32+
//~^ ERROR encountered a cycle during delegation signature resolution
3333
}
3434

3535
mod fourth_mod {
3636
trait Trait {
3737
reuse Trait::foo as bar;
38-
//~^ ERROR failed to resolve delegation callee
38+
//~^ ERROR encountered a cycle during delegation signature resolution
3939
reuse Trait::bar as foo;
40-
//~^ ERROR failed to resolve delegation callee
40+
//~^ ERROR encountered a cycle during delegation signature resolution
4141
}
4242
}
4343

4444
mod fifth_mod {
4545
reuse super::fifth_mod::{bar as foo, foo as bar};
46-
//~^ ERROR failed to resolve delegation callee
47-
//~| ERROR failed to resolve delegation callee
46+
//~^ ERROR encountered a cycle during delegation signature resolution
47+
//~| ERROR encountered a cycle during delegation signature resolution
4848

4949
trait GlobReuse {
5050
reuse GlobReuse::{foo as bar, bar as goo, goo as foo};
51-
//~^ ERROR failed to resolve delegation callee
52-
//~| ERROR failed to resolve delegation callee
53-
//~| ERROR failed to resolve delegation callee
51+
//~^ ERROR encountered a cycle during delegation signature resolution
52+
//~| ERROR encountered a cycle during delegation signature resolution
53+
//~| ERROR encountered a cycle during delegation signature resolution
5454
}
5555
}
5656

tests/ui/delegation/recursive_delegation_errors.stderr

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,91 +4,91 @@ error: failed to resolve delegation callee
44
LL | reuse foo;
55
| ^^^
66

7-
error: failed to resolve delegation callee
7+
error: encountered a cycle during delegation signature resolution
88
--> $DIR/recursive_delegation_errors.rs:13:11
99
|
1010
LL | reuse foo as bar;
1111
| ^^^
1212

13-
error: failed to resolve delegation callee
13+
error: encountered a cycle during delegation signature resolution
1414
--> $DIR/recursive_delegation_errors.rs:15:11
1515
|
1616
LL | reuse bar as foo;
1717
| ^^^
1818

19-
error: failed to resolve delegation callee
19+
error: encountered a cycle during delegation signature resolution
2020
--> $DIR/recursive_delegation_errors.rs:21:11
2121
|
2222
LL | reuse foo as foo1;
2323
| ^^^
2424

25-
error: failed to resolve delegation callee
25+
error: encountered a cycle during delegation signature resolution
2626
--> $DIR/recursive_delegation_errors.rs:23:11
2727
|
2828
LL | reuse foo1 as foo2;
2929
| ^^^^
3030

31-
error: failed to resolve delegation callee
31+
error: encountered a cycle during delegation signature resolution
3232
--> $DIR/recursive_delegation_errors.rs:25:11
3333
|
3434
LL | reuse foo2 as foo3;
3535
| ^^^^
3636

37-
error: failed to resolve delegation callee
37+
error: encountered a cycle during delegation signature resolution
3838
--> $DIR/recursive_delegation_errors.rs:27:11
3939
|
4040
LL | reuse foo3 as foo4;
4141
| ^^^^
4242

43-
error: failed to resolve delegation callee
43+
error: encountered a cycle during delegation signature resolution
4444
--> $DIR/recursive_delegation_errors.rs:29:11
4545
|
4646
LL | reuse foo4 as foo5;
4747
| ^^^^
4848

49-
error: failed to resolve delegation callee
49+
error: encountered a cycle during delegation signature resolution
5050
--> $DIR/recursive_delegation_errors.rs:31:11
5151
|
5252
LL | reuse foo5 as foo;
5353
| ^^^^
5454

55-
error: failed to resolve delegation callee
55+
error: encountered a cycle during delegation signature resolution
5656
--> $DIR/recursive_delegation_errors.rs:37:22
5757
|
5858
LL | reuse Trait::foo as bar;
5959
| ^^^
6060

61-
error: failed to resolve delegation callee
61+
error: encountered a cycle during delegation signature resolution
6262
--> $DIR/recursive_delegation_errors.rs:39:22
6363
|
6464
LL | reuse Trait::bar as foo;
6565
| ^^^
6666

67-
error: failed to resolve delegation callee
67+
error: encountered a cycle during delegation signature resolution
6868
--> $DIR/recursive_delegation_errors.rs:45:30
6969
|
7070
LL | reuse super::fifth_mod::{bar as foo, foo as bar};
7171
| ^^^
7272

73-
error: failed to resolve delegation callee
73+
error: encountered a cycle during delegation signature resolution
7474
--> $DIR/recursive_delegation_errors.rs:45:42
7575
|
7676
LL | reuse super::fifth_mod::{bar as foo, foo as bar};
7777
| ^^^
7878

79-
error: failed to resolve delegation callee
79+
error: encountered a cycle during delegation signature resolution
8080
--> $DIR/recursive_delegation_errors.rs:50:27
8181
|
8282
LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo};
8383
| ^^^
8484

85-
error: failed to resolve delegation callee
85+
error: encountered a cycle during delegation signature resolution
8686
--> $DIR/recursive_delegation_errors.rs:50:39
8787
|
8888
LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo};
8989
| ^^^
9090

91-
error: failed to resolve delegation callee
91+
error: encountered a cycle during delegation signature resolution
9292
--> $DIR/recursive_delegation_errors.rs:50:51
9393
|
9494
LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo};

0 commit comments

Comments
 (0)