Auto merge of #45344 - kennytm:rollup, r=kennytm
Rollup of 10 pull requests - Successful merges: #45097, #45151, #45307, #45308, #45310, #45315, #45321, #45329, #45338, #45339 - Failed merges:
This commit is contained in:
commit
f6d7514545
22 changed files with 83 additions and 91 deletions
10
.travis.yml
10
.travis.yml
|
@ -36,7 +36,7 @@ matrix:
|
||||||
NO_LLVM_ASSERTIONS=1
|
NO_LLVM_ASSERTIONS=1
|
||||||
NO_DEBUG_ASSERTIONS=1
|
NO_DEBUG_ASSERTIONS=1
|
||||||
os: osx
|
os: osx
|
||||||
osx_image: xcode7
|
osx_image: xcode7.3
|
||||||
if: branch = auto
|
if: branch = auto
|
||||||
|
|
||||||
# macOS builders. These are placed near the beginning because they are very
|
# macOS builders. These are placed near the beginning because they are very
|
||||||
|
@ -57,7 +57,7 @@ matrix:
|
||||||
NO_LLVM_ASSERTIONS=1
|
NO_LLVM_ASSERTIONS=1
|
||||||
NO_DEBUG_ASSERTIONS=1
|
NO_DEBUG_ASSERTIONS=1
|
||||||
os: osx
|
os: osx
|
||||||
osx_image: xcode8.2
|
osx_image: xcode8.3
|
||||||
if: branch = auto
|
if: branch = auto
|
||||||
|
|
||||||
- env: >
|
- env: >
|
||||||
|
@ -71,7 +71,7 @@ matrix:
|
||||||
NO_LLVM_ASSERTIONS=1
|
NO_LLVM_ASSERTIONS=1
|
||||||
NO_DEBUG_ASSERTIONS=1
|
NO_DEBUG_ASSERTIONS=1
|
||||||
os: osx
|
os: osx
|
||||||
osx_image: xcode8.2
|
osx_image: xcode8.3
|
||||||
if: branch = auto
|
if: branch = auto
|
||||||
|
|
||||||
# OSX builders producing releases. These do not run the full test suite and
|
# OSX builders producing releases. These do not run the full test suite and
|
||||||
|
@ -91,7 +91,7 @@ matrix:
|
||||||
NO_LLVM_ASSERTIONS=1
|
NO_LLVM_ASSERTIONS=1
|
||||||
NO_DEBUG_ASSERTIONS=1
|
NO_DEBUG_ASSERTIONS=1
|
||||||
os: osx
|
os: osx
|
||||||
osx_image: xcode7
|
osx_image: xcode7.3
|
||||||
if: branch = auto
|
if: branch = auto
|
||||||
|
|
||||||
- env: >
|
- env: >
|
||||||
|
@ -105,7 +105,7 @@ matrix:
|
||||||
NO_LLVM_ASSERTIONS=1
|
NO_LLVM_ASSERTIONS=1
|
||||||
NO_DEBUG_ASSERTIONS=1
|
NO_DEBUG_ASSERTIONS=1
|
||||||
os: osx
|
os: osx
|
||||||
osx_image: xcode7
|
osx_image: xcode7.3
|
||||||
if: branch = auto
|
if: branch = auto
|
||||||
|
|
||||||
# Linux builders, remaining docker images
|
# Linux builders, remaining docker images
|
||||||
|
|
|
@ -648,7 +648,8 @@ class RustBuild(object):
|
||||||
if not ((module.endswith("llvm") and
|
if not ((module.endswith("llvm") and
|
||||||
self.get_toml('llvm-config')) or
|
self.get_toml('llvm-config')) or
|
||||||
(module.endswith("jemalloc") and
|
(module.endswith("jemalloc") and
|
||||||
self.get_toml('jemalloc')))]
|
(self.get_toml('use-jemalloc') == "false" or
|
||||||
|
self.get_toml('jemalloc'))))]
|
||||||
run(["git", "submodule", "update",
|
run(["git", "submodule", "update",
|
||||||
"--init", "--recursive"] + submodules,
|
"--init", "--recursive"] + submodules,
|
||||||
cwd=self.rust_root, verbose=self.verbose)
|
cwd=self.rust_root, verbose=self.verbose)
|
||||||
|
|
|
@ -96,11 +96,11 @@ Using this flag looks like this:
|
||||||
$ rustdoc src/lib.rs --crate-name mycrate
|
$ rustdoc src/lib.rs --crate-name mycrate
|
||||||
```
|
```
|
||||||
|
|
||||||
By default, `rustodc` assumes that the name of your crate is the same name
|
By default, `rustdoc` assumes that the name of your crate is the same name
|
||||||
as the `.rs` file. `--crate-name` lets you override this assumption with
|
as the `.rs` file. `--crate-name` lets you override this assumption with
|
||||||
whatever name you choose.
|
whatever name you choose.
|
||||||
|
|
||||||
## `-L`/`--library-path`:
|
## `-L`/`--library-path`: where to look for dependencies
|
||||||
|
|
||||||
Using this flag looks like this:
|
Using this flag looks like this:
|
||||||
|
|
||||||
|
@ -186,7 +186,7 @@ on documentation tests](documentation-tests.html).
|
||||||
|
|
||||||
See also `--test-args`.
|
See also `--test-args`.
|
||||||
|
|
||||||
## `--test-args`:
|
## `--test-args`: pass options to test runner
|
||||||
|
|
||||||
Using this flag looks like this:
|
Using this flag looks like this:
|
||||||
|
|
||||||
|
@ -199,7 +199,7 @@ For more, see [the chapter on documentation tests](documentation-tests.html).
|
||||||
|
|
||||||
See also `--test`.
|
See also `--test`.
|
||||||
|
|
||||||
## `--target`:
|
## `--target`: generate documentation for the specified target triple
|
||||||
|
|
||||||
Using this flag looks like this:
|
Using this flag looks like this:
|
||||||
|
|
||||||
|
@ -253,7 +253,7 @@ $ rustdoc README.md --html-before-content extra.html
|
||||||
```
|
```
|
||||||
|
|
||||||
This flag takes a list of files, and inserts them inside the `<body>` tag but
|
This flag takes a list of files, and inserts them inside the `<body>` tag but
|
||||||
before the other content `rustodc` would normally produce in the rendered
|
before the other content `rustdoc` would normally produce in the rendered
|
||||||
documentation.
|
documentation.
|
||||||
|
|
||||||
## `--html-after-content`: include more HTML after the content
|
## `--html-after-content`: include more HTML after the content
|
||||||
|
@ -266,7 +266,7 @@ $ rustdoc README.md --html-after-content extra.html
|
||||||
```
|
```
|
||||||
|
|
||||||
This flag takes a list of files, and inserts them before the `</body>` tag but
|
This flag takes a list of files, and inserts them before the `</body>` tag but
|
||||||
after the other content `rustodc` would normally produce in the rendered
|
after the other content `rustdoc` would normally produce in the rendered
|
||||||
documentation.
|
documentation.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -8,11 +8,6 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
// FIXME https://github.com/kripken/emscripten/issues/4563
|
|
||||||
// NB we have to actually not compile this test to avoid
|
|
||||||
// an undefined symbol error
|
|
||||||
#![cfg(not(target_os = "emscripten"))]
|
|
||||||
|
|
||||||
use core::num::flt2dec::estimator::*;
|
use core::num::flt2dec::estimator::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -171,7 +171,7 @@ fn build_local_id_to_index(body: Option<&hir::Body>,
|
||||||
-> FxHashMap<hir::ItemLocalId, Vec<CFGIndex>> {
|
-> FxHashMap<hir::ItemLocalId, Vec<CFGIndex>> {
|
||||||
let mut index = FxHashMap();
|
let mut index = FxHashMap();
|
||||||
|
|
||||||
// FIXME (#6298): Would it be better to fold formals from decl
|
// FIXME(#15020) Would it be better to fold formals from decl
|
||||||
// into cfg itself? i.e. introduce a fn-based flow-graph in
|
// into cfg itself? i.e. introduce a fn-based flow-graph in
|
||||||
// addition to the current block-based flow-graph, rather than
|
// addition to the current block-based flow-graph, rather than
|
||||||
// have to put traversals like this here?
|
// have to put traversals like this here?
|
||||||
|
|
|
@ -477,10 +477,8 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
|
||||||
|
|
||||||
fn pat_ty(&self, pat: &hir::Pat) -> McResult<Ty<'tcx>> {
|
fn pat_ty(&self, pat: &hir::Pat) -> McResult<Ty<'tcx>> {
|
||||||
let base_ty = self.node_ty(pat.hir_id)?;
|
let base_ty = self.node_ty(pat.hir_id)?;
|
||||||
// FIXME (Issue #18207): This code detects whether we are
|
// This code detects whether we are looking at a `ref x`,
|
||||||
// looking at a `ref x`, and if so, figures out what the type
|
// and if so, figures out what the type *being borrowed* is.
|
||||||
// *being borrowed* is. But ideally we would put in a more
|
|
||||||
// fundamental fix to this conflated use of the node id.
|
|
||||||
let ret_ty = match pat.node {
|
let ret_ty = match pat.node {
|
||||||
PatKind::Binding(..) => {
|
PatKind::Binding(..) => {
|
||||||
let bm = *self.tables
|
let bm = *self.tables
|
||||||
|
|
|
@ -960,7 +960,7 @@ fn resolve_expr<'a, 'tcx>(visitor: &mut RegionResolutionVisitor<'a, 'tcx>, expr:
|
||||||
|
|
||||||
hir::ExprAssignOp(..) | hir::ExprIndex(..) |
|
hir::ExprAssignOp(..) | hir::ExprIndex(..) |
|
||||||
hir::ExprUnary(..) | hir::ExprCall(..) | hir::ExprMethodCall(..) => {
|
hir::ExprUnary(..) | hir::ExprCall(..) | hir::ExprMethodCall(..) => {
|
||||||
// FIXME(#6268) Nested method calls
|
// FIXME(https://github.com/rust-lang/rfcs/issues/811) Nested method calls
|
||||||
//
|
//
|
||||||
// The lifetimes for a call or method call look as follows:
|
// The lifetimes for a call or method call look as follows:
|
||||||
//
|
//
|
||||||
|
@ -1081,8 +1081,6 @@ fn resolve_local<'a, 'tcx>(visitor: &mut RegionResolutionVisitor<'a, 'tcx>,
|
||||||
// Here, the expression `[...]` has an extended lifetime due to rule
|
// Here, the expression `[...]` has an extended lifetime due to rule
|
||||||
// A, but the inner rvalues `a()` and `b()` have an extended lifetime
|
// A, but the inner rvalues `a()` and `b()` have an extended lifetime
|
||||||
// due to rule C.
|
// due to rule C.
|
||||||
//
|
|
||||||
// FIXME(#6308) -- Note that `[]` patterns work more smoothly post-DST.
|
|
||||||
|
|
||||||
if let Some(expr) = init {
|
if let Some(expr) = init {
|
||||||
record_rvalue_scope_if_borrow_expr(visitor, &expr, blk_scope);
|
record_rvalue_scope_if_borrow_expr(visitor, &expr, blk_scope);
|
||||||
|
|
|
@ -28,8 +28,6 @@ pub enum FileMatch {
|
||||||
}
|
}
|
||||||
|
|
||||||
// A module for searching for libraries
|
// A module for searching for libraries
|
||||||
// FIXME (#2658): I'm not happy how this module turned out. Should
|
|
||||||
// probably just be folded into cstore.
|
|
||||||
|
|
||||||
pub struct FileSearch<'a> {
|
pub struct FileSearch<'a> {
|
||||||
pub sysroot: &'a Path,
|
pub sysroot: &'a Path,
|
||||||
|
|
|
@ -252,7 +252,6 @@ fn uncovered_tys<'tcx>(tcx: TyCtxt, ty: Ty<'tcx>, infer_is_local: InferIsLocal)
|
||||||
|
|
||||||
fn is_type_parameter(ty: Ty) -> bool {
|
fn is_type_parameter(ty: Ty) -> bool {
|
||||||
match ty.sty {
|
match ty.sty {
|
||||||
// FIXME(#20590) straighten story about projection types
|
|
||||||
ty::TyProjection(..) | ty::TyParam(..) => true,
|
ty::TyProjection(..) | ty::TyParam(..) => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
|
|
|
@ -1309,13 +1309,13 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
|
||||||
};
|
};
|
||||||
|
|
||||||
if obligation.predicate.skip_binder().self_ty().is_ty_var() {
|
if obligation.predicate.skip_binder().self_ty().is_ty_var() {
|
||||||
// FIXME(#20297): Self is a type variable (e.g. `_: AsRef<str>`).
|
// Self is a type variable (e.g. `_: AsRef<str>`).
|
||||||
//
|
//
|
||||||
// This is somewhat problematic, as the current scheme can't really
|
// This is somewhat problematic, as the current scheme can't really
|
||||||
// handle it turning to be a projection. This does end up as truly
|
// handle it turning to be a projection. This does end up as truly
|
||||||
// ambiguous in most cases anyway.
|
// ambiguous in most cases anyway.
|
||||||
//
|
//
|
||||||
// Until this is fixed, take the fast path out - this also improves
|
// Take the fast path out - this also improves
|
||||||
// performance by preventing assemble_candidates_from_impls from
|
// performance by preventing assemble_candidates_from_impls from
|
||||||
// matching every impl for this trait.
|
// matching every impl for this trait.
|
||||||
return Ok(SelectionCandidateSet { vec: vec![], ambiguous: true });
|
return Ok(SelectionCandidateSet { vec: vec![], ambiguous: true });
|
||||||
|
@ -1383,8 +1383,6 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
|
||||||
{
|
{
|
||||||
debug!("assemble_candidates_for_projected_tys({:?})", obligation);
|
debug!("assemble_candidates_for_projected_tys({:?})", obligation);
|
||||||
|
|
||||||
// FIXME(#20297) -- just examining the self-type is very simplistic
|
|
||||||
|
|
||||||
// before we go into the whole skolemization thing, just
|
// before we go into the whole skolemization thing, just
|
||||||
// quickly check if the self-type is a projection at all.
|
// quickly check if the self-type is a projection at all.
|
||||||
match obligation.predicate.0.trait_ref.self_ty().sty {
|
match obligation.predicate.0.trait_ref.self_ty().sty {
|
||||||
|
@ -2174,14 +2172,6 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
ty::TyClosure(def_id, ref substs) => {
|
ty::TyClosure(def_id, ref substs) => {
|
||||||
// FIXME(#27086). We are invariant w/r/t our
|
|
||||||
// func_substs, but we don't see them as
|
|
||||||
// constituent types; this seems RIGHT but also like
|
|
||||||
// something that a normal type couldn't simulate. Is
|
|
||||||
// this just a gap with the way that PhantomData and
|
|
||||||
// OIBIT interact? That is, there is no way to say
|
|
||||||
// "make me invariant with respect to this TYPE, but
|
|
||||||
// do not act as though I can reach it"
|
|
||||||
substs.upvar_tys(def_id, self.tcx()).collect()
|
substs.upvar_tys(def_id, self.tcx()).collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,42 +73,6 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||||
// projection).
|
// projection).
|
||||||
match ty.sty {
|
match ty.sty {
|
||||||
ty::TyClosure(def_id, ref substs) => {
|
ty::TyClosure(def_id, ref substs) => {
|
||||||
// FIXME(#27086). We do not accumulate from substs, since they
|
|
||||||
// don't represent reachable data. This means that, in
|
|
||||||
// practice, some of the lifetime parameters might not
|
|
||||||
// be in scope when the body runs, so long as there is
|
|
||||||
// no reachable data with that lifetime. For better or
|
|
||||||
// worse, this is consistent with fn types, however,
|
|
||||||
// which can also encapsulate data in this fashion
|
|
||||||
// (though it's somewhat harder, and typically
|
|
||||||
// requires virtual dispatch).
|
|
||||||
//
|
|
||||||
// Note that changing this (in a naive way, at least)
|
|
||||||
// causes regressions for what appears to be perfectly
|
|
||||||
// reasonable code like this:
|
|
||||||
//
|
|
||||||
// ```
|
|
||||||
// fn foo<'a>(p: &Data<'a>) {
|
|
||||||
// bar(|q: &mut Parser| q.read_addr())
|
|
||||||
// }
|
|
||||||
// fn bar(p: Box<FnMut(&mut Parser)+'static>) {
|
|
||||||
// }
|
|
||||||
// ```
|
|
||||||
//
|
|
||||||
// Note that `p` (and `'a`) are not used in the
|
|
||||||
// closure at all, but to meet the requirement that
|
|
||||||
// the closure type `C: 'static` (so it can be coerced
|
|
||||||
// to the object type), we get the requirement that
|
|
||||||
// `'a: 'static` since `'a` appears in the closure
|
|
||||||
// type `C`.
|
|
||||||
//
|
|
||||||
// A smarter fix might "prune" unused `func_substs` --
|
|
||||||
// this would avoid breaking simple examples like
|
|
||||||
// this, but would still break others (which might
|
|
||||||
// indeed be invalid, depending on your POV). Pruning
|
|
||||||
// would be a subtle process, since we have to see
|
|
||||||
// what func/type parameters are used and unused,
|
|
||||||
// taking into consideration UFCS and so forth.
|
|
||||||
|
|
||||||
for upvar_ty in substs.upvar_tys(def_id, *self) {
|
for upvar_ty in substs.upvar_tys(def_id, *self) {
|
||||||
self.compute_components(upvar_ty, out);
|
self.compute_components(upvar_ty, out);
|
||||||
|
|
|
@ -781,8 +781,9 @@ the base path, it will still be considered freezable.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**FIXME #10520: Restrictions against mutating the base pointer.** When
|
**FIXME [RFC 1751](https://github.com/rust-lang/rfcs/issues/1751)
|
||||||
an `&mut` pointer is frozen or claimed, we currently pass along the
|
Restrictions against mutating the base pointer.**
|
||||||
|
When an `&mut` pointer is frozen or claimed, we currently pass along the
|
||||||
restriction against MUTATE to the base pointer. I do not believe this
|
restriction against MUTATE to the base pointer. I do not believe this
|
||||||
restriction is needed. It dates from the days when we had a way to
|
restriction is needed. It dates from the days when we had a way to
|
||||||
mutate that preserved the value being mutated (i.e., swap). Nowadays
|
mutate that preserved the value being mutated (i.e., swap). Nowadays
|
||||||
|
|
|
@ -659,7 +659,7 @@ impl<'a, 'tcx> CheckLoanCtxt<'a, 'tcx> {
|
||||||
debug!("check_if_path_is_moved(id={:?}, use_kind={:?}, lp={:?})",
|
debug!("check_if_path_is_moved(id={:?}, use_kind={:?}, lp={:?})",
|
||||||
id, use_kind, lp);
|
id, use_kind, lp);
|
||||||
|
|
||||||
// FIXME (22079): if you find yourself tempted to cut and paste
|
// FIXME: if you find yourself tempted to cut and paste
|
||||||
// the body below and then specializing the error reporting,
|
// the body below and then specializing the error reporting,
|
||||||
// consider refactoring this instead!
|
// consider refactoring this instead!
|
||||||
|
|
||||||
|
@ -720,7 +720,7 @@ impl<'a, 'tcx> CheckLoanCtxt<'a, 'tcx> {
|
||||||
// the path must be initialized to prevent a case of
|
// the path must be initialized to prevent a case of
|
||||||
// partial reinitialization
|
// partial reinitialization
|
||||||
//
|
//
|
||||||
// FIXME (22079): could refactor via hypothetical
|
// FIXME: could refactor via hypothetical
|
||||||
// generalized check_if_path_is_moved
|
// generalized check_if_path_is_moved
|
||||||
let loan_path = owned_ptr_base_path_rc(lp_base);
|
let loan_path = owned_ptr_base_path_rc(lp_base);
|
||||||
self.move_data.each_move_of(id, &loan_path, |_, _| {
|
self.move_data.each_move_of(id, &loan_path, |_, _| {
|
||||||
|
|
|
@ -406,7 +406,7 @@ impl<'a, 'tcx> GatherLoanCtxt<'a, 'tcx> {
|
||||||
self.all_loans.push(loan);
|
self.all_loans.push(loan);
|
||||||
|
|
||||||
// if loan_gen_scope != borrow_id {
|
// if loan_gen_scope != borrow_id {
|
||||||
// FIXME(#6268) Nested method calls
|
// FIXME(https://github.com/rust-lang/rfcs/issues/811) Nested method calls
|
||||||
//
|
//
|
||||||
// Typically, the scope of the loan includes the point at
|
// Typically, the scope of the loan includes the point at
|
||||||
// which the loan is originated. This
|
// which the loan is originated. This
|
||||||
|
@ -417,9 +417,8 @@ impl<'a, 'tcx> GatherLoanCtxt<'a, 'tcx> {
|
||||||
//let restr = restrictions::compute_restrictions(
|
//let restr = restrictions::compute_restrictions(
|
||||||
// self.bccx, borrow_span, cmt, RESTR_EMPTY);
|
// self.bccx, borrow_span, cmt, RESTR_EMPTY);
|
||||||
//let loan = {
|
//let loan = {
|
||||||
// let all_loans = &mut *self.all_loans; // FIXME(#5074)
|
|
||||||
// Loan {
|
// Loan {
|
||||||
// index: all_loans.len(),
|
// index: self.all_loans.len(),
|
||||||
// loan_path,
|
// loan_path,
|
||||||
// cmt,
|
// cmt,
|
||||||
// mutbl: ConstMutability,
|
// mutbl: ConstMutability,
|
||||||
|
|
|
@ -73,6 +73,8 @@ unsafe fn configure_llvm(sess: &Session) {
|
||||||
|
|
||||||
const ARM_WHITELIST: &'static [&'static str] = &["neon\0", "vfp2\0", "vfp3\0", "vfp4\0"];
|
const ARM_WHITELIST: &'static [&'static str] = &["neon\0", "vfp2\0", "vfp3\0", "vfp4\0"];
|
||||||
|
|
||||||
|
const AARCH64_WHITELIST: &'static [&'static str] = &["neon\0"];
|
||||||
|
|
||||||
const X86_WHITELIST: &'static [&'static str] = &["avx\0", "avx2\0", "bmi\0", "bmi2\0", "sse\0",
|
const X86_WHITELIST: &'static [&'static str] = &["avx\0", "avx2\0", "bmi\0", "bmi2\0", "sse\0",
|
||||||
"sse2\0", "sse3\0", "sse4.1\0", "sse4.2\0",
|
"sse2\0", "sse3\0", "sse4.1\0", "sse4.2\0",
|
||||||
"ssse3\0", "tbm\0", "lzcnt\0", "popcnt\0",
|
"ssse3\0", "tbm\0", "lzcnt\0", "popcnt\0",
|
||||||
|
@ -90,6 +92,7 @@ pub fn target_features(sess: &Session) -> Vec<Symbol> {
|
||||||
|
|
||||||
let whitelist = match &*sess.target.target.arch {
|
let whitelist = match &*sess.target.target.arch {
|
||||||
"arm" => ARM_WHITELIST,
|
"arm" => ARM_WHITELIST,
|
||||||
|
"aarch64" => AARCH64_WHITELIST,
|
||||||
"x86" | "x86_64" => X86_WHITELIST,
|
"x86" | "x86_64" => X86_WHITELIST,
|
||||||
"hexagon" => HEXAGON_WHITELIST,
|
"hexagon" => HEXAGON_WHITELIST,
|
||||||
"powerpc" | "powerpc64" => POWERPC_WHITELIST,
|
"powerpc" | "powerpc64" => POWERPC_WHITELIST,
|
||||||
|
|
|
@ -815,7 +815,8 @@ impl<'a, 'gcx, 'tcx> Visitor<'gcx> for RegionCtxt<'a, 'gcx, 'tcx> {
|
||||||
// the type of the node expr.id here *before applying
|
// the type of the node expr.id here *before applying
|
||||||
// adjustments*.
|
// adjustments*.
|
||||||
//
|
//
|
||||||
// FIXME(#6268) nested method calls requires that this rule change
|
// FIXME(https://github.com/rust-lang/rfcs/issues/811)
|
||||||
|
// nested method calls requires that this rule change
|
||||||
let ty0 = self.resolve_node_type(expr.hir_id);
|
let ty0 = self.resolve_node_type(expr.hir_id);
|
||||||
self.type_must_outlive(infer::AddrOf(expr.span), ty0, expr_region);
|
self.type_must_outlive(infer::AddrOf(expr.span), ty0, expr_region);
|
||||||
intravisit::walk_expr(self, expr);
|
intravisit::walk_expr(self, expr);
|
||||||
|
|
|
@ -284,7 +284,6 @@ mod prim_pointer { }
|
||||||
/// Arrays of sizes from 0 to 32 (inclusive) implement the following traits if
|
/// Arrays of sizes from 0 to 32 (inclusive) implement the following traits if
|
||||||
/// the element type allows it:
|
/// the element type allows it:
|
||||||
///
|
///
|
||||||
/// - [`Clone`][clone] (only if `T: `[`Copy`][copy])
|
|
||||||
/// - [`Debug`][debug]
|
/// - [`Debug`][debug]
|
||||||
/// - [`IntoIterator`][intoiterator] (implemented for `&[T; N]` and `&mut [T; N]`)
|
/// - [`IntoIterator`][intoiterator] (implemented for `&[T; N]` and `&mut [T; N]`)
|
||||||
/// - [`PartialEq`][partialeq], [`PartialOrd`][partialord], [`Eq`][eq], [`Ord`][ord]
|
/// - [`PartialEq`][partialeq], [`PartialOrd`][partialord], [`Eq`][eq], [`Ord`][ord]
|
||||||
|
@ -299,8 +298,10 @@ mod prim_pointer { }
|
||||||
/// entirely different types. As a stopgap, trait implementations are
|
/// entirely different types. As a stopgap, trait implementations are
|
||||||
/// statically generated up to size 32.
|
/// statically generated up to size 32.
|
||||||
///
|
///
|
||||||
/// Arrays of *any* size are [`Copy`][copy] if the element type is [`Copy`][copy]. This
|
/// Arrays of *any* size are [`Copy`][copy] if the element type is [`Copy`][copy]
|
||||||
/// works because the [`Copy`][copy] trait is specially known to the compiler.
|
/// and [`Clone`][clone] if the element type is [`Clone`][clone]. This works
|
||||||
|
/// because [`Copy`][copy] and [`Clone`][clone] traits are specially known
|
||||||
|
/// to the compiler.
|
||||||
///
|
///
|
||||||
/// Arrays coerce to [slices (`[T]`)][slice], so a slice method may be called on
|
/// Arrays coerce to [slices (`[T]`)][slice], so a slice method may be called on
|
||||||
/// an array. Indeed, this provides most of the API for working with arrays.
|
/// an array. Indeed, this provides most of the API for working with arrays.
|
||||||
|
|
|
@ -552,6 +552,12 @@ impl Command {
|
||||||
|
|
||||||
/// Configuration for the child process's standard input (stdin) handle.
|
/// Configuration for the child process's standard input (stdin) handle.
|
||||||
///
|
///
|
||||||
|
/// Defaults to [`inherit`] when used with `spawn` or `status`, and
|
||||||
|
/// defaults to [`piped`] when used with `output`.
|
||||||
|
///
|
||||||
|
/// [`inherit`]: struct.Stdio.html#method.inherit
|
||||||
|
/// [`piped`]: struct.Stdio.html#method.piped
|
||||||
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// Basic usage:
|
/// Basic usage:
|
||||||
|
@ -572,6 +578,12 @@ impl Command {
|
||||||
|
|
||||||
/// Configuration for the child process's standard output (stdout) handle.
|
/// Configuration for the child process's standard output (stdout) handle.
|
||||||
///
|
///
|
||||||
|
/// Defaults to [`inherit`] when used with `spawn` or `status`, and
|
||||||
|
/// defaults to [`piped`] when used with `output`.
|
||||||
|
///
|
||||||
|
/// [`inherit`]: struct.Stdio.html#method.inherit
|
||||||
|
/// [`piped`]: struct.Stdio.html#method.piped
|
||||||
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// Basic usage:
|
/// Basic usage:
|
||||||
|
@ -592,6 +604,12 @@ impl Command {
|
||||||
|
|
||||||
/// Configuration for the child process's standard error (stderr) handle.
|
/// Configuration for the child process's standard error (stderr) handle.
|
||||||
///
|
///
|
||||||
|
/// Defaults to [`inherit`] when used with `spawn` or `status`, and
|
||||||
|
/// defaults to [`piped`] when used with `output`.
|
||||||
|
///
|
||||||
|
/// [`inherit`]: struct.Stdio.html#method.inherit
|
||||||
|
/// [`piped`]: struct.Stdio.html#method.piped
|
||||||
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// Basic usage:
|
/// Basic usage:
|
||||||
|
|
|
@ -393,8 +393,8 @@ pub trait MetadataExt {
|
||||||
/// to. For a directory, the structure specifies when the directory was
|
/// to. For a directory, the structure specifies when the directory was
|
||||||
/// created.
|
/// created.
|
||||||
///
|
///
|
||||||
/// If the underlying filesystem does not support the last write time
|
/// If the underlying filesystem does not support the last write time,
|
||||||
/// time, the returned value is 0.
|
/// the returned value is 0.
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
|
|
|
@ -4088,11 +4088,11 @@ impl<'a> Parser<'a> {
|
||||||
node: StmtKind::Item(i),
|
node: StmtKind::Item(i),
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
let unused_attrs = |attrs: &[_], s: &mut Self| {
|
let unused_attrs = |attrs: &[Attribute], s: &mut Self| {
|
||||||
if !attrs.is_empty() {
|
if !attrs.is_empty() {
|
||||||
if s.prev_token_kind == PrevTokenKind::DocComment {
|
if s.prev_token_kind == PrevTokenKind::DocComment {
|
||||||
s.span_fatal_err(s.prev_span, Error::UselessDocComment).emit();
|
s.span_fatal_err(s.prev_span, Error::UselessDocComment).emit();
|
||||||
} else {
|
} else if attrs.iter().any(|a| a.style == AttrStyle::Outer) {
|
||||||
s.span_err(s.span, "expected statement after outer attribute");
|
s.span_err(s.span, "expected statement after outer attribute");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
15
src/test/ui/issue-45296.rs
Normal file
15
src/test/ui/issue-45296.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <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.
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let unused = ();
|
||||||
|
|
||||||
|
#![allow(unused_variables)]
|
||||||
|
}
|
11
src/test/ui/issue-45296.stderr
Normal file
11
src/test/ui/issue-45296.stderr
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
error: an inner attribute is not permitted in this context
|
||||||
|
--> $DIR/issue-45296.rs:14:7
|
||||||
|
|
|
||||||
|
14 | #![allow(unused_variables)]
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
= note: inner attributes and doc comments, like `#![no_std]` or `//! My crate`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes and doc comments, like `#[test]` and
|
||||||
|
`/// My function`, annotate the item following them.
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue