about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJosh Driver <keeperofdakeys@gmail.com>2016-12-31 16:02:06 +1030
committerJosh Driver <keeperofdakeys@gmail.com>2016-12-31 17:19:23 +1030
commit22f788c64417523e838bf367c83f8a426102809a (patch)
tree108a720e81508d25a77606c0ed9118cbb1bebc0e
parent6c9bb42ecc48ffb5a3c8b61e220b11adc3a46384 (diff)
downloadrust-22f788c64417523e838bf367c83f8a426102809a.tar.gz
rust-22f788c64417523e838bf367c83f8a426102809a.zip
Stop macro calls in structs for proc_macro_derive from panicing
-rw-r--r--src/librustc_resolve/macros.rs5
-rw-r--r--src/libsyntax_ext/deriving/custom.rs5
-rw-r--r--src/test/run-pass-fulldeps/proc-macro/auxiliary/derive-nothing.rs24
-rw-r--r--src/test/run-pass-fulldeps/proc-macro/struct-field-macro.rs29
4 files changed, 62 insertions, 1 deletions
diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs
index 44cc580ad12..c7e0b2733f0 100644
--- a/src/librustc_resolve/macros.rs
+++ b/src/librustc_resolve/macros.rs
@@ -29,6 +29,7 @@ use syntax::ext::hygiene::Mark;
 use syntax::ext::tt::macro_rules;
 use syntax::feature_gate::{emit_feature_err, GateIssue};
 use syntax::fold::Folder;
+use syntax::fold;
 use syntax::ptr::P;
 use syntax::symbol::keywords;
 use syntax::util::lev_distance::find_best_match_for_name;
@@ -117,6 +118,10 @@ impl<'a> base::Resolver for Resolver<'a> {
                 }
                 path
             }
+
+            fn fold_mac(&mut self, mac: ast::Mac) -> ast::Mac {
+                fold::noop_fold_mac(mac, self)
+            }
         }
 
         EliminateCrateVar(self).fold_item(item).expect_one("")
diff --git a/src/libsyntax_ext/deriving/custom.rs b/src/libsyntax_ext/deriving/custom.rs
index 6f02a348f91..811aea4a9eb 100644
--- a/src/libsyntax_ext/deriving/custom.rs
+++ b/src/libsyntax_ext/deriving/custom.rs
@@ -12,7 +12,7 @@ use std::panic;
 
 use errors::FatalError;
 use proc_macro::{TokenStream, __internal};
-use syntax::ast::{self, ItemKind, Attribute};
+use syntax::ast::{self, ItemKind, Attribute, Mac};
 use syntax::attr::{mark_used, mark_known};
 use syntax::codemap::Span;
 use syntax::ext::base::*;
@@ -28,6 +28,9 @@ impl<'a> Visitor<'a> for MarkAttrs<'a> {
             mark_known(attr);
         }
     }
+
+    fn visit_mac(&mut self, _mac: &Mac) {
+    }
 }
 
 pub struct CustomDerive {
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/derive-nothing.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/derive-nothing.rs
new file mode 100644
index 00000000000..a9257cb4c8b
--- /dev/null
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/derive-nothing.rs
@@ -0,0 +1,24 @@
+// Copyright 2016 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
+
+#![crate_type = "proc-macro"]
+#![feature(proc_macro)]
+#![feature(proc_macro_lib)]
+
+extern crate proc_macro;
+
+use proc_macro::TokenStream;
+
+#[proc_macro_derive(Nothing)]
+pub fn nothing(input: TokenStream) -> TokenStream {
+    "".parse().unwrap()
+}
diff --git a/src/test/run-pass-fulldeps/proc-macro/struct-field-macro.rs b/src/test/run-pass-fulldeps/proc-macro/struct-field-macro.rs
new file mode 100644
index 00000000000..68da011e5a5
--- /dev/null
+++ b/src/test/run-pass-fulldeps/proc-macro/struct-field-macro.rs
@@ -0,0 +1,29 @@
+// Copyright 2016 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:derive-nothing.rs
+// ignore-stage1
+
+#![feature(proc_macro)]
+
+#[macro_use]
+extern crate derive_nothing;
+
+macro_rules! int {
+    () => { i32 }
+}
+
+#[derive(Nothing)]
+struct S {
+    x: int!(),
+}
+
+fn main() {
+}