about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2017-08-25 13:33:15 -0700
committerAlex Crichton <alex@alexcrichton.com>2017-08-25 15:57:05 -0700
commitce322eedff7d665ed3e5ea142ac6bb40d6a72c66 (patch)
tree9c0c63b59ac93a4112e87aa1e06e8c3ca36e8c97 /src/test
parentba65645c78a87f1fa5c6d7132130bb3175fbe68b (diff)
downloadrust-ce322eedff7d665ed3e5ea142ac6bb40d6a72c66.tar.gz
rust-ce322eedff7d665ed3e5ea142ac6bb40d6a72c66.zip
rustc: Fix proc_macro expansions on trait methods
This commit fixes procedural macro attributes being attached to trait methods,
ensuring that they get resolved and expanded as other procedural macro
attributes. The bug here was that `current_module` on the resolver was
accidentally set to be a trait when it's otherwise only ever expecting a
`mod`/block module. The actual fix here came from @jseyfried, I'm just helping
to land it in the compiler!

Closes #42493
Diffstat (limited to 'src/test')
-rw-r--r--src/test/run-pass-fulldeps/proc-macro/attr-on-trait.rs28
-rw-r--r--src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-on-trait.rs25
2 files changed, 53 insertions, 0 deletions
diff --git a/src/test/run-pass-fulldeps/proc-macro/attr-on-trait.rs b/src/test/run-pass-fulldeps/proc-macro/attr-on-trait.rs
new file mode 100644
index 00000000000..8ba38875eff
--- /dev/null
+++ b/src/test/run-pass-fulldeps/proc-macro/attr-on-trait.rs
@@ -0,0 +1,28 @@
+// Copyright 2017 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.
+
+// aux-build:attr-on-trait.rs
+
+#![feature(proc_macro)]
+
+extern crate attr_on_trait;
+
+trait Foo {
+    #[attr_on_trait::foo]
+    fn foo() {}
+}
+
+impl Foo for i32 {
+    fn foo(&self) {}
+}
+
+fn main() {
+    3i32.foo();
+}
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-on-trait.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-on-trait.rs
new file mode 100644
index 00000000000..8e977034027
--- /dev/null
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-on-trait.rs
@@ -0,0 +1,25 @@
+// Copyright 2017 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.
+
+// no-prefer-dynamic
+
+#![feature(proc_macro)]
+#![crate_type = "proc-macro"]
+
+extern crate proc_macro;
+
+use proc_macro::TokenStream;
+
+#[proc_macro_attribute]
+pub fn foo(attr: TokenStream, item: TokenStream) -> TokenStream {
+    drop(attr);
+    assert_eq!(item.to_string(), "fn foo() { }");
+    "fn foo(&self);".parse().unwrap()
+}