diff options
| author | bors <bors@rust-lang.org> | 2016-11-19 13:28:50 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-11-19 13:28:50 -0600 |
| commit | bfa709a38a8c607e1c13ee5635fbfd1940eb18b1 (patch) | |
| tree | bab57c3dd07eec288d6cade2b14b6b4117367b86 | |
| parent | b1da18fe9be180ecfcfb1691c4eb669c496996f5 (diff) | |
| parent | 3254fabf8e4a81a595579fa19abd5ec49bff270d (diff) | |
Auto merge of #37826 - keeperofdakeys:proc-macro-test, r=alexcrichton
Show a better error when using --test with #[proc_macro_derive] Fixes https://github.com/rust-lang/rust/issues/37480 Currently using `--test` with a crate that contains a `#[proc_macro_derive]` attribute causes an error. This PR doesn't attempt to fix the issue itself, or determine what tesing of a proc_macro_derive crate should be - just to provide a better error message.
| -rw-r--r-- | src/librustc_driver/driver.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax_ext/proc_macro_registrar.rs | 9 | ||||
| -rw-r--r-- | src/test/compile-fail-fulldeps/proc-macro/error-on-test.rs | 22 |
3 files changed, 33 insertions, 0 deletions
diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index 5466c8871d4..6a3a1bbb55c 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -709,10 +709,12 @@ pub fn phase_2_configure_and_expand<'a, F>(sess: &Session, let crate_types = sess.crate_types.borrow(); let num_crate_types = crate_types.len(); let is_proc_macro_crate = crate_types.contains(&config::CrateTypeProcMacro); + let is_test_crate = sess.opts.test; syntax_ext::proc_macro_registrar::modify(&sess.parse_sess, &mut resolver, krate, is_proc_macro_crate, + is_test_crate, num_crate_types, sess.diagnostic(), &sess.features.borrow()) diff --git a/src/libsyntax_ext/proc_macro_registrar.rs b/src/libsyntax_ext/proc_macro_registrar.rs index d6d31200a99..36fd6408b4f 100644 --- a/src/libsyntax_ext/proc_macro_registrar.rs +++ b/src/libsyntax_ext/proc_macro_registrar.rs @@ -38,12 +38,14 @@ struct CollectCustomDerives<'a> { in_root: bool, handler: &'a errors::Handler, is_proc_macro_crate: bool, + is_test_crate: bool, } pub fn modify(sess: &ParseSess, resolver: &mut ::syntax::ext::base::Resolver, mut krate: ast::Crate, is_proc_macro_crate: bool, + is_test_crate: bool, num_crate_types: usize, handler: &errors::Handler, features: &Features) -> ast::Crate { @@ -55,6 +57,7 @@ pub fn modify(sess: &ParseSess, in_root: true, handler: handler, is_proc_macro_crate: is_proc_macro_crate, + is_test_crate: is_test_crate, }; visit::walk_crate(&mut collect, &krate); @@ -137,6 +140,12 @@ impl<'a> Visitor for CollectCustomDerives<'a> { attributes found"); } + if self.is_test_crate { + self.handler.span_err(attr.span(), + "`--test` cannot be used with proc-macro crates"); + return; + } + if !self.is_proc_macro_crate { self.handler.span_err(attr.span(), "the `#[proc_macro_derive]` attribute is \ diff --git a/src/test/compile-fail-fulldeps/proc-macro/error-on-test.rs b/src/test/compile-fail-fulldeps/proc-macro/error-on-test.rs new file mode 100644 index 00000000000..1fd48f075de --- /dev/null +++ b/src/test/compile-fail-fulldeps/proc-macro/error-on-test.rs @@ -0,0 +1,22 @@ +// 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. + +// compile-flags: --test + +#![crate_type = "proc-macro"] +#![feature(proc_macro)] + +extern crate proc_macro; + +#[proc_macro_derive(A)] +//~^ ERROR: `--test` cannot be used with proc-macro crates +pub fn foo1(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + "".parse().unwrap() +} |
