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:
bors 2018-08-07 11:00:07 +00:00
commit 18925dee25
28 changed files with 141 additions and 212 deletions

View file

@ -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]]

View file

@ -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);
} }

View file

@ -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,

View file

@ -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",

View file

@ -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> {

View file

@ -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

View file

@ -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,
} }
} }
} }

View file

@ -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;

View file

@ -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.
/// ///

View file

@ -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",

View file

@ -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,
} }
} }

View file

@ -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

View file

@ -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.

View file

@ -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(_) |

View file

@ -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:

View file

@ -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,

View file

@ -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,

View file

@ -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;

View file

@ -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);

View file

@ -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'>&#x2212;</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'>&#x2212;</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) =>

View file

@ -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 {

View file

@ -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

View file

@ -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);

View file

@ -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),

View file

@ -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,
} }
} }

View file

@ -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));

View file

@ -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));

View 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");
}