1
Fork 0

Auto merge of #86757 - JohnTitor:rollup-acevhz7, r=JohnTitor

Rollup of 8 pull requests

Successful merges:

 - #85504 (the foundation owns rust trademarks)
 - #85520 (Fix typo and improve documentation for E0632)
 - #86680 (Improve error for missing -Z with debugging option)
 - #86728 (Check node kind to avoid ICE in `check_expr_return()`)
 - #86740 (copy rust-lld as ld in dist)
 - #86746 (Fix rustdoc query type filter)
 - #86750 (Test cross-crate usage of `feature(const_trait_impl)`)
 - #86755 (alloc: `RawVec<T, A>::shrink` can be in `no_global_oom_handling`.)

Failed merges:

r? `@ghost`
`@rustbot` modify labels: rollup
This commit is contained in:
bors 2021-07-01 01:08:46 +00:00
commit 866335b337
30 changed files with 258 additions and 22 deletions

View file

@ -272,15 +272,14 @@ See [LICENSE-APACHE](LICENSE-APACHE), [LICENSE-MIT](LICENSE-MIT), and
## Trademark ## Trademark
The Rust programming language is an open source, community project governed [The Rust Foundation][rust-foundation] owns and protects the Rust and Cargo
by a core team. It is also sponsored by the Mozilla Foundation (“Mozilla”), trademarks and logos (the “Rust Trademarks”).
which owns and protects the Rust and Cargo trademarks and logos
(the “Rust Trademarks”).
If you want to use these names or brands, please read the [media guide][media-guide]. If you want to use these names or brands, please read the [media guide][media-guide].
Third-party logos may be subject to third-party copyrights and trademarks. See Third-party logos may be subject to third-party copyrights and trademarks. See
[Licenses][policies-licenses] for details. [Licenses][policies-licenses] for details.
[rust-foundation]: https://foundation.rust-lang.org/
[media-guide]: https://www.rust-lang.org/policies/media-guide [media-guide]: https://www.rust-lang.org/policies/media-guide
[policies-licenses]: https://www.rust-lang.org/policies/licenses [policies-licenses]: https://www.rust-lang.org/policies/licenses

View file

