Auto merge of #100048 - matthiaskrgr:rollup-agimvm6, r=matthiaskrgr
Rollup of 8 pull requests Successful merges: - #99156 (`codegen_fulfill_obligation` expect erased regions) - #99293 (only run --all-targets in stage0 for Std) - #99779 (Fix item info pos and height) - #99994 (Remove `guess_head_span`) - #100011 (Use Parser's `restrictions` instead of `let_expr_allowed`) - #100017 (kmc-solid: Update `Socket::connect_timeout` to be in line with #78802) - #100037 (Update rustc man page to match `rustc --help`) - #100042 (Update books) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
ca37a45232
|
@ -8,7 +8,7 @@ pub use self::ValuePairs::*;
|
|||
use self::opaque_types::OpaqueTypeStorage;
|
||||
pub(crate) use self::undo_log::{InferCtxtUndoLogs, Snapshot, UndoLog};
|
||||
|
||||
use crate::traits::{self, ObligationCause, PredicateObligations, TraitEngine};
|
||||
use crate::traits::{self, ObligationCause, PredicateObligations, TraitEngine, TraitEngineExt};
|
||||
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
|
@ -645,9 +645,7 @@ impl<'tcx, T> InferOk<'tcx, T> {
|
|||
fulfill_cx: &mut dyn TraitEngine<'tcx>,
|
||||
) -> T {
|
||||
let InferOk { value, obligations } = self;
|
||||
for obligation in obligations {
|
||||
fulfill_cx.register_predicate_obligation(infcx, obligation);
|
||||
}
|
||||
fulfill_cx.register_predicate_obligations(infcx, obligations);
|
||||
value
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1391,8 +1391,6 @@ impl<'a> Parser<'a> {
|
|||
} else if self.is_do_yeet() {
|
||||
self.parse_yeet_expr(attrs)
|
||||
} else if self.check_keyword(kw::Let) {
|
||||
self.manage_let_chains_context();
|
||||
self.bump();
|
||||
self.parse_let_expr(attrs)
|
||||
} else if self.eat_keyword(kw::Underscore) {
|
||||
Ok(self.mk_expr(self.prev_token.span, ExprKind::Underscore, attrs))
|
||||
|
@ -2342,32 +2340,24 @@ impl<'a> Parser<'a> {
|
|||
|
||||
/// Parses the condition of a `if` or `while` expression.
|
||||
fn parse_cond_expr(&mut self) -> PResult<'a, P<Expr>> {
|
||||
self.with_let_management(true, |local_self| {
|
||||
local_self.parse_expr_res(Restrictions::NO_STRUCT_LITERAL, None)
|
||||
})
|
||||
}
|
||||
|
||||
// Checks if `let` is in an invalid position like `let x = let y = 1;` or
|
||||
// if the current `let` is in a let_chains context but nested in another
|
||||
// expression like `if let Some(_) = _opt && [1, 2, 3][let _ = ()] = 1`.
|
||||
//
|
||||
// This method expects that the current token is `let`.
|
||||
fn manage_let_chains_context(&mut self) {
|
||||
debug_assert!(matches!(self.token.kind, TokenKind::Ident(kw::Let, _)));
|
||||
let is_in_a_let_chains_context_but_nested_in_other_expr = self.let_expr_allowed
|
||||
&& !matches!(
|
||||
self.prev_token.kind,
|
||||
TokenKind::AndAnd | TokenKind::Ident(kw::If, _) | TokenKind::Ident(kw::While, _)
|
||||
);
|
||||
if !self.let_expr_allowed || is_in_a_let_chains_context_but_nested_in_other_expr {
|
||||
self.struct_span_err(self.token.span, "expected expression, found `let` statement")
|
||||
.emit();
|
||||
}
|
||||
self.parse_expr_res(Restrictions::NO_STRUCT_LITERAL | Restrictions::ALLOW_LET, None)
|
||||
}
|
||||
|
||||
/// Parses a `let $pat = $expr` pseudo-expression.
|
||||
/// The `let` token has already been eaten.
|
||||
fn parse_let_expr(&mut self, attrs: AttrVec) -> PResult<'a, P<Expr>> {
|
||||
// This is a *approximate* heuristic that detects if `let` chains are
|
||||
// being parsed in the right position. It's approximate because it
|
||||
// doesn't deny all invalid `let` expressions, just completely wrong usages.
|
||||
let not_in_chain = !matches!(
|
||||
self.prev_token.kind,
|
||||
TokenKind::AndAnd | TokenKind::Ident(kw::If, _) | TokenKind::Ident(kw::While, _)
|
||||
);
|
||||
if !self.restrictions.contains(Restrictions::ALLOW_LET) || not_in_chain {
|
||||
self.struct_span_err(self.token.span, "expected expression, found `let` statement")
|
||||
.emit();
|
||||
}
|
||||
|
||||
self.bump(); // Eat `let` token
|
||||
let lo = self.prev_token.span;
|
||||
let pat = self.parse_pat_allow_top_alt(
|
||||
None,
|
||||
|
@ -2687,7 +2677,9 @@ impl<'a> Parser<'a> {
|
|||
// `&&` tokens.
|
||||
fn check_let_expr(expr: &Expr) -> bool {
|
||||
match expr.kind {
|
||||
ExprKind::Binary(_, ref lhs, ref rhs) => check_let_expr(lhs) || check_let_expr(rhs),
|
||||
ExprKind::Binary(BinOp { node: BinOpKind::And, .. }, ref lhs, ref rhs) => {
|
||||
check_let_expr(lhs) || check_let_expr(rhs)
|
||||
}
|
||||
ExprKind::Let(..) => true,
|
||||
_ => false,
|
||||
}
|
||||
|
@ -2703,9 +2695,8 @@ impl<'a> Parser<'a> {
|
|||
)?;
|
||||
let guard = if this.eat_keyword(kw::If) {
|
||||
let if_span = this.prev_token.span;
|
||||
let cond = this.with_let_management(true, |local_this| local_this.parse_expr())?;
|
||||
let has_let_expr = check_let_expr(&cond);
|
||||
if has_let_expr {
|
||||
let cond = this.parse_expr_res(Restrictions::ALLOW_LET, None)?;
|
||||
if check_let_expr(&cond) {
|
||||
let span = if_span.to(cond.span);
|
||||
this.sess.gated_spans.gate(sym::if_let_guard, span);
|
||||
}
|
||||
|
@ -3279,17 +3270,4 @@ impl<'a> Parser<'a> {
|
|||
Ok((res, trailing))
|
||||
})
|
||||
}
|
||||
|
||||
// Calls `f` with the internal `let_expr_allowed` set to `let_expr_allowed` and then
|
||||
// sets the internal `let_expr_allowed` back to its original value.
|
||||
fn with_let_management<T>(
|
||||
&mut self,
|
||||
let_expr_allowed: bool,
|
||||
f: impl FnOnce(&mut Self) -> T,
|
||||
) -> T {
|
||||
let last_let_expr_allowed = mem::replace(&mut self.let_expr_allowed, let_expr_allowed);
|
||||
let rslt = f(self);
|
||||
self.let_expr_allowed = last_let_expr_allowed;
|
||||
rslt
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,6 +47,7 @@ bitflags::bitflags! {
|
|||
const STMT_EXPR = 1 << 0;
|
||||
const NO_STRUCT_LITERAL = 1 << 1;
|
||||
const CONST_EXPR = 1 << 2;
|
||||
const ALLOW_LET = 1 << 3;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -147,15 +148,12 @@ pub struct Parser<'a> {
|
|||
/// This allows us to recover when the user forget to add braces around
|
||||
/// multiple statements in the closure body.
|
||||
pub current_closure: Option<ClosureSpans>,
|
||||
/// Used to track where `let`s are allowed. For example, `if true && let 1 = 1` is valid
|
||||
/// but `[1, 2, 3][let _ = ()]` is not.
|
||||
let_expr_allowed: bool,
|
||||
}
|
||||
|
||||
// This type is used a lot, e.g. it's cloned when matching many declarative macro rules. Make sure
|
||||
// it doesn't unintentionally get bigger.
|
||||
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
|
||||
rustc_data_structures::static_assert_size!(Parser<'_>, 336);
|
||||
rustc_data_structures::static_assert_size!(Parser<'_>, 328);
|
||||
|
||||
/// Stores span information about a closure.
|
||||
#[derive(Clone)]
|
||||
|
@ -462,7 +460,6 @@ impl<'a> Parser<'a> {
|
|||
inner_attr_ranges: Default::default(),
|
||||
},
|
||||
current_closure: None,
|
||||
let_expr_allowed: false,
|
||||
};
|
||||
|
||||
// Make parser point to the first token.
|
||||
|
|
|
@ -23,8 +23,6 @@ pub fn codegen_fulfill_obligation<'tcx>(
|
|||
tcx: TyCtxt<'tcx>,
|
||||
(param_env, trait_ref): (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>),
|
||||
) -> Result<&'tcx ImplSource<'tcx, ()>, CodegenObligationError> {
|
||||
// Remove any references to regions; this helps improve caching.
|
||||
let trait_ref = tcx.erase_regions(trait_ref);
|
||||
// We expect the input to be fully normalized.
|
||||
debug_assert_eq!(trait_ref, tcx.normalize_erasing_regions(param_env, trait_ref));
|
||||
|
||||
|
|
|
@ -356,13 +356,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// 6 | | };
|
||||
// | |_____^ expected integer, found `()`
|
||||
// ```
|
||||
if block.expr.is_none() && block.stmts.is_empty() && outer_span.is_some() {
|
||||
let sp = if let Some(cs) = cond_span.find_ancestor_inside(span) {
|
||||
span.with_hi(cs.hi())
|
||||
} else {
|
||||
span
|
||||
};
|
||||
outer_span = Some(sp);
|
||||
if block.expr.is_none() && block.stmts.is_empty()
|
||||
&& let Some(outer_span) = &mut outer_span
|
||||
&& let Some(cond_span) = cond_span.find_ancestor_inside(*outer_span)
|
||||
{
|
||||
*outer_span = outer_span.with_hi(cond_span.hi())
|
||||
}
|
||||
|
||||
(self.find_block_span(block), block.hir_id)
|
||||
|
|
|
@ -230,8 +230,8 @@ impl Socket {
|
|||
pub fn connect_timeout(&self, addr: &SocketAddr, timeout: Duration) -> io::Result<()> {
|
||||
self.set_nonblocking(true)?;
|
||||
let r = unsafe {
|
||||
let (addrp, len) = addr.into_inner();
|
||||
cvt(netc::connect(self.0.raw(), addrp, len))
|
||||
let (addr, len) = addr.into_inner();
|
||||
cvt(netc::connect(self.0.raw(), addr.as_ptr(), len))
|
||||
};
|
||||
self.set_nonblocking(false)?;
|
||||
|
||||
|
|
|
@ -140,7 +140,13 @@ impl Step for Std {
|
|||
cargo_subcommand(builder.kind),
|
||||
);
|
||||
|
||||
cargo.arg("--all-targets");
|
||||
// If we're not in stage 0, tests and examples will fail to compile
|
||||
// from `core` definitions being loaded from two different `libcore`
|
||||
// .rmeta and .rlib files.
|
||||
if compiler.stage == 0 {
|
||||
cargo.arg("--all-targets");
|
||||
}
|
||||
|
||||
std_cargo(builder, target, compiler.stage, &mut cargo);
|
||||
|
||||
// Explicitly pass -p for all dependencies krates -- this will force cargo
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 766979590da8100998f0d662499d4a901d8d1640
|
||||
Subproject commit befe6840874311635c417cf731377f07234ee373
|
|
@ -44,18 +44,18 @@ The optional \fIKIND\fR can be one of \fIstatic\fR, \fIdylib\fR, or
|
|||
\fIframework\fR.
|
||||
If omitted, \fIdylib\fR is assumed.
|
||||
.TP
|
||||
\fB\-\-crate\-type\fR [bin|lib|rlib|dylib|cdylib|staticlib]
|
||||
\fB\-\-crate\-type\fR [bin|lib|rlib|dylib|cdylib|staticlib|proc\-macro]
|
||||
Comma separated list of types of crates for the compiler to emit.
|
||||
.TP
|
||||
\fB\-\-crate\-name\fR \fINAME\fR
|
||||
Specify the name of the crate being built.
|
||||
.TP
|
||||
\fB\-\-emit\fR [asm|llvm\-bc|llvm\-ir|obj|link|dep\-info|mir][=\fIPATH\fR]
|
||||
\fB\-\-emit\fR [asm|llvm\-bc|llvm\-ir|obj|metadata|link|dep\-info|mir][=\fIPATH\fR]
|
||||
Configure the output that \fBrustc\fR will produce. Each emission may also have
|
||||
an optional explicit output \fIPATH\fR specified for that particular emission
|
||||
kind. This path takes precedence over the \fB-o\fR option.
|
||||
.TP
|
||||
\fB\-\-print\fR [crate\-name|\:file\-names|\:sysroot|\:cfg|\:target\-list|\:target\-cpus|\:target\-features|\:relocation\-models|\:code\-models|\:tls\-models|\:target\-spec\-json|\:native\-static\-libs]
|
||||
\fB\-\-print\fR [crate\-name|\:file\-names|\:sysroot|\:target\-libdir|\:cfg|\:target\-list|\:target\-cpus|\:target\-features|\:relocation\-models|\:code\-models|\:tls\-models|\:target\-spec\-json|\:native\-static\-libs|\:stack\-protector\-strategies|\:link\-args]
|
||||
Comma separated list of compiler information to print on stdout.
|
||||
.TP
|
||||
\fB\-g\fR
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit a92be0fef439b3d8e0468d82cb24812d303520a0
|
||||
Subproject commit f3d3953bf3b158d596c96d55ce5366f9f3f972e9
|
|
@ -1 +1 @@
|
|||
Subproject commit 3155db49b0d57cd82c65456ac210b69ecec5ccb1
|
||||
Subproject commit ee342dc91e1ba1bb1e1f1318f84bbe3bfac04798
|
|
@ -1 +1 @@
|
|||
Subproject commit d5201cddace979b299ec1bf9fd8997338151aa9d
|
||||
Subproject commit 04f3cf0bb2f5a6ee2bfc4b1a6a6cd8c11d1c5531
|
|
@ -1111,7 +1111,14 @@ table,
|
|||
}
|
||||
|
||||
.item-info .stab {
|
||||
display: inline-block;
|
||||
width: fit-content;
|
||||
/* This min-height is needed to unify the height of the stab elements because some of them
|
||||
have emojis.
|
||||
*/
|
||||
min-height: 36px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
.stab {
|
||||
padding: 3px;
|
||||
|
@ -1121,6 +1128,7 @@ table,
|
|||
}
|
||||
.stab p {
|
||||
display: inline;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.stab .emoji {
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
// This test ensures that the item information don't take 100% of the width if unnecessary.
|
||||
goto: file://|DOC_PATH|/lib2/struct.Foo.html
|
||||
// We set a fixed size so there is no chance of "random" resize.
|
||||
size: (1100, 800)
|
||||
// We check that ".item-info" is bigger than its content.
|
||||
assert-css: (".item-info", {"width": "790px"})
|
||||
assert-css: (".item-info .stab", {"width": "289px"})
|
||||
assert-position: (".item-info .stab", {"x": 295})
|
32
src/test/rustdoc-gui/item-info.goml
Normal file
32
src/test/rustdoc-gui/item-info.goml
Normal file
|
@ -0,0 +1,32 @@
|
|||
// This test ensures a few things for item info elements.
|
||||
goto: file://|DOC_PATH|/lib2/struct.Foo.html
|
||||
// Ensuring that the item information don't take 100% of the width if unnecessary.
|
||||
// We set a fixed size so there is no chance of "random" resize.
|
||||
size: (1100, 800)
|
||||
// We check that ".item-info" is bigger than its content.
|
||||
assert-css: (".item-info", {"width": "790px"})
|
||||
assert-css: (".item-info .stab", {"width": "289px"})
|
||||
assert-position: (".item-info .stab", {"x": 295})
|
||||
|
||||
// Now we ensure that they're not rendered on the same line.
|
||||
goto: file://|DOC_PATH|/lib2/trait.Trait.html
|
||||
// We first ensure that there are two item info on the trait.
|
||||
assert-count: ("#main-content > .item-info .stab", 2)
|
||||
// They should not have the same `y` position!
|
||||
compare-elements-position-false: (
|
||||
"#main-content > .item-info .stab:nth-of-type(1)",
|
||||
"#main-content > .item-info .stab:nth-of-type(2)",
|
||||
("y"),
|
||||
)
|
||||
// But they should have the same `x` position.
|
||||
compare-elements-position: (
|
||||
"#main-content > .item-info .stab:nth-of-type(1)",
|
||||
"#main-content > .item-info .stab:nth-of-type(2)",
|
||||
("x"),
|
||||
)
|
||||
// They are supposed to have the same height too.
|
||||
compare-elements-css: (
|
||||
"#main-content > .item-info .stab:nth-of-type(1)",
|
||||
"#main-content > .item-info .stab:nth-of-type(2)",
|
||||
["height"],
|
||||
)
|
|
@ -30,10 +30,13 @@ impl Foo {
|
|||
pub fn a_method(&self) {}
|
||||
}
|
||||
|
||||
#[doc(cfg(feature = "foo-method"))]
|
||||
#[deprecated = "Whatever [`Foo::a_method`](#method.a_method)"]
|
||||
pub trait Trait {
|
||||
type X;
|
||||
const Y: u32;
|
||||
|
||||
#[deprecated = "Whatever [`Foo`](#tadam)"]
|
||||
fn foo() {}
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,8 @@ fn _if_let_guard() {
|
|||
() if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
|
||||
//~^ ERROR `if let` guards are experimental
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
|
||||
() if let Range { start: _, end: _ } = (true..true) && false => {}
|
||||
//~^ ERROR `if let` guards are experimental
|
||||
|
|
|
@ -41,19 +41,31 @@ LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 =
|
|||
| ^^^
|
||||
|
||||
error: expected expression, found `let` statement
|
||||
--> $DIR/feature-gate.rs:52:16
|
||||
--> $DIR/feature-gate.rs:32:55
|
||||
|
|
||||
LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
|
||||
| ^^^
|
||||
|
||||
error: expected expression, found `let` statement
|
||||
--> $DIR/feature-gate.rs:32:68
|
||||
|
|
||||
LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
|
||||
| ^^^
|
||||
|
||||
error: expected expression, found `let` statement
|
||||
--> $DIR/feature-gate.rs:54:16
|
||||
|
|
||||
LL | use_expr!((let 0 = 1 && 0 == 0));
|
||||
| ^^^
|
||||
|
||||
error: expected expression, found `let` statement
|
||||
--> $DIR/feature-gate.rs:54:16
|
||||
--> $DIR/feature-gate.rs:56:16
|
||||
|
|
||||
LL | use_expr!((let 0 = 1));
|
||||
| ^^^
|
||||
|
||||
error: no rules expected the token `let`
|
||||
--> $DIR/feature-gate.rs:62:15
|
||||
--> $DIR/feature-gate.rs:64:15
|
||||
|
|
||||
LL | macro_rules! use_expr {
|
||||
| --------------------- when calling this macro
|
||||
|
@ -102,7 +114,7 @@ LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 =
|
|||
= help: you can write `if matches!(<expr>, <pattern>)` instead of `if let <pattern> = <expr>`
|
||||
|
||||
error[E0658]: `if let` guards are experimental
|
||||
--> $DIR/feature-gate.rs:36:12
|
||||
--> $DIR/feature-gate.rs:38:12
|
||||
|
|
||||
LL | () if let Range { start: _, end: _ } = (true..true) && false => {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -112,7 +124,7 @@ LL | () if let Range { start: _, end: _ } = (true..true) && false => {}
|
|||
= help: you can write `if matches!(<expr>, <pattern>)` instead of `if let <pattern> = <expr>`
|
||||
|
||||
error[E0658]: `if let` guards are experimental
|
||||
--> $DIR/feature-gate.rs:58:12
|
||||
--> $DIR/feature-gate.rs:60:12
|
||||
|
|
||||
LL | () if let 0 = 1 => {}
|
||||
| ^^^^^^^^^^^^
|
||||
|
@ -121,6 +133,6 @@ LL | () if let 0 = 1 => {}
|
|||
= help: add `#![feature(if_let_guard)]` to the crate attributes to enable
|
||||
= help: you can write `if matches!(<expr>, <pattern>)` instead of `if let <pattern> = <expr>`
|
||||
|
||||
error: aborting due to 16 previous errors
|
||||
error: aborting due to 18 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
|
@ -51,6 +51,8 @@ fn _if() {
|
|||
//~| ERROR `let` expressions are not supported here
|
||||
//~| ERROR `let` expressions are not supported here
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
}
|
||||
|
||||
fn _while() {
|
||||
|
@ -81,6 +83,8 @@ fn _while() {
|
|||
//~| ERROR `let` expressions are not supported here
|
||||
//~| ERROR `let` expressions are not supported here
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
}
|
||||
|
||||
fn _macros() {
|
||||
|
@ -146,6 +150,7 @@ fn nested_within_if_expr() {
|
|||
//~| ERROR expected expression, found `let` statement
|
||||
if true || (true && let 0 = 0) {}
|
||||
//~^ ERROR `let` expressions are not supported here
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
|
||||
let mut x = true;
|
||||
if x = let 0 = 0 {}
|
||||
|
@ -237,6 +242,7 @@ fn nested_within_while_expr() {
|
|||
//~| ERROR expected expression, found `let` statement
|
||||
while true || (true && let 0 = 0) {}
|
||||
//~^ ERROR `let` expressions are not supported here
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
|
||||
let mut x = true;
|
||||
while x = let 0 = 0 {}
|
||||
|
@ -388,16 +394,19 @@ fn inside_const_generic_arguments() {
|
|||
if let A::<{
|
||||
true && let 1 = 1
|
||||
//~^ ERROR `let` expressions are not supported here
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
}>::O = 5 {}
|
||||
|
||||
while let A::<{
|
||||
true && let 1 = 1
|
||||
//~^ ERROR `let` expressions are not supported here
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
}>::O = 5 {}
|
||||
|
||||
if A::<{
|
||||
true && let 1 = 1
|
||||
//~^ ERROR `let` expressions are not supported here
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
}>::O == 5 {}
|
||||
|
||||
// In the cases above we have `ExprKind::Block` to help us out.
|
||||
|
@ -409,7 +418,8 @@ fn inside_const_generic_arguments() {
|
|||
if A::<
|
||||
true && let 1 = 1
|
||||
//~^ ERROR `let` expressions are not supported here
|
||||
//~| ERROR expressions must be enclosed in braces
|
||||
//~| ERROR expressions must be enclosed in braces
|
||||
//~| ERROR expected expression, found `let` statement
|
||||
>::O == 5 {}
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue