diff options
| author | bors <bors@rust-lang.org> | 2019-07-26 23:29:02 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-07-26 23:29:02 +0000 |
| commit | 09e39897587dca70f0b15093d425a682c392349c (patch) | |
| tree | 508bc51dc8e6410bffb962429eb5a61ec6d6a3cc /src/libcore | |
| parent | c43753f910aae000f8bcb0a502407ea332afc74b (diff) | |
| parent | 8eaf17bca2674293eba0ea10056d5c77b6352086 (diff) | |
Auto merge of #62086 - petrochenkov:builtout, r=eddyb
Define built-in macros through libcore
This PR defines built-in macros through libcore using a scheme similar to lang items (attribute `#[rustc_builtin_macro]`).
All the macro properties (stability, visibility, etc.) are taken from the source code in libcore, with exception of the expander function transforming input tokens/AST into output tokens/AST, which is still provided by the compiler.
The macros are made available to user code through the standard library prelude (`{core,std}::prelude::v1`), so they are still always in scope.
As a result **built-in macros now have stable absolute addresses in the library**, like `core::prelude::v1::line!()`, this is an insta-stable change.
Right now `prelude::v1` is the only publicly available absolute address for these macros, but eventually they can be moved into more appropriate locations with library team approval (e.g. `Clone` derive -> `core::clone::Clone`).
Now when built-in macros have canonical definitions they can be imported or reexported without issues (https://github.com/rust-lang/rust/issues/61687).
Other changes:
- You can now define a derive macro with a name matching one of the built-in derives (https://github.com/rust-lang/rust/issues/52269). This was an artificial restriction that could be worked around with import renaming anyway.
Known regressions:
- Empty library crate with a crate-level `#![test]` attribute no longer compiles without `--test`. Previously it didn't compile *with* `--test` or with the bin crate type.
Fixes https://github.com/rust-lang/rust/issues/61687
Fixes https://github.com/rust-lang/rust/issues/61804
r? @eddyb
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/macros.rs | 14 | ||||
| -rw-r--r-- | src/libcore/prelude/v1.rs | 47 | ||||
| -rw-r--r-- | src/libcore/task/wake.rs | 2 |
3 files changed, 55 insertions, 8 deletions
diff --git a/src/libcore/macros.rs b/src/libcore/macros.rs index 17781798946..218c164a7dc 100644 --- a/src/libcore/macros.rs +++ b/src/libcore/macros.rs @@ -657,13 +657,13 @@ macro_rules! uninit_array { ); } -/// Built-in macros to the compiler itself. +/// Definitions of built-in macros. /// -/// These macros do not have any corresponding definition with a `macro_rules!` -/// macro, but are documented here. Their implementations can be found hardcoded -/// into libsyntax itself. -#[cfg(rustdoc)] -mod builtin { +/// Most of the macro properties (stability, visibility, etc.) are taken from the source code here, +/// with exception of expansion functions transforming macro inputs into outputs, +/// those functions are provided by the compiler. +#[cfg(not(bootstrap))] +pub(crate) mod builtin { /// Causes compilation to fail with the given error message when encountered. /// @@ -950,7 +950,7 @@ mod builtin { /// Same as `column`, but less likely to be shadowed. #[unstable(feature = "__rust_unstable_column", issue = "0", - reason = "internal implementation detail of the `column` macro")] + reason = "internal implementation detail of the `panic` macro")] #[rustc_builtin_macro] #[rustc_macro_transparency = "semitransparent"] pub macro __rust_unstable_column() { /* compiler built-in */ } diff --git a/src/libcore/prelude/v1.rs b/src/libcore/prelude/v1.rs index 501a41d0d1c..de79e2fa260 100644 --- a/src/libcore/prelude/v1.rs +++ b/src/libcore/prelude/v1.rs @@ -44,3 +44,50 @@ pub use crate::option::Option::{self, Some, None}; #[stable(feature = "core_prelude", since = "1.4.0")] #[doc(no_inline)] pub use crate::result::Result::{self, Ok, Err}; + +// Re-exported built-in macros +#[cfg(not(bootstrap))] +#[stable(feature = "builtin_macro_prelude", since = "1.38.0")] +#[allow(deprecated)] +#[doc(no_inline)] +pub use crate::macros::builtin::{ + Clone, + Copy, + Debug, + Decodable, + Default, + Encodable, + Eq, + Hash, + Ord, + PartialEq, + PartialOrd, + RustcDecodable, + RustcEncodable, + __rust_unstable_column, + asm, + assert, + bench, + cfg, + column, + compile_error, + concat, + concat_idents, + env, + file, + format_args, + format_args_nl, + global_allocator, + global_asm, + include, + include_bytes, + include_str, + line, + log_syntax, + module_path, + option_env, + stringify, + test, + test_case, + trace_macros, +}; diff --git a/src/libcore/task/wake.rs b/src/libcore/task/wake.rs index 6f841bd2adf..65e29364287 100644 --- a/src/libcore/task/wake.rs +++ b/src/libcore/task/wake.rs @@ -217,7 +217,7 @@ impl fmt::Debug for Context<'_> { /// This handle encapsulates a [`RawWaker`] instance, which defines the /// executor-specific wakeup behavior. /// -/// Implements [`Clone`], [`Send`], and [`Sync`]. +/// Implements [`Clone`], [`trait@Send`], and [`trait@Sync`]. /// /// [`RawWaker`]: struct.RawWaker.html #[repr(transparent)] |
