diff --git a/src/Cargo.lock b/src/Cargo.lock index 6d7fcb71efa..fcc30c007ea 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -1057,7 +1057,7 @@ dependencies = [ [[package]] name = "rls-data" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rls-span 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1381,7 +1381,7 @@ name = "rustc_save_analysis" version = "0.0.0" dependencies = [ "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rls-data 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rls-data 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rls-span 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc 0.0.0", "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2101,7 +2101,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db" "checksum rls-analysis 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8d77d58e8933752142b5b92e3f8ba6d6f1630be6da5627c492268a43f79ffbda" "checksum rls-data 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "374a8fad31cc0681a7bfd8a04079dd4afd0e981d34e18a171b1a467445bdf51e" -"checksum rls-data 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9e2087477364c34faca86c2476765deb1185dbae3c598cfb1eb040f3a74d22b5" +"checksum rls-data 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e502ac679bc35e023e982506c32d0278ef89e29af1e4ad21cb70c44b525b87a9" "checksum rls-span 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d7c7046dc6a92f2ae02ed302746db4382e75131b9ce20ce967259f6b5867a6a" "checksum rls-vfs 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ace07060dd154731b39254864245cbdd33c8f5f64fe1f630a089c72e2468f854" "checksum rustc-demangle 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3058a43ada2c2d0b92b3ae38007a2d0fa5e9db971be260e0171408a4ff471c95" diff --git a/src/doc/unstable-book/src/language-features/compile-error.md b/src/doc/unstable-book/src/language-features/compile-error.md new file mode 100644 index 00000000000..1b25eeda3f6 --- /dev/null +++ b/src/doc/unstable-book/src/language-features/compile-error.md @@ -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 +} +``` diff --git a/src/libcore/macros.rs b/src/libcore/macros.rs index 91ee064aaba..1da91a3b708 100644 --- a/src/libcore/macros.rs +++ b/src/libcore/macros.rs @@ -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!`]. diff --git a/src/libcore/mem.rs b/src/libcore/mem.rs index 3924034fea2..509b396f211 100644 --- a/src/libcore/mem.rs +++ b/src/libcore/mem.rs @@ -504,8 +504,8 @@ pub fn swap(x: &mut T, y: &mut T) { // Haswell E processors. LLVM is more able to optimize if we give a struct a // #[repr(simd)], even if we don't actually use this struct directly. // - // FIXME repr(simd) broken on emscripten - #[cfg_attr(not(target_os = "emscripten"), repr(simd))] + // FIXME repr(simd) broken on emscripten and redox + #[cfg_attr(not(any(target_os = "emscripten", target_os = "redox")), repr(simd))] struct Block(u64, u64, u64, u64); struct UnalignedBlock(u64, u64, u64, u64); diff --git a/src/librustc_save_analysis/Cargo.toml b/src/librustc_save_analysis/Cargo.toml index 53a82cf73e9..1ae666fbc2f 100644 --- a/src/librustc_save_analysis/Cargo.toml +++ b/src/librustc_save_analysis/Cargo.toml @@ -14,7 +14,7 @@ rustc = { path = "../librustc" } rustc_typeck = { path = "../librustc_typeck" } syntax = { path = "../libsyntax" } syntax_pos = { path = "../libsyntax_pos" } -rls-data = "0.6" +rls-data = "0.7" rls-span = "0.4" # FIXME(#40527) should move rustc serialize out of tree rustc-serialize = "0.3" diff --git a/src/libstd/macros.rs b/src/libstd/macros.rs index 496c014f70e..82c4f0830a6 100644 --- a/src/libstd/macros.rs +++ b/src/libstd/macros.rs @@ -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 diff --git a/src/libstd/sync/mpsc/mod.rs b/src/libstd/sync/mpsc/mod.rs index 7d5e1929cd2..dcd4c8dfdf5 100644 --- a/src/libstd/sync/mpsc/mod.rs +++ b/src/libstd/sync/mpsc/mod.rs @@ -499,8 +499,6 @@ unsafe impl Send for Sender { } impl !Sync for Sender { } /// The sending-half of Rust's synchronous [`sync_channel`] type. -/// This half can only be owned by one thread, but it can be cloned -/// to send to other threads. /// /// Messages can be sent through this channel with [`send`] or [`try_send`]. /// @@ -555,9 +553,6 @@ pub struct SyncSender { #[stable(feature = "rust1", since = "1.0.0")] unsafe impl Send for SyncSender {} -#[stable(feature = "rust1", since = "1.0.0")] -impl !Sync for SyncSender {} - /// An error returned from the [`Sender::send`] or [`SyncSender::send`] /// function on **channel**s. /// diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index c91c77719e6..f8a26287bd4 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -1065,6 +1065,7 @@ fn enable_trace_macros = trace_macros, 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, } } diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 4543378789d..d7d3a70f3c7 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -111,6 +111,7 @@ pub fn new() -> 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)), @@ -1008,6 +1009,9 @@ pub fn feature_err<'a>(sess: &'a ParseSess, feature: &str, span: Span, issue: Ga 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 = diff --git a/src/libsyntax_ext/compile_error.rs b/src/libsyntax_ext/compile_error.rs new file mode 100644 index 00000000000..bb496716d8c --- /dev/null +++ b/src/libsyntax_ext/compile_error.rs @@ -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 or the MIT license +// , 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 { + 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) +} diff --git a/src/libsyntax_ext/lib.rs b/src/libsyntax_ext/lib.rs index 2016fc4fbe1..8ba07c35b05 100644 --- a/src/libsyntax_ext/lib.rs +++ b/src/libsyntax_ext/lib.rs @@ -30,6 +30,7 @@ mod asm; mod cfg; +mod compile_error; mod concat; mod concat_idents; mod env; @@ -105,6 +106,7 @@ macro_rules! register { 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. diff --git a/src/test/compile-fail/compile_error_macro.rs b/src/test/compile-fail/compile_error_macro.rs new file mode 100644 index 00000000000..2a2c3fd8092 --- /dev/null +++ b/src/test/compile-fail/compile_error_macro.rs @@ -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 or the MIT license +// , 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 +} diff --git a/src/test/compile-fail/feature-gate-compile_error.rs b/src/test/compile-fail/feature-gate-compile_error.rs new file mode 100644 index 00000000000..545c6852961 --- /dev/null +++ b/src/test/compile-fail/feature-gate-compile_error.rs @@ -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 or the MIT license +// , 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 +} diff --git a/src/test/compile-fail/not-sync.rs b/src/test/compile-fail/not-sync.rs index aa7a83a7baa..12c29279178 100644 --- a/src/test/compile-fail/not-sync.rs +++ b/src/test/compile-fail/not-sync.rs @@ -10,7 +10,7 @@ use std::cell::{Cell, RefCell}; use std::rc::{Rc, Weak}; -use std::sync::mpsc::{Receiver, Sender, SyncSender}; +use std::sync::mpsc::{Receiver, Sender}; fn test() {} @@ -29,6 +29,4 @@ fn main() { //~^ ERROR `std::sync::mpsc::Receiver: std::marker::Sync` is not satisfied test::>(); //~^ ERROR `std::sync::mpsc::Sender: std::marker::Sync` is not satisfied - test::>(); - //~^ ERROR `std::sync::mpsc::SyncSender: std::marker::Sync` is not satisfied } diff --git a/src/tools/rls b/src/tools/rls index e53e2f8d5b7..d26fd6f089a 160000 --- a/src/tools/rls +++ b/src/tools/rls @@ -1 +1 @@ -Subproject commit e53e2f8d5b7f7751dd478fff68c1dbe7247cb096 +Subproject commit d26fd6f089a4e7f1216a03a6d604bee33b2301dc