]>
Commit | Line | Data |
---|---|---|
dfeec247 XL |
1 | use rustc_errors::struct_span_err; |
2 | use rustc_hir as hir; | |
3 | use rustc_hir::itemlikevisit::ItemLikeVisitor; | |
ba9703b0 | 4 | use rustc_middle::ty::TyCtxt; |
dfeec247 | 5 | use rustc_span::symbol::sym; |
60c5eb7d | 6 | |
416331ca | 7 | pub fn test_variance(tcx: TyCtxt<'_>) { |
c295e0f8 | 8 | tcx.hir().visit_all_item_likes(&mut VarianceTest { tcx }); |
7cac9316 XL |
9 | } |
10 | ||
dc9dc135 XL |
11 | struct VarianceTest<'tcx> { |
12 | tcx: TyCtxt<'tcx>, | |
7cac9316 XL |
13 | } |
14 | ||
dc9dc135 | 15 | impl ItemLikeVisitor<'tcx> for VarianceTest<'tcx> { |
dfeec247 | 16 | fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { |
7cac9316 XL |
17 | // For unit testing: check for a special "rustc_variance" |
18 | // attribute and report an error with various results if found. | |
6a06907d XL |
19 | if self.tcx.has_attr(item.def_id.to_def_id(), sym::rustc_variance) { |
20 | let variances_of = self.tcx.variances_of(item.def_id); | |
dfeec247 | 21 | struct_span_err!(self.tcx.sess, item.span, E0208, "{:?}", variances_of).emit(); |
7cac9316 XL |
22 | } |
23 | } | |
24 | ||
dfeec247 XL |
25 | fn visit_trait_item(&mut self, _: &'tcx hir::TraitItem<'tcx>) {} |
26 | fn visit_impl_item(&mut self, _: &'tcx hir::ImplItem<'tcx>) {} | |
fc512014 | 27 | fn visit_foreign_item(&mut self, _: &'tcx hir::ForeignItem<'tcx>) {} |
7cac9316 | 28 | } |