Skip to content

Commit e181139

Browse files
authored
Rollup merge of rust-lang#61570 - varkor:infer-const-arg, r=eddyb
Fix issues with const argument inference Fixes rust-lang#60724. Fixes rust-lang#61346. r? @eddyb
2 parents 22244cf + f11e6f7 commit e181139

12 files changed

+186
-89
lines changed

src/librustc/hir/lowering.rs

+11-10
Original file line numberDiff line numberDiff line change
@@ -2168,7 +2168,7 @@ impl<'a> LoweringContext<'a> {
21682168
itctx: ImplTraitContext<'_>,
21692169
explicit_owner: Option<NodeId>,
21702170
) -> hir::PathSegment {
2171-
let (mut generic_args, infer_types) = if let Some(ref generic_args) = segment.args {
2171+
let (mut generic_args, infer_args) = if let Some(ref generic_args) = segment.args {
21722172
let msg = "parenthesized type parameters may only be used with a `Fn` trait";
21732173
match **generic_args {
21742174
GenericArgs::AngleBracketed(ref data) => {
@@ -2230,17 +2230,17 @@ impl<'a> LoweringContext<'a> {
22302230
.collect();
22312231
if expected_lifetimes > 0 && param_mode == ParamMode::Explicit {
22322232
let anon_lt_suggestion = vec!["'_"; expected_lifetimes].join(", ");
2233-
let no_ty_args = generic_args.args.len() == expected_lifetimes;
2233+
let no_non_lt_args = generic_args.args.len() == expected_lifetimes;
22342234
let no_bindings = generic_args.bindings.is_empty();
2235-
let (incl_angl_brckt, insertion_span, suggestion) = if no_ty_args && no_bindings {
2235+
let (incl_angl_brckt, insertion_sp, suggestion) = if no_non_lt_args && no_bindings {
22362236
// If there are no (non-implicit) generic args or associated type
22372237
// bindings, our suggestion includes the angle brackets.
22382238
(true, path_span.shrink_to_hi(), format!("<{}>", anon_lt_suggestion))
22392239
} else {
22402240
// Otherwise (sorry, this is kind of gross) we need to infer the
22412241
// place to splice in the `'_, ` from the generics that do exist.
22422242
let first_generic_span = first_generic_span
2243-
.expect("already checked that type args or bindings exist");
2243+
.expect("already checked that non-lifetime args or bindings exist");
22442244
(false, first_generic_span.shrink_to_lo(), format!("{}, ", anon_lt_suggestion))
22452245
};
22462246
match self.anonymous_lifetime_mode {
@@ -2263,7 +2263,7 @@ impl<'a> LoweringContext<'a> {
22632263
expected_lifetimes,
22642264
path_span,
22652265
incl_angl_brckt,
2266-
insertion_span,
2266+
insertion_sp,
22672267
suggestion,
22682268
);
22692269
err.emit();
@@ -2280,7 +2280,7 @@ impl<'a> LoweringContext<'a> {
22802280
expected_lifetimes,
22812281
path_span,
22822282
incl_angl_brckt,
2283-
insertion_span,
2283+
insertion_sp,
22842284
suggestion,
22852285
)
22862286
);
@@ -2305,7 +2305,7 @@ impl<'a> LoweringContext<'a> {
23052305
Some(id),
23062306
Some(self.lower_res(res)),
23072307
generic_args,
2308-
infer_types,
2308+
infer_args,
23092309
)
23102310
}
23112311

@@ -2316,9 +2316,10 @@ impl<'a> LoweringContext<'a> {
23162316
mut itctx: ImplTraitContext<'_>,
23172317
) -> (hir::GenericArgs, bool) {
23182318
let &AngleBracketedArgs { ref args, ref constraints, .. } = data;
2319-
let has_types = args.iter().any(|arg| match arg {
2319+
let has_non_lt_args = args.iter().any(|arg| match arg {
2320+
ast::GenericArg::Lifetime(_) => false,
23202321
ast::GenericArg::Type(_) => true,
2321-
_ => false,
2322+
ast::GenericArg::Const(_) => true,
23222323
});
23232324
(
23242325
hir::GenericArgs {
@@ -2328,7 +2329,7 @@ impl<'a> LoweringContext<'a> {
23282329
.collect(),
23292330
parenthesized: false,
23302331
},
2331-
!has_types && param_mode == ParamMode::Optional
2332+
!has_non_lt_args && param_mode == ParamMode::Optional
23322333
)
23332334
}
23342335

src/librustc/hir/mod.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ pub struct PathSegment {
348348
/// This only applies to expression and pattern paths, and
349349
/// out of those only the segments with no type parameters
350350
/// to begin with, e.g., `Vec::new` is `<Vec<..>>::new::<..>`.
351-
pub infer_types: bool,
351+
pub infer_args: bool,
352352
}
353353

354354
impl PathSegment {
@@ -358,7 +358,7 @@ impl PathSegment {
358358
ident,
359359
hir_id: None,
360360
res: None,
361-
infer_types: true,
361+
infer_args: true,
362362
args: None,
363363
}
364364
}
@@ -368,13 +368,13 @@ impl PathSegment {
368368
hir_id: Option<HirId>,
369369
res: Option<Res>,
370370
args: GenericArgs,
371-
infer_types: bool,
371+
infer_args: bool,
372372
) -> Self {
373373
PathSegment {
374374
ident,
375375
hir_id,
376376
res,
377-
infer_types,
377+
infer_args,
378378
args: if args.is_empty() {
379379
None
380380
} else {

src/librustc/hir/print.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -1196,7 +1196,7 @@ impl<'a> State<'a> {
11961196

11971197
segment.with_generic_args(|generic_args| {
11981198
if !generic_args.args.is_empty() || !generic_args.bindings.is_empty() {
1199-
return self.print_generic_args(&generic_args, segment.infer_types, true);
1199+
return self.print_generic_args(&generic_args, segment.infer_args, true);
12001200
}
12011201
Ok(())
12021202
})?;
@@ -1561,7 +1561,7 @@ impl<'a> State<'a> {
15611561
if segment.ident.name != kw::PathRoot {
15621562
self.print_ident(segment.ident)?;
15631563
segment.with_generic_args(|generic_args| {
1564-
self.print_generic_args(generic_args, segment.infer_types,
1564+
self.print_generic_args(generic_args, segment.infer_args,
15651565
colons_before_params)
15661566
})?;
15671567
}
@@ -1574,7 +1574,7 @@ impl<'a> State<'a> {
15741574
if segment.ident.name != kw::PathRoot {
15751575
self.print_ident(segment.ident)?;
15761576
segment.with_generic_args(|generic_args| {
1577-
self.print_generic_args(generic_args, segment.infer_types, false)
1577+
self.print_generic_args(generic_args, segment.infer_args, false)
15781578
})?;
15791579
}
15801580
Ok(())
@@ -1602,7 +1602,7 @@ impl<'a> State<'a> {
16021602
self.print_ident(segment.ident)?;
16031603
segment.with_generic_args(|generic_args| {
16041604
self.print_generic_args(generic_args,
1605-
segment.infer_types,
1605+
segment.infer_args,
16061606
colons_before_params)
16071607
})?;
16081608
}
@@ -1614,7 +1614,7 @@ impl<'a> State<'a> {
16141614
self.print_ident(item_segment.ident)?;
16151615
item_segment.with_generic_args(|generic_args| {
16161616
self.print_generic_args(generic_args,
1617-
item_segment.infer_types,
1617+
item_segment.infer_args,
16181618
colons_before_params)
16191619
})
16201620
}
@@ -1626,7 +1626,7 @@ impl<'a> State<'a> {
16261626
self.print_ident(item_segment.ident)?;
16271627
item_segment.with_generic_args(|generic_args| {
16281628
self.print_generic_args(generic_args,
1629-
item_segment.infer_types,
1629+
item_segment.infer_args,
16301630
colons_before_params)
16311631
})
16321632
}
@@ -1635,7 +1635,7 @@ impl<'a> State<'a> {
16351635

16361636
fn print_generic_args(&mut self,
16371637
generic_args: &hir::GenericArgs,
1638-
infer_types: bool,
1638+
infer_args: bool,
16391639
colons_before_params: bool)
16401640
-> io::Result<()> {
16411641
if generic_args.parenthesized {
@@ -1681,7 +1681,7 @@ impl<'a> State<'a> {
16811681

16821682
// FIXME(eddyb): this would leak into error messages (e.g.,
16831683
// "non-exhaustive patterns: `Some::<..>(_)` not covered").
1684-
if infer_types && false {
1684+
if infer_args && false {
16851685
start_or_comma(self)?;
16861686
self.s.word("..")?;
16871687
}

0 commit comments

Comments
 (0)