about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2014-11-02 18:45:22 -0800
committerAlex Crichton <alex@alexcrichton.com>2014-11-03 08:31:46 -0800
commit202ede19d9d090c1b1eb4073811aec9a6e37b498 (patch)
tree52bd4151b2cc2d4071b97e7c21671a071cdfef15
parentb3f8b8f2381d96932bea1dafd2c877090d267424 (diff)
parent949dbc11ffe5767ae744d40b7eb4b5fa9204b9b1 (diff)
downloadrust-202ede19d9d090c1b1eb4073811aec9a6e37b498.tar.gz
rust-202ede19d9d090c1b1eb4073811aec9a6e37b498.zip
rollup merge of #18523 : bkoropoff/issue-18501
-rw-r--r--src/librustc/middle/astencode.rs16
-rw-r--r--src/librustc/middle/def.rs9
-rw-r--r--src/test/auxiliary/issue-18501.rs27
-rw-r--r--src/test/run-pass/issue-18501.rs20
4 files changed, 61 insertions, 11 deletions
diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs
index 3d2bd763a14..988f7d46f5f 100644
--- a/src/librustc/middle/astencode.rs
+++ b/src/librustc/middle/astencode.rs
@@ -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)) }
diff --git a/src/librustc/middle/def.rs b/src/librustc/middle/def.rs
index a71f714a2ef..160bb2238e7 100644
--- a/src/librustc/middle/def.rs
+++ b/src/librustc/middle/def.rs
@@ -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 {
diff --git a/src/test/auxiliary/issue-18501.rs b/src/test/auxiliary/issue-18501.rs
new file mode 100644
index 00000000000..af3bc20378c
--- /dev/null
+++ b/src/test/auxiliary/issue-18501.rs
@@ -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);
+}
diff --git a/src/test/run-pass/issue-18501.rs b/src/test/run-pass/issue-18501.rs
new file mode 100644
index 00000000000..ce026942948
--- /dev/null
+++ b/src/test/run-pass/issue-18501.rs
@@ -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();
+}