Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add compile_error! #42620

Merged
merged 2 commits into from
Jun 21, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions src/doc/unstable-book/src/language-features/compile-error.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# `compile_error`

The tracking issue for this feature is: [#40872]

[#29599]: https://github.com/rust-lang/rust/issues/40872

------------------------

The `compile_error` feature adds a macro which will generate a compilation
error with the specified error message.

## Examples

```rust
#![feature(compile_error)]

fn main() {
compile_error!("The error message"); //ERROR The error message
}
```
11 changes: 11 additions & 0 deletions src/libcore/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -562,6 +562,17 @@ macro_rules! unimplemented {
///
/// For more information, see documentation for `std`'s macros.
mod builtin {

/// Unconditionally causes compilation to fail with the given error message when encountered.
///
/// For more information, see the [RFC].
///
/// [RFC]: https://github.com/rust-lang/rfcs/blob/master/text/1695-add-error-macro.md
#[unstable(feature = "compile_error_macro", issue = "40872")]
#[macro_export]
#[cfg(dox)]
macro_rules! compile_error { ($msg:expr) => ({ /* compiler built-in */ }) }

/// The core macro for formatted string creation & output.
///
/// For more information, see the documentation for [`std::format_args!`].
Expand Down
10 changes: 10 additions & 0 deletions src/libstd/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,16 @@ macro_rules! assert_approx_eq {
/// into libsyntax itself.
#[cfg(dox)]
pub mod builtin {

/// Unconditionally causes compilation to fail with the given error message when encountered.
///
/// For more information, see the [RFC].
///
/// [RFC]: https://github.com/rust-lang/rfcs/blob/master/text/1695-add-error-macro.md
#[unstable(feature = "compile_error_macro", issue = "40872")]
#[macro_export]
macro_rules! compile_error { ($msg:expr) => ({ /* compiler built-in */ }) }

/// The core macro for formatted string creation & output.
///
/// This macro produces a value of type [`fmt::Arguments`]. This value can be
Expand Down
1 change: 1 addition & 0 deletions src/libsyntax/ext/expand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1065,6 +1065,7 @@ impl<'feat> ExpansionConfig<'feat> {
fn enable_allow_internal_unstable = allow_internal_unstable,
fn enable_custom_derive = custom_derive,
fn proc_macro_enabled = proc_macro,
fn enable_compile_error = compile_error,
}
}

Expand Down
4 changes: 4 additions & 0 deletions src/libsyntax/feature_gate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ macro_rules! declare_features {

declare_features! (
(active, asm, "1.0.0", Some(29722)),
(active, compile_error, "1.20.0", Some(40872)),
(active, concat_idents, "1.0.0", Some(29599)),
(active, link_args, "1.0.0", Some(29596)),
(active, log_syntax, "1.0.0", Some(29598)),
Expand Down Expand Up @@ -1008,6 +1009,9 @@ pub const EXPLAIN_LOG_SYNTAX: &'static str =
pub const EXPLAIN_CONCAT_IDENTS: &'static str =
"`concat_idents` is not stable enough for use and is subject to change";

pub const EXPLAIN_COMPILE_ERROR: &'static str =
"`compile_error` is not stable enough for use and is subject to change";

pub const EXPLAIN_TRACE_MACROS: &'static str =
"`trace_macros` is not stable enough for use and is subject to change";
pub const EXPLAIN_ALLOW_INTERNAL_UNSTABLE: &'static str =
Expand Down
40 changes: 40 additions & 0 deletions src/libsyntax_ext/compile_error.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Copyright 2012-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.

// The compiler code necessary to support the compile_error! extension.

use syntax::ext::base::*;
use syntax::ext::base;
use syntax::feature_gate;
use syntax_pos::Span;
use syntax::tokenstream;

pub fn expand_compile_error<'cx>(cx: &'cx mut ExtCtxt,
sp: Span,
tts: &[tokenstream::TokenTree])
-> Box<base::MacResult + 'cx> {
if !cx.ecfg.enable_compile_error() {
feature_gate::emit_feature_err(&cx.parse_sess,
"compile_error",
sp,
feature_gate::GateIssue::Language,
feature_gate::EXPLAIN_COMPILE_ERROR);
return DummyResult::expr(sp);
}

let var = match get_single_str_from_tts(cx, sp, tts, "compile_error!") {
None => return DummyResult::expr(sp),
Some(v) => v,
};

cx.span_err(sp, &var);

DummyResult::any(sp)
}
2 changes: 2 additions & 0 deletions src/libsyntax_ext/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ extern crate rustc_errors as errors;

mod asm;
mod cfg;
mod compile_error;
mod concat;
mod concat_idents;
mod env;
Expand Down Expand Up @@ -109,6 +110,7 @@ pub fn register_builtins(resolver: &mut syntax::ext::base::Resolver,
option_env: env::expand_option_env,
log_syntax: log_syntax::expand_syntax_ext,
trace_macros: trace_macros::expand_trace_macros,
compile_error: compile_error::expand_compile_error,
}

// format_args uses `unstable` things internally.
Expand Down
15 changes: 15 additions & 0 deletions src/test/compile-fail/compile_error_macro.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// 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.

#![feature(compile_error)]

fn main() {
compile_error!("a very descriptive error message"); //~ ERROR: a very descriptive error message
}
13 changes: 13 additions & 0 deletions src/test/compile-fail/feature-gate-compile_error.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// 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.

fn main() {
compile_error!("test"); //~ ERROR: `compile_error` is not stable enough
}