Auto merge of #43800 - GuillaumeGomez:rollup, r=GuillaumeGomez
Rollup of 18 pull requests - Successful merges: #43176, #43632, #43650, #43712, #43715, #43721, #43739, #43741, #43744, #43747, #43752, #43760, #43773, #43779, #43783, #43791, #43793, #43795 - Failed merges:
This commit is contained in:
commit
59675d29eb
47 changed files with 249 additions and 76 deletions
|
@ -95,7 +95,7 @@ const MAX_REFCOUNT: usize = (isize::MAX) as usize;
|
|||
/// # Cloning references
|
||||
///
|
||||
/// Creating a new reference from an existing reference counted pointer is done using the
|
||||
/// `Clone` trait implemented for [`Arc<T>`][`arc`] and [`Weak<T>`][`weak`].
|
||||
/// `Clone` trait implemented for [`Arc<T>`][arc] and [`Weak<T>`][weak].
|
||||
///
|
||||
/// ```
|
||||
/// use std::sync::Arc;
|
||||
|
|
|
@ -144,7 +144,7 @@ use boxed::Box;
|
|||
/// # Deref
|
||||
///
|
||||
/// `String`s implement [`Deref`]`<Target=str>`, and so inherit all of [`str`]'s
|
||||
/// methods. In addition, this means that you can pass a `String` to any
|
||||
/// methods. In addition, this means that you can pass a `String` to a
|
||||
/// function which takes a [`&str`] by using an ampersand (`&`):
|
||||
///
|
||||
/// ```
|
||||
|
@ -160,8 +160,38 @@ use boxed::Box;
|
|||
///
|
||||
/// This will create a [`&str`] from the `String` and pass it in. This
|
||||
/// conversion is very inexpensive, and so generally, functions will accept
|
||||
/// [`&str`]s as arguments unless they need a `String` for some specific reason.
|
||||
/// [`&str`]s as arguments unless they need a `String` for some specific
|
||||
/// reason.
|
||||
///
|
||||
/// In certain cases Rust doesn't have enough information to make this
|
||||
/// conversion, known as `Deref` coercion. In the following example a string
|
||||
/// slice `&'a str` implements the trait `TraitExample`, and the function
|
||||
/// `example_func` takes anything that implements the trait. In this case Rust
|
||||
/// would need to make two implicit conversions, which Rust doesn't have the
|
||||
/// means to do. For that reason, the following example will not compile.
|
||||
///
|
||||
/// ```compile_fail,E0277
|
||||
/// trait TraitExample {}
|
||||
///
|
||||
/// impl<'a> TraitExample for &'a str {}
|
||||
///
|
||||
/// fn example_func<A: TraitExample>(example_arg: A) {}
|
||||
///
|
||||
/// fn main() {
|
||||
/// let example_string = String::from("example_string");
|
||||
/// example_func(&example_string);
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// There are two options that would work instead. The first would be to
|
||||
/// change the line `example_func(&example_string);` to
|
||||
/// `example_func(example_string.as_str());`, using the method `as_str()`
|
||||
/// to explicitly extract the string slice containing the string. The second
|
||||
/// way changes `example_func(&example_string);` to
|
||||
/// `example_func(&*example_string);`. In this case we are dereferencing a
|
||||
/// `String` to a `str`, then referencing the `str` back to `&str`. The
|
||||
/// second way is more idiomatic, however both work to do the conversion
|
||||
/// explicitly rather than relying on the implicit conversion.
|
||||
///
|
||||
/// # Representation
|
||||
///
|
||||
|
|
|
@ -2197,8 +2197,8 @@ impl<'a, 'tcx> TyLayout<'tcx> {
|
|||
let tcx = cx.tcx();
|
||||
|
||||
let ptr_field_type = |pointee: Ty<'tcx>| {
|
||||
assert!(i < 2);
|
||||
let slice = |element: Ty<'tcx>| {
|
||||
assert!(i < 2);
|
||||
if i == 0 {
|
||||
tcx.mk_mut_ptr(element)
|
||||
} else {
|
||||
|
|
|
@ -563,7 +563,7 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
|
|||
Entry {
|
||||
kind: EntryKind::Mod(self.lazy(&data)),
|
||||
visibility: self.lazy(&ty::Visibility::from_hir(vis, id, tcx)),
|
||||
span: self.lazy(&md.inner),
|
||||
span: self.lazy(&tcx.def_span(def_id)),
|
||||
attributes: self.encode_attributes(attrs),
|
||||
children: self.lazy_seq(md.item_ids.iter().map(|item_id| {
|
||||
tcx.hir.local_def_id(item_id.id).index
|
||||
|
|
|
@ -1525,9 +1525,9 @@ static BAR: _ = "test"; // error, explicitly write out the type instead
|
|||
"##,
|
||||
|
||||
E0122: r##"
|
||||
An attempt was made to add a generic constraint to a type alias. While Rust will
|
||||
allow this with a warning, it will not currently enforce the constraint.
|
||||
Consider the example below:
|
||||
An attempt was made to add a generic constraint to a type alias. This constraint
|
||||
is entirely ignored. For backwards compatibility, Rust still allows this with a
|
||||
warning. Consider the example below:
|
||||
|
||||
```
|
||||
trait Foo{}
|
||||
|
|
|
@ -2141,8 +2141,8 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
|
|||
|
||||
if !types.is_empty() {
|
||||
write!(w, "
|
||||
<h2 id='associated-types' class='section-header'>
|
||||
<a href='#associated-types'>Associated Types</a>
|
||||
<h2 id='associated-types' class='small-section-header'>
|
||||
Associated Types<a href='#associated-types' class='anchor'></a>
|
||||
</h2>
|
||||
<div class='methods'>
|
||||
")?;
|
||||
|
@ -2154,8 +2154,8 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
|
|||
|
||||
if !consts.is_empty() {
|
||||
write!(w, "
|
||||
<h2 id='associated-const' class='section-header'>
|
||||
<a href='#associated-const'>Associated Constants</a>
|
||||
<h2 id='associated-const' class='small-section-header'>
|
||||
Associated Constants<a href='#associated-const' class='anchor'></a>
|
||||
</h2>
|
||||
<div class='methods'>
|
||||
")?;
|
||||
|
@ -2168,8 +2168,8 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
|
|||
// Output the documentation for each function individually
|
||||
if !required.is_empty() {
|
||||
write!(w, "
|
||||
<h2 id='required-methods' class='section-header'>
|
||||
<a href='#required-methods'>Required Methods</a>
|
||||
<h2 id='required-methods' class='small-section-header'>
|
||||
Required Methods<a href='#required-methods' class='anchor'></a>
|
||||
</h2>
|
||||
<div class='methods'>
|
||||
")?;
|
||||
|
@ -2180,8 +2180,8 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
|
|||
}
|
||||
if !provided.is_empty() {
|
||||
write!(w, "
|
||||
<h2 id='provided-methods' class='section-header'>
|
||||
<a href='#provided-methods'>Provided Methods</a>
|
||||
<h2 id='provided-methods' class='small-section-header'>
|
||||
Provided Methods<a href='#provided-methods' class='anchor'></a>
|
||||
</h2>
|
||||
<div class='methods'>
|
||||
")?;
|
||||
|
@ -2196,8 +2196,8 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
|
|||
|
||||
let cache = cache();
|
||||
write!(w, "
|
||||
<h2 id='implementors' class='section-header'>
|
||||
<a href='#implementors'>Implementors</a>
|
||||
<h2 id='implementors' class='small-section-header'>
|
||||
Implementors<a href='#implementors' class='anchor'></a>
|
||||
</h2>
|
||||
<ul class='item-list' id='implementors-list'>
|
||||
")?;
|
||||
|
@ -2436,8 +2436,8 @@ fn item_struct(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
|
|||
}).peekable();
|
||||
if let doctree::Plain = s.struct_type {
|
||||
if fields.peek().is_some() {
|
||||
write!(w, "<h2 id='fields' class='fields section-header'>
|
||||
<a href='#fields'>Fields</a></h2>")?;
|
||||
write!(w, "<h2 id='fields' class='fields small-section-header'>
|
||||
Fields<a href='#fields' class='anchor'></a></h2>")?;
|
||||
for (field, ty) in fields {
|
||||
let id = derive_id(format!("{}.{}",
|
||||
ItemType::StructField,
|
||||
|
@ -2485,8 +2485,8 @@ fn item_union(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
|
|||
}
|
||||
}).peekable();
|
||||
if fields.peek().is_some() {
|
||||
write!(w, "<h2 id='fields' class='fields section-header'>
|
||||
<a href='#fields'>Fields</a></h2>")?;
|
||||
write!(w, "<h2 id='fields' class='fields small-section-header'>
|
||||
Fields<a href='#fields' class='anchor'></a></h2>")?;
|
||||
for (field, ty) in fields {
|
||||
write!(w, "<span id='{shortty}.{name}' class=\"{shortty}\"><code>{name}: {ty}</code>
|
||||
</span>",
|
||||
|
@ -2558,8 +2558,8 @@ fn item_enum(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
|
|||
|
||||
document(w, cx, it)?;
|
||||
if !e.variants.is_empty() {
|
||||
write!(w, "<h2 id='variants' class='variants section-header'>
|
||||
<a href='#variants'>Variants</a></h2>\n")?;
|
||||
write!(w, "<h2 id='variants' class='variants small-section-header'>
|
||||
Variants<a href='#variants' class='anchor'></a></h2>\n")?;
|
||||
for variant in &e.variants {
|
||||
let id = derive_id(format!("{}.{}",
|
||||
ItemType::Variant,
|
||||
|
@ -2831,16 +2831,16 @@ fn render_assoc_items(w: &mut fmt::Formatter,
|
|||
let render_mode = match what {
|
||||
AssocItemRender::All => {
|
||||
write!(w, "
|
||||
<h2 id='methods' class='section-header'>
|
||||
<a href='#methods'>Methods</a>
|
||||
<h2 id='methods' class='small-section-header'>
|
||||
Methods<a href='#methods' class='anchor'></a>
|
||||
</h2>
|
||||
")?;
|
||||
RenderMode::Normal
|
||||
}
|
||||
AssocItemRender::DerefFor { trait_, type_, deref_mut_ } => {
|
||||
write!(w, "
|
||||
<h2 id='deref-methods' class='section-header'>
|
||||
<a href='#deref-methods'>Methods from {}<Target = {}></a>
|
||||
<h2 id='deref-methods' class='small-section-header'>
|
||||
Methods from {}<Target = {}><a href='#deref-methods' class='anchor'></a>
|
||||
</h2>
|
||||
", trait_, type_)?;
|
||||
RenderMode::ForDeref { mut_: deref_mut_ }
|
||||
|
@ -2865,8 +2865,8 @@ fn render_assoc_items(w: &mut fmt::Formatter,
|
|||
render_deref_methods(w, cx, impl_, containing_item, has_deref_mut)?;
|
||||
}
|
||||
write!(w, "
|
||||
<h2 id='implementations' class='section-header'>
|
||||
<a href='#implementations'>Trait Implementations</a>
|
||||
<h2 id='implementations' class='small-section-header'>
|
||||
Trait Implementations<a href='#implementations' class='anchor'></a>
|
||||
</h2>
|
||||
")?;
|
||||
for i in &traits {
|
||||
|
|
|
@ -438,6 +438,16 @@ a {
|
|||
background: transparent;
|
||||
}
|
||||
|
||||
.small-section-header:hover > .anchor {
|
||||
display: initial;
|
||||
}
|
||||
.anchor {
|
||||
display: none;
|
||||
}
|
||||
.anchor:after {
|
||||
content: '\2002\00a7\2002';
|
||||
}
|
||||
|
||||
.docblock a:hover, .docblock-short a:hover, .stability a {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
@ -677,6 +687,10 @@ span.since {
|
|||
left: 0;
|
||||
}
|
||||
|
||||
.variant + .toggle-wrapper + .docblock > p {
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.variant + .toggle-wrapper > a {
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
@ -695,7 +709,7 @@ span.since {
|
|||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.enum .variant, .struct .structfield, .union .structfield {
|
||||
#main > .variant, #main > .structfield {
|
||||
display: block;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ use time::SystemTime;
|
|||
/// A reference to an open file on the filesystem.
|
||||
///
|
||||
/// An instance of a `File` can be read and/or written depending on what options
|
||||
/// it was opened with. Files also implement `Seek` to alter the logical cursor
|
||||
/// it was opened with. Files also implement [`Seek`] to alter the logical cursor
|
||||
/// that the file contains internally.
|
||||
///
|
||||
/// Files are automatically closed when they go out of scope.
|
||||
|
@ -48,7 +48,7 @@ use time::SystemTime;
|
|||
/// # }
|
||||
/// ```
|
||||
///
|
||||
/// Read the contents of a file into a `String`:
|
||||
/// Read the contents of a file into a [`String`]:
|
||||
///
|
||||
/// ```no_run
|
||||
/// use std::fs::File;
|
||||
|
@ -81,6 +81,8 @@ use time::SystemTime;
|
|||
/// # }
|
||||
/// ```
|
||||
///
|
||||
/// [`Seek`]: ../io/trait.Seek.html
|
||||
/// [`String`]: ../string/struct.String.html
|
||||
/// [`Read`]: ../io/trait.Read.html
|
||||
/// [`BufReader<R>`]: ../io/struct.BufReader.html
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
@ -104,19 +106,19 @@ pub struct Metadata(fs_imp::FileAttr);
|
|||
/// Iterator over the entries in a directory.
|
||||
///
|
||||
/// This iterator is returned from the [`read_dir`] function of this module and
|
||||
/// will yield instances of `io::Result<DirEntry>`. Through a [`DirEntry`]
|
||||
/// will yield instances of [`io::Result`]`<`[`DirEntry`]`>`. Through a [`DirEntry`]
|
||||
/// information like the entry's path and possibly other metadata can be
|
||||
/// learned.
|
||||
///
|
||||
/// [`read_dir`]: fn.read_dir.html
|
||||
/// [`DirEntry`]: struct.DirEntry.html
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
/// This [`io::Result`] will be an `Err` if there's some sort of intermittent
|
||||
/// This [`io::Result`] will be an [`Err`] if there's some sort of intermittent
|
||||
/// IO error during iteration.
|
||||
///
|
||||
/// [`read_dir`]: fn.read_dir.html
|
||||
/// [`DirEntry`]: struct.DirEntry.html
|
||||
/// [`io::Result`]: ../io/type.Result.html
|
||||
/// [`Err`]: ../result/enum.Result.html#variant.Err
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[derive(Debug)]
|
||||
pub struct ReadDir(fs_imp::ReadDir);
|
||||
|
|
|
@ -17,17 +17,21 @@ use convert::From;
|
|||
/// A specialized [`Result`](../result/enum.Result.html) type for I/O
|
||||
/// operations.
|
||||
///
|
||||
/// This type is broadly used across `std::io` for any operation which may
|
||||
/// This type is broadly used across [`std::io`] for any operation which may
|
||||
/// produce an error.
|
||||
///
|
||||
/// This typedef is generally used to avoid writing out `io::Error` directly and
|
||||
/// is otherwise a direct mapping to `Result`.
|
||||
/// This typedef is generally used to avoid writing out [`io::Error`] directly and
|
||||
/// is otherwise a direct mapping to [`Result`].
|
||||
///
|
||||
/// While usual Rust style is to import types directly, aliases of `Result`
|
||||
/// often are not, to make it easier to distinguish between them. `Result` is
|
||||
/// generally assumed to be `std::result::Result`, and so users of this alias
|
||||
/// While usual Rust style is to import types directly, aliases of [`Result`]
|
||||
/// often are not, to make it easier to distinguish between them. [`Result`] is
|
||||
/// generally assumed to be [`std::result::Result`][`Result`], and so users of this alias
|
||||
/// will generally use `io::Result` instead of shadowing the prelude's import
|
||||
/// of `std::result::Result`.
|
||||
/// of [`std::result::Result`][`Result`].
|
||||
///
|
||||
/// [`std::io`]: ../io/index.html
|
||||
/// [`io::Error`]: ../io/struct.Error.html
|
||||
/// [`Result`]: ../result/enum.Result.html
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
|
@ -47,13 +51,16 @@ use convert::From;
|
|||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub type Result<T> = result::Result<T, Error>;
|
||||
|
||||
/// The error type for I/O operations of the `Read`, `Write`, `Seek`, and
|
||||
/// The error type for I/O operations of the [`Read`], [`Write`], [`Seek`], and
|
||||
/// associated traits.
|
||||
///
|
||||
/// Errors mostly originate from the underlying OS, but custom instances of
|
||||
/// `Error` can be created with crafted error messages and a particular value of
|
||||
/// [`ErrorKind`].
|
||||
///
|
||||
/// [`Read`]: ../io/trait.Read.html
|
||||
/// [`Write`]: ../io/trait.Write.html
|
||||
/// [`Seek`]: ../io/trait.Seek.html
|
||||
/// [`ErrorKind`]: enum.ErrorKind.html
|
||||
#[derive(Debug)]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
//! you'll see a few different types of I/O throughout the documentation in
|
||||
//! this module: [`File`]s, [`TcpStream`]s, and sometimes even [`Vec<T>`]s. For
|
||||
//! example, [`Read`] adds a [`read`][`Read::read`] method, which we can use on
|
||||
//! `File`s:
|
||||
//! [`File`]s:
|
||||
//!
|
||||
//! ```
|
||||
//! use std::io;
|
||||
|
@ -146,9 +146,9 @@
|
|||
//! # }
|
||||
//! ```
|
||||
//!
|
||||
//! Note that you cannot use the `?` operator in functions that do not return
|
||||
//! a `Result<T, E>` (e.g. `main`). Instead, you can call `.unwrap()` or `match`
|
||||
//! on the return value to catch any possible errors:
|
||||
//! Note that you cannot use the [`?` operator] in functions that do not return
|
||||
//! a [`Result<T, E>`][`Result`] (e.g. `main`). Instead, you can call [`.unwrap()`]
|
||||
//! or `match` on the return value to catch any possible errors:
|
||||
//!
|
||||
//! ```
|
||||
//! use std::io;
|
||||
|
@ -265,6 +265,8 @@
|
|||
//! [`io::Result`]: type.Result.html
|
||||
//! [`?` operator]: ../../book/first-edition/syntax-index.html
|
||||
//! [`Read::read`]: trait.Read.html#tymethod.read
|
||||
//! [`Result`]: ../result/enum.Result.html
|
||||
//! [`.unwrap()`]: ../result/enum.Result.html#method.unwrap
|
||||
|
||||
#![stable(feature = "rust1", since = "1.0.0")]
|
||||
|
||||
|
|
|
@ -466,7 +466,7 @@ impl Ipv4Addr {
|
|||
/// - test addresses used for documentation (192.0.2.0/24, 198.51.100.0/24 and 203.0.113.0/24)
|
||||
/// - the unspecified address (0.0.0.0)
|
||||
///
|
||||
/// [ipv4-sr]: http://goo.gl/RaZ7lg
|
||||
/// [ipv4-sr]: https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
|
||||
/// [`true`]: ../../std/primitive.bool.html
|
||||
///
|
||||
/// # Examples
|
||||
|
|
|
@ -655,7 +655,7 @@ impl UnixListener {
|
|||
/// Accepts a new incoming connection to this listener.
|
||||
///
|
||||
/// This function will block the calling thread until a new Unix connection
|
||||
/// is established. When established, the corersponding [`UnixStream`] and
|
||||
/// is established. When established, the corresponding [`UnixStream`] and
|
||||
/// the remote peer's address will be returned.
|
||||
///
|
||||
/// [`UnixStream`]: ../../../../std/os/unix/net/struct.UnixStream.html
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
pub use self::SyntaxExtension::{MultiDecorator, MultiModifier, NormalTT, IdentTT};
|
||||
pub use self::SyntaxExtension::*;
|
||||
|
||||
use ast::{self, Attribute, Name, PatKind, MetaItem};
|
||||
use attr::HasAttrs;
|
||||
|
|
|
@ -294,7 +294,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||
let item = match self.cx.resolver.resolve_macro(
|
||||
Mark::root(), path, MacroKind::Derive, false) {
|
||||
Ok(ext) => match *ext {
|
||||
SyntaxExtension::BuiltinDerive(..) => item_with_markers.clone(),
|
||||
BuiltinDerive(..) => item_with_markers.clone(),
|
||||
_ => item.clone(),
|
||||
},
|
||||
_ => item.clone(),
|
||||
|
@ -427,7 +427,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||
items.push(item);
|
||||
kind.expect_from_annotatables(items)
|
||||
}
|
||||
SyntaxExtension::AttrProcMacro(ref mac) => {
|
||||
AttrProcMacro(ref mac) => {
|
||||
let item_tok = TokenTree::Token(DUMMY_SP, Token::interpolated(match item {
|
||||
Annotatable::Item(item) => token::NtItem(item),
|
||||
Annotatable::TraitItem(item) => token::NtTraitItem(item.unwrap()),
|
||||
|
@ -436,7 +436,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||
let tok_result = mac.expand(self.cx, attr.span, attr.tokens, item_tok);
|
||||
self.parse_expansion(tok_result, kind, &attr.path, attr.span)
|
||||
}
|
||||
SyntaxExtension::ProcMacroDerive(..) | SyntaxExtension::BuiltinDerive(..) => {
|
||||
ProcMacroDerive(..) | BuiltinDerive(..) => {
|
||||
self.cx.span_err(attr.span, &format!("`{}` is a derive mode", attr.path));
|
||||
kind.dummy(attr.span)
|
||||
}
|
||||
|
@ -474,7 +474,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||
};
|
||||
|
||||
let opt_expanded = match *ext {
|
||||
SyntaxExtension::DeclMacro(ref expand, def_span) => {
|
||||
DeclMacro(ref expand, def_span) => {
|
||||
if let Err(msg) = validate_and_set_expn_info(def_span.map(|(_, s)| s),
|
||||
false) {
|
||||
self.cx.span_err(path.span, &msg);
|
||||
|
@ -512,18 +512,18 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||
kind.make_from(expander.expand(self.cx, span, ident, input))
|
||||
}
|
||||
|
||||
MultiDecorator(..) | MultiModifier(..) | SyntaxExtension::AttrProcMacro(..) => {
|
||||
MultiDecorator(..) | MultiModifier(..) | AttrProcMacro(..) => {
|
||||
self.cx.span_err(path.span,
|
||||
&format!("`{}` can only be used in attributes", path));
|
||||
return kind.dummy(span);
|
||||
}
|
||||
|
||||
SyntaxExtension::ProcMacroDerive(..) | SyntaxExtension::BuiltinDerive(..) => {
|
||||
ProcMacroDerive(..) | BuiltinDerive(..) => {
|
||||
self.cx.span_err(path.span, &format!("`{}` is a derive mode", path));
|
||||
return kind.dummy(span);
|
||||
}
|
||||
|
||||
SyntaxExtension::ProcMacro(ref expandfun) => {
|
||||
ProcMacro(ref expandfun) => {
|
||||
if ident.name != keywords::Invalid.name() {
|
||||
let msg =
|
||||
format!("macro {}! expects no ident argument, given '{}'", path, ident);
|
||||
|
@ -582,7 +582,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||
};
|
||||
|
||||
match *ext {
|
||||
SyntaxExtension::ProcMacroDerive(ref ext, _) => {
|
||||
ProcMacroDerive(ref ext, _) => {
|
||||
invoc.expansion_data.mark.set_expn_info(expn_info);
|
||||
let span = Span { ctxt: self.cx.backtrace(), ..span };
|
||||
let dummy = ast::MetaItem { // FIXME(jseyfried) avoid this
|
||||
|
@ -592,7 +592,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||
};
|
||||
kind.expect_from_annotatables(ext.expand(self.cx, span, &dummy, item))
|
||||
}
|
||||
SyntaxExtension::BuiltinDerive(func) => {
|
||||
BuiltinDerive(func) => {
|
||||
expn_info.callee.allow_internal_unstable = true;
|
||||
invoc.expansion_data.mark.set_expn_info(expn_info);
|
||||
let span = Span { ctxt: self.cx.backtrace(), ..span };
|
||||
|
|
|
@ -82,7 +82,7 @@ const UNICODE_ARRAY: &'static [(char, &'static str, char)] = &[
|
|||
('։', "Armenian Full Stop", ':'),
|
||||
('܃', "Syriac Supralinear Colon", ':'),
|
||||
('܄', "Syriac Sublinear Colon", ':'),
|
||||
('᛬', "Runic Multiple Ponctuation", ':'),
|
||||
('᛬', "Runic Multiple Punctuation", ':'),
|
||||
('︰', "Presentation Form For Vertical Two Dot Leader", ':'),
|
||||
('᠃', "Mongolian Full Stop", ':'),
|
||||
('᠉', "Mongolian Manchu Full Stop", ':'),
|
||||
|
@ -264,7 +264,7 @@ const UNICODE_ARRAY: &'static [(char, &'static str, char)] = &[
|
|||
('ꝸ', "Latin Small Letter Um", '&'),
|
||||
('&', "Fullwidth Ampersand", '&'),
|
||||
|
||||
('᛭', "Runic Cros Punctuation", '+'),
|
||||
('᛭', "Runic Cross Punctuation", '+'),
|
||||
('➕', "Heavy Plus Sign", '+'),
|
||||
('𐊛', "Lycian Letter H", '+'),
|
||||
('﬩', "Hebrew Letter Alternative Plus Sign", '+'),
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:attribute-with-error.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![feature(proc_macro)]
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:attributes-included.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![feature(proc_macro, rustc_attrs)]
|
||||
#![warn(unused)]
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:derive-bad.rs
|
||||
// ignore-stage1
|
||||
|
||||
#[macro_use]
|
||||
extern crate derive_bad;
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:derive-unstable-2.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![allow(warnings)]
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:derive-unstable.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![allow(warnings)]
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:issue_38586.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![feature(proc_macro)]
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:derive-b.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![allow(warnings)]
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:bang_proc_macro2.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![feature(proc_macro)]
|
||||
#![allow(unused_macros)]
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:derive-b.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![allow(warnings)]
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// ignore-tidy-linelength
|
||||
// compile-flags: -Z verbose -Z mir-emit-validate=1
|
||||
// compile-flags: -Z verbose -Z mir-emit-validate=1 -Z span_free_formats
|
||||
|
||||
struct Test(i32);
|
||||
|
||||
|
@ -20,16 +20,13 @@ impl Test {
|
|||
|
||||
fn main() {
|
||||
let mut x = 0;
|
||||
Test(0).foo(&mut x);
|
||||
Test(0).foo(&mut x); // just making sure we do not panic when there is a tuple struct ctor
|
||||
|
||||
// Also test closures
|
||||
let c = |x: &mut i32| { let y = &*x; *y };
|
||||
c(&mut x);
|
||||
}
|
||||
|
||||
// FIXME: Also test code generated inside the closure, make sure it has validation. Unfortunately,
|
||||
// the interesting lines of code also contain name of the source file, so we cannot test for it.
|
||||
|
||||
// END RUST SOURCE
|
||||
// START rustc.node12.EraseRegions.after.mir
|
||||
// bb0: {
|
||||
|
@ -57,3 +54,24 @@ fn main() {
|
|||
// }
|
||||
// }
|
||||
// END rustc.node23.EraseRegions.after.mir
|
||||
// START rustc.node50.EraseRegions.after.mir
|
||||
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(50)], _2: &ReErased mut i32) -> i32 {
|
||||
// bb0: {
|
||||
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483663) => validate_1/8cd878b::main[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(50)], _2: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483663) => validate_1/8cd878b::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
|
||||
// StorageLive(_3);
|
||||
// _3 = _2;
|
||||
// StorageLive(_4);
|
||||
// Validate(Suspend(ReScope(Remainder(BlockRemainder { block: NodeId(41), first_statement_index: 0 }))), [(*_3): i32]);
|
||||
// _4 = &ReErased (*_3);
|
||||
// Validate(Acquire, [(*_4): i32/ReScope(Remainder(BlockRemainder { block: NodeId(41), first_statement_index: 0 })) (imm)]);
|
||||
// StorageLive(_5);
|
||||
// _5 = (*_4);
|
||||
// _0 = _5;
|
||||
// StorageDead(_5);
|
||||
// StorageDead(_4);
|
||||
// EndRegion(ReScope(Remainder(BlockRemainder { block: NodeId(41), first_statement_index: 0 })));
|
||||
// StorageDead(_3);
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// END rustc.node50.EraseRegions.after.mir
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// ignore-tidy-linelength
|
||||
// compile-flags: -Z verbose -Z mir-emit-validate=1
|
||||
// compile-flags: -Z verbose -Z mir-emit-validate=1 -Z span_free_formats
|
||||
|
||||
// Make sure unsafe fns and fns with an unsafe block only get restricted validation.
|
||||
|
||||
|
@ -45,6 +45,19 @@ fn main() {
|
|||
// }
|
||||
// }
|
||||
// END rustc.node4.EraseRegions.after.mir
|
||||
// START rustc.node22.EraseRegions.after.mir
|
||||
// fn write_42::{{closure}}(_1: &ReErased [closure@NodeId(22)], _2: *mut i32) -> () {
|
||||
// bb0: {
|
||||
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483659) => validate_4/8cd878b::write_42[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(22)], _2: *mut i32]);
|
||||
// Validate(Release, [_1: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483659) => validate_4/8cd878b::write_42[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(22)], _2: *mut i32]);
|
||||
// StorageLive(_3);
|
||||
// _3 = _2;
|
||||
// (*_3) = const 23i32;
|
||||
// StorageDead(_3);
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// END rustc.node22.EraseRegions.after.mir
|
||||
// START rustc.node31.EraseRegions.after.mir
|
||||
// fn test(_1: &ReErased mut i32) -> () {
|
||||
// bb0: {
|
||||
|
@ -58,3 +71,13 @@ fn main() {
|
|||
// }
|
||||
// }
|
||||
// END rustc.node31.EraseRegions.after.mir
|
||||
// START rustc.node60.EraseRegions.after.mir
|
||||
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(60)], _2: &ReErased mut i32) -> bool {
|
||||
// bb0: {
|
||||
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483663) => validate_4/8cd878b::main[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(60)], _2: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483663) => validate_4/8cd878b::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
|
||||
// Validate(Release, [_1: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483663) => validate_4/8cd878b::main[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(60)], _2: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483663) => validate_4/8cd878b::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
|
||||
// StorageLive(_3);
|
||||
// _0 = const write_42(_4) -> bb1;
|
||||
// }
|
||||
// }
|
||||
// END rustc.node60.EraseRegions.after.mir
|
||||
|
|
|
@ -9,9 +9,9 @@
|
|||
// except according to those terms.
|
||||
|
||||
// ignore-tidy-linelength
|
||||
// compile-flags: -Z verbose -Z mir-emit-validate=2
|
||||
// compile-flags: -Z verbose -Z mir-emit-validate=2 -Z span_free_formats
|
||||
|
||||
// Make sure unsafe fns and fns with an unsafe block only get full validation.
|
||||
// Make sure unsafe fns and fns with an unsafe block still get full validation.
|
||||
|
||||
unsafe fn write_42(x: *mut i32) -> bool {
|
||||
*x = 42;
|
||||
|
@ -26,12 +26,12 @@ fn main() {
|
|||
test(&mut 0);
|
||||
|
||||
let test_closure = unsafe { |x: &mut i32| write_42(x) };
|
||||
// Note that validation will fail if this is executed: The closure keeps the lock on
|
||||
// x, so the write in write_42 fails. This test just checks code generation,
|
||||
// so the UB doesn't matter.
|
||||
test_closure(&mut 0);
|
||||
}
|
||||
|
||||
// FIXME: Also test code generated inside the closure, make sure it has validation. Unfortunately,
|
||||
// the interesting lines of code also contain name of the source file, so we cannot test for it.
|
||||
|
||||
// END RUST SOURCE
|
||||
// START rustc.node17.EraseRegions.after.mir
|
||||
// fn test(_1: &ReErased mut i32) -> () {
|
||||
|
@ -42,3 +42,22 @@ fn main() {
|
|||
// }
|
||||
// }
|
||||
// END rustc.node17.EraseRegions.after.mir
|
||||
// START rustc.node46.EraseRegions.after.mir
|
||||
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(46)], _2: &ReErased mut i32) -> bool {
|
||||
// bb0: {
|
||||
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483660) => validate_5/8cd878b::main[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(46)], _2: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483660) => validate_5/8cd878b::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
|
||||
// StorageLive(_3);
|
||||
// _3 = _2;
|
||||
// StorageLive(_4);
|
||||
// StorageLive(_5);
|
||||
// Validate(Suspend(ReScope(Misc(NodeId(44)))), [(*_3): i32]);
|
||||
// _5 = &ReErased mut (*_3);
|
||||
// Validate(Acquire, [(*_5): i32/ReScope(Misc(NodeId(44)))]);
|
||||
// _4 = _5 as *mut i32 (Misc);
|
||||
// StorageDead(_5);
|
||||
// EndRegion(ReScope(Misc(NodeId(44))));
|
||||
// Validate(Release, [_0: bool, _4: *mut i32]);
|
||||
// _0 = const write_42(_4) -> bb1;
|
||||
// }
|
||||
// }
|
||||
// END rustc.node46.EraseRegions.after.mir
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
-include ../tools.mk
|
||||
|
||||
ifeq ($(findstring stage1,$(RUST_BUILD_STAGE)),stage1)
|
||||
# ignore stage1
|
||||
all:
|
||||
|
||||
else
|
||||
all:
|
||||
$(RUSTC) a.rs && $(RUSTC) b.rs
|
||||
$(BARE_RUSTC) c.rs -L dependency=$(TMPDIR) --extern b=$(TMPDIR)/libb.rlib \
|
||||
--out-dir=$(TMPDIR)
|
||||
endif
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
-include ../tools.mk
|
||||
|
||||
ifeq ($(findstring stage1,$(RUST_BUILD_STAGE)),stage1)
|
||||
# ignore stage1
|
||||
all:
|
||||
|
||||
else
|
||||
all:
|
||||
$(RUSTC) a.rs && $(RUSTC) b.rs && $(RUSTC) c.rs
|
||||
endif
|
||||
|
|
|
@ -1,5 +1,11 @@
|
|||
-include ../tools.mk
|
||||
|
||||
ifeq ($(findstring stage1,$(RUST_BUILD_STAGE)),stage1)
|
||||
# ignore stage1
|
||||
all:
|
||||
|
||||
else
|
||||
all:
|
||||
$(RUSTC) foo.rs; $(RUSTC) bar.rs
|
||||
$(RUSTDOC) baz.rs -L $(TMPDIR) -o $(TMPDIR)
|
||||
endif
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
-include ../tools.mk
|
||||
|
||||
ifeq ($(findstring stage1,$(RUST_BUILD_STAGE)),stage1)
|
||||
# ignore stage1
|
||||
all:
|
||||
|
||||
else
|
||||
# Windows doesn't correctly handle include statements with escaping paths,
|
||||
# so this test will not get run on Windows.
|
||||
ifdef IS_WINDOWS
|
||||
|
@ -15,3 +20,5 @@ $(TMPDIR)/libllvm-function-pass.o:
|
|||
$(TMPDIR)/libllvm-module-pass.o:
|
||||
$(CXX) $(CFLAGS) $(LLVM_CXXFLAGS) -c llvm-module-pass.so.cc -o $(TMPDIR)/libllvm-module-pass.o
|
||||
endif
|
||||
|
||||
endif
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
-include ../tools.mk
|
||||
|
||||
ifeq ($(findstring stage1,$(RUST_BUILD_STAGE)),stage1)
|
||||
# ignore stage1
|
||||
all:
|
||||
|
||||
else
|
||||
all:
|
||||
$(RUSTC) foo.rs
|
||||
$(RUSTC) bar.rs --emit dep-info
|
||||
grep "proc-macro source" $(TMPDIR)/bar.d && exit 1 || exit 0
|
||||
endif
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:custom_derive_plugin.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![feature(plugin, custom_derive)]
|
||||
#![plugin(custom_derive_plugin)]
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:add-impl.rs
|
||||
// ignore-stage1
|
||||
|
||||
#[macro_use]
|
||||
extern crate add_impl;
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:append-impl.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![allow(warnings)]
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:attr-args.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![allow(warnings)]
|
||||
#![feature(proc_macro)]
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:bang-macro.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![feature(proc_macro)]
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:count_compound_ops.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![feature(proc_macro)]
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:double.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![allow(unused)]
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:derive-same-struct.rs
|
||||
// ignore-stage1
|
||||
|
||||
#[macro_use]
|
||||
extern crate derive_same_struct;
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
// aux-build:hygiene_example_codegen.rs
|
||||
// aux-build:hygiene_example.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![feature(proc_macro)]
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:issue-39889.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![feature(proc_macro)]
|
||||
#![allow(unused)]
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
// except according to those terms.
|
||||
|
||||
// aux-build:issue-40001-plugin.rs
|
||||
// ignore-stage1
|
||||
|
||||
#![feature(proc_macro, plugin)]
|
||||
#![plugin(issue_40001_plugin)]
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
// aux-build:derive-atob.rs
|
||||
// aux-build:derive-ctod.rs
|
||||
// ignore-stage1
|
||||
|
||||
#[macro_use]
|
||||
extern crate derive_atob;
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
// aux-build:derive-a.rs
|
||||
// aux-build:derive-reexport.rs
|
||||
// ignore-stage1
|
||||
|
||||
#[macro_use]
|
||||
extern crate derive_reexport;
|
||||
|
|
|
@ -107,6 +107,10 @@ fn fishy() {
|
|||
String::<>::from::<>("><>").chars::<>().rev::<>().collect::<String>());
|
||||
}
|
||||
|
||||
fn union() {
|
||||
union union<'union> { union: &'union union<'union>, }
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
strange();
|
||||
funny();
|
||||
|
@ -119,4 +123,5 @@ pub fn main() {
|
|||
dots();
|
||||
you_eight();
|
||||
fishy();
|
||||
union();
|
||||
}
|
||||
|
|
|
@ -83,7 +83,7 @@ fn line_is_url(line: &str) -> bool {
|
|||
=> state = EXP_END,
|
||||
|
||||
(EXP_URL, w)
|
||||
if w.starts_with("http://") || w.starts_with("https://")
|
||||
if w.starts_with("http://") || w.starts_with("https://") || w.starts_with("../")
|
||||
=> state = EXP_END,
|
||||
|
||||
(_, _) => return false,
|
||||
|
|
Loading…
Add table
Reference in a new issue