mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-08 04:56:58 +00:00
Auto merge of #91555 - matthiaskrgr:rollup-pq0iaq7, r=matthiaskrgr
Rollup of 4 pull requests Successful merges: - #90529 (Skip reborrows in AbstractConstBuilder) - #91437 (Pretty print empty blocks as {}) - #91450 (Don't suggest types whose inner type is erroneous) - #91535 (Stabilize `-Z emit-future-incompat` as `--json future-incompat`) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
772d51f887
@ -263,14 +263,17 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
|
||||
self.strsep(",", false, b, elts, op)
|
||||
}
|
||||
|
||||
fn maybe_print_comment(&mut self, pos: BytePos) {
|
||||
fn maybe_print_comment(&mut self, pos: BytePos) -> bool {
|
||||
let mut has_comment = false;
|
||||
while let Some(ref cmnt) = self.next_comment() {
|
||||
if cmnt.pos < pos {
|
||||
has_comment = true;
|
||||
self.print_comment(cmnt);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
has_comment
|
||||
}
|
||||
|
||||
fn print_comment(&mut self, cmnt: &Comment) {
|
||||
@ -570,7 +573,10 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
|
||||
self.print_tts(tts, convert_dollar_crate);
|
||||
self.end();
|
||||
match delim {
|
||||
DelimToken::Brace => self.bclose(span),
|
||||
DelimToken::Brace => {
|
||||
let empty = tts.is_empty();
|
||||
self.bclose(span, empty);
|
||||
}
|
||||
_ => {
|
||||
let token_str = self.token_kind_to_string(&token::CloseDelim(delim));
|
||||
self.word(token_str)
|
||||
@ -642,17 +648,20 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
|
||||
self.end(); // Close the head-box.
|
||||
}
|
||||
|
||||
fn bclose_maybe_open(&mut self, span: rustc_span::Span, close_box: bool) {
|
||||
self.maybe_print_comment(span.hi());
|
||||
fn bclose_maybe_open(&mut self, span: rustc_span::Span, empty: bool, close_box: bool) {
|
||||
let has_comment = self.maybe_print_comment(span.hi());
|
||||
if !empty || has_comment {
|
||||
self.break_offset_if_not_bol(1, -(INDENT_UNIT as isize));
|
||||
}
|
||||
self.word("}");
|
||||
if close_box {
|
||||
self.end(); // Close the outer-box.
|
||||
}
|
||||
}
|
||||
|
||||
fn bclose(&mut self, span: rustc_span::Span) {
|
||||
self.bclose_maybe_open(span, true)
|
||||
fn bclose(&mut self, span: rustc_span::Span, empty: bool) {
|
||||
let close_box = true;
|
||||
self.bclose_maybe_open(span, empty, close_box)
|
||||
}
|
||||
|
||||
fn break_offset_if_not_bol(&mut self, n: usize, off: isize) {
|
||||
@ -1196,7 +1205,8 @@ impl<'a> State<'a> {
|
||||
for item in items {
|
||||
self.print_item(item);
|
||||
}
|
||||
self.bclose(item.span);
|
||||
let empty = item.attrs.is_empty() && items.is_empty();
|
||||
self.bclose(item.span, empty);
|
||||
}
|
||||
ModKind::Unloaded => {
|
||||
self.s.word(";");
|
||||
@ -1216,7 +1226,8 @@ impl<'a> State<'a> {
|
||||
}
|
||||
self.bopen();
|
||||
self.print_foreign_mod(nmod, &item.attrs);
|
||||
self.bclose(item.span);
|
||||
let empty = item.attrs.is_empty() && nmod.items.is_empty();
|
||||
self.bclose(item.span, empty);
|
||||
}
|
||||
ast::ItemKind::GlobalAsm(ref asm) => {
|
||||
self.head(visibility_qualified(&item.vis, "global_asm!"));
|
||||
@ -1291,7 +1302,8 @@ impl<'a> State<'a> {
|
||||
for impl_item in items {
|
||||
self.print_assoc_item(impl_item);
|
||||
}
|
||||
self.bclose(item.span);
|
||||
let empty = item.attrs.is_empty() && items.is_empty();
|
||||
self.bclose(item.span, empty);
|
||||
}
|
||||
ast::ItemKind::Trait(box ast::Trait {
|
||||
is_auto,
|
||||
@ -1326,7 +1338,8 @@ impl<'a> State<'a> {
|
||||
for trait_item in items {
|
||||
self.print_assoc_item(trait_item);
|
||||
}
|
||||
self.bclose(item.span);
|
||||
let empty = item.attrs.is_empty() && items.is_empty();
|
||||
self.bclose(item.span, empty);
|
||||
}
|
||||
ast::ItemKind::TraitAlias(ref generics, ref bounds) => {
|
||||
self.head("");
|
||||
@ -1410,7 +1423,8 @@ impl<'a> State<'a> {
|
||||
self.end();
|
||||
self.maybe_print_trailing_comment(v.span, None);
|
||||
}
|
||||
self.bclose(span)
|
||||
let empty = variants.is_empty();
|
||||
self.bclose(span, empty)
|
||||
}
|
||||
|
||||
crate fn print_visibility(&mut self, vis: &ast::Visibility) {
|
||||
@ -1441,6 +1455,9 @@ impl<'a> State<'a> {
|
||||
crate fn print_record_struct_body(&mut self, fields: &[ast::FieldDef], span: rustc_span::Span) {
|
||||
self.nbsp();
|
||||
self.bopen();
|
||||
|
||||
let empty = fields.is_empty();
|
||||
if !empty {
|
||||
self.hardbreak_if_not_bol();
|
||||
|
||||
for field in fields {
|
||||
@ -1453,8 +1470,9 @@ impl<'a> State<'a> {
|
||||
self.print_type(&field.ty);
|
||||
self.s.word(",");
|
||||
}
|
||||
}
|
||||
|
||||
self.bclose(span)
|
||||
self.bclose(span, empty);
|
||||
}
|
||||
|
||||
crate fn print_struct(
|
||||
@ -1633,7 +1651,8 @@ impl<'a> State<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
self.bclose_maybe_open(blk.span, close_box);
|
||||
let empty = attrs.is_empty() && blk.stmts.is_empty();
|
||||
self.bclose_maybe_open(blk.span, empty, close_box);
|
||||
self.ann.post(self, AnnNode::Block(blk))
|
||||
}
|
||||
|
||||
@ -2010,7 +2029,8 @@ impl<'a> State<'a> {
|
||||
for arm in arms {
|
||||
self.print_arm(arm);
|
||||
}
|
||||
self.bclose(expr.span);
|
||||
let empty = attrs.is_empty() && arms.is_empty();
|
||||
self.bclose(expr.span, empty);
|
||||
}
|
||||
ast::ExprKind::Closure(
|
||||
capture_clause,
|
||||
|
@ -2174,7 +2174,7 @@ impl<'a> State<'a> {
|
||||
match decl.output {
|
||||
hir::FnRetTy::Return(ref ty) => {
|
||||
self.print_type(&ty);
|
||||
self.maybe_print_comment(ty.span.lo())
|
||||
self.maybe_print_comment(ty.span.lo());
|
||||
}
|
||||
hir::FnRetTy::DefaultReturn(..) => unreachable!(),
|
||||
}
|
||||
@ -2368,7 +2368,7 @@ impl<'a> State<'a> {
|
||||
self.end();
|
||||
|
||||
if let hir::FnRetTy::Return(ref output) = decl.output {
|
||||
self.maybe_print_comment(output.span.lo())
|
||||
self.maybe_print_comment(output.span.lo());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -651,7 +651,6 @@ fn test_debugging_options_tracking_hash() {
|
||||
untracked!(dump_mir_dir, String::from("abc"));
|
||||
untracked!(dump_mir_exclude_pass_number, true);
|
||||
untracked!(dump_mir_graphviz, true);
|
||||
untracked!(emit_future_incompat_report, true);
|
||||
untracked!(emit_stack_sizes, true);
|
||||
untracked!(future_incompat_test, true);
|
||||
untracked!(hir_stats, true);
|
||||
|
@ -746,6 +746,7 @@ impl Default for Options {
|
||||
edition: DEFAULT_EDITION,
|
||||
json_artifact_notifications: false,
|
||||
json_unused_externs: false,
|
||||
json_future_incompat: false,
|
||||
pretty: None,
|
||||
working_dir: RealFileName::LocalPath(std::env::current_dir().unwrap()),
|
||||
}
|
||||
@ -1257,6 +1258,7 @@ pub struct JsonConfig {
|
||||
pub json_rendered: HumanReadableErrorType,
|
||||
pub json_artifact_notifications: bool,
|
||||
pub json_unused_externs: bool,
|
||||
pub json_future_incompat: bool,
|
||||
}
|
||||
|
||||
/// Parse the `--json` flag.
|
||||
@ -1269,6 +1271,7 @@ pub fn parse_json(matches: &getopts::Matches) -> JsonConfig {
|
||||
let mut json_color = ColorConfig::Never;
|
||||
let mut json_artifact_notifications = false;
|
||||
let mut json_unused_externs = false;
|
||||
let mut json_future_incompat = false;
|
||||
for option in matches.opt_strs("json") {
|
||||
// For now conservatively forbid `--color` with `--json` since `--json`
|
||||
// won't actually be emitting any colors and anything colorized is
|
||||
@ -1286,6 +1289,7 @@ pub fn parse_json(matches: &getopts::Matches) -> JsonConfig {
|
||||
"diagnostic-rendered-ansi" => json_color = ColorConfig::Always,
|
||||
"artifacts" => json_artifact_notifications = true,
|
||||
"unused-externs" => json_unused_externs = true,
|
||||
"future-incompat" => json_future_incompat = true,
|
||||
s => early_error(
|
||||
ErrorOutputType::default(),
|
||||
&format!("unknown `--json` option `{}`", s),
|
||||
@ -1298,6 +1302,7 @@ pub fn parse_json(matches: &getopts::Matches) -> JsonConfig {
|
||||
json_rendered: json_rendered(json_color),
|
||||
json_artifact_notifications,
|
||||
json_unused_externs,
|
||||
json_future_incompat,
|
||||
}
|
||||
}
|
||||
|
||||
@ -2011,8 +2016,12 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
|
||||
|
||||
let edition = parse_crate_edition(matches);
|
||||
|
||||
let JsonConfig { json_rendered, json_artifact_notifications, json_unused_externs } =
|
||||
parse_json(matches);
|
||||
let JsonConfig {
|
||||
json_rendered,
|
||||
json_artifact_notifications,
|
||||
json_unused_externs,
|
||||
json_future_incompat,
|
||||
} = parse_json(matches);
|
||||
|
||||
let error_format = parse_error_format(matches, color, json_rendered);
|
||||
|
||||
@ -2248,6 +2257,7 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
|
||||
edition,
|
||||
json_artifact_notifications,
|
||||
json_unused_externs,
|
||||
json_future_incompat,
|
||||
pretty,
|
||||
working_dir,
|
||||
}
|
||||
|
@ -228,6 +228,9 @@ top_level_options!(
|
||||
/// `true` if we're emitting a JSON blob containing the unused externs
|
||||
json_unused_externs: bool [UNTRACKED],
|
||||
|
||||
/// `true` if we're emitting a JSON job containg a future-incompat report for lints
|
||||
json_future_incompat: bool [TRACKED],
|
||||
|
||||
pretty: Option<PpMode> [UNTRACKED],
|
||||
|
||||
/// The (potentially remapped) working directory
|
||||
@ -1147,8 +1150,6 @@ options! {
|
||||
computed `block` spans (one span encompassing a block's terminator and \
|
||||
all statements). If `-Z instrument-coverage` is also enabled, create \
|
||||
an additional `.html` file showing the computed coverage spans."),
|
||||
emit_future_incompat_report: bool = (false, parse_bool, [UNTRACKED],
|
||||
"emits a future-incompatibility report for lints (RFC 2834)"),
|
||||
emit_stack_sizes: bool = (false, parse_bool, [UNTRACKED],
|
||||
"emit a section containing stack size metadata (default: no)"),
|
||||
fewer_names: Option<bool> = (None, parse_opt_bool, [TRACKED],
|
||||
|
@ -280,7 +280,7 @@ impl Session {
|
||||
}
|
||||
|
||||
fn emit_future_breakage(&self) {
|
||||
if !self.opts.debugging_opts.emit_future_incompat_report {
|
||||
if !self.opts.json_future_incompat {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -399,13 +399,25 @@ impl<'a, 'tcx> AbstractConstBuilder<'a, 'tcx> {
|
||||
let arg = self.recurse_build(source)?;
|
||||
self.nodes.push(Node::Cast(abstract_const::CastKind::As, arg, node.ty))
|
||||
}
|
||||
ExprKind::Borrow{ arg, ..} => {
|
||||
let arg_node = &self.body.exprs[*arg];
|
||||
|
||||
// FIXME(generic_const_exprs): We may want to support these.
|
||||
ExprKind::AddressOf { .. }
|
||||
| ExprKind::Borrow { .. }
|
||||
| ExprKind::Deref { .. } => self.maybe_supported_error(
|
||||
// Skip reborrows for now until we allow Deref/Borrow/AddressOf
|
||||
// expressions.
|
||||
// FIXME(generic_const_exprs): Verify/explain why this is sound
|
||||
if let ExprKind::Deref {arg} = arg_node.kind {
|
||||
self.recurse_build(arg)?
|
||||
} else {
|
||||
self.maybe_supported_error(
|
||||
node.span,
|
||||
"dereferencing is not supported in generic constants",
|
||||
"borrowing is not supported in generic constants",
|
||||
)?
|
||||
}
|
||||
}
|
||||
// FIXME(generic_const_exprs): We may want to support these.
|
||||
ExprKind::AddressOf { .. } | ExprKind::Deref {..}=> self.maybe_supported_error(
|
||||
node.span,
|
||||
"dereferencing or taking the address is not supported in generic constants",
|
||||
)?,
|
||||
ExprKind::Repeat { .. } | ExprKind::Array { .. } => self.maybe_supported_error(
|
||||
node.span,
|
||||
|
@ -41,7 +41,7 @@ use rustc_middle::ty::subst::InternalSubsts;
|
||||
use rustc_middle::ty::util::Discr;
|
||||
use rustc_middle::ty::util::IntTypeExt;
|
||||
use rustc_middle::ty::{self, AdtKind, Const, DefIdTree, Ty, TyCtxt};
|
||||
use rustc_middle::ty::{ReprOptions, ToPredicate, WithConstness};
|
||||
use rustc_middle::ty::{ReprOptions, ToPredicate, TypeFoldable, WithConstness};
|
||||
use rustc_session::lint;
|
||||
use rustc_session::parse::feature_err;
|
||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||
@ -1777,7 +1777,7 @@ fn fn_sig(tcx: TyCtxt<'_>, def_id: DefId) -> ty::PolyFnSig<'_> {
|
||||
visitor.visit_ty(ty);
|
||||
let mut diag = bad_placeholder_type(tcx, visitor.0, "return type");
|
||||
let ret_ty = fn_sig.skip_binder().output();
|
||||
if ret_ty != tcx.ty_error() {
|
||||
if !ret_ty.references_error() {
|
||||
if !ret_ty.is_closure() {
|
||||
let ret_ty_str = match ret_ty.kind() {
|
||||
// Suggest a function pointer return type instead of a unique function definition
|
||||
|
@ -1,8 +1,7 @@
|
||||
// compile-flags: --crate-type=lib
|
||||
|
||||
// pp-exact
|
||||
fn f() {
|
||||
} /*
|
||||
fn f() {} /*
|
||||
The next line should not be indented.
|
||||
|
||||
That one. It shouldn't have been indented.
|
||||
|
@ -4,7 +4,7 @@ error: overly complex generic constant
|
||||
LL | fn test<const N: usize>() -> [u8; N + (|| 42)()] {}
|
||||
| ^^^^-------^^
|
||||
| |
|
||||
| dereferencing is not supported in generic constants
|
||||
| borrowing is not supported in generic constants
|
||||
|
|
||||
= help: consider moving this anonymous constant into a `const` function
|
||||
= note: this operation may be supported in the future
|
||||
|
12
src/test/ui/const-generics/issues/issue-90455.rs
Normal file
12
src/test/ui/const-generics/issues/issue-90455.rs
Normal file
@ -0,0 +1,12 @@
|
||||
#![feature(generic_const_exprs, adt_const_params)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
struct FieldElement<const N: &'static str> {
|
||||
n: [u64; num_limbs(N)],
|
||||
//~^ ERROR unconstrained generic constant
|
||||
}
|
||||
const fn num_limbs(_: &str) -> usize {
|
||||
0
|
||||
}
|
||||
|
||||
fn main() {}
|
10
src/test/ui/const-generics/issues/issue-90455.stderr
Normal file
10
src/test/ui/const-generics/issues/issue-90455.stderr
Normal file
@ -0,0 +1,10 @@
|
||||
error: unconstrained generic constant
|
||||
--> $DIR/issue-90455.rs:5:8
|
||||
|
|
||||
LL | n: [u64; num_limbs(N)],
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: try adding a `where` bound using this expression: `where [(); num_limbs(N)]:`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -1,4 +1,4 @@
|
||||
// compile-flags: -Zfuture-incompat-test -Zemit-future-incompat-report
|
||||
// compile-flags: -Zfuture-incompat-test
|
||||
// check-pass
|
||||
|
||||
// The `-Zfuture-incompat-test flag causes any normal warning to be included
|
||||
|
@ -13,7 +13,6 @@ extern crate std;
|
||||
// [pretty]compile-flags: -Zunpretty=everybody_loops
|
||||
// [pretty]check-pass
|
||||
#[repr("C")]
|
||||
struct A {
|
||||
}
|
||||
struct A {}
|
||||
|
||||
fn main() { loop {} }
|
||||
|
7
src/test/ui/typeck/issue-91450-inner-ty-error.rs
Normal file
7
src/test/ui/typeck/issue-91450-inner-ty-error.rs
Normal file
@ -0,0 +1,7 @@
|
||||
// Regression test for #91450.
|
||||
// This test ensures that the compiler does not suggest `Foo<[type error]>` in diagnostic messages.
|
||||
|
||||
fn foo() -> Option<_> {} //~ ERROR: [E0308]
|
||||
//~^ ERROR: the type placeholder `_` is not allowed
|
||||
|
||||
fn main() {}
|
21
src/test/ui/typeck/issue-91450-inner-ty-error.stderr
Normal file
21
src/test/ui/typeck/issue-91450-inner-ty-error.stderr
Normal file
@ -0,0 +1,21 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-91450-inner-ty-error.rs:4:13
|
||||
|
|
||||
LL | fn foo() -> Option<_> {}
|
||||
| --- ^^^^^^^^^ expected enum `Option`, found `()`
|
||||
| |
|
||||
| implicitly returns `()` as its body has no tail or `return` expression
|
||||
|
|
||||
= note: expected enum `Option<_>`
|
||||
found unit type `()`
|
||||
|
||||
error[E0121]: the type placeholder `_` is not allowed within types on item signatures for return types
|
||||
--> $DIR/issue-91450-inner-ty-error.rs:4:20
|
||||
|
|
||||
LL | fn foo() -> Option<_> {}
|
||||
| ^ not allowed in type signatures
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0121, E0308.
|
||||
For more information about an error, try `rustc --explain E0121`.
|
@ -1802,6 +1802,7 @@ impl<'test> TestCx<'test> {
|
||||
// patterns still match the raw compiler output.
|
||||
if self.props.error_patterns.is_empty() {
|
||||
rustc.args(&["--error-format", "json"]);
|
||||
rustc.args(&["--json", "future-incompat"]);
|
||||
}
|
||||
rustc.arg("-Zui-testing");
|
||||
rustc.arg("-Zdeduplicate-diagnostics=no");
|
||||
@ -1809,11 +1810,11 @@ impl<'test> TestCx<'test> {
|
||||
Ui => {
|
||||
if !self.props.compile_flags.iter().any(|s| s.starts_with("--error-format")) {
|
||||
rustc.args(&["--error-format", "json"]);
|
||||
rustc.args(&["--json", "future-incompat"]);
|
||||
}
|
||||
rustc.arg("-Ccodegen-units=1");
|
||||
rustc.arg("-Zui-testing");
|
||||
rustc.arg("-Zdeduplicate-diagnostics=no");
|
||||
rustc.arg("-Zemit-future-incompat-report");
|
||||
}
|
||||
MirOpt => {
|
||||
rustc.args(&[
|
||||
|
Loading…
Reference in New Issue
Block a user