Include ForeignItem when visiting types for WF check · rust-lang/rust@f725b97 (original) (raw)

File tree

3 files changed

lines changed

3 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
1 1 use crate::collect::ItemCtxt;
2 2 use rustc_hir as hir;
3 3 use rustc_hir::intravisit::{self, Visitor};
4 -use rustc_hir::HirId;
4 +use rustc_hir::{ForeignItem, ForeignItemKind, HirId};
5 5 use rustc_infer::infer::TyCtxtInferExt;
6 6 use rustc_infer::traits::TraitEngine;
7 7 use rustc_infer::traits::{ObligationCause, WellFormedLoc};
@@ -141,6 +141,9 @@ fn diagnostic_hir_wf_check<'tcx>(
141 141 ref item => bug!("Unexpected item {:?}", item),
142 142 },
143 143 hir::Node::Field(field) => Some(field.ty),
144 + hir::Node::ForeignItem(ForeignItem {
145 +kind: ForeignItemKind::Static(ty, _), ..
146 +}) => Some(*ty),
144 147 ref node => bug!("Unexpected node {:?}", node),
145 148 },
146 149 WellFormedLoc::Param { function: _, param_idx } => {
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
1 +// Regression test for the ICE described in #95665.
2 +// Ensure that the expected error is output (and thus that there is no ICE)
3 +
4 +pub trait Trait: {}
5 +
6 +pub struct Struct<T: Trait> {
7 +member: T,
8 +}
9 +
10 +// uncomment and bug goes away
11 +// impl Trait for u8 {}
12 +
13 +extern "C" {
14 +static VAR: Struct<u8>;
15 +//~^ 14:17: 14:27: the trait bound `u8: Trait` is not satisfied [E0277]
16 +}
17 +
18 +fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
1 +error[E0277]: the trait bound `u8: Trait` is not satisfied
2 + --> $DIR/issue-95665.rs:14:17
3 + |
4 +LL | static VAR: Struct;
5 + | ^^^^^^^^^^ the trait `Trait` is not implemented for `u8`
6 + |
7 +note: required by a bound in `Struct`
8 + --> $DIR/issue-95665.rs:6:22
9 + |
10 +LL | pub struct Struct<T: Trait> {
11 + | ^^^^^ required by this bound in `Struct`
12 +
13 +error: aborting due to previous error
14 +
15 +For more information about this error, try `rustc --explain E0277`.