Auto merge of #53150 - kennytm:rollup, r=kennytm
Rollup of 10 pull requests Successful merges: - #52885 (Remove some unused method arguments from typeck) - #52886 (cleanup: Remove `Def::GlobalAsm`) - #53028 (Building librustc_codegen_llvm in a separate directory) - #53052 (fixed broken links to char) - #53060 (Change rustdoc style so fully qualified name does not overlap src link) - #53068 (Rename Executor trait to Spawn) - #53093 (Enable macros to pass $:literal to another macro) - #53107 (Remove references to `StaticMutex` which got removed a while ago) - #53135 (Rust 2018: Disable catch_expr, not targeted for 2018 edition) - #53139 (set emit_debug_gdb_scripts: false for riscv32imac-unknown-none target)
This commit is contained in:
commit
18925dee25
28 changed files with 141 additions and 212 deletions
|
@ -2184,30 +2184,10 @@ dependencies = [
|
||||||
name = "rustc_codegen_llvm"
|
name = "rustc_codegen_llvm"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"env_logger 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"jobserver 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc 0.0.0",
|
|
||||||
"rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc_allocator 0.0.0",
|
|
||||||
"rustc_apfloat 0.0.0",
|
|
||||||
"rustc_codegen_utils 0.0.0",
|
|
||||||
"rustc_data_structures 0.0.0",
|
|
||||||
"rustc_errors 0.0.0",
|
|
||||||
"rustc_incremental 0.0.0",
|
|
||||||
"rustc_llvm 0.0.0",
|
"rustc_llvm 0.0.0",
|
||||||
"rustc_mir 0.0.0",
|
|
||||||
"rustc_platform_intrinsics 0.0.0",
|
|
||||||
"rustc_target 0.0.0",
|
|
||||||
"serialize 0.0.0",
|
|
||||||
"syntax 0.0.0",
|
|
||||||
"syntax_pos 0.0.0",
|
|
||||||
"tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -137,8 +137,10 @@ impl Step for CodegenBackend {
|
||||||
let target = self.target;
|
let target = self.target;
|
||||||
let backend = self.backend;
|
let backend = self.backend;
|
||||||
|
|
||||||
|
let out_dir = builder.cargo_out(compiler, Mode::Codegen, target);
|
||||||
|
builder.clear_if_dirty(&out_dir, &librustc_stamp(builder, compiler, target));
|
||||||
|
|
||||||
let mut cargo = builder.cargo(compiler, Mode::Codegen, target, "check");
|
let mut cargo = builder.cargo(compiler, Mode::Codegen, target, "check");
|
||||||
let features = builder.rustc_features().to_string();
|
|
||||||
cargo.arg("--manifest-path").arg(builder.src.join("src/librustc_codegen_llvm/Cargo.toml"));
|
cargo.arg("--manifest-path").arg(builder.src.join("src/librustc_codegen_llvm/Cargo.toml"));
|
||||||
rustc_cargo_env(builder, &mut cargo);
|
rustc_cargo_env(builder, &mut cargo);
|
||||||
|
|
||||||
|
@ -146,7 +148,7 @@ impl Step for CodegenBackend {
|
||||||
|
|
||||||
let _folder = builder.fold_output(|| format!("stage{}-rustc_codegen_llvm", compiler.stage));
|
let _folder = builder.fold_output(|| format!("stage{}-rustc_codegen_llvm", compiler.stage));
|
||||||
run_cargo(builder,
|
run_cargo(builder,
|
||||||
cargo.arg("--features").arg(features),
|
&mut cargo,
|
||||||
&codegen_backend_stamp(builder, compiler, target, backend),
|
&codegen_backend_stamp(builder, compiler, target, backend),
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -670,16 +670,17 @@ impl Step for CodegenBackend {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let out_dir = builder.cargo_out(compiler, Mode::Codegen, target);
|
||||||
|
builder.clear_if_dirty(&out_dir, &librustc_stamp(builder, compiler, target));
|
||||||
|
|
||||||
let mut cargo = builder.cargo(compiler, Mode::Codegen, target, "build");
|
let mut cargo = builder.cargo(compiler, Mode::Codegen, target, "build");
|
||||||
let mut features = builder.rustc_features().to_string();
|
|
||||||
cargo.arg("--manifest-path")
|
cargo.arg("--manifest-path")
|
||||||
.arg(builder.src.join("src/librustc_codegen_llvm/Cargo.toml"));
|
.arg(builder.src.join("src/librustc_codegen_llvm/Cargo.toml"));
|
||||||
rustc_cargo_env(builder, &mut cargo);
|
rustc_cargo_env(builder, &mut cargo);
|
||||||
|
|
||||||
features += &build_codegen_backend(&builder, &mut cargo, &compiler, target, backend);
|
let features = build_codegen_backend(&builder, &mut cargo, &compiler, target, backend);
|
||||||
|
|
||||||
let tmp_stamp = builder.cargo_out(compiler, Mode::Codegen, target)
|
let tmp_stamp = out_dir.join(".tmp.stamp");
|
||||||
.join(".tmp.stamp");
|
|
||||||
|
|
||||||
let _folder = builder.fold_output(|| format!("stage{}-rustc_codegen_llvm", compiler.stage));
|
let _folder = builder.fold_output(|| format!("stage{}-rustc_codegen_llvm", compiler.stage));
|
||||||
let files = run_cargo(builder,
|
let files = run_cargo(builder,
|
||||||
|
|
|
@ -555,8 +555,8 @@ impl Build {
|
||||||
let suffix = match mode {
|
let suffix = match mode {
|
||||||
Mode::Std => "-std",
|
Mode::Std => "-std",
|
||||||
Mode::Test => "-test",
|
Mode::Test => "-test",
|
||||||
Mode::Codegen => "-rustc",
|
|
||||||
Mode::Rustc => "-rustc",
|
Mode::Rustc => "-rustc",
|
||||||
|
Mode::Codegen => "-codegen",
|
||||||
Mode::ToolBootstrap => "-bootstrap-tools",
|
Mode::ToolBootstrap => "-bootstrap-tools",
|
||||||
Mode::ToolStd => "-tools",
|
Mode::ToolStd => "-tools",
|
||||||
Mode::ToolRustc => "-tools",
|
Mode::ToolRustc => "-tools",
|
||||||
|
|
|
@ -67,7 +67,7 @@ use core::marker::{Unpin, Unsize};
|
||||||
use core::mem::{self, PinMut};
|
use core::mem::{self, PinMut};
|
||||||
use core::ops::{CoerceUnsized, Deref, DerefMut, Generator, GeneratorState};
|
use core::ops::{CoerceUnsized, Deref, DerefMut, Generator, GeneratorState};
|
||||||
use core::ptr::{self, NonNull, Unique};
|
use core::ptr::{self, NonNull, Unique};
|
||||||
use core::task::{Context, Poll, Executor, SpawnErrorKind, SpawnObjError};
|
use core::task::{Context, Poll, Spawn, SpawnErrorKind, SpawnObjError};
|
||||||
|
|
||||||
use raw_vec::RawVec;
|
use raw_vec::RawVec;
|
||||||
use str::from_boxed_utf8_unchecked;
|
use str::from_boxed_utf8_unchecked;
|
||||||
|
@ -973,11 +973,14 @@ unsafe impl<'a, T, F> UnsafeFutureObj<'a, T> for PinBox<F>
|
||||||
}
|
}
|
||||||
|
|
||||||
#[unstable(feature = "futures_api", issue = "50547")]
|
#[unstable(feature = "futures_api", issue = "50547")]
|
||||||
impl<E> Executor for Box<E>
|
impl<Sp> Spawn for Box<Sp>
|
||||||
where E: Executor + ?Sized
|
where Sp: Spawn + ?Sized
|
||||||
{
|
{
|
||||||
fn spawn_obj(&mut self, task: FutureObj<'static, ()>) -> Result<(), SpawnObjError> {
|
fn spawn_obj(
|
||||||
(**self).spawn_obj(task)
|
&mut self,
|
||||||
|
future: FutureObj<'static, ()>,
|
||||||
|
) -> Result<(), SpawnObjError> {
|
||||||
|
(**self).spawn_obj(future)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn status(&self) -> Result<(), SpawnErrorKind> {
|
fn status(&self) -> Result<(), SpawnErrorKind> {
|
||||||
|
|
|
@ -2117,8 +2117,6 @@ impl str {
|
||||||
/// This length is in bytes, not [`char`]s or graphemes. In other words,
|
/// This length is in bytes, not [`char`]s or graphemes. In other words,
|
||||||
/// it may not be what a human considers the length of the string.
|
/// it may not be what a human considers the length of the string.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// Basic usage:
|
/// Basic usage:
|
||||||
|
@ -2590,8 +2588,6 @@ impl str {
|
||||||
/// Value, and may not match your idea of what a 'character' is. Iteration
|
/// Value, and may not match your idea of what a 'character' is. Iteration
|
||||||
/// over grapheme clusters may be what you actually want.
|
/// over grapheme clusters may be what you actually want.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// Basic usage:
|
/// Basic usage:
|
||||||
|
@ -2643,8 +2639,6 @@ impl str {
|
||||||
/// The iterator yields tuples. The position is first, the [`char`] is
|
/// The iterator yields tuples. The position is first, the [`char`] is
|
||||||
/// second.
|
/// second.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// Basic usage:
|
/// Basic usage:
|
||||||
|
@ -2946,7 +2940,6 @@ impl str {
|
||||||
/// The pattern can be a `&str`, [`char`], or a closure that determines if
|
/// The pattern can be a `&str`, [`char`], or a closure that determines if
|
||||||
/// a character matches.
|
/// a character matches.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
/// [`None`]: option/enum.Option.html#variant.None
|
/// [`None`]: option/enum.Option.html#variant.None
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
|
@ -2994,7 +2987,6 @@ impl str {
|
||||||
/// The pattern can be a `&str`, [`char`], or a closure that determines if
|
/// The pattern can be a `&str`, [`char`], or a closure that determines if
|
||||||
/// a character matches.
|
/// a character matches.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
/// [`None`]: option/enum.Option.html#variant.None
|
/// [`None`]: option/enum.Option.html#variant.None
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
|
@ -3050,7 +3042,6 @@ impl str {
|
||||||
/// If the pattern allows a reverse search but its results might differ
|
/// If the pattern allows a reverse search but its results might differ
|
||||||
/// from a forward search, the [`rsplit`] method can be used.
|
/// from a forward search, the [`rsplit`] method can be used.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
/// [`rsplit`]: #method.rsplit
|
/// [`rsplit`]: #method.rsplit
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
|
@ -3157,8 +3148,6 @@ impl str {
|
||||||
/// The pattern can be a `&str`, [`char`], or a closure that determines the
|
/// The pattern can be a `&str`, [`char`], or a closure that determines the
|
||||||
/// split.
|
/// split.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
|
||||||
/// # Iterator behavior
|
/// # Iterator behavior
|
||||||
///
|
///
|
||||||
/// The returned iterator requires that the pattern supports a reverse
|
/// The returned iterator requires that the pattern supports a reverse
|
||||||
|
@ -3224,7 +3213,6 @@ impl str {
|
||||||
/// elements. This is true for, eg, [`char`] but not for `&str`.
|
/// elements. This is true for, eg, [`char`] but not for `&str`.
|
||||||
///
|
///
|
||||||
/// [`DoubleEndedIterator`]: iter/trait.DoubleEndedIterator.html
|
/// [`DoubleEndedIterator`]: iter/trait.DoubleEndedIterator.html
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
///
|
||||||
/// If the pattern allows a reverse search but its results might differ
|
/// If the pattern allows a reverse search but its results might differ
|
||||||
/// from a forward search, the [`rsplit_terminator`] method can be used.
|
/// from a forward search, the [`rsplit_terminator`] method can be used.
|
||||||
|
@ -3259,8 +3247,6 @@ impl str {
|
||||||
/// Additional libraries might provide more complex patterns like
|
/// Additional libraries might provide more complex patterns like
|
||||||
/// regular expressions.
|
/// regular expressions.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
|
||||||
/// Equivalent to [`split`], except that the trailing substring is
|
/// Equivalent to [`split`], except that the trailing substring is
|
||||||
/// skipped if empty.
|
/// skipped if empty.
|
||||||
///
|
///
|
||||||
|
@ -3306,8 +3292,6 @@ impl str {
|
||||||
/// The pattern can be a `&str`, [`char`], or a closure that determines the
|
/// The pattern can be a `&str`, [`char`], or a closure that determines the
|
||||||
/// split.
|
/// split.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
|
||||||
/// # Iterator behavior
|
/// # Iterator behavior
|
||||||
///
|
///
|
||||||
/// The returned iterator will not be double ended, because it is
|
/// The returned iterator will not be double ended, because it is
|
||||||
|
@ -3361,8 +3345,6 @@ impl str {
|
||||||
/// The pattern can be a `&str`, [`char`], or a closure that
|
/// The pattern can be a `&str`, [`char`], or a closure that
|
||||||
/// determines the split.
|
/// determines the split.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
|
||||||
/// # Iterator behavior
|
/// # Iterator behavior
|
||||||
///
|
///
|
||||||
/// The returned iterator will not be double ended, because it is not
|
/// The returned iterator will not be double ended, because it is not
|
||||||
|
@ -3407,8 +3389,6 @@ impl str {
|
||||||
/// The pattern can be a `&str`, [`char`], or a closure that
|
/// The pattern can be a `&str`, [`char`], or a closure that
|
||||||
/// determines if a character matches.
|
/// determines if a character matches.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
|
||||||
/// # Iterator behavior
|
/// # Iterator behavior
|
||||||
///
|
///
|
||||||
/// The returned iterator will be a [`DoubleEndedIterator`] if the pattern
|
/// The returned iterator will be a [`DoubleEndedIterator`] if the pattern
|
||||||
|
@ -3416,7 +3396,6 @@ impl str {
|
||||||
/// elements. This is true for, eg, [`char`] but not for `&str`.
|
/// elements. This is true for, eg, [`char`] but not for `&str`.
|
||||||
///
|
///
|
||||||
/// [`DoubleEndedIterator`]: iter/trait.DoubleEndedIterator.html
|
/// [`DoubleEndedIterator`]: iter/trait.DoubleEndedIterator.html
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
///
|
||||||
/// If the pattern allows a reverse search but its results might differ
|
/// If the pattern allows a reverse search but its results might differ
|
||||||
/// from a forward search, the [`rmatches`] method can be used.
|
/// from a forward search, the [`rmatches`] method can be used.
|
||||||
|
@ -3446,8 +3425,6 @@ impl str {
|
||||||
/// The pattern can be a `&str`, [`char`], or a closure that determines if
|
/// The pattern can be a `&str`, [`char`], or a closure that determines if
|
||||||
/// a character matches.
|
/// a character matches.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
|
||||||
/// # Iterator behavior
|
/// # Iterator behavior
|
||||||
///
|
///
|
||||||
/// The returned iterator requires that the pattern supports a reverse
|
/// The returned iterator requires that the pattern supports a reverse
|
||||||
|
@ -3488,8 +3465,6 @@ impl str {
|
||||||
/// The pattern can be a `&str`, [`char`], or a closure that determines
|
/// The pattern can be a `&str`, [`char`], or a closure that determines
|
||||||
/// if a character matches.
|
/// if a character matches.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
|
||||||
/// # Iterator behavior
|
/// # Iterator behavior
|
||||||
///
|
///
|
||||||
/// The returned iterator will be a [`DoubleEndedIterator`] if the pattern
|
/// The returned iterator will be a [`DoubleEndedIterator`] if the pattern
|
||||||
|
@ -3532,8 +3507,6 @@ impl str {
|
||||||
/// The pattern can be a `&str`, [`char`], or a closure that determines if a
|
/// The pattern can be a `&str`, [`char`], or a closure that determines if a
|
||||||
/// character matches.
|
/// character matches.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
|
||||||
/// # Iterator behavior
|
/// # Iterator behavior
|
||||||
///
|
///
|
||||||
/// The returned iterator requires that the pattern supports a reverse
|
/// The returned iterator requires that the pattern supports a reverse
|
||||||
|
@ -3665,8 +3638,6 @@ impl str {
|
||||||
/// The pattern can be a [`char`] or a closure that determines if a
|
/// The pattern can be a [`char`] or a closure that determines if a
|
||||||
/// character matches.
|
/// character matches.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// Simple patterns:
|
/// Simple patterns:
|
||||||
|
@ -3711,8 +3682,6 @@ impl str {
|
||||||
/// The pattern can be a `&str`, [`char`], or a closure that determines if
|
/// The pattern can be a `&str`, [`char`], or a closure that determines if
|
||||||
/// a character matches.
|
/// a character matches.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
|
||||||
/// # Text directionality
|
/// # Text directionality
|
||||||
///
|
///
|
||||||
/// A string is a sequence of bytes. 'Left' in this context means the first
|
/// A string is a sequence of bytes. 'Left' in this context means the first
|
||||||
|
@ -3750,8 +3719,6 @@ impl str {
|
||||||
/// The pattern can be a `&str`, [`char`], or a closure that
|
/// The pattern can be a `&str`, [`char`], or a closure that
|
||||||
/// determines if a character matches.
|
/// determines if a character matches.
|
||||||
///
|
///
|
||||||
/// [`char`]: primitive.char.html
|
|
||||||
///
|
|
||||||
/// # Text directionality
|
/// # Text directionality
|
||||||
///
|
///
|
||||||
/// A string is a sequence of bytes. 'Right' in this context means the last
|
/// A string is a sequence of bytes. 'Right' in this context means the last
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
issue = "50547")]
|
issue = "50547")]
|
||||||
|
|
||||||
use fmt;
|
use fmt;
|
||||||
use super::{Executor, Waker, LocalWaker};
|
use super::{Spawn, Waker, LocalWaker};
|
||||||
|
|
||||||
/// Information about the currently-running task.
|
/// Information about the currently-running task.
|
||||||
///
|
///
|
||||||
|
@ -21,7 +21,7 @@ use super::{Executor, Waker, LocalWaker};
|
||||||
/// when performing a single `poll` step on a task.
|
/// when performing a single `poll` step on a task.
|
||||||
pub struct Context<'a> {
|
pub struct Context<'a> {
|
||||||
local_waker: &'a LocalWaker,
|
local_waker: &'a LocalWaker,
|
||||||
executor: &'a mut dyn Executor,
|
spawner: &'a mut dyn Spawn,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> fmt::Debug for Context<'a> {
|
impl<'a> fmt::Debug for Context<'a> {
|
||||||
|
@ -32,13 +32,14 @@ impl<'a> fmt::Debug for Context<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Context<'a> {
|
impl<'a> Context<'a> {
|
||||||
/// Create a new task `Context` with the provided `local_waker`, `waker`, and `executor`.
|
/// Create a new task `Context` with the provided `local_waker`, `waker`,
|
||||||
|
/// and `spawner`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new(local_waker: &'a LocalWaker, executor: &'a mut dyn Executor) -> Context<'a> {
|
pub fn new(
|
||||||
Context {
|
local_waker: &'a LocalWaker,
|
||||||
local_waker,
|
spawner: &'a mut dyn Spawn,
|
||||||
executor,
|
) -> Context<'a> {
|
||||||
}
|
Context { local_waker, spawner }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the `LocalWaker` associated with the current task.
|
/// Get the `LocalWaker` associated with the current task.
|
||||||
|
@ -53,40 +54,45 @@ impl<'a> Context<'a> {
|
||||||
unsafe { &*(self.local_waker as *const LocalWaker as *const Waker) }
|
unsafe { &*(self.local_waker as *const LocalWaker as *const Waker) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the default executor associated with this task.
|
/// Get the spawner associated with this task.
|
||||||
///
|
///
|
||||||
/// This method is useful primarily if you want to explicitly handle
|
/// This method is useful primarily if you want to explicitly handle
|
||||||
/// spawn failures.
|
/// spawn failures.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn executor(&mut self) -> &mut dyn Executor {
|
pub fn spawner(&mut self) -> &mut dyn Spawn {
|
||||||
self.executor
|
self.spawner
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Produce a context like the current one, but using the given waker instead.
|
/// Produce a context like the current one, but using the given waker
|
||||||
|
/// instead.
|
||||||
///
|
///
|
||||||
/// This advanced method is primarily used when building "internal
|
/// This advanced method is primarily used when building "internal
|
||||||
/// schedulers" within a task, where you want to provide some customized
|
/// schedulers" within a task, where you want to provide some customized
|
||||||
/// wakeup logic.
|
/// wakeup logic.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn with_waker<'b>(&'b mut self, local_waker: &'b LocalWaker) -> Context<'b> {
|
pub fn with_waker<'b>(
|
||||||
|
&'b mut self,
|
||||||
|
local_waker: &'b LocalWaker,
|
||||||
|
) -> Context<'b> {
|
||||||
Context {
|
Context {
|
||||||
local_waker,
|
local_waker,
|
||||||
executor: self.executor,
|
spawner: self.spawner,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Produce a context like the current one, but using the given executor
|
/// Produce a context like the current one, but using the given spawner
|
||||||
/// instead.
|
/// instead.
|
||||||
///
|
///
|
||||||
/// This advanced method is primarily used when building "internal
|
/// This advanced method is primarily used when building "internal
|
||||||
/// schedulers" within a task.
|
/// schedulers" within a task.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn with_executor<'b, E>(&'b mut self, executor: &'b mut E) -> Context<'b>
|
pub fn with_spawner<'b, Sp: Spawn>(
|
||||||
where E: Executor
|
&'b mut self,
|
||||||
{
|
spawner: &'b mut Sp,
|
||||||
|
) -> Context<'b> {
|
||||||
Context {
|
Context {
|
||||||
local_waker: self.local_waker,
|
local_waker: self.local_waker,
|
||||||
executor,
|
spawner,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,10 +17,8 @@
|
||||||
mod context;
|
mod context;
|
||||||
pub use self::context::Context;
|
pub use self::context::Context;
|
||||||
|
|
||||||
mod executor;
|
mod spawn;
|
||||||
pub use self::executor::{
|
pub use self::spawn::{Spawn, SpawnErrorKind, SpawnObjError, SpawnLocalObjError};
|
||||||
Executor, SpawnErrorKind, SpawnObjError, SpawnLocalObjError
|
|
||||||
};
|
|
||||||
|
|
||||||
mod poll;
|
mod poll;
|
||||||
pub use self::poll::Poll;
|
pub use self::poll::Poll;
|
||||||
|
|
|
@ -15,16 +15,13 @@
|
||||||
use fmt;
|
use fmt;
|
||||||
use future::{FutureObj, LocalFutureObj};
|
use future::{FutureObj, LocalFutureObj};
|
||||||
|
|
||||||
/// A task executor.
|
/// Spawns tasks that poll futures to completion onto its associated task
|
||||||
|
/// executor.
|
||||||
///
|
///
|
||||||
/// Futures are polled until completion by tasks, a kind of lightweight
|
/// The term "task" refers to a kind of lightweight "thread". Task executors
|
||||||
/// "thread". A *task executor* is responsible for the creation of these tasks
|
/// are responsible for scheduling the execution of tasks on operating system
|
||||||
/// and the coordination of their execution on real operating system threads. In
|
/// threads.
|
||||||
/// particular, whenever a task signals that it can make further progress via a
|
pub trait Spawn {
|
||||||
/// wake-up notification, it is the responsibility of the task executor to put
|
|
||||||
/// the task into a queue to continue executing it, i.e. polling the future in
|
|
||||||
/// it, later.
|
|
||||||
pub trait Executor {
|
|
||||||
/// Spawns a new task with the given future. The future will be polled until
|
/// Spawns a new task with the given future. The future will be polled until
|
||||||
/// completion.
|
/// completion.
|
||||||
///
|
///
|
|
@ -70,8 +70,6 @@ pub enum Def {
|
||||||
Macro(DefId, MacroKind),
|
Macro(DefId, MacroKind),
|
||||||
NonMacroAttr, // e.g. `#[inline]` or `#[rustfmt::skip]`
|
NonMacroAttr, // e.g. `#[inline]` or `#[rustfmt::skip]`
|
||||||
|
|
||||||
GlobalAsm(DefId),
|
|
||||||
|
|
||||||
// Both namespaces
|
// Both namespaces
|
||||||
Err,
|
Err,
|
||||||
}
|
}
|
||||||
|
@ -251,8 +249,7 @@ impl Def {
|
||||||
Def::AssociatedTy(id) | Def::TyParam(id) | Def::Struct(id) | Def::StructCtor(id, ..) |
|
Def::AssociatedTy(id) | Def::TyParam(id) | Def::Struct(id) | Def::StructCtor(id, ..) |
|
||||||
Def::Union(id) | Def::Trait(id) | Def::Method(id) | Def::Const(id) |
|
Def::Union(id) | Def::Trait(id) | Def::Method(id) | Def::Const(id) |
|
||||||
Def::AssociatedConst(id) | Def::Macro(id, ..) |
|
Def::AssociatedConst(id) | Def::Macro(id, ..) |
|
||||||
Def::Existential(id) | Def::AssociatedExistential(id) |
|
Def::Existential(id) | Def::AssociatedExistential(id) | Def::TyForeign(id) => {
|
||||||
Def::GlobalAsm(id) | Def::TyForeign(id) => {
|
|
||||||
id
|
id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,7 +299,6 @@ impl Def {
|
||||||
Def::Label(..) => "label",
|
Def::Label(..) => "label",
|
||||||
Def::SelfTy(..) => "self type",
|
Def::SelfTy(..) => "self type",
|
||||||
Def::Macro(.., macro_kind) => macro_kind.descr(),
|
Def::Macro(.., macro_kind) => macro_kind.descr(),
|
||||||
Def::GlobalAsm(..) => "global asm",
|
|
||||||
Def::ToolMod => "tool module",
|
Def::ToolMod => "tool module",
|
||||||
Def::NonMacroAttr => "non-macro attribute",
|
Def::NonMacroAttr => "non-macro attribute",
|
||||||
Def::Err => "unresolved item",
|
Def::Err => "unresolved item",
|
||||||
|
|
|
@ -432,7 +432,6 @@ impl<'hir> Map<'hir> {
|
||||||
ItemKind::Const(..) => Some(Def::Const(def_id())),
|
ItemKind::Const(..) => Some(Def::Const(def_id())),
|
||||||
ItemKind::Fn(..) => Some(Def::Fn(def_id())),
|
ItemKind::Fn(..) => Some(Def::Fn(def_id())),
|
||||||
ItemKind::Mod(..) => Some(Def::Mod(def_id())),
|
ItemKind::Mod(..) => Some(Def::Mod(def_id())),
|
||||||
ItemKind::GlobalAsm(..) => Some(Def::GlobalAsm(def_id())),
|
|
||||||
ItemKind::Existential(..) => Some(Def::Existential(def_id())),
|
ItemKind::Existential(..) => Some(Def::Existential(def_id())),
|
||||||
ItemKind::Ty(..) => Some(Def::TyAlias(def_id())),
|
ItemKind::Ty(..) => Some(Def::TyAlias(def_id())),
|
||||||
ItemKind::Enum(..) => Some(Def::Enum(def_id())),
|
ItemKind::Enum(..) => Some(Def::Enum(def_id())),
|
||||||
|
@ -445,6 +444,7 @@ impl<'hir> Map<'hir> {
|
||||||
ItemKind::ExternCrate(_) |
|
ItemKind::ExternCrate(_) |
|
||||||
ItemKind::Use(..) |
|
ItemKind::Use(..) |
|
||||||
ItemKind::ForeignMod(..) |
|
ItemKind::ForeignMod(..) |
|
||||||
|
ItemKind::GlobalAsm(..) |
|
||||||
ItemKind::Impl(..) => None,
|
ItemKind::Impl(..) => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1015,7 +1015,6 @@ impl_stable_hash_for!(enum hir::def::Def {
|
||||||
Upvar(def_id, index, expr_id),
|
Upvar(def_id, index, expr_id),
|
||||||
Label(node_id),
|
Label(node_id),
|
||||||
Macro(def_id, macro_kind),
|
Macro(def_id, macro_kind),
|
||||||
GlobalAsm(def_id),
|
|
||||||
ToolMod,
|
ToolMod,
|
||||||
NonMacroAttr,
|
NonMacroAttr,
|
||||||
Err
|
Err
|
||||||
|
|
|
@ -10,39 +10,12 @@ crate-type = ["dylib"]
|
||||||
test = false
|
test = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bitflags = "1.0.1"
|
|
||||||
cc = "1.0.1"
|
cc = "1.0.1"
|
||||||
flate2 = "1.0"
|
|
||||||
jobserver = "0.1.5"
|
|
||||||
libc = "0.2"
|
|
||||||
log = "0.4"
|
|
||||||
num_cpus = "1.0"
|
num_cpus = "1.0"
|
||||||
rustc = { path = "../librustc" }
|
|
||||||
rustc-demangle = "0.1.4"
|
rustc-demangle = "0.1.4"
|
||||||
rustc_allocator = { path = "../librustc_allocator" }
|
|
||||||
rustc_apfloat = { path = "../librustc_apfloat" }
|
|
||||||
rustc_target = { path = "../librustc_target" }
|
|
||||||
rustc_data_structures = { path = "../librustc_data_structures" }
|
|
||||||
rustc_errors = { path = "../librustc_errors" }
|
|
||||||
rustc_incremental = { path = "../librustc_incremental" }
|
|
||||||
rustc_llvm = { path = "../librustc_llvm" }
|
rustc_llvm = { path = "../librustc_llvm" }
|
||||||
rustc_platform_intrinsics = { path = "../librustc_platform_intrinsics" }
|
|
||||||
rustc_codegen_utils = { path = "../librustc_codegen_utils" }
|
|
||||||
rustc_mir = { path = "../librustc_mir" }
|
|
||||||
serialize = { path = "../libserialize" }
|
|
||||||
syntax = { path = "../libsyntax" }
|
|
||||||
syntax_pos = { path = "../libsyntax_pos" }
|
|
||||||
tempfile = "3.0"
|
|
||||||
|
|
||||||
# not actually used but needed to make sure we enable the same feature set as
|
|
||||||
# winapi used in librustc
|
|
||||||
env_logger = { version = "0.5", default-features = false }
|
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
# Used to communicate the feature to `rustc_target` in the same manner that the
|
|
||||||
# `rustc` driver script communicate this.
|
|
||||||
jemalloc = ["rustc_target/jemalloc"]
|
|
||||||
|
|
||||||
# This is used to convince Cargo to separately cache builds of `rustc_codegen_llvm`
|
# This is used to convince Cargo to separately cache builds of `rustc_codegen_llvm`
|
||||||
# when this option is enabled or not. That way we can build two, cache two
|
# when this option is enabled or not. That way we can build two, cache two
|
||||||
# artifacts, and have nice speedy rebuilds.
|
# artifacts, and have nice speedy rebuilds.
|
||||||
|
|
|
@ -427,10 +427,10 @@ impl<'tcx> EntryKind<'tcx> {
|
||||||
EntryKind::Trait(_) => Def::Trait(did),
|
EntryKind::Trait(_) => Def::Trait(did),
|
||||||
EntryKind::Enum(..) => Def::Enum(did),
|
EntryKind::Enum(..) => Def::Enum(did),
|
||||||
EntryKind::MacroDef(_) => Def::Macro(did, MacroKind::Bang),
|
EntryKind::MacroDef(_) => Def::Macro(did, MacroKind::Bang),
|
||||||
EntryKind::GlobalAsm => Def::GlobalAsm(did),
|
|
||||||
EntryKind::ForeignType => Def::TyForeign(did),
|
EntryKind::ForeignType => Def::TyForeign(did),
|
||||||
|
|
||||||
EntryKind::ForeignMod |
|
EntryKind::ForeignMod |
|
||||||
|
EntryKind::GlobalAsm |
|
||||||
EntryKind::Impl(_) |
|
EntryKind::Impl(_) |
|
||||||
EntryKind::Field |
|
EntryKind::Field |
|
||||||
EntryKind::Generator(_) |
|
EntryKind::Generator(_) |
|
||||||
|
|
|
@ -1281,9 +1281,7 @@ const F: &'static C = &D; // error
|
||||||
```
|
```
|
||||||
|
|
||||||
This is because cell types do operations that are not thread-safe. Due to this,
|
This is because cell types do operations that are not thread-safe. Due to this,
|
||||||
they don't implement Sync and thus can't be placed in statics. In this
|
they don't implement Sync and thus can't be placed in statics.
|
||||||
case, `StaticMutex` would work just fine, but it isn't stable yet:
|
|
||||||
https://doc.rust-lang.org/nightly/std/sync/struct.StaticMutex.html
|
|
||||||
|
|
||||||
However, if you still wish to use these types, you can achieve this by an unsafe
|
However, if you still wish to use these types, you can achieve this by an unsafe
|
||||||
wrapper:
|
wrapper:
|
||||||
|
|
|
@ -810,7 +810,6 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
|
||||||
HirDef::SelfTy(..) |
|
HirDef::SelfTy(..) |
|
||||||
HirDef::Label(..) |
|
HirDef::Label(..) |
|
||||||
HirDef::Macro(..) |
|
HirDef::Macro(..) |
|
||||||
HirDef::GlobalAsm(..) |
|
|
||||||
HirDef::ToolMod |
|
HirDef::ToolMod |
|
||||||
HirDef::NonMacroAttr |
|
HirDef::NonMacroAttr |
|
||||||
HirDef::Err => None,
|
HirDef::Err => None,
|
||||||
|
|
|
@ -33,6 +33,7 @@ pub fn target() -> TargetResult {
|
||||||
executables: true,
|
executables: true,
|
||||||
panic_strategy: PanicStrategy::Abort,
|
panic_strategy: PanicStrategy::Abort,
|
||||||
relocation_model: "static".to_string(),
|
relocation_model: "static".to_string(),
|
||||||
|
emit_debug_gdb_scripts: false,
|
||||||
abi_blacklist: vec![
|
abi_blacklist: vec![
|
||||||
Abi::Cdecl,
|
Abi::Cdecl,
|
||||||
Abi::Stdcall,
|
Abi::Stdcall,
|
||||||
|
|
|
@ -68,9 +68,7 @@ pub fn compare_impl_method<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
|
|
||||||
if let Err(ErrorReported) = compare_synthetic_generics(tcx,
|
if let Err(ErrorReported) = compare_synthetic_generics(tcx,
|
||||||
impl_m,
|
impl_m,
|
||||||
impl_m_span,
|
trait_m) {
|
||||||
trait_m,
|
|
||||||
trait_item_span) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -729,14 +727,11 @@ fn compare_number_of_method_arguments<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
|
|
||||||
fn compare_synthetic_generics<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
fn compare_synthetic_generics<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
impl_m: &ty::AssociatedItem,
|
impl_m: &ty::AssociatedItem,
|
||||||
_impl_m_span: Span, // FIXME necessary?
|
trait_m: &ty::AssociatedItem)
|
||||||
trait_m: &ty::AssociatedItem,
|
|
||||||
_trait_item_span: Option<Span>) // FIXME necessary?
|
|
||||||
-> Result<(), ErrorReported> {
|
-> Result<(), ErrorReported> {
|
||||||
// FIXME(chrisvittal) Clean up this function, list of FIXME items:
|
// FIXME(chrisvittal) Clean up this function, list of FIXME items:
|
||||||
// 1. Better messages for the span labels
|
// 1. Better messages for the span labels
|
||||||
// 2. Explanation as to what is going on
|
// 2. Explanation as to what is going on
|
||||||
// 3. Correct the function signature for what we actually use
|
|
||||||
// If we get here, we already have the same number of generics, so the zip will
|
// If we get here, we already have the same number of generics, so the zip will
|
||||||
// be okay.
|
// be okay.
|
||||||
let mut error_found = false;
|
let mut error_found = false;
|
||||||
|
|
|
@ -41,21 +41,19 @@ struct Checker<'a, 'tcx: 'a> {
|
||||||
|
|
||||||
impl<'a, 'tcx> Checker<'a, 'tcx> {
|
impl<'a, 'tcx> Checker<'a, 'tcx> {
|
||||||
fn check<F>(&self, trait_def_id: Option<DefId>, mut f: F) -> &Self
|
fn check<F>(&self, trait_def_id: Option<DefId>, mut f: F) -> &Self
|
||||||
where F: FnMut(TyCtxt<'a, 'tcx, 'tcx>, DefId, DefId)
|
where F: FnMut(TyCtxt<'a, 'tcx, 'tcx>, DefId)
|
||||||
{
|
{
|
||||||
if Some(self.trait_def_id) == trait_def_id {
|
if Some(self.trait_def_id) == trait_def_id {
|
||||||
for &impl_id in self.tcx.hir.trait_impls(self.trait_def_id) {
|
for &impl_id in self.tcx.hir.trait_impls(self.trait_def_id) {
|
||||||
let impl_def_id = self.tcx.hir.local_def_id(impl_id);
|
let impl_def_id = self.tcx.hir.local_def_id(impl_id);
|
||||||
f(self.tcx, self.trait_def_id, impl_def_id);
|
f(self.tcx, impl_def_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_implementation_of_drop<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
fn visit_implementation_of_drop<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, impl_did: DefId) {
|
||||||
_drop_did: DefId,
|
|
||||||
impl_did: DefId) {
|
|
||||||
match tcx.type_of(impl_did).sty {
|
match tcx.type_of(impl_did).sty {
|
||||||
ty::TyAdt(..) => {}
|
ty::TyAdt(..) => {}
|
||||||
_ => {
|
_ => {
|
||||||
|
@ -87,9 +85,7 @@ fn visit_implementation_of_drop<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_implementation_of_copy<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
fn visit_implementation_of_copy<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, impl_did: DefId) {
|
||||||
_copy_did: DefId,
|
|
||||||
impl_did: DefId) {
|
|
||||||
debug!("visit_implementation_of_copy: impl_did={:?}", impl_did);
|
debug!("visit_implementation_of_copy: impl_did={:?}", impl_did);
|
||||||
|
|
||||||
let impl_node_id = if let Some(n) = tcx.hir.as_local_node_id(impl_did) {
|
let impl_node_id = if let Some(n) = tcx.hir.as_local_node_id(impl_did) {
|
||||||
|
@ -157,9 +153,7 @@ fn visit_implementation_of_copy<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_implementation_of_coerce_unsized<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
fn visit_implementation_of_coerce_unsized<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, impl_did: DefId) {
|
||||||
_: DefId,
|
|
||||||
impl_did: DefId) {
|
|
||||||
debug!("visit_implementation_of_coerce_unsized: impl_did={:?}",
|
debug!("visit_implementation_of_coerce_unsized: impl_did={:?}",
|
||||||
impl_did);
|
impl_did);
|
||||||
|
|
||||||
|
|
|
@ -1613,7 +1613,6 @@ impl fmt::Display for AllTypes {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
write!(f,
|
write!(f,
|
||||||
"<h1 class='fqn'>\
|
"<h1 class='fqn'>\
|
||||||
<span class='in-band'>List of all items</span>\
|
|
||||||
<span class='out-of-band'>\
|
<span class='out-of-band'>\
|
||||||
<span id='render-detail'>\
|
<span id='render-detail'>\
|
||||||
<a id=\"toggle-all-docs\" href=\"javascript:void(0)\" title=\"collapse all docs\">\
|
<a id=\"toggle-all-docs\" href=\"javascript:void(0)\" title=\"collapse all docs\">\
|
||||||
|
@ -1621,6 +1620,7 @@ impl fmt::Display for AllTypes {
|
||||||
</a>\
|
</a>\
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
|
<span class='in-band'>List of all items</span>\
|
||||||
</h1>")?;
|
</h1>")?;
|
||||||
print_entries(f, &self.structs, "Structs", "structs")?;
|
print_entries(f, &self.structs, "Structs", "structs")?;
|
||||||
print_entries(f, &self.enums, "Enums", "enums")?;
|
print_entries(f, &self.enums, "Enums", "enums")?;
|
||||||
|
@ -2068,7 +2068,34 @@ impl<'a> fmt::Display for Item<'a> {
|
||||||
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
||||||
debug_assert!(!self.item.is_stripped());
|
debug_assert!(!self.item.is_stripped());
|
||||||
// Write the breadcrumb trail header for the top
|
// Write the breadcrumb trail header for the top
|
||||||
write!(fmt, "<h1 class='fqn'><span class='in-band'>")?;
|
write!(fmt, "<h1 class='fqn'><span class='out-of-band'>")?;
|
||||||
|
if let Some(version) = self.item.stable_since() {
|
||||||
|
write!(fmt, "<span class='since' title='Stable since Rust version {0}'>{0}</span>",
|
||||||
|
version)?;
|
||||||
|
}
|
||||||
|
write!(fmt,
|
||||||
|
"<span id='render-detail'>\
|
||||||
|
<a id=\"toggle-all-docs\" href=\"javascript:void(0)\" \
|
||||||
|
title=\"collapse all docs\">\
|
||||||
|
[<span class='inner'>−</span>]\
|
||||||
|
</a>\
|
||||||
|
</span>")?;
|
||||||
|
|
||||||
|
// Write `src` tag
|
||||||
|
//
|
||||||
|
// When this item is part of a `pub use` in a downstream crate, the
|
||||||
|
// [src] link in the downstream documentation will actually come back to
|
||||||
|
// this page, and this link will be auto-clicked. The `id` attribute is
|
||||||
|
// used to find the link to auto-click.
|
||||||
|
if self.cx.shared.include_sources && !self.item.is_primitive() {
|
||||||
|
if let Some(l) = self.src_href() {
|
||||||
|
write!(fmt, "<a class='srclink' href='{}' title='{}'>[src]</a>",
|
||||||
|
l, "goto source code")?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
write!(fmt, "</span>")?; // out-of-band
|
||||||
|
write!(fmt, "<span class='in-band'>")?;
|
||||||
match self.item.inner {
|
match self.item.inner {
|
||||||
clean::ModuleItem(ref m) => if m.is_crate {
|
clean::ModuleItem(ref m) => if m.is_crate {
|
||||||
write!(fmt, "Crate ")?;
|
write!(fmt, "Crate ")?;
|
||||||
|
@ -2105,34 +2132,7 @@ impl<'a> fmt::Display for Item<'a> {
|
||||||
write!(fmt, "<a class=\"{}\" href=''>{}</a>",
|
write!(fmt, "<a class=\"{}\" href=''>{}</a>",
|
||||||
self.item.type_(), self.item.name.as_ref().unwrap())?;
|
self.item.type_(), self.item.name.as_ref().unwrap())?;
|
||||||
|
|
||||||
write!(fmt, "</span>")?; // in-band
|
write!(fmt, "</span></h1>")?; // in-band
|
||||||
write!(fmt, "<span class='out-of-band'>")?;
|
|
||||||
if let Some(version) = self.item.stable_since() {
|
|
||||||
write!(fmt, "<span class='since' title='Stable since Rust version {0}'>{0}</span>",
|
|
||||||
version)?;
|
|
||||||
}
|
|
||||||
write!(fmt,
|
|
||||||
"<span id='render-detail'>\
|
|
||||||
<a id=\"toggle-all-docs\" href=\"javascript:void(0)\" \
|
|
||||||
title=\"collapse all docs\">\
|
|
||||||
[<span class='inner'>−</span>]\
|
|
||||||
</a>\
|
|
||||||
</span>")?;
|
|
||||||
|
|
||||||
// Write `src` tag
|
|
||||||
//
|
|
||||||
// When this item is part of a `pub use` in a downstream crate, the
|
|
||||||
// [src] link in the downstream documentation will actually come back to
|
|
||||||
// this page, and this link will be auto-clicked. The `id` attribute is
|
|
||||||
// used to find the link to auto-click.
|
|
||||||
if self.cx.shared.include_sources && !self.item.is_primitive() {
|
|
||||||
if let Some(l) = self.src_href() {
|
|
||||||
write!(fmt, "<a class='srclink' href='{}' title='{}'>[src]</a>",
|
|
||||||
l, "goto source code")?;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
write!(fmt, "</span></h1>")?; // out-of-band
|
|
||||||
|
|
||||||
match self.item.inner {
|
match self.item.inner {
|
||||||
clean::ModuleItem(ref m) =>
|
clean::ModuleItem(ref m) =>
|
||||||
|
|
|
@ -97,7 +97,7 @@ h1, h2, h3:not(.impl):not(.method):not(.type):not(.tymethod):not(.important), h4
|
||||||
h1.fqn {
|
h1.fqn {
|
||||||
border-bottom: 1px dashed;
|
border-bottom: 1px dashed;
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
position: relative;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
h2, h3:not(.impl):not(.method):not(.type):not(.tymethod), h4:not(.method):not(.type):not(.tymethod):not(.associatedconstant) {
|
h2, h3:not(.impl):not(.method):not(.type):not(.tymethod), h4:not(.method):not(.type):not(.tymethod):not(.associatedconstant) {
|
||||||
border-bottom: 1px solid;
|
border-bottom: 1px solid;
|
||||||
|
@ -352,14 +352,11 @@ nav.sub {
|
||||||
}
|
}
|
||||||
|
|
||||||
.content .out-of-band {
|
.content .out-of-band {
|
||||||
|
float: right;
|
||||||
font-size: 23px;
|
font-size: 23px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
text-align: right;
|
|
||||||
display: inline-block;
|
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
h3.impl > .out-of-band {
|
h3.impl > .out-of-band {
|
||||||
|
|
|
@ -31,12 +31,10 @@
|
||||||
// initialization closure panics, the Once enters a "poisoned" state which means
|
// initialization closure panics, the Once enters a "poisoned" state which means
|
||||||
// that all future calls will immediately panic as well.
|
// that all future calls will immediately panic as well.
|
||||||
//
|
//
|
||||||
// So to implement this, one might first reach for a `StaticMutex`, but those
|
// So to implement this, one might first reach for a `Mutex`, but those cannot
|
||||||
// unfortunately need to be deallocated (e.g. call `destroy()`) to free memory
|
// be put into a `static`. It also gets a lot harder with poisoning to figure
|
||||||
// on all OSes (some of the BSDs allocate memory for mutexes). It also gets a
|
// out when the mutex needs to be deallocated because it's not after the closure
|
||||||
// lot harder with poisoning to figure out when the mutex needs to be
|
// finishes, but after the first successful closure finishes.
|
||||||
// deallocated because it's not after the closure finishes, but after the first
|
|
||||||
// successful closure finishes.
|
|
||||||
//
|
//
|
||||||
// All in all, this is instead implemented with atomics and lock-free
|
// All in all, this is instead implemented with atomics and lock-free
|
||||||
// operations! Whee! Each `Once` has one word of atomic state, and this state is
|
// operations! Whee! Each `Once` has one word of atomic state, and this state is
|
||||||
|
|
|
@ -49,9 +49,6 @@ impl Mutex {
|
||||||
// references, we instead create the mutex with type
|
// references, we instead create the mutex with type
|
||||||
// PTHREAD_MUTEX_NORMAL which is guaranteed to deadlock if we try to
|
// PTHREAD_MUTEX_NORMAL which is guaranteed to deadlock if we try to
|
||||||
// re-lock it from the same thread, thus avoiding undefined behavior.
|
// re-lock it from the same thread, thus avoiding undefined behavior.
|
||||||
//
|
|
||||||
// We can't do anything for StaticMutex, but that type is deprecated
|
|
||||||
// anyways.
|
|
||||||
let mut attr: libc::pthread_mutexattr_t = mem::uninitialized();
|
let mut attr: libc::pthread_mutexattr_t = mem::uninitialized();
|
||||||
let r = libc::pthread_mutexattr_init(&mut attr);
|
let r = libc::pthread_mutexattr_init(&mut attr);
|
||||||
debug_assert_eq!(r, 0);
|
debug_assert_eq!(r, 0);
|
||||||
|
|
|
@ -323,7 +323,7 @@ declare_features! (
|
||||||
(active, abi_x86_interrupt, "1.17.0", Some(40180), None),
|
(active, abi_x86_interrupt, "1.17.0", Some(40180), None),
|
||||||
|
|
||||||
// Allows the `catch {...}` expression
|
// Allows the `catch {...}` expression
|
||||||
(active, catch_expr, "1.17.0", Some(31436), Some(Edition::Edition2018)),
|
(active, catch_expr, "1.17.0", Some(31436), None),
|
||||||
|
|
||||||
// Used to preserve symbols (see llvm.used)
|
// Used to preserve symbols (see llvm.used)
|
||||||
(active, used, "1.18.0", Some(40289), None),
|
(active, used, "1.18.0", Some(40289), None),
|
||||||
|
|
|
@ -302,6 +302,10 @@ impl Token {
|
||||||
BinOp(Minus) => true,
|
BinOp(Minus) => true,
|
||||||
Ident(ident, false) if ident.name == keywords::True.name() => true,
|
Ident(ident, false) if ident.name == keywords::True.name() => true,
|
||||||
Ident(ident, false) if ident.name == keywords::False.name() => true,
|
Ident(ident, false) if ident.name == keywords::False.name() => true,
|
||||||
|
Interpolated(ref nt) => match nt.0 {
|
||||||
|
NtLiteral(..) => true,
|
||||||
|
_ => false,
|
||||||
|
},
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ use std::sync::{
|
||||||
use std::future::FutureObj;
|
use std::future::FutureObj;
|
||||||
use std::task::{
|
use std::task::{
|
||||||
Context, Poll, Wake,
|
Context, Poll, Wake,
|
||||||
Executor, SpawnObjError,
|
Spawn, SpawnObjError,
|
||||||
local_waker_from_nonlocal,
|
local_waker_from_nonlocal,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -36,8 +36,8 @@ impl Wake for Counter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct NoopExecutor;
|
struct NoopSpawner;
|
||||||
impl Executor for NoopExecutor {
|
impl Spawn for NoopSpawner {
|
||||||
fn spawn_obj(&mut self, _: FutureObj<'static, ()>) -> Result<(), SpawnObjError> {
|
fn spawn_obj(&mut self, _: FutureObj<'static, ()>) -> Result<(), SpawnObjError> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -127,8 +127,8 @@ where
|
||||||
let mut fut = PinBox::new(f(9));
|
let mut fut = PinBox::new(f(9));
|
||||||
let counter = Arc::new(Counter { wakes: AtomicUsize::new(0) });
|
let counter = Arc::new(Counter { wakes: AtomicUsize::new(0) });
|
||||||
let waker = local_waker_from_nonlocal(counter.clone());
|
let waker = local_waker_from_nonlocal(counter.clone());
|
||||||
let executor = &mut NoopExecutor;
|
let spawner = &mut NoopSpawner;
|
||||||
let cx = &mut Context::new(&waker, executor);
|
let cx = &mut Context::new(&waker, spawner);
|
||||||
|
|
||||||
assert_eq!(0, counter.wakes.load(atomic::Ordering::SeqCst));
|
assert_eq!(0, counter.wakes.load(atomic::Ordering::SeqCst));
|
||||||
assert_eq!(Poll::Pending, fut.as_pin_mut().poll(cx));
|
assert_eq!(Poll::Pending, fut.as_pin_mut().poll(cx));
|
||||||
|
|
|
@ -23,7 +23,7 @@ use std::future::FutureObj;
|
||||||
use std::task::{
|
use std::task::{
|
||||||
Context, Poll,
|
Context, Poll,
|
||||||
Wake, Waker, LocalWaker,
|
Wake, Waker, LocalWaker,
|
||||||
Executor, SpawnObjError,
|
Spawn, SpawnObjError,
|
||||||
local_waker, local_waker_from_nonlocal,
|
local_waker, local_waker_from_nonlocal,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -42,9 +42,9 @@ impl Wake for Counter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct NoopExecutor;
|
struct NoopSpawner;
|
||||||
|
|
||||||
impl Executor for NoopExecutor {
|
impl Spawn for NoopSpawner {
|
||||||
fn spawn_obj(&mut self, _: FutureObj<'static, ()>) -> Result<(), SpawnObjError> {
|
fn spawn_obj(&mut self, _: FutureObj<'static, ()>) -> Result<(), SpawnObjError> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,7 @@ impl Future for MyFuture {
|
||||||
cx.waker().wake();
|
cx.waker().wake();
|
||||||
cx.waker().wake();
|
cx.waker().wake();
|
||||||
cx.local_waker().wake();
|
cx.local_waker().wake();
|
||||||
cx.executor().spawn_obj(PinBox::new(MyFuture).into()).unwrap();
|
cx.spawner().spawn_obj(PinBox::new(MyFuture).into()).unwrap();
|
||||||
Poll::Ready(())
|
Poll::Ready(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,8 +70,8 @@ fn test_local_waker() {
|
||||||
nonlocal_wakes: AtomicUsize::new(0),
|
nonlocal_wakes: AtomicUsize::new(0),
|
||||||
});
|
});
|
||||||
let waker = unsafe { local_waker(counter.clone()) };
|
let waker = unsafe { local_waker(counter.clone()) };
|
||||||
let executor = &mut NoopExecutor;
|
let spawner = &mut NoopSpawner;
|
||||||
let cx = &mut Context::new(&waker, executor);
|
let cx = &mut Context::new(&waker, spawner);
|
||||||
assert_eq!(Poll::Ready(()), PinMut::new(&mut MyFuture).poll(cx));
|
assert_eq!(Poll::Ready(()), PinMut::new(&mut MyFuture).poll(cx));
|
||||||
assert_eq!(1, counter.local_wakes.load(atomic::Ordering::SeqCst));
|
assert_eq!(1, counter.local_wakes.load(atomic::Ordering::SeqCst));
|
||||||
assert_eq!(2, counter.nonlocal_wakes.load(atomic::Ordering::SeqCst));
|
assert_eq!(2, counter.nonlocal_wakes.load(atomic::Ordering::SeqCst));
|
||||||
|
@ -83,8 +83,8 @@ fn test_local_as_nonlocal_waker() {
|
||||||
nonlocal_wakes: AtomicUsize::new(0),
|
nonlocal_wakes: AtomicUsize::new(0),
|
||||||
});
|
});
|
||||||
let waker: LocalWaker = local_waker_from_nonlocal(counter.clone());
|
let waker: LocalWaker = local_waker_from_nonlocal(counter.clone());
|
||||||
let executor = &mut NoopExecutor;
|
let spawner = &mut NoopSpawner;
|
||||||
let cx = &mut Context::new(&waker, executor);
|
let cx = &mut Context::new(&waker, spawner);
|
||||||
assert_eq!(Poll::Ready(()), PinMut::new(&mut MyFuture).poll(cx));
|
assert_eq!(Poll::Ready(()), PinMut::new(&mut MyFuture).poll(cx));
|
||||||
assert_eq!(0, counter.local_wakes.load(atomic::Ordering::SeqCst));
|
assert_eq!(0, counter.local_wakes.load(atomic::Ordering::SeqCst));
|
||||||
assert_eq!(3, counter.nonlocal_wakes.load(atomic::Ordering::SeqCst));
|
assert_eq!(3, counter.nonlocal_wakes.load(atomic::Ordering::SeqCst));
|
||||||
|
|
24
src/test/run-pass/issue-52169.rs
Normal file
24
src/test/run-pass/issue-52169.rs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// Copyright 2018 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(macro_literal_matcher)]
|
||||||
|
|
||||||
|
macro_rules! a {
|
||||||
|
($i:literal) => { "right" };
|
||||||
|
($i:tt) => { "wrong" };
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! b {
|
||||||
|
($i:literal) => { a!($i) };
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
assert_eq!(b!(0), "right");
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue