Skip to content

Commit

Permalink
Auto merge of rust-lang#124537 - matthiaskrgr:rollup-zjv9gu8, r=matth…
Browse files Browse the repository at this point in the history
…iaskrgr

Rollup of 3 pull requests

Successful merges:

 - rust-lang#124185 (Remove optionality from MoveData::base_local)
 - rust-lang#124488 (Add a note to the ArbitraryExpressionInPattern error)
 - rust-lang#124530 (Fix Fuchsia build broken by rust-lang#124210)

r? `@ghost`
`@rustbot` modify labels: rollup
  • Loading branch information
bors committed Apr 29, 2024
2 parents a8a1d3a + d94eaba commit 7823bf0
Show file tree
Hide file tree
Showing 12 changed files with 46 additions and 14 deletions.
1 change: 1 addition & 0 deletions compiler/rustc_ast_lowering/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ ast_lowering_abi_specified_multiple_times =
ast_lowering_arbitrary_expression_in_pattern =
arbitrary expressions aren't allowed in patterns
.pattern_from_macro_note = the `expr` fragment specifier forces the metavariable's content to be an expression
ast_lowering_argument = argument
Expand Down
2 changes: 2 additions & 0 deletions compiler/rustc_ast_lowering/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,8 @@ pub struct NeverPatternWithGuard {
pub struct ArbitraryExpressionInPattern {
#[primary_span]
pub span: Span,
#[note(ast_lowering_pattern_from_macro_note)]
pub pattern_from_macro_note: bool,
}

#[derive(Diagnostic)]
Expand Down
6 changes: 5 additions & 1 deletion compiler/rustc_ast_lowering/src/pat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
ExprKind::Path(..) if allow_paths => {}
ExprKind::Unary(UnOp::Neg, inner) if matches!(inner.kind, ExprKind::Lit(_)) => {}
_ => {
let guar = self.dcx().emit_err(ArbitraryExpressionInPattern { span: expr.span });
let pattern_from_macro = expr.is_approximately_pattern();
let guar = self.dcx().emit_err(ArbitraryExpressionInPattern {
span: expr.span,
pattern_from_macro_note: pattern_from_macro,
});
return self.arena.alloc(self.expr_err(expr.span, guar));
}
}
Expand Down
4 changes: 1 addition & 3 deletions compiler/rustc_borrowck/src/borrow_set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,7 @@ impl LocalsStateAtExit {
has_storage_dead.visit_body(body);
let mut has_storage_dead_or_moved = has_storage_dead.0;
for move_out in &move_data.moves {
if let Some(index) = move_data.base_local(move_out.path) {
has_storage_dead_or_moved.insert(index);
}
has_storage_dead_or_moved.insert(move_data.base_local(move_out.path));
}
LocalsStateAtExit::SomeAreInvalidated { has_storage_dead_or_moved }
}
Expand Down
15 changes: 5 additions & 10 deletions compiler/rustc_mir_dataflow/src/move_paths/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -358,20 +358,15 @@ impl<'tcx> MoveData<'tcx> {
builder::gather_moves(body, tcx, param_env, filter)
}

/// For the move path `mpi`, returns the root local variable (if any) that starts the path.
/// (e.g., for a path like `a.b.c` returns `Some(a)`)
pub fn base_local(&self, mut mpi: MovePathIndex) -> Option<Local> {
/// For the move path `mpi`, returns the root local variable that starts the path.
/// (e.g., for a path like `a.b.c` returns `a`)
pub fn base_local(&self, mut mpi: MovePathIndex) -> Local {
loop {
let path = &self.move_paths[mpi];
if let Some(l) = path.place.as_local() {
return Some(l);
}
if let Some(parent) = path.parent {
mpi = parent;
continue;
} else {
return None;
return l;
}
mpi = path.parent.expect("root move paths should be locals");
}
}

Expand Down
1 change: 1 addition & 0 deletions library/std/src/sys/pal/unix/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -894,6 +894,7 @@ impl Drop for Dir {
target_os = "vita",
target_os = "hurd",
target_os = "espidf",
target_os = "fuchsia",
)))]
{
let fd = unsafe { libc::dirfd(self.0) };
Expand Down
4 changes: 4 additions & 0 deletions tests/ui/issues/issue-43250.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@ error: arbitrary expressions aren't allowed in patterns
|
LL | m!(y);
| ^
|
= note: the `expr` fragment specifier forces the metavariable's content to be an expression

error: arbitrary expressions aren't allowed in patterns
--> $DIR/issue-43250.rs:11:8
|
LL | m!(C);
| ^
|
= note: the `expr` fragment specifier forces the metavariable's content to be an expression

error: aborting due to 2 previous errors

11 changes: 11 additions & 0 deletions tests/ui/lowering/expr-in-pat-issue-99380.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
macro_rules! foo {
($p:expr) => {
if let $p = Some(42) {
return;
}
};
}

fn main() {
foo!(Some(3)); //~ ERROR arbitrary expressions aren't allowed in patterns
}
10 changes: 10 additions & 0 deletions tests/ui/lowering/expr-in-pat-issue-99380.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
error: arbitrary expressions aren't allowed in patterns
--> $DIR/expr-in-pat-issue-99380.rs:10:10
|
LL | foo!(Some(3));
| ^^^^^^^
|
= note: the `expr` fragment specifier forces the metavariable's content to be an expression

error: aborting due to 1 previous error

1 change: 1 addition & 0 deletions tests/ui/macros/vec-macro-in-pattern.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ error: arbitrary expressions aren't allowed in patterns
LL | Some(vec![43]) => {}
| ^^^^^^^^
|
= note: the `expr` fragment specifier forces the metavariable's content to be an expression
= note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to 1 previous error
Expand Down
2 changes: 2 additions & 0 deletions tests/ui/match/expr_before_ident_pat.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ error: arbitrary expressions aren't allowed in patterns
|
LL | funny!(a, a);
| ^
|
= note: the `expr` fragment specifier forces the metavariable's content to be an expression

error: aborting due to 2 previous errors

Expand Down
3 changes: 3 additions & 0 deletions tests/ui/pattern/issue-92074-macro-ice.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ LL | () => { force_expr!(Vec::new()) }
LL | assert!(matches!(x, En::A(make_vec!())));
| ----------- in this macro invocation
|
= note: the `expr` fragment specifier forces the metavariable's content to be an expression
= note: this error originates in the macro `make_vec` (in Nightly builds, run with -Z macro-backtrace for more info)

error: arbitrary expressions aren't allowed in patterns
Expand All @@ -18,6 +19,7 @@ LL | () => { force_pat!(get_usize(), get_usize()) }
LL | assert!(matches!(5, make_pat!()));
| ----------- in this macro invocation
|
= note: the `expr` fragment specifier forces the metavariable's content to be an expression
= note: this error originates in the macro `make_pat` (in Nightly builds, run with -Z macro-backtrace for more info)

error: arbitrary expressions aren't allowed in patterns
Expand All @@ -29,6 +31,7 @@ LL | () => { force_pat!(get_usize(), get_usize()) }
LL | assert!(matches!(5, make_pat!()));
| ----------- in this macro invocation
|
= note: the `expr` fragment specifier forces the metavariable's content to be an expression
= note: this error originates in the macro `make_pat` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to 3 previous errors
Expand Down

0 comments on commit 7823bf0

Please sign in to comment.