From aff4cd5ce725602249c2554b04b1066d09acd31e Mon Sep 17 00:00:00 2001
From: Deadbeef
Date: Mon, 14 Jun 2021 01:49:37 +0800
Subject: Report Layout of enum variants
Followup of #83501, Fixes #86253.
---
src/librustdoc/html/render/print_item.rs | 36 +++++++++++++++++++++++++++++++-
src/test/rustdoc/type-layout.rs | 6 ++++++
2 files changed, 41 insertions(+), 1 deletion(-)
(limited to 'src')
diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs
index 8f4857a6939..f362a288bcb 100644
--- a/src/librustdoc/html/render/print_item.rs
+++ b/src/librustdoc/html/render/print_item.rs
@@ -7,11 +7,13 @@ use rustc_data_structures::fx::FxHashMap;
use rustc_hir as hir;
use rustc_hir::def::CtorKind;
use rustc_hir::def_id::DefId;
+use rustc_middle::bug;
use rustc_middle::middle::stability;
use rustc_middle::ty::layout::LayoutError;
-use rustc_middle::ty::TyCtxt;
+use rustc_middle::ty::{Adt, TyCtxt};
use rustc_span::hygiene::MacroKind;
use rustc_span::symbol::{kw, sym, Symbol};
+use rustc_target::abi::Variants;
use super::{
collect_paths_for_type, document, ensure_trailing_slash, item_ty_to_strs, notable_traits_decl,
@@ -1636,6 +1638,38 @@ fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
pl = if bytes == 1 { "" } else { "s" },
);
}
+ if let Variants::Multiple { variants, .. } = &ty_layout.layout.variants {
+ if !variants.is_empty() {
+ w.write_str(
+ "\
+ Size for each variant:\
+
",
+ );
+
+ let adt = if let Adt(adt, _) = ty_layout.ty.kind() {
+ adt
+ } else {
+ bug!("not an adt")
+ };
+
+ for (index, layout) in variants.iter_enumerated() {
+ let ident = adt.variants[index].ident;
+ if layout.abi.is_unsized() {
+ writeln!(w, "{name} (unsized) ", name = ident);
+ } else {
+ let bytes = layout.size.bytes();
+ writeln!(
+ w,
+ "{name}: {size} byte{pl} ",
+ name = ident,
+ size = bytes,
+ pl = if bytes == 1 { "" } else { "s" },
+ );
+ }
+ }
+ w.write_str("
");
+ }
+ }
}
// This kind of layout error can occur with valid code, e.g. if you try to
// get the layout of a generic type such as `Vec`.
diff --git a/src/test/rustdoc/type-layout.rs b/src/test/rustdoc/type-layout.rs
index 272911de681..f398dd776d9 100644
--- a/src/test/rustdoc/type-layout.rs
+++ b/src/test/rustdoc/type-layout.rs
@@ -52,3 +52,9 @@ pub struct Unsized([u8]);
// @!has type_layout/trait.MyTrait.html 'Size: '
pub trait MyTrait {}
+
+// @has type_layout/enum.Variants.html '1 byte'
+pub enum Variants {
+ A,
+ B(u8),
+}
--
cgit 1.4.1-3-g733a5
From c349b79029770e39963fadf5021cfa6a6cfe5472 Mon Sep 17 00:00:00 2001
From: Deadbeef
Date: Fri, 9 Jul 2021 22:25:46 +0800
Subject: Apply suggestions
---
src/librustdoc/html/render/print_item.rs | 44 +++++++++++++-------------------
1 file changed, 18 insertions(+), 26 deletions(-)
(limited to 'src')
diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs
index f362a288bcb..b25323c4e0a 100644
--- a/src/librustdoc/html/render/print_item.rs
+++ b/src/librustdoc/html/render/print_item.rs
@@ -7,13 +7,13 @@ use rustc_data_structures::fx::FxHashMap;
use rustc_hir as hir;
use rustc_hir::def::CtorKind;
use rustc_hir::def_id::DefId;
-use rustc_middle::bug;
use rustc_middle::middle::stability;
+use rustc_middle::span_bug;
use rustc_middle::ty::layout::LayoutError;
use rustc_middle::ty::{Adt, TyCtxt};
use rustc_span::hygiene::MacroKind;
use rustc_span::symbol::{kw, sym, Symbol};
-use rustc_target::abi::Variants;
+use rustc_target::abi::{Layout, Variants};
use super::{
collect_paths_for_type, document, ensure_trailing_slash, item_ty_to_strs, notable_traits_decl,
@@ -1606,6 +1606,15 @@ fn document_non_exhaustive(w: &mut Buffer, item: &clean::Item) {
}
fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
+ fn write_size_of_layout(w: &mut Buffer, layout: &Layout) {
+ if layout.abi.is_unsized() {
+ write!(w, "(unsized)");
+ } else {
+ let bytes = layout.size.bytes();
+ write!(w, "{size} byte{pl}", size = bytes, pl = if bytes == 1 { "" } else { "s" },);
+ }
+ }
+
if !cx.shared.show_type_layout {
return;
}
@@ -1627,17 +1636,9 @@ fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
“Type Layout” \
chapter for details on type layout guarantees."
);
- if ty_layout.layout.abi.is_unsized() {
- writeln!(w, "Size: (unsized)
");
- } else {
- let bytes = ty_layout.layout.size.bytes();
- writeln!(
- w,
- "Size: {size} byte{pl}
",
- size = bytes,
- pl = if bytes == 1 { "" } else { "s" },
- );
- }
+ w.write_str("Size: ");
+ write_size_of_layout(w, ty_layout.layout);
+ writeln!(w, "
");
if let Variants::Multiple { variants, .. } = &ty_layout.layout.variants {
if !variants.is_empty() {
w.write_str(
@@ -1649,23 +1650,14 @@ fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
let adt = if let Adt(adt, _) = ty_layout.ty.kind() {
adt
} else {
- bug!("not an adt")
+ span_bug!(tcx.def_span(ty_def_id), "not an adt")
};
for (index, layout) in variants.iter_enumerated() {
let ident = adt.variants[index].ident;
- if layout.abi.is_unsized() {
- writeln!(w, "{name} (unsized)", name = ident);
- } else {
- let bytes = layout.size.bytes();
- writeln!(
- w,
- "{name}: {size} byte{pl}",
- name = ident,
- size = bytes,
- pl = if bytes == 1 { "" } else { "s" },
- );
- }
+ write!(w, "{name} ", name = ident);
+ write_size_of_layout(w, layout);
+ writeln!(w, "");
}
w.write_str("");
}
--
cgit 1.4.1-3-g733a5
From 8096910b54920f4c3334de555ee9dd265ed6f49d Mon Sep 17 00:00:00 2001
From: Deadbeef
Date: Sat, 10 Jul 2021 21:35:40 +0800
Subject: Report variant size without the discriminant
---
src/librustdoc/html/render/print_item.rs | 20 +++++++++++++-------
src/test/rustdoc/type-layout.rs | 3 ++-
2 files changed, 15 insertions(+), 8 deletions(-)
(limited to 'src')
diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs
index b25323c4e0a..4e90e611a16 100644
--- a/src/librustdoc/html/render/print_item.rs
+++ b/src/librustdoc/html/render/print_item.rs
@@ -13,7 +13,7 @@ use rustc_middle::ty::layout::LayoutError;
use rustc_middle::ty::{Adt, TyCtxt};
use rustc_span::hygiene::MacroKind;
use rustc_span::symbol::{kw, sym, Symbol};
-use rustc_target::abi::{Layout, Variants};
+use rustc_target::abi::{Layout, Primitive, Variants};
use super::{
collect_paths_for_type, document, ensure_trailing_slash, item_ty_to_strs, notable_traits_decl,
@@ -1606,11 +1606,11 @@ fn document_non_exhaustive(w: &mut Buffer, item: &clean::Item) {
}
fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
- fn write_size_of_layout(w: &mut Buffer, layout: &Layout) {
+ fn write_size_of_layout(w: &mut Buffer, layout: &Layout, tag_size: u64) {
if layout.abi.is_unsized() {
write!(w, "(unsized)");
} else {
- let bytes = layout.size.bytes();
+ let bytes = layout.size.bytes() - tag_size;
write!(w, "{size} byte{pl}", size = bytes, pl = if bytes == 1 { "" } else { "s" },);
}
}
@@ -1637,9 +1637,9 @@ fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
chapter for details on type layout guarantees."
);
w.write_str("Size: ");
- write_size_of_layout(w, ty_layout.layout);
+ write_size_of_layout(w, ty_layout.layout, 0);
writeln!(w, "
");
- if let Variants::Multiple { variants, .. } = &ty_layout.layout.variants {
+ if let Variants::Multiple { variants, tag, .. } = &ty_layout.layout.variants {
if !variants.is_empty() {
w.write_str(
"\
@@ -1653,10 +1653,16 @@ fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
span_bug!(tcx.def_span(ty_def_id), "not an adt")
};
+ let tag_size = if let Primitive::Int(i, _) = tag.value {
+ i.size().bytes()
+ } else {
+ span_bug!(tcx.def_span(ty_def_id), "tag is not int")
+ };
+
for (index, layout) in variants.iter_enumerated() {
let ident = adt.variants[index].ident;
- write!(w, "
{name} ", name = ident);
- write_size_of_layout(w, layout);
+ write!(w, "{name}: ", name = ident);
+ write_size_of_layout(w, layout, tag_size);
writeln!(w, "");
}
w.write_str("");
diff --git a/src/test/rustdoc/type-layout.rs b/src/test/rustdoc/type-layout.rs
index f398dd776d9..bc1b65c46e2 100644
--- a/src/test/rustdoc/type-layout.rs
+++ b/src/test/rustdoc/type-layout.rs
@@ -53,7 +53,8 @@ pub struct Unsized([u8]);
// @!has type_layout/trait.MyTrait.html 'Size: '
pub trait MyTrait {}
-// @has type_layout/enum.Variants.html '1 byte'
+// @has type_layout/enum.Variants.html 'A: 0 bytes'
+// @has - 'B: 1 byte'
pub enum Variants {
A,
B(u8),
--
cgit 1.4.1-3-g733a5
From 5f1505e7f13fdea3f2d626059010cf26edfce4f8 Mon Sep 17 00:00:00 2001
From: Deadbeef
Date: Tue, 31 Aug 2021 05:24:08 +0000
Subject: Apply suggestions
---
src/librustdoc/html/render/print_item.rs | 5 ++---
src/test/rustdoc/type-layout.rs | 4 +++-
2 files changed, 5 insertions(+), 4 deletions(-)
(limited to 'src')
diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs
index 4e90e611a16..6054073bf79 100644
--- a/src/librustdoc/html/render/print_item.rs
+++ b/src/librustdoc/html/render/print_item.rs
@@ -1642,8 +1642,7 @@ fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
if let Variants::Multiple { variants, tag, .. } = &ty_layout.layout.variants {
if !variants.is_empty() {
w.write_str(
- "\
- Size for each variant:\
+ "
Size for each variant:
\
",
);
@@ -1665,7 +1664,7 @@ fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
write_size_of_layout(w, layout, tag_size);
writeln!(w, "");
}
- w.write_str("
");
+ w.write_str("");
}
}
}
diff --git a/src/test/rustdoc/type-layout.rs b/src/test/rustdoc/type-layout.rs
index bc1b65c46e2..8c4f4f8fc98 100644
--- a/src/test/rustdoc/type-layout.rs
+++ b/src/test/rustdoc/type-layout.rs
@@ -53,7 +53,9 @@ pub struct Unsized([u8]);
// @!has type_layout/trait.MyTrait.html 'Size: '
pub trait MyTrait {}
-// @has type_layout/enum.Variants.html 'A: 0 bytes'
+// @has type_layout/enum.Variants.html 'Size: '
+// @has - '2 bytes'
+// @has - 'A: 0 bytes'
// @has - 'B: 1 byte'
pub enum Variants {
A,
--
cgit 1.4.1-3-g733a5
From 6cfe98f1962c442504a0b56f260620f1bccd7601 Mon Sep 17 00:00:00 2001
From: Theodore Luo Wang
Date: Tue, 31 Aug 2021 23:07:58 -0400
Subject: Improve error checking on unary plus
---
compiler/rustc_parse/src/parser/expr.rs | 12 ++++
.../ui/did_you_mean/issue-88276-unary-plus.fixed | 13 ++++
src/test/ui/did_you_mean/issue-88276-unary-plus.rs | 13 ++++
.../ui/did_you_mean/issue-88276-unary-plus.stderr | 83 ++++++++++++++++++++++
4 files changed, 121 insertions(+)
create mode 100644 src/test/ui/did_you_mean/issue-88276-unary-plus.fixed
create mode 100644 src/test/ui/did_you_mean/issue-88276-unary-plus.rs
create mode 100644 src/test/ui/did_you_mean/issue-88276-unary-plus.stderr
(limited to 'src')
diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs
index 326c8f81ffb..88dae48a901 100644
--- a/compiler/rustc_parse/src/parser/expr.rs
+++ b/compiler/rustc_parse/src/parser/expr.rs
@@ -23,6 +23,8 @@ use rustc_span::symbol::{kw, sym, Ident, Symbol};
use rustc_span::{BytePos, Pos};
use std::mem;
+use tracing::debug;
+
/// Possibly accepts an `token::Interpolated` expression (a pre-parsed expression
/// dropped into the token stream, which happens while parsing the result of
/// macro expansion). Placement of these is not as complex as I feared it would
@@ -355,6 +357,7 @@ impl<'a> Parser<'a> {
/// but the next token implies this should be parsed as an expression.
/// For example: `if let Some(x) = x { x } else { 0 } / 2`.
fn error_found_expr_would_be_stmt(&self, lhs: &Expr) {
+ debug!("error_found_expr_would_be_stmt(lhs: {:?})", lhs);
let mut err = self.struct_span_err(
self.token.span,
&format!("expected expression, found `{}`", pprust::token_to_string(&self.token),),
@@ -516,6 +519,15 @@ impl<'a> Parser<'a> {
token::BinOp(token::And) | token::AndAnd => {
make_it!(this, attrs, |this, _| this.parse_borrow_expr(lo))
}
+ token::BinOp(token::Plus) => {
+ this.struct_span_err(lo, "leading `+` is not supported")
+ .span_label(lo, "unexpected `+`")
+ .span_suggestion_short(lo, "remove the `+`", "".to_string(), Applicability::MachineApplicable)
+ .emit();
+ this.bump();
+
+ this.parse_prefix_expr(None)
+ } // `+expr`
token::Ident(..) if this.token.is_keyword(kw::Box) => {
make_it!(this, attrs, |this, _| this.parse_box_expr(lo))
}
diff --git a/src/test/ui/did_you_mean/issue-88276-unary-plus.fixed b/src/test/ui/did_you_mean/issue-88276-unary-plus.fixed
new file mode 100644
index 00000000000..4bd248663b8
--- /dev/null
+++ b/src/test/ui/did_you_mean/issue-88276-unary-plus.fixed
@@ -0,0 +1,13 @@
+// run-rustfix
+#[allow(unused_parens)]
+fn main() {
+ let _ = 1; //~ ERROR leading `+` is not supported
+ let _ = -(1+2)*3; //~ ERROR leading `+` is not supported
+ let _ = -(1+2)*3; //~ ERROR leading `+` is not supported
+ //~| ERROR leading `+` is not supported
+ let _ = --(1+2)*3; //~ ERROR leading `+` is not supported
+ //~| ERROR leading `+` is not supported
+ let _ = (&"hello"); //~ ERROR leading `+` is not supported
+ let _ = [3, 4+6]; //~ ERROR leading `+` is not supported
+ //~| ERROR leading `+` is not supported
+}
diff --git a/src/test/ui/did_you_mean/issue-88276-unary-plus.rs b/src/test/ui/did_you_mean/issue-88276-unary-plus.rs
new file mode 100644
index 00000000000..e2cce677b47
--- /dev/null
+++ b/src/test/ui/did_you_mean/issue-88276-unary-plus.rs
@@ -0,0 +1,13 @@
+// run-rustfix
+#[allow(unused_parens)]
+fn main() {
+ let _ = +1; //~ ERROR leading `+` is not supported
+ let _ = -+(1+2)*3; //~ ERROR leading `+` is not supported
+ let _ = +-+(1+2)*3; //~ ERROR leading `+` is not supported
+ //~| ERROR leading `+` is not supported
+ let _ = -+-+(1+2)*3; //~ ERROR leading `+` is not supported
+ //~| ERROR leading `+` is not supported
+ let _ = (+&"hello"); //~ ERROR leading `+` is not supported
+ let _ = +[+3, 4+6]; //~ ERROR leading `+` is not supported
+ //~| ERROR leading `+` is not supported
+}
diff --git a/src/test/ui/did_you_mean/issue-88276-unary-plus.stderr b/src/test/ui/did_you_mean/issue-88276-unary-plus.stderr
new file mode 100644
index 00000000000..9c1227d7c35
--- /dev/null
+++ b/src/test/ui/did_you_mean/issue-88276-unary-plus.stderr
@@ -0,0 +1,83 @@
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:4:13
+ |
+LL | let _ = +1;
+ | ^
+ | |
+ | unexpected `+`
+ | help: remove the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:5:14
+ |
+LL | let _ = -+(1+2)*3;
+ | ^
+ | |
+ | unexpected `+`
+ | help: remove the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:6:13
+ |
+LL | let _ = +-+(1+2)*3;
+ | ^
+ | |
+ | unexpected `+`
+ | help: remove the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:6:15
+ |
+LL | let _ = +-+(1+2)*3;
+ | ^
+ | |
+ | unexpected `+`
+ | help: remove the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:8:14
+ |
+LL | let _ = -+-+(1+2)*3;
+ | ^
+ | |
+ | unexpected `+`
+ | help: remove the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:8:16
+ |
+LL | let _ = -+-+(1+2)*3;
+ | ^
+ | |
+ | unexpected `+`
+ | help: remove the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:10:14
+ |
+LL | let _ = (+&"hello");
+ | ^
+ | |
+ | unexpected `+`
+ | help: remove the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:11:13
+ |
+LL | let _ = +[+3, 4+6];
+ | ^
+ | |
+ | unexpected `+`
+ | help: remove the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:11:15
+ |
+LL | let _ = +[+3, 4+6];
+ | ^
+ | |
+ | unexpected `+`
+ | help: remove the `+`
+
+error: aborting due to 9 previous errors
+
--
cgit 1.4.1-3-g733a5
From 5a863d594c725d09ab8f0df5caba374d72200976 Mon Sep 17 00:00:00 2001
From: Theodore Luo Wang
Date: Wed, 1 Sep 2021 11:54:06 -0400
Subject: Add checks for a block before a unary plus. Fix failing tests
---
compiler/rustc_parse/src/parser/expr.rs | 30 +++++---
compiler/rustc_parse/src/parser/stmt.rs | 3 +
src/test/ui/associated-types/issue-36499.stderr | 7 +-
.../ui/did_you_mean/issue-88276-unary-plus.fixed | 13 ----
src/test/ui/did_you_mean/issue-88276-unary-plus.rs | 13 ----
.../ui/did_you_mean/issue-88276-unary-plus.stderr | 83 ----------------------
src/test/ui/parser/expr-as-stmt.fixed | 6 +-
src/test/ui/parser/expr-as-stmt.rs | 6 +-
src/test/ui/parser/expr-as-stmt.stderr | 12 ++--
src/test/ui/parser/issue-88276-unary-plus.fixed | 13 ++++
src/test/ui/parser/issue-88276-unary-plus.rs | 13 ++++
src/test/ui/parser/issue-88276-unary-plus.stderr | 83 ++++++++++++++++++++++
12 files changed, 151 insertions(+), 131 deletions(-)
delete mode 100644 src/test/ui/did_you_mean/issue-88276-unary-plus.fixed
delete mode 100644 src/test/ui/did_you_mean/issue-88276-unary-plus.rs
delete mode 100644 src/test/ui/did_you_mean/issue-88276-unary-plus.stderr
create mode 100644 src/test/ui/parser/issue-88276-unary-plus.fixed
create mode 100644 src/test/ui/parser/issue-88276-unary-plus.rs
create mode 100644 src/test/ui/parser/issue-88276-unary-plus.stderr
(limited to 'src')
diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs
index 43de53e8723..c887f9fe0cf 100644
--- a/compiler/rustc_parse/src/parser/expr.rs
+++ b/compiler/rustc_parse/src/parser/expr.rs
@@ -165,9 +165,12 @@ impl<'a> Parser<'a> {
if [token::DotDot, token::DotDotDot, token::DotDotEq].contains(&self.token.kind) {
return self.parse_prefix_range_expr(attrs);
} else {
- self.parse_prefix_expr(attrs)?
+ let result = self.parse_prefix_expr(attrs);
+ debug!("parse_prefix_expr result: {:?}", &result);
+ result?
}
};
+ debug!("parse_assoc_expr_with(lhs = {:?})", &lhs);
let last_type_ascription_set = self.last_type_ascription.is_some();
if !self.should_continue_as_assoc_expr(&lhs) {
@@ -175,8 +178,11 @@ impl<'a> Parser<'a> {
return Ok(lhs);
}
+ debug!("continue_as_assoc_expr");
+
self.expected_tokens.push(TokenType::Operator);
while let Some(op) = self.check_assoc_op() {
+ debug!("op: {:?}", op);
// Adjust the span for interpolated LHS to point to the `$lhs` token
// and not to what it refers to.
let lhs_span = match self.prev_token.kind {
@@ -520,17 +526,25 @@ impl<'a> Parser<'a> {
make_it!(this, attrs, |this, _| this.parse_borrow_expr(lo))
}
token::BinOp(token::Plus) => {
- this.struct_span_err(lo, "leading `+` is not supported")
- .span_label(lo, "unexpected `+`")
- .span_suggestion_short(
+ debug!("leading + detected: {:?}", lo);
+ let mut err = this.struct_span_err(lo, "leading `+` is not supported");
+ err.span_label(lo, "unexpected `+`");
+
+ // a block on the LHS might have been intended to be an expression instead
+ let sp = this.sess.source_map().start_point(lo);
+ if let Some(sp) = this.sess.ambiguous_block_expr_parse.borrow().get(&sp) {
+ this.sess.expr_parentheses_needed(&mut err, *sp);
+ } else {
+ err.span_suggestion(
lo,
- "remove the `+`",
+ "try removing the `+`",
"".to_string(),
Applicability::MachineApplicable,
- )
- .emit();
- this.bump();
+ );
+ }
+ err.emit();
+ this.bump();
this.parse_prefix_expr(None)
} // `+expr`
token::Ident(..) if this.token.is_keyword(kw::Box) => {
diff --git a/compiler/rustc_parse/src/parser/stmt.rs b/compiler/rustc_parse/src/parser/stmt.rs
index 85515bd2a63..329b60f9a87 100644
--- a/compiler/rustc_parse/src/parser/stmt.rs
+++ b/compiler/rustc_parse/src/parser/stmt.rs
@@ -21,6 +21,8 @@ use rustc_span::symbol::{kw, sym};
use std::mem;
+use tracing::debug;
+
impl<'a> Parser<'a> {
/// Parses a statement. This stops just before trailing semicolons on everything but items.
/// e.g., a `StmtKind::Semi` parses to a `StmtKind::Expr`, leaving the trailing `;` unconsumed.
@@ -418,6 +420,7 @@ impl<'a> Parser<'a> {
if self.token == token::Eof {
break;
}
+ debug!("parsing statements, stmts: {:?}", &stmts);
let stmt = match self.parse_full_stmt(recover) {
Err(mut err) if recover.yes() => {
self.maybe_annotate_with_ascription(&mut err, false);
diff --git a/src/test/ui/associated-types/issue-36499.stderr b/src/test/ui/associated-types/issue-36499.stderr
index ff450f60acc..990ef09e3f7 100644
--- a/src/test/ui/associated-types/issue-36499.stderr
+++ b/src/test/ui/associated-types/issue-36499.stderr
@@ -1,8 +1,11 @@
-error: expected expression, found `+`
+error: leading `+` is not supported
--> $DIR/issue-36499.rs:4:9
|
LL | 2 + +2;
- | ^ expected expression
+ | ^
+ | |
+ | unexpected `+`
+ | help: try removing the `+`
error: aborting due to previous error
diff --git a/src/test/ui/did_you_mean/issue-88276-unary-plus.fixed b/src/test/ui/did_you_mean/issue-88276-unary-plus.fixed
deleted file mode 100644
index 4bd248663b8..00000000000
--- a/src/test/ui/did_you_mean/issue-88276-unary-plus.fixed
+++ /dev/null
@@ -1,13 +0,0 @@
-// run-rustfix
-#[allow(unused_parens)]
-fn main() {
- let _ = 1; //~ ERROR leading `+` is not supported
- let _ = -(1+2)*3; //~ ERROR leading `+` is not supported
- let _ = -(1+2)*3; //~ ERROR leading `+` is not supported
- //~| ERROR leading `+` is not supported
- let _ = --(1+2)*3; //~ ERROR leading `+` is not supported
- //~| ERROR leading `+` is not supported
- let _ = (&"hello"); //~ ERROR leading `+` is not supported
- let _ = [3, 4+6]; //~ ERROR leading `+` is not supported
- //~| ERROR leading `+` is not supported
-}
diff --git a/src/test/ui/did_you_mean/issue-88276-unary-plus.rs b/src/test/ui/did_you_mean/issue-88276-unary-plus.rs
deleted file mode 100644
index e2cce677b47..00000000000
--- a/src/test/ui/did_you_mean/issue-88276-unary-plus.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-// run-rustfix
-#[allow(unused_parens)]
-fn main() {
- let _ = +1; //~ ERROR leading `+` is not supported
- let _ = -+(1+2)*3; //~ ERROR leading `+` is not supported
- let _ = +-+(1+2)*3; //~ ERROR leading `+` is not supported
- //~| ERROR leading `+` is not supported
- let _ = -+-+(1+2)*3; //~ ERROR leading `+` is not supported
- //~| ERROR leading `+` is not supported
- let _ = (+&"hello"); //~ ERROR leading `+` is not supported
- let _ = +[+3, 4+6]; //~ ERROR leading `+` is not supported
- //~| ERROR leading `+` is not supported
-}
diff --git a/src/test/ui/did_you_mean/issue-88276-unary-plus.stderr b/src/test/ui/did_you_mean/issue-88276-unary-plus.stderr
deleted file mode 100644
index 9c1227d7c35..00000000000
--- a/src/test/ui/did_you_mean/issue-88276-unary-plus.stderr
+++ /dev/null
@@ -1,83 +0,0 @@
-error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:4:13
- |
-LL | let _ = +1;
- | ^
- | |
- | unexpected `+`
- | help: remove the `+`
-
-error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:5:14
- |
-LL | let _ = -+(1+2)*3;
- | ^
- | |
- | unexpected `+`
- | help: remove the `+`
-
-error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:6:13
- |
-LL | let _ = +-+(1+2)*3;
- | ^
- | |
- | unexpected `+`
- | help: remove the `+`
-
-error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:6:15
- |
-LL | let _ = +-+(1+2)*3;
- | ^
- | |
- | unexpected `+`
- | help: remove the `+`
-
-error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:8:14
- |
-LL | let _ = -+-+(1+2)*3;
- | ^
- | |
- | unexpected `+`
- | help: remove the `+`
-
-error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:8:16
- |
-LL | let _ = -+-+(1+2)*3;
- | ^
- | |
- | unexpected `+`
- | help: remove the `+`
-
-error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:10:14
- |
-LL | let _ = (+&"hello");
- | ^
- | |
- | unexpected `+`
- | help: remove the `+`
-
-error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:11:13
- |
-LL | let _ = +[+3, 4+6];
- | ^
- | |
- | unexpected `+`
- | help: remove the `+`
-
-error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:11:15
- |
-LL | let _ = +[+3, 4+6];
- | ^
- | |
- | unexpected `+`
- | help: remove the `+`
-
-error: aborting due to 9 previous errors
-
diff --git a/src/test/ui/parser/expr-as-stmt.fixed b/src/test/ui/parser/expr-as-stmt.fixed
index c217ab9774f..79d73090a04 100644
--- a/src/test/ui/parser/expr-as-stmt.fixed
+++ b/src/test/ui/parser/expr-as-stmt.fixed
@@ -5,18 +5,18 @@
#![allow(unused_must_use)]
fn foo() -> i32 {
- ({2}) + {2} //~ ERROR expected expression, found `+`
+ ({2}) + {2} //~ ERROR leading `+` is not supported
//~^ ERROR mismatched types
}
fn bar() -> i32 {
- ({2}) + 2 //~ ERROR expected expression, found `+`
+ ({2}) + 2 //~ ERROR leading `+` is not supported
//~^ ERROR mismatched types
}
fn zul() -> u32 {
let foo = 3;
- ({ 42 }) + foo; //~ ERROR expected expression, found `+`
+ ({ 42 }) + foo; //~ ERROR leading `+` is not supported
//~^ ERROR mismatched types
32
}
diff --git a/src/test/ui/parser/expr-as-stmt.rs b/src/test/ui/parser/expr-as-stmt.rs
index b04025faaec..8698f99b81a 100644
--- a/src/test/ui/parser/expr-as-stmt.rs
+++ b/src/test/ui/parser/expr-as-stmt.rs
@@ -5,18 +5,18 @@
#![allow(unused_must_use)]
fn foo() -> i32 {
- {2} + {2} //~ ERROR expected expression, found `+`
+ {2} + {2} //~ ERROR leading `+` is not supported
//~^ ERROR mismatched types
}
fn bar() -> i32 {
- {2} + 2 //~ ERROR expected expression, found `+`
+ {2} + 2 //~ ERROR leading `+` is not supported
//~^ ERROR mismatched types
}
fn zul() -> u32 {
let foo = 3;
- { 42 } + foo; //~ ERROR expected expression, found `+`
+ { 42 } + foo; //~ ERROR leading `+` is not supported
//~^ ERROR mismatched types
32
}
diff --git a/src/test/ui/parser/expr-as-stmt.stderr b/src/test/ui/parser/expr-as-stmt.stderr
index ba5cd01abfc..91f97c4662a 100644
--- a/src/test/ui/parser/expr-as-stmt.stderr
+++ b/src/test/ui/parser/expr-as-stmt.stderr
@@ -1,30 +1,30 @@
-error: expected expression, found `+`
+error: leading `+` is not supported
--> $DIR/expr-as-stmt.rs:8:9
|
LL | {2} + {2}
- | ^ expected expression
+ | ^ unexpected `+`
|
help: parentheses are required to parse this as an expression
|
LL | ({2}) + {2}
| + +
-error: expected expression, found `+`
+error: leading `+` is not supported
--> $DIR/expr-as-stmt.rs:13:9
|
LL | {2} + 2
- | ^ expected expression
+ | ^ unexpected `+`
|
help: parentheses are required to parse this as an expression
|
LL | ({2}) + 2
| + +
-error: expected expression, found `+`
+error: leading `+` is not supported
--> $DIR/expr-as-stmt.rs:19:12
|
LL | { 42 } + foo;
- | ^ expected expression
+ | ^ unexpected `+`
|
help: parentheses are required to parse this as an expression
|
diff --git a/src/test/ui/parser/issue-88276-unary-plus.fixed b/src/test/ui/parser/issue-88276-unary-plus.fixed
new file mode 100644
index 00000000000..279cdb5060a
--- /dev/null
+++ b/src/test/ui/parser/issue-88276-unary-plus.fixed
@@ -0,0 +1,13 @@
+// run-rustfix
+#[allow(unused_parens)]
+fn main() {
+ let _ = 1; //~ ERROR leading `+` is not supported
+ let _ = -(1+2)*3; //~ ERROR leading `+` is not supported
+ let _ = --(1+2)*3; //~ ERROR leading `+` is not supported
+ //~| ERROR leading `+` is not supported
+ let _ = (1 + 2) * 3; //~ ERROR leading `+` is not supported
+ //~| ERROR leading `+` is not supported
+ let _ = (&"hello"); //~ ERROR leading `+` is not supported
+ let _ = [3, 4+6]; //~ ERROR leading `+` is not supported
+ //~| ERROR leading `+` is not supported
+}
diff --git a/src/test/ui/parser/issue-88276-unary-plus.rs b/src/test/ui/parser/issue-88276-unary-plus.rs
new file mode 100644
index 00000000000..a72dad4dc71
--- /dev/null
+++ b/src/test/ui/parser/issue-88276-unary-plus.rs
@@ -0,0 +1,13 @@
+// run-rustfix
+#[allow(unused_parens)]
+fn main() {
+ let _ = +1; //~ ERROR leading `+` is not supported
+ let _ = -+(1+2)*3; //~ ERROR leading `+` is not supported
+ let _ = -+-+(1+2)*3; //~ ERROR leading `+` is not supported
+ //~| ERROR leading `+` is not supported
+ let _ = (1 + +2) * +3; //~ ERROR leading `+` is not supported
+ //~| ERROR leading `+` is not supported
+ let _ = (+&"hello"); //~ ERROR leading `+` is not supported
+ let _ = +[+3, 4+6]; //~ ERROR leading `+` is not supported
+ //~| ERROR leading `+` is not supported
+}
diff --git a/src/test/ui/parser/issue-88276-unary-plus.stderr b/src/test/ui/parser/issue-88276-unary-plus.stderr
new file mode 100644
index 00000000000..255839bc684
--- /dev/null
+++ b/src/test/ui/parser/issue-88276-unary-plus.stderr
@@ -0,0 +1,83 @@
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:4:13
+ |
+LL | let _ = +1;
+ | ^
+ | |
+ | unexpected `+`
+ | help: try removing the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:5:14
+ |
+LL | let _ = -+(1+2)*3;
+ | ^
+ | |
+ | unexpected `+`
+ | help: try removing the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:6:14
+ |
+LL | let _ = -+-+(1+2)*3;
+ | ^
+ | |
+ | unexpected `+`
+ | help: try removing the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:6:16
+ |
+LL | let _ = -+-+(1+2)*3;
+ | ^
+ | |
+ | unexpected `+`
+ | help: try removing the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:8:18
+ |
+LL | let _ = (1 + +2) * +3;
+ | ^
+ | |
+ | unexpected `+`
+ | help: try removing the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:8:24
+ |
+LL | let _ = (1 + +2) * +3;
+ | ^
+ | |
+ | unexpected `+`
+ | help: try removing the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:10:14
+ |
+LL | let _ = (+&"hello");
+ | ^
+ | |
+ | unexpected `+`
+ | help: try removing the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:11:13
+ |
+LL | let _ = +[+3, 4+6];
+ | ^
+ | |
+ | unexpected `+`
+ | help: try removing the `+`
+
+error: leading `+` is not supported
+ --> $DIR/issue-88276-unary-plus.rs:11:15
+ |
+LL | let _ = +[+3, 4+6];
+ | ^
+ | |
+ | unexpected `+`
+ | help: try removing the `+`
+
+error: aborting due to 9 previous errors
+
--
cgit 1.4.1-3-g733a5
From 65eb7e516c798a9447dbfe1d02aeeb314d4fec54 Mon Sep 17 00:00:00 2001
From: Theodore Luo Wang
Date: Sat, 4 Sep 2021 22:35:59 -0400
Subject: Use verbose suggestions and only match if the + is seen before a
numeric literal
---
compiler/rustc_ast/src/token.rs | 4 +
compiler/rustc_parse/src/parser/expr.rs | 7 +-
src/test/ui/associated-types/issue-36499.stderr | 11 ++-
src/test/ui/parser/expr-as-stmt.fixed | 4 +-
src/test/ui/parser/expr-as-stmt.rs | 4 +-
src/test/ui/parser/expr-as-stmt.stderr | 8 +-
src/test/ui/parser/issue-88276-unary-plus.fixed | 7 +-
src/test/ui/parser/issue-88276-unary-plus.rs | 9 +--
src/test/ui/parser/issue-88276-unary-plus.stderr | 93 ++++++++----------------
9 files changed, 55 insertions(+), 92 deletions(-)
(limited to 'src')
diff --git a/compiler/rustc_ast/src/token.rs b/compiler/rustc_ast/src/token.rs
index 710a592e258..e467bd963bf 100644
--- a/compiler/rustc_ast/src/token.rs
+++ b/compiler/rustc_ast/src/token.rs
@@ -586,6 +586,10 @@ impl Token {
self.is_non_raw_ident_where(|id| id.name.is_bool_lit())
}
+ pub fn is_numeric_lit(&self) -> bool {
+ matches!(self.kind, Literal(Lit { kind: LitKind::Integer, ..}) | Literal(Lit { kind: LitKind::Float, ..}))
+ }
+
/// Returns `true` if the token is a non-raw identifier for which `pred` holds.
pub fn is_non_raw_ident_where(&self, pred: impl FnOnce(Ident) -> bool) -> bool {
match self.ident() {
diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs
index 4463d2fc6c8..83e1c5ff753 100644
--- a/compiler/rustc_parse/src/parser/expr.rs
+++ b/compiler/rustc_parse/src/parser/expr.rs
@@ -516,16 +516,15 @@ impl<'a> Parser<'a> {
token::BinOp(token::And) | token::AndAnd => {
make_it!(this, attrs, |this, _| this.parse_borrow_expr(lo))
}
- token::BinOp(token::Plus) => {
+ token::BinOp(token::Plus) if this.look_ahead(1, |tok| tok.is_numeric_lit()) => {
let mut err = this.struct_span_err(lo, "leading `+` is not supported");
err.span_label(lo, "unexpected `+`");
// a block on the LHS might have been intended to be an expression instead
- let sp = this.sess.source_map().start_point(lo);
- if let Some(sp) = this.sess.ambiguous_block_expr_parse.borrow().get(&sp) {
+ if let Some(sp) = this.sess.ambiguous_block_expr_parse.borrow().get(&lo) {
this.sess.expr_parentheses_needed(&mut err, *sp);
} else {
- err.span_suggestion(
+ err.span_suggestion_verbose(
lo,
"try removing the `+`",
"".to_string(),
diff --git a/src/test/ui/associated-types/issue-36499.stderr b/src/test/ui/associated-types/issue-36499.stderr
index 990ef09e3f7..610798d880f 100644
--- a/src/test/ui/associated-types/issue-36499.stderr
+++ b/src/test/ui/associated-types/issue-36499.stderr
@@ -2,10 +2,13 @@ error: leading `+` is not supported
--> $DIR/issue-36499.rs:4:9
|
LL | 2 + +2;
- | ^
- | |
- | unexpected `+`
- | help: try removing the `+`
+ | ^ unexpected `+`
+ |
+help: try removing the `+`
+ |
+LL - 2 + +2;
+LL + 2 + 2;
+ |
error: aborting due to previous error
diff --git a/src/test/ui/parser/expr-as-stmt.fixed b/src/test/ui/parser/expr-as-stmt.fixed
index 79d73090a04..5f5e25991e0 100644
--- a/src/test/ui/parser/expr-as-stmt.fixed
+++ b/src/test/ui/parser/expr-as-stmt.fixed
@@ -5,7 +5,7 @@
#![allow(unused_must_use)]
fn foo() -> i32 {
- ({2}) + {2} //~ ERROR leading `+` is not supported
+ ({2}) + {2} //~ ERROR expected expression, found `+`
//~^ ERROR mismatched types
}
@@ -16,7 +16,7 @@ fn bar() -> i32 {
fn zul() -> u32 {
let foo = 3;
- ({ 42 }) + foo; //~ ERROR leading `+` is not supported
+ ({ 42 }) + foo; //~ ERROR expected expression, found `+`
//~^ ERROR mismatched types
32
}
diff --git a/src/test/ui/parser/expr-as-stmt.rs b/src/test/ui/parser/expr-as-stmt.rs
index 8698f99b81a..5428e1c32fe 100644
--- a/src/test/ui/parser/expr-as-stmt.rs
+++ b/src/test/ui/parser/expr-as-stmt.rs
@@ -5,7 +5,7 @@
#![allow(unused_must_use)]
fn foo() -> i32 {
- {2} + {2} //~ ERROR leading `+` is not supported
+ {2} + {2} //~ ERROR expected expression, found `+`
//~^ ERROR mismatched types
}
@@ -16,7 +16,7 @@ fn bar() -> i32 {
fn zul() -> u32 {
let foo = 3;
- { 42 } + foo; //~ ERROR leading `+` is not supported
+ { 42 } + foo; //~ ERROR expected expression, found `+`
//~^ ERROR mismatched types
32
}
diff --git a/src/test/ui/parser/expr-as-stmt.stderr b/src/test/ui/parser/expr-as-stmt.stderr
index 91f97c4662a..d99e9be0000 100644
--- a/src/test/ui/parser/expr-as-stmt.stderr
+++ b/src/test/ui/parser/expr-as-stmt.stderr
@@ -1,8 +1,8 @@
-error: leading `+` is not supported
+error: expected expression, found `+`
--> $DIR/expr-as-stmt.rs:8:9
|
LL | {2} + {2}
- | ^ unexpected `+`
+ | ^ expected expression
|
help: parentheses are required to parse this as an expression
|
@@ -20,11 +20,11 @@ help: parentheses are required to parse this as an expression
LL | ({2}) + 2
| + +
-error: leading `+` is not supported
+error: expected expression, found `+`
--> $DIR/expr-as-stmt.rs:19:12
|
LL | { 42 } + foo;
- | ^ unexpected `+`
+ | ^ expected expression
|
help: parentheses are required to parse this as an expression
|
diff --git a/src/test/ui/parser/issue-88276-unary-plus.fixed b/src/test/ui/parser/issue-88276-unary-plus.fixed
index 279cdb5060a..25b7c340f60 100644
--- a/src/test/ui/parser/issue-88276-unary-plus.fixed
+++ b/src/test/ui/parser/issue-88276-unary-plus.fixed
@@ -2,12 +2,7 @@
#[allow(unused_parens)]
fn main() {
let _ = 1; //~ ERROR leading `+` is not supported
- let _ = -(1+2)*3; //~ ERROR leading `+` is not supported
- let _ = --(1+2)*3; //~ ERROR leading `+` is not supported
- //~| ERROR leading `+` is not supported
- let _ = (1 + 2) * 3; //~ ERROR leading `+` is not supported
+ let _ = (1.0 + 2.0) * 3.0; //~ ERROR leading `+` is not supported
//~| ERROR leading `+` is not supported
- let _ = (&"hello"); //~ ERROR leading `+` is not supported
let _ = [3, 4+6]; //~ ERROR leading `+` is not supported
- //~| ERROR leading `+` is not supported
}
diff --git a/src/test/ui/parser/issue-88276-unary-plus.rs b/src/test/ui/parser/issue-88276-unary-plus.rs
index a72dad4dc71..11b2e9d6016 100644
--- a/src/test/ui/parser/issue-88276-unary-plus.rs
+++ b/src/test/ui/parser/issue-88276-unary-plus.rs
@@ -2,12 +2,7 @@
#[allow(unused_parens)]
fn main() {
let _ = +1; //~ ERROR leading `+` is not supported
- let _ = -+(1+2)*3; //~ ERROR leading `+` is not supported
- let _ = -+-+(1+2)*3; //~ ERROR leading `+` is not supported
- //~| ERROR leading `+` is not supported
- let _ = (1 + +2) * +3; //~ ERROR leading `+` is not supported
+ let _ = (1.0 + +2.0) * +3.0; //~ ERROR leading `+` is not supported
//~| ERROR leading `+` is not supported
- let _ = (+&"hello"); //~ ERROR leading `+` is not supported
- let _ = +[+3, 4+6]; //~ ERROR leading `+` is not supported
- //~| ERROR leading `+` is not supported
+ let _ = [+3, 4+6]; //~ ERROR leading `+` is not supported
}
diff --git a/src/test/ui/parser/issue-88276-unary-plus.stderr b/src/test/ui/parser/issue-88276-unary-plus.stderr
index 255839bc684..b26761729a8 100644
--- a/src/test/ui/parser/issue-88276-unary-plus.stderr
+++ b/src/test/ui/parser/issue-88276-unary-plus.stderr
@@ -2,82 +2,49 @@ error: leading `+` is not supported
--> $DIR/issue-88276-unary-plus.rs:4:13
|
LL | let _ = +1;
- | ^
- | |
- | unexpected `+`
- | help: try removing the `+`
-
-error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:5:14
+ | ^ unexpected `+`
|
-LL | let _ = -+(1+2)*3;
- | ^
- | |
- | unexpected `+`
- | help: try removing the `+`
-
-error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:6:14
+help: try removing the `+`
|
-LL | let _ = -+-+(1+2)*3;
- | ^
- | |
- | unexpected `+`
- | help: try removing the `+`
+LL - let _ = +1;
+LL + let _ = 1;
+ |
error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:6:16
+ --> $DIR/issue-88276-unary-plus.rs:5:20
|
-LL | let _ = -+-+(1+2)*3;
- | ^
- | |
- | unexpected `+`
- | help: try removing the `+`
-
-error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:8:18
+LL | let _ = (1.0 + +2.0) * +3.0;
+ | ^ unexpected `+`
|
-LL | let _ = (1 + +2) * +3;
- | ^
- | |
- | unexpected `+`
- | help: try removing the `+`
-
-error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:8:24
+help: try removing the `+`
|
-LL | let _ = (1 + +2) * +3;
- | ^
- | |
- | unexpected `+`
- | help: try removing the `+`
+LL - let _ = (1.0 + +2.0) * +3.0;
+LL + let _ = (1.0 + 2.0) * +3.0;
+ |
error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:10:14
+ --> $DIR/issue-88276-unary-plus.rs:5:28
|
-LL | let _ = (+&"hello");
- | ^
- | |
- | unexpected `+`
- | help: try removing the `+`
-
-error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:11:13
+LL | let _ = (1.0 + +2.0) * +3.0;
+ | ^ unexpected `+`
|
-LL | let _ = +[+3, 4+6];
- | ^
- | |
- | unexpected `+`
- | help: try removing the `+`
+help: try removing the `+`
+ |
+LL - let _ = (1.0 + +2.0) * +3.0;
+LL + let _ = (1.0 + +2.0) * 3.0;
+ |
error: leading `+` is not supported
- --> $DIR/issue-88276-unary-plus.rs:11:15
+ --> $DIR/issue-88276-unary-plus.rs:7:14
+ |
+LL | let _ = [+3, 4+6];
+ | ^ unexpected `+`
+ |
+help: try removing the `+`
|
-LL | let _ = +[+3, 4+6];
- | ^
- | |
- | unexpected `+`
- | help: try removing the `+`
+LL - let _ = [+3, 4+6];
+LL + let _ = [3, 4+6];
+ |
-error: aborting due to 9 previous errors
+error: aborting due to 4 previous errors
--
cgit 1.4.1-3-g733a5
From fe7bcd6e4044f760f90aa2309c76d3a75899126a Mon Sep 17 00:00:00 2001
From: Bram van den Heuvel
Date: Tue, 31 Aug 2021 11:03:49 +0200
Subject: Add regression test for #74400
---
.../lifetime-errors/issue_74400.nll.stderr | 30 ++++++++++++++++++++++
.../ui/lifetimes/lifetime-errors/issue_74400.rs | 13 ++++++++++
.../lifetimes/lifetime-errors/issue_74400.stderr | 11 ++++++++
3 files changed, 54 insertions(+)
create mode 100644 src/test/ui/lifetimes/lifetime-errors/issue_74400.nll.stderr
create mode 100644 src/test/ui/lifetimes/lifetime-errors/issue_74400.rs
create mode 100644 src/test/ui/lifetimes/lifetime-errors/issue_74400.stderr
(limited to 'src')
diff --git a/src/test/ui/lifetimes/lifetime-errors/issue_74400.nll.stderr b/src/test/ui/lifetimes/lifetime-errors/issue_74400.nll.stderr
new file mode 100644
index 00000000000..5a1294f948f
--- /dev/null
+++ b/src/test/ui/lifetimes/lifetime-errors/issue_74400.nll.stderr
@@ -0,0 +1,30 @@
+error[E0310]: the parameter type `T` may not live long enough
+ --> $DIR/issue_74400.rs:12:5
+ |
+LL | f(data, identity)
+ | ^^^^^^^^^^^^^^^^^
+ |
+ = help: consider adding an explicit lifetime bound `T: 'static`...
+
+error[E0308]: mismatched types
+ --> $DIR/issue_74400.rs:12:5
+ |
+LL | f(data, identity)
+ | ^^^^^^^^^^^^^^^^^ one type is more general than the other
+ |
+ = note: expected type `for<'r> Fn<(&'r T,)>`
+ found type `Fn<(&T,)>`
+
+error: implementation of `FnOnce` is not general enough
+ --> $DIR/issue_74400.rs:12:5
+ |
+LL | f(data, identity)
+ | ^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough
+ |
+ = note: `fn(&'2 T) -> &'2 T {identity::<&'2 T>}` must implement `FnOnce<(&'1 T,)>`, for any lifetime `'1`...
+ = note: ...but it actually implements `FnOnce<(&'2 T,)>`, for some specific lifetime `'2`
+
+error: aborting due to 3 previous errors
+
+Some errors have detailed explanations: E0308, E0310.
+For more information about an error, try `rustc --explain E0308`.
diff --git a/src/test/ui/lifetimes/lifetime-errors/issue_74400.rs b/src/test/ui/lifetimes/lifetime-errors/issue_74400.rs
new file mode 100644
index 00000000000..f83384524f7
--- /dev/null
+++ b/src/test/ui/lifetimes/lifetime-errors/issue_74400.rs
@@ -0,0 +1,13 @@
+//! Regression test for #74400: Type mismatch in function arguments E0631, E0271 are falsely
+//! recognized as E0308 mismatched types.
+
+use std::convert::identity;
+
+fn main() {}
+
+fn f(data: &[T], key: impl Fn(&T) -> S) {
+}
+
+fn g(data: &[T]) {
+ f(data, identity) //~ ERROR implementation of `FnOnce` is not general
+}
diff --git a/src/test/ui/lifetimes/lifetime-errors/issue_74400.stderr b/src/test/ui/lifetimes/lifetime-errors/issue_74400.stderr
new file mode 100644
index 00000000000..d972861a2b5
--- /dev/null
+++ b/src/test/ui/lifetimes/lifetime-errors/issue_74400.stderr
@@ -0,0 +1,11 @@
+error: implementation of `FnOnce` is not general enough
+ --> $DIR/issue_74400.rs:12:5
+ |
+LL | f(data, identity)
+ | ^ implementation of `FnOnce` is not general enough
+ |
+ = note: `fn(&'2 T) -> &'2 T {identity::<&'2 T>}` must implement `FnOnce<(&'1 T,)>`, for any lifetime `'1`...
+ = note: ...but it actually implements `FnOnce<(&'2 T,)>`, for some specific lifetime `'2`
+
+error: aborting due to previous error
+
--
cgit 1.4.1-3-g733a5
From c0451f73b2094d7edccb77d7ea8be48f64887e67 Mon Sep 17 00:00:00 2001
From: Deadbeef
Date: Mon, 6 Sep 2021 07:09:32 +0000
Subject: Correctly handle niche of enum
---
src/librustdoc/html/render/print_item.rs | 12 ++++++++----
src/test/rustdoc/type-layout.rs | 9 +++++++++
2 files changed, 17 insertions(+), 4 deletions(-)
(limited to 'src')
diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs
index 6054073bf79..aac631a1cfc 100644
--- a/src/librustdoc/html/render/print_item.rs
+++ b/src/librustdoc/html/render/print_item.rs
@@ -13,7 +13,7 @@ use rustc_middle::ty::layout::LayoutError;
use rustc_middle::ty::{Adt, TyCtxt};
use rustc_span::hygiene::MacroKind;
use rustc_span::symbol::{kw, sym, Symbol};
-use rustc_target::abi::{Layout, Primitive, Variants};
+use rustc_target::abi::{Layout, Primitive, TagEncoding, Variants};
use super::{
collect_paths_for_type, document, ensure_trailing_slash, item_ty_to_strs, notable_traits_decl,
@@ -1639,7 +1639,9 @@ fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
w.write_str("Size: ");
write_size_of_layout(w, ty_layout.layout, 0);
writeln!(w, "
");
- if let Variants::Multiple { variants, tag, .. } = &ty_layout.layout.variants {
+ if let Variants::Multiple { variants, tag, tag_encoding, .. } =
+ &ty_layout.layout.variants
+ {
if !variants.is_empty() {
w.write_str(
"Size for each variant:
\
@@ -1652,10 +1654,12 @@ fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) {
span_bug!(tcx.def_span(ty_def_id), "not an adt")
};
- let tag_size = if let Primitive::Int(i, _) = tag.value {
+ let tag_size = if let TagEncoding::Niche { .. } = tag_encoding {
+ 0
+ } else if let Primitive::Int(i, _) = tag.value {
i.size().bytes()
} else {
- span_bug!(tcx.def_span(ty_def_id), "tag is not int")
+ span_bug!(tcx.def_span(ty_def_id), "tag is neither niche nor int")
};
for (index, layout) in variants.iter_enumerated() {
diff --git a/src/test/rustdoc/type-layout.rs b/src/test/rustdoc/type-layout.rs
index 8c4f4f8fc98..0868486fa59 100644
--- a/src/test/rustdoc/type-layout.rs
+++ b/src/test/rustdoc/type-layout.rs
@@ -61,3 +61,12 @@ pub enum Variants {
A,
B(u8),
}
+
+// @has type_layout/enum.WithNiche.html 'Size: '
+// @has - //p '4 bytes'
+// @has - 'None: 0 bytes'
+// @has - 'Some: 4 bytes'
+pub enum WithNiche {
+ None,
+ Some(std::num::NonZeroU32),
+}
--
cgit 1.4.1-3-g733a5
From 214eef043501a896ec375fc831891cf1dc09219f Mon Sep 17 00:00:00 2001
From: hyd-dev
Date: Mon, 6 Sep 2021 23:58:10 +0800
Subject: Add a regression test for
https://github.com/rust-lang/rust/issues/88649
---
src/test/ui/consts/issue-88649.rs | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
create mode 100644 src/test/ui/consts/issue-88649.rs
(limited to 'src')
diff --git a/src/test/ui/consts/issue-88649.rs b/src/test/ui/consts/issue-88649.rs
new file mode 100644
index 00000000000..43e562b5a7d
--- /dev/null
+++ b/src/test/ui/consts/issue-88649.rs
@@ -0,0 +1,18 @@
+// check-pass
+#![crate_type = "lib"]
+
+enum Foo {
+ Variant1(bool),
+ Variant2(bool),
+}
+
+const _: () = {
+ let mut n = 0;
+ while n < 2 {
+ match Foo::Variant1(true) {
+ Foo::Variant1(x) | Foo::Variant2(x) if x => {}
+ _ => {}
+ }
+ n += 1;
+ }
+};
--
cgit 1.4.1-3-g733a5