FIx ICE on wf check for foreign fns
This commit is contained in:
parent
507bff92fa
commit
7008911080
4 changed files with 50 additions and 1 deletions
|
@ -153,6 +153,7 @@ fn msg_span_from_early_bound_and_free_regions(
|
||||||
Some(Node::Item(it)) => item_scope_tag(&it),
|
Some(Node::Item(it)) => item_scope_tag(&it),
|
||||||
Some(Node::TraitItem(it)) => trait_item_scope_tag(&it),
|
Some(Node::TraitItem(it)) => trait_item_scope_tag(&it),
|
||||||
Some(Node::ImplItem(it)) => impl_item_scope_tag(&it),
|
Some(Node::ImplItem(it)) => impl_item_scope_tag(&it),
|
||||||
|
Some(Node::ForeignItem(it)) => foreign_item_scope_tag(&it),
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
let (prefix, span) = match *region {
|
let (prefix, span) = match *region {
|
||||||
|
@ -233,6 +234,13 @@ fn impl_item_scope_tag(item: &hir::ImplItem<'_>) -> &'static str {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn foreign_item_scope_tag(item: &hir::ForeignItem<'_>) -> &'static str {
|
||||||
|
match item.kind {
|
||||||
|
hir::ForeignItemKind::Fn(..) => "method body",
|
||||||
|
hir::ForeignItemKind::Static(..) | hir::ForeignItemKind::Type => "associated item",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn explain_span(tcx: TyCtxt<'tcx>, heading: &str, span: Span) -> (String, Option<Span>) {
|
fn explain_span(tcx: TyCtxt<'tcx>, heading: &str, span: Span) -> (String, Option<Span>) {
|
||||||
let lo = tcx.sess.source_map().lookup_char_pos(span.lo());
|
let lo = tcx.sess.source_map().lookup_char_pos(span.lo());
|
||||||
(format!("the {} at {}:{}", heading, lo.line, lo.col.to_usize() + 1), Some(span))
|
(format!("the {} at {}:{}", heading, lo.line, lo.col.to_usize() + 1), Some(span))
|
||||||
|
|
|
@ -51,7 +51,7 @@ impl<'tcx> CheckWfFcxBuilder<'tcx> {
|
||||||
let fcx = FnCtxt::new(&inh, param_env, id);
|
let fcx = FnCtxt::new(&inh, param_env, id);
|
||||||
if !inh.tcx.features().trivial_bounds {
|
if !inh.tcx.features().trivial_bounds {
|
||||||
// As predicates are cached rather than obligations, this
|
// As predicates are cached rather than obligations, this
|
||||||
// needsto be called first so that they are checked with an
|
// needs to be called first so that they are checked with an
|
||||||
// empty `param_env`.
|
// empty `param_env`.
|
||||||
check_false_global_bounds(&fcx, span, id);
|
check_false_global_bounds(&fcx, span, id);
|
||||||
}
|
}
|
||||||
|
|
17
src/test/ui/wf/wf-in-foreign-fn-decls-issue-80468.rs
Normal file
17
src/test/ui/wf/wf-in-foreign-fn-decls-issue-80468.rs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// Regression test for #80468.
|
||||||
|
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
pub trait Trait {}
|
||||||
|
|
||||||
|
#[repr(transparent)]
|
||||||
|
pub struct Wrapper<T: Trait>(T);
|
||||||
|
|
||||||
|
#[repr(transparent)]
|
||||||
|
pub struct Ref<'a>(&'a u8);
|
||||||
|
|
||||||
|
impl Trait for Ref {} //~ ERROR: implicit elided lifetime not allowed here
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
pub fn repro(_: Wrapper<Ref>); //~ ERROR: mismatched types
|
||||||
|
}
|
24
src/test/ui/wf/wf-in-foreign-fn-decls-issue-80468.stderr
Normal file
24
src/test/ui/wf/wf-in-foreign-fn-decls-issue-80468.stderr
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
error[E0726]: implicit elided lifetime not allowed here
|
||||||
|
--> $DIR/wf-in-foreign-fn-decls-issue-80468.rs:13:16
|
||||||
|
|
|
||||||
|
LL | impl Trait for Ref {}
|
||||||
|
| ^^^- help: indicate the anonymous lifetime: `<'_>`
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/wf-in-foreign-fn-decls-issue-80468.rs:16:21
|
||||||
|
|
|
||||||
|
LL | pub fn repro(_: Wrapper<Ref>);
|
||||||
|
| ^^^^^^^^^^^^ lifetime mismatch
|
||||||
|
|
|
||||||
|
= note: expected trait `Trait`
|
||||||
|
found trait `Trait`
|
||||||
|
note: the anonymous lifetime #1 defined on the method body at 16:5...
|
||||||
|
--> $DIR/wf-in-foreign-fn-decls-issue-80468.rs:16:5
|
||||||
|
|
|
||||||
|
LL | pub fn repro(_: Wrapper<Ref>);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
= note: ...does not necessarily outlive the static lifetime
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
Loading…
Add table
Add a link
Reference in a new issue