|
1 | 1 | use std::mem; |
2 | 2 |
|
3 | | -use rustc_ast::visit::FnKind; |
| 3 | +use rustc_ast::visit::{BoundKind, FnKind}; |
4 | 4 | use rustc_ast::*; |
5 | 5 | use rustc_attr_parsing::{AttributeParser, Early, OmitDoc, ShouldEmit}; |
6 | 6 | use rustc_expand::expand::AstFragment; |
@@ -311,6 +311,19 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> { |
311 | 311 | } |
312 | 312 | } |
313 | 313 |
|
| 314 | + fn visit_where_bound_predicate(&mut self, pred: &'a WhereBoundPredicate) { |
| 315 | + let prev = self.resolver.visit_non_lifetime_binder.enter_where_bound_predicate(); |
| 316 | + for generic_param in &pred.bound_generic_params { |
| 317 | + self.visit_generic_param(&generic_param); |
| 318 | + } |
| 319 | + self.resolver.visit_non_lifetime_binder = prev; |
| 320 | + |
| 321 | + self.visit_ty(&pred.bounded_ty); |
| 322 | + for generic_bound in &pred.bounds { |
| 323 | + self.visit_param_bound(generic_bound, BoundKind::Bound); |
| 324 | + } |
| 325 | + } |
| 326 | + |
314 | 327 | fn visit_variant_data(&mut self, data: &'a VariantData) { |
315 | 328 | // The assumption here is that non-`cfg` macro expansion cannot change field indices. |
316 | 329 | // It currently holds because only inert attributes are accepted on fields, |
@@ -339,10 +352,32 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> { |
339 | 352 | // |
340 | 353 | // In that case, the impl-trait is lowered as an additional generic parameter. |
341 | 354 | self.with_impl_trait(ImplTraitContext::Universal, |this| { |
342 | | - visit::walk_generic_param(this, param) |
| 355 | + this.visit_id(param.id); |
| 356 | + this.visit_ident(¶m.ident); |
| 357 | + for attr in ¶m.attrs { |
| 358 | + this.visit_attribute(attr) |
| 359 | + } |
| 360 | + |
| 361 | + let prev = this.resolver.visit_non_lifetime_binder.enter_generic_bound(); |
| 362 | + for bound in ¶m.bounds { |
| 363 | + this.visit_param_bound(bound, BoundKind::Bound); |
| 364 | + } |
| 365 | + this.resolver.visit_non_lifetime_binder = prev; |
| 366 | + |
| 367 | + this.visit_generic_param_kind(¶m.kind); |
343 | 368 | }); |
344 | 369 | } |
345 | 370 |
|
| 371 | + fn visit_poly_trait_ref(&mut self, poly_trait_ref: &'a PolyTraitRef) { |
| 372 | + let prev = self.resolver.visit_non_lifetime_binder.enter_where_bound_predicate(); |
| 373 | + for generic_param in &poly_trait_ref.bound_generic_params { |
| 374 | + self.visit_generic_param(&generic_param); |
| 375 | + } |
| 376 | + self.resolver.visit_non_lifetime_binder = prev; |
| 377 | + |
| 378 | + self.visit_trait_ref(&poly_trait_ref.trait_ref); |
| 379 | + } |
| 380 | + |
346 | 381 | fn visit_assoc_item(&mut self, i: &'a AssocItem, ctxt: visit::AssocCtxt) { |
347 | 382 | let (ident, def_kind) = match &i.kind { |
348 | 383 | AssocItemKind::Fn(box Fn { ident, .. }) |
@@ -372,6 +407,12 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> { |
372 | 407 | if !self.resolver.tcx.features().min_generic_const_args() { |
373 | 408 | let parent = |
374 | 409 | self.create_def(constant.id, None, DefKind::AnonConst, constant.value.span); |
| 410 | + |
| 411 | + if self.resolver.visit_non_lifetime_binder.in_generic_bound() { |
| 412 | + // Record anno const blocks inside non-lifetime binders, e.g., `for<T: Trait<{ ... }>>`. |
| 413 | + self.resolver.hirless_def_ids.insert(parent); |
| 414 | + } |
| 415 | + |
375 | 416 | return self.with_parent(parent, |this| visit::walk_anon_const(this, constant)); |
376 | 417 | } |
377 | 418 |
|
|
0 commit comments