@ -29,7 +29,7 @@ use rustc_middle::middle::cstore::MetadataLoader;
use rustc_save_analysis as save; use rustc_save_analysis as save;
use rustc_save_analysis::DumpHandler; use rustc_save_analysis::DumpHandler;
use rustc_serialize::json::{self, ToJson}; use rustc_serialize::json::{self, ToJson};
use rustc_session::config::nightly_options; use rustc_session::config::{nightly_options, CG_OPTIONS, DB_OPTIONS};
use rustc_session::config::{ErrorOutputType, Input, OutputType, PrintRequest, TrimmedDefPaths}; use rustc_session::config::{ErrorOutputType, Input, OutputType, PrintRequest, TrimmedDefPaths};
use rustc_session::getopts; use rustc_session::getopts;
use rustc_session::lint::{Lint, LintId}; use rustc_session::lint::{Lint, LintId};
@ -1010,9 +1010,18 @@ pub fn handle_options(args: &[String]) -> Option<getopts::Matches> {
for option in config::rustc_optgroups() { for option in config::rustc_optgroups() {
(option.apply)(&mut options); (option.apply)(&mut options);
} }
let matches = options let matches = options.parse(args).unwrap_or_else(|e| {
.parse(args) let msg = match e {
.unwrap_or_else(|f| early_error(ErrorOutputType::default(), &f.to_string())); getopts::Fail::UnrecognizedOption(ref opt) => CG_OPTIONS
.iter()
.map(|&(name, ..)| ('C', name))
.chain(DB_OPTIONS.iter().map(|&(name, ..)| ('Z', name)))
.find(|&(_, name)| *opt == name.replace("_", "-"))
.map(|(flag, _)| format!("{}. Did you mean `-{} {}`?", e, flag, opt)),
_ => None,
};
early_error(ErrorOutputType::default(), &msg.unwrap_or_else(|| e.to_string()));
});
// For all options we just parsed, we check a few aspects: // For all options we just parsed, we check a few aspects:
// //

View file

@ -361,6 +361,7 @@ E0626: include_str!("./error_codes/E0626.md"),
E0627: include_str!("./error_codes/E0627.md"), E0627: include_str!("./error_codes/E0627.md"),
E0628: include_str!("./error_codes/E0628.md"), E0628: include_str!("./error_codes/E0628.md"),
E0631: include_str!("./error_codes/E0631.md"), E0631: include_str!("./error_codes/E0631.md"),
E0632: include_str!("./error_codes/E0632.md"),
E0633: include_str!("./error_codes/E0633.md"), E0633: include_str!("./error_codes/E0633.md"),
E0634: include_str!("./error_codes/E0634.md"), E0634: include_str!("./error_codes/E0634.md"),
E0635: include_str!("./error_codes/E0635.md"), E0635: include_str!("./error_codes/E0635.md"),
@ -623,8 +624,6 @@ E0783: include_str!("./error_codes/E0783.md"),
// E0629, // missing 'feature' (rustc_const_unstable) // E0629, // missing 'feature' (rustc_const_unstable)
// E0630, // rustc_const_unstable attribute must be paired with stable/unstable // E0630, // rustc_const_unstable attribute must be paired with stable/unstable
// attribute // attribute
E0632, // cannot provide explicit generic arguments when `impl Trait` is
// used in argument position
E0640, // infer outlives requirements E0640, // infer outlives requirements
// E0645, // trait aliases not finished // E0645, // trait aliases not finished
E0667, // `impl Trait` in projections E0667, // `impl Trait` in projections

View file

@ -0,0 +1,25 @@
An explicit generic argument was provided when calling a function that
uses `impl Trait` in argument position.
Erroneous code example:
```compile_fail,E0632
fn foo<T: Copy>(a: T, b: impl Clone) {}
foo::<i32>(0i32, "abc".to_string());
```
Either all generic arguments should be inferred at the call site, or
the function definition should use an explicit generic type parameter
instead of `impl Trait`. Example:
```
fn foo<T: Copy>(a: T, b: impl Clone) {}
fn bar<T: Copy, U: Clone>(a: T, b: U) {}
foo(0i32, "abc".to_string());
bar::<i32, String>(0i32, "abc".to_string());
bar::<_, _>(0i32, "abc".to_string());
bar(0i32, "abc".to_string());
```

View file

@ -1084,7 +1084,7 @@ declare_lint! {
/// ///
/// ### Explanation /// ### Explanation
/// ///
/// An function with generics must have its symbol mangled to accommodate /// A function with generics must have its symbol mangled to accommodate
/// the generic parameter. The [`no_mangle` attribute] has no effect in /// the generic parameter. The [`no_mangle` attribute] has no effect in
/// this situation, and should be removed. /// this situation, and should be removed.
/// ///

View file

@ -1223,7 +1223,12 @@ impl EncodeContext<'a, 'tcx> {
let fn_data = if let hir::ImplItemKind::Fn(ref sig, body) = ast_item.kind { let fn_data = if let hir::ImplItemKind::Fn(ref sig, body) = ast_item.kind {
FnData { FnData {
asyncness: sig.header.asyncness, asyncness: sig.header.asyncness,
constness: sig.header.constness, // Can be inside `impl const Trait`, so using sig.header.constness is not reliable
constness: if self.tcx.is_const_fn_raw(def_id) {
hir::Constness::Const
} else {
hir::Constness::NotConst
},
param_names: self.encode_fn_param_names_for_body(body), param_names: self.encode_fn_param_names_for_body(body),
} }
} else { } else {

View file

@ -682,9 +682,23 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}; };
let encl_item_id = self.tcx.hir().get_parent_item(expr.hir_id); let encl_item_id = self.tcx.hir().get_parent_item(expr.hir_id);
let encl_item = self.tcx.hir().expect_item(encl_item_id);
if let hir::ItemKind::Fn(..) = encl_item.kind { if let Some(hir::Node::Item(hir::Item {
kind: hir::ItemKind::Fn(..),
span: encl_fn_span,
..
}))
| Some(hir::Node::TraitItem(hir::TraitItem {
kind: hir::TraitItemKind::Fn(_, hir::TraitFn::Provided(_)),
span: encl_fn_span,
..
}))
| Some(hir::Node::ImplItem(hir::ImplItem {
kind: hir::ImplItemKind::Fn(..),
span: encl_fn_span,
..
})) = self.tcx.hir().find(encl_item_id)
{
// We are inside a function body, so reporting "return statement // We are inside a function body, so reporting "return statement
// outside of function body" needs an explanation. // outside of function body" needs an explanation.
@ -698,7 +712,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let encl_body = self.tcx.hir().body(encl_body_id); let encl_body = self.tcx.hir().body(encl_body_id);
err.encl_body_span = Some(encl_body.value.span); err.encl_body_span = Some(encl_body.value.span);
err.encl_fn_span = Some(encl_item.span); err.encl_fn_span = Some(*encl_fn_span);
} }
self.tcx.sess.emit_err(err); self.tcx.sess.emit_err(err);

View file

@ -463,7 +463,6 @@ impl<T, A: Allocator> RawVec<T, A> {
Ok(()) Ok(())
} }
#[cfg(not(no_global_oom_handling))]
fn shrink(&mut self, amount: usize) -> Result<(), TryReserveError> { fn shrink(&mut self, amount: usize) -> Result<(), TryReserveError> {
assert!(amount <= self.capacity(), "Tried to shrink to a larger capacity"); assert!(amount <= self.capacity(), "Tried to shrink to a larger capacity");

View file

@ -400,12 +400,12 @@ impl Step for Rustc {
// Copy over lld if it's there // Copy over lld if it's there
if builder.config.lld_enabled { if builder.config.lld_enabled {
let exe = exe("rust-lld", compiler.host); let rust_lld = exe("rust-lld", compiler.host);
builder.copy(&src_dir.join(&exe), &dst_dir.join(&exe)); builder.copy(&src_dir.join(&rust_lld), &dst_dir.join(&rust_lld));
// for `-Z gcc-ld=lld` // for `-Z gcc-ld=lld`
let gcc_lld_dir = dst_dir.join("gcc-ld"); let gcc_lld_dir = dst_dir.join("gcc-ld");
t!(fs::create_dir(&gcc_lld_dir)); t!(fs::create_dir(&gcc_lld_dir));
builder.copy(&src_dir.join(&exe), &gcc_lld_dir.join(&exe)); builder.copy(&src_dir.join(&rust_lld), &gcc_lld_dir.join(exe("ld", compiler.host)));
} }
// Copy over llvm-dwp if it's there // Copy over llvm-dwp if it's there

View file

@ -801,7 +801,8 @@ window.initSearch = function(rawSearchIndex) {
results_returned[fullId].lev = results_returned[fullId].lev =
Math.min(results_returned[fullId].lev, returned); Math.min(results_returned[fullId].lev, returned);
} }
if (index !== -1 || lev <= MAX_LEV_DISTANCE) { if (typePassesFilter(typeFilter, ty.ty) &&
(index !== -1 || lev <= MAX_LEV_DISTANCE)) {
if (index !== -1 && paths.length < 2) { if (index !== -1 && paths.length < 2) {
lev = 0; lev = 0;
} }

View file

@ -0,0 +1,12 @@
// exact-check
const QUERY = 'macro:print';
const EXPECTED = {
'others': [
{ 'path': 'std', 'name': 'print' },
{ 'path': 'std', 'name': 'eprint' },
{ 'path': 'std', 'name': 'println' },
{ 'path': 'std', 'name': 'eprintln' },
],
};

View file

@ -6,3 +6,4 @@ LL | assert_eq!(f::<4usize>(Usizable), 20usize);
error: aborting due to previous error error: aborting due to previous error
For more information about this error, try `rustc --explain E0632`.

View file

@ -6,3 +6,4 @@ LL | assert_eq!(f::<4usize>(Usizable), 20usize);
error: aborting due to previous error error: aborting due to previous error
For more information about this error, try `rustc --explain E0632`.

View file

@ -6,3 +6,4 @@ LL | foo::<String>('a');
error: aborting due to previous error error: aborting due to previous error
For more information about this error, try `rustc --explain E0632`.

View file

@ -8,3 +8,4 @@ LL | evt.handle_event::<TestEvent, fn(TestEvent)>(|_evt| {
error: aborting due to previous error error: aborting due to previous error
For more information about this error, try `rustc --explain E0632`.

View file

@ -0,0 +1 @@
// compile-flags: --llvm-args

View file

@ -0,0 +1,2 @@
error: Unrecognized option: 'llvm-args'. Did you mean `-C llvm-args`?

View file

@ -0,0 +1 @@
// compile-flags: --unpretty=hir

View file

@ -0,0 +1,2 @@
error: Unrecognized option: 'unpretty'. Did you mean `-Z unpretty`?

View file

@ -12,6 +12,25 @@ const C: [(); 42] = {
}] }]
}; };
struct S {}
trait Tr {
fn foo();
fn bar() {
//~^ NOTE: ...not the enclosing function body
[(); return];
//~^ ERROR: return statement outside of function body [E0572]
//~| NOTE: the return is part of this body...
}
}
impl Tr for S {
fn foo() {
//~^ NOTE: ...not the enclosing function body
[(); return];
//~^ ERROR: return statement outside of function body [E0572]
//~| NOTE: the return is part of this body...
}
}
fn main() { fn main() {
//~^ NOTE: ...not the enclosing function body //~^ NOTE: ...not the enclosing function body
[(); return || { [(); return || {

View file

@ -9,7 +9,31 @@ LL | | }]
| |_____^ | |_____^
error[E0572]: return statement outside of function body error[E0572]: return statement outside of function body
--> $DIR/issue-86188-return-not-in-fn-body.rs:17:10 --> $DIR/issue-86188-return-not-in-fn-body.rs:20:14
|
LL | / fn bar() {
LL | |
LL | | [(); return];
| | ^^^^^^ the return is part of this body...
LL | |
LL | |
LL | | }
| |_____- ...not the enclosing function body
error[E0572]: return statement outside of function body
--> $DIR/issue-86188-return-not-in-fn-body.rs:28:14
|
LL | / fn foo() {
LL | |
LL | | [(); return];
| | ^^^^^^ the return is part of this body...
LL | |
LL | |
LL | | }
| |_____- ...not the enclosing function body
error[E0572]: return statement outside of function body
--> $DIR/issue-86188-return-not-in-fn-body.rs:36:10
| |
LL | / fn main() { LL | / fn main() {
LL | | LL | |
@ -23,6 +47,6 @@ LL | || }];
LL | | } LL | | }
| |_- ...not the enclosing function body | |_- ...not the enclosing function body
error: aborting due to 2 previous errors error: aborting due to 4 previous errors
For more information about this error, try `rustc --explain E0572`. For more information about this error, try `rustc --explain E0572`.

View file

@ -0,0 +1,22 @@
#![feature(const_trait_impl)]
#![allow(incomplete_features)]
pub trait MyTrait {
fn func(self);
}
pub struct NonConst;
impl MyTrait for NonConst {
fn func(self) {
}
}
pub struct Const;
impl const MyTrait for Const {
fn func(self) {
}
}

View file

@ -0,0 +1,18 @@
// aux-build: cross-crate.rs
extern crate cross_crate;
use cross_crate::*;
fn non_const_context() {
NonConst.func();
Const.func();
}
const fn const_context() {
NonConst.func();
//~^ ERROR: calls in constant functions are limited to constant functions, tuple structs and tuple variants
Const.func();
//~^ ERROR: calls in constant functions are limited to constant functions, tuple structs and tuple variants
}
fn main() {}

View file

@ -0,0 +1,15 @@
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
--> $DIR/cross-crate-feature-disabled.rs:12:5
|
LL | NonConst.func();
| ^^^^^^^^^^^^^^^
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
--> $DIR/cross-crate-feature-disabled.rs:14:5
|
LL | Const.func();
| ^^^^^^^^^^^^
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0015`.

View file

@ -0,0 +1,20 @@
#![feature(const_trait_impl)]
#![allow(incomplete_features)]
// aux-build: cross-crate.rs
extern crate cross_crate;
use cross_crate::*;
fn non_const_context() {
NonConst.func();
Const.func();
}
const fn const_context() {
NonConst.func();
//~^ ERROR: calls in constant functions are limited to constant functions, tuple structs and tuple variants
Const.func();
}
fn main() {}

View file

@ -0,0 +1,9 @@
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
--> $DIR/cross-crate-feature-enabled.rs:15:5
|
LL | NonConst.func();
| ^^^^^^^^^^^^^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0015`.

View file

@ -18,3 +18,4 @@ LL | Bar::<i8>::func::<u8>(42);
error: aborting due to 3 previous errors error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0632`.

View file

@ -0,0 +1,9 @@
error[E0572]: return statement outside of function body
--> $DIR/issue-86721-return-expr-ice.rs:9:22
|
LL | const U: usize = return;
| ^^^^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0572`.

View file

@ -0,0 +1,9 @@
error[E0572]: return statement outside of function body
--> $DIR/issue-86721-return-expr-ice.rs:15:20
|
LL | fn foo(a: [(); return]);
| ^^^^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0572`.

View file

@ -0,0 +1,17 @@
// Regression test for the ICE described in #86721.
// revisions: rev1 rev2
#![cfg_attr(any(), rev1, rev2)]
#![crate_type="lib"]
#[cfg(any(rev1))]
trait T {
const U: usize = return;
//[rev1]~^ ERROR: return statement outside of function body [E0572]
}
#[cfg(any(rev2))]
trait T2 {
fn foo(a: [(); return]);
//[rev2]~^ ERROR: return statement outside of function body [E0572]
}