Skip to content

Commit 202ede1

Browse files
committed
rollup merge of #18523 : bkoropoff/issue-18501
2 parents b3f8b8f + 949dbc1 commit 202ede1

File tree

4 files changed

+61
-11
lines changed

4 files changed

+61
-11
lines changed

src/librustc/middle/astencode.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -441,19 +441,13 @@ impl tr for def::Def {
441441
fn tr(&self, dcx: &DecodeContext) -> def::Def {
442442
match *self {
443443
def::DefFn(did, is_ctor) => def::DefFn(did.tr(dcx), is_ctor),
444-
def::DefStaticMethod(did, wrapped_did2) => {
445-
def::DefStaticMethod(did.tr(dcx),
446-
match wrapped_did2 {
447-
def::FromTrait(did2) => {
448-
def::FromTrait(did2.tr(dcx))
449-
}
450-
def::FromImpl(did2) => {
451-
def::FromImpl(did2.tr(dcx))
452-
}
453-
})
444+
def::DefStaticMethod(did, p) => {
445+
def::DefStaticMethod(did.tr(dcx), p.map(|did2| did2.tr(dcx)))
454446
}
455447
def::DefMethod(did0, did1, p) => {
456-
def::DefMethod(did0.tr(dcx), did1.map(|did1| did1.tr(dcx)), p)
448+
def::DefMethod(did0.tr(dcx),
449+
did1.map(|did1| did1.tr(dcx)),
450+
p.map(|did2| did2.tr(dcx)))
457451
}
458452
def::DefSelfTy(nid) => { def::DefSelfTy(dcx.tr_id(nid)) }
459453
def::DefMod(did) => { def::DefMod(did.tr(dcx)) }

src/librustc/middle/def.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ pub enum MethodProvenance {
5555
FromImpl(ast::DefId),
5656
}
5757

58+
impl MethodProvenance {
59+
pub fn map(self, f: |ast::DefId| -> ast::DefId) -> MethodProvenance {
60+
match self {
61+
FromTrait(did) => FromTrait(f(did)),
62+
FromImpl(did) => FromImpl(f(did))
63+
}
64+
}
65+
}
66+
5867
impl Def {
5968
pub fn def_id(&self) -> ast::DefId {
6069
match *self {

src/test/auxiliary/issue-18501.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
#![crate_type = "rlib"]
12+
struct Foo;
13+
14+
trait Tr {
15+
fn tr(&self);
16+
}
17+
18+
impl Tr for Foo {
19+
fn tr(&self) {}
20+
}
21+
22+
fn take_method<T>(f: fn(&T), t: &T) {}
23+
24+
#[inline]
25+
pub fn pass_method() {
26+
take_method(Tr::tr, &Foo);
27+
}

src/test/run-pass/issue-18501.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// Test that we don't ICE when inlining a function from another
12+
// crate that uses a trait method as a value due to incorrectly
13+
// translating the def ID of the trait during AST decoding.
14+
15+
// aux-build:issue-18501.rs
16+
extern crate "issue-18501" as issue;
17+
18+
fn main() {
19+
issue::pass_method();
20+
}

0 commit comments

Comments
 (0)