rollup merge of #18523 : bkoropoff/issue-18501
This commit is contained in:
commit
202ede19d9
4 changed files with 61 additions and 11 deletions
|
@ -441,19 +441,13 @@ impl tr for def::Def {
|
|||
fn tr(&self, dcx: &DecodeContext) -> def::Def {
|
||||
match *self {
|
||||
def::DefFn(did, is_ctor) => def::DefFn(did.tr(dcx), is_ctor),
|
||||
def::DefStaticMethod(did, wrapped_did2) => {
|
||||
def::DefStaticMethod(did.tr(dcx),
|
||||
match wrapped_did2 {
|
||||
def::FromTrait(did2) => {
|
||||
def::FromTrait(did2.tr(dcx))
|
||||
}
|
||||
def::FromImpl(did2) => {
|
||||
def::FromImpl(did2.tr(dcx))
|
||||
}
|
||||
})
|
||||
def::DefStaticMethod(did, p) => {
|
||||
def::DefStaticMethod(did.tr(dcx), p.map(|did2| did2.tr(dcx)))
|
||||
}
|
||||
def::DefMethod(did0, did1, p) => {
|
||||
def::DefMethod(did0.tr(dcx), did1.map(|did1| did1.tr(dcx)), p)
|
||||
def::DefMethod(did0.tr(dcx),
|
||||
did1.map(|did1| did1.tr(dcx)),
|
||||
p.map(|did2| did2.tr(dcx)))
|
||||
}
|
||||
def::DefSelfTy(nid) => { def::DefSelfTy(dcx.tr_id(nid)) }
|
||||
def::DefMod(did) => { def::DefMod(did.tr(dcx)) }
|
||||
|
|
|
@ -55,6 +55,15 @@ pub enum MethodProvenance {
|
|||
FromImpl(ast::DefId),
|
||||
}
|
||||
|
||||
impl MethodProvenance {
|
||||
pub fn map(self, f: |ast::DefId| -> ast::DefId) -> MethodProvenance {
|
||||
match self {
|
||||
FromTrait(did) => FromTrait(f(did)),
|
||||
FromImpl(did) => FromImpl(f(did))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Def {
|
||||
pub fn def_id(&self) -> ast::DefId {
|
||||
match *self {
|
||||
|
|
27
src/test/auxiliary/issue-18501.rs
Normal file
27
src/test/auxiliary/issue-18501.rs
Normal file
|
@ -0,0 +1,27 @@
|
|||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![crate_type = "rlib"]
|
||||
struct Foo;
|
||||
|
||||
trait Tr {
|
||||
fn tr(&self);
|
||||
}
|
||||
|
||||
impl Tr for Foo {
|
||||
fn tr(&self) {}
|
||||
}
|
||||
|
||||
fn take_method<T>(f: fn(&T), t: &T) {}
|
||||
|
||||
#[inline]
|
||||
pub fn pass_method() {
|
||||
take_method(Tr::tr, &Foo);
|
||||
}
|
20
src/test/run-pass/issue-18501.rs
Normal file
20
src/test/run-pass/issue-18501.rs
Normal file
|
@ -0,0 +1,20 @@
|
|||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// Test that we don't ICE when inlining a function from another
|
||||
// crate that uses a trait method as a value due to incorrectly
|
||||
// translating the def ID of the trait during AST decoding.
|
||||
|
||||
// aux-build:issue-18501.rs
|
||||
extern crate "issue-18501" as issue;
|
||||
|
||||
fn main() {
|
||||
issue::pass_method();
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue