-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Change the desugaring of assert!
for better error output
#122661
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
rust-analyzer is developed in its own repository. If possible, consider making this change to rust-lang/rust-analyzer instead. cc @rust-lang/rust-analyzer The Miri subtree was changed cc @rust-lang/miri |
This comment has been minimized.
This comment has been minimized.
ead1593
to
eb411c1
Compare
This comment has been minimized.
This comment has been minimized.
Sigh, clippy shows at least one test where a suggestion causes there to be a condition that isn't a |
This comment was marked as resolved.
This comment was marked as resolved.
This comment has been minimized.
This comment has been minimized.
Isn't this technically a breaking change for e.g. (playground): struct Booly(i32);
impl std::ops::Not for Booly {
type Output = bool;
fn not(self) -> Self::Output {
self.0 == 0
}
}
fn main() {
assert!(Booly(1), "booly booly!")
} |
At the very least, we might need to tie such a change to an edition. I am not certain whether this decision would be a T-lang matter or a T-libs-api one. I'll nominate for T-lang for now. (Namely: The question is whether we can start enforcing a rule that the first expression to @rustbot label +I-lang-nominated |
src/tools/rust-analyzer/crates/parser/test_data/parser/ok/0035_weird_exprs.rs
Outdated
Show resolved
Hide resolved
@pnkfelix we can keep the current (undocumented) behavior by making the desugaring be {
let x: bool = !!condition;
x
} instead of what this PR does: {
let x: bool = condition;
x
} I believe that would still cause errors to complain about Edit: an option would be to have an internal marker trait: use std::ops::Not;
trait CanAssert {}
impl<T: Not<Output = bool>> CanAssert for T {}
fn main() {
let _ = Box::new(true) as Box<dyn CanAssert>;
let _ = Box::new(42) as Box<dyn CanAssert>;
}
|
@estebank what about making the expansion edition-dependent? Is there precedent for that? Then, editions >= 2024 would expand to what you have proposed in the code of this PR, and editions < 2024 could expand to the |
(to answer my own question, |
c8185ea
to
07a5b21
Compare
Some changes occurred in coverage tests. cc @Zalathar |
I tried the marker trait approach for <=2021, and it kind of worked, but the diagnostics were actually worse than just doing |
This comment has been minimized.
This comment has been minimized.
Since I don't think it's been acknowledged above, for the record, this breaks the following code:
Because |
@compiler-errors that is indeed the case for 2024 onwards, not for previous editions. |
I think the critical point is whether an edition-dependent expansion is worth breaking that case (of Update: I don't know whether it is worth going through this exercise explicitly, but there is a design space here. E.g. one set of options is:
(And then there's variations thereof about how to handle editions < 2024, but that's a separate debate IMO.) |
(this is waiting for a decision from T-lang and/or T-libs regarding what interface we want to commit to for @rustbot label: +S-waiting-on-team -S-waiting-on-review |
Rollup of 9 pull requests Successful merges: - #122661 (Change the desugaring of `assert!` for better error output) - #138736 (Sanitizers target modificators) - #144955 (search graph: lazily update parent goals) - #145120 (llvm: Accept new LLVM lifetime format) - #145153 (Handle macros with multiple kinds, and improve errors) - #145189 (Weekly `cargo update`) - #145250 (Add regression test for former ICE involving malformed meta items containing interpolated tokens) - #145309 (Fix `-Zregparm` for LLVM builtins) - #145331 (Make std use the edition 2024 prelude) r? `@ghost` `@rustbot` modify labels: rollup
…ochenkov Change the desugaring of `assert!` for better error output In the desugaring of `assert!`, we now expand to a `match` expression instead of `if !cond {..}`. The span of incorrect conditions will point only at the expression, and not the whole `assert!` invocation. ``` error[E0308]: mismatched types --> $DIR/issue-14091.rs:2:13 | LL | assert!(1,1); | ^ expected `bool`, found integer ``` We no longer mention the expression needing to implement the `Not` trait. ``` error[E0308]: mismatched types --> $DIR/issue-14091-2.rs:15:13 | LL | assert!(x, x); | ^ expected `bool`, found `BytePos` ``` Now `assert!(val)` desugars to: ```rust match val { true => {}, _ => $crate::panic::panic_2021!(), } ``` Fix rust-lang#122159.
Rollup of 13 pull requests Successful merges: - #122661 (Change the desugaring of `assert!` for better error output) - #142372 (Improve `--remap-path-prefix` documentation) - #143075 (compiler: Allow `extern "interrupt" fn() -> !`) - #145005 (strip prefix of temporary file names when it exceeds filesystem name length limit) - #145065 (resolve: Introduce `RibKind::Block`) - #145120 (llvm: Accept new LLVM lifetime format) - #145189 (Weekly `cargo update`) - #145261 (Improve tracing in bootstrap) - #145266 (Reduce some queries around associated items) - #145299 (doc test: fix mpsc.rs try_send doc test) - #145331 (Make std use the edition 2024 prelude) - #145353 (bootstrap: Fix jemalloc 64K page support for aarch64 tools) - #145361 (Suppress wrapper suggestion when expected and actual ty are the same adt and the variant is unresolved) Failed merges: - #145324 (Rename and document `ONLY_HOSTS` in bootstrap) - #145372 (resolve: Miscellaneous cleanups) r? `@ghost` `@rustbot` modify labels: rollup
Rollup of 13 pull requests Successful merges: - #122661 (Change the desugaring of `assert!` for better error output) - #142372 (Improve `--remap-path-prefix` documentation) - #143075 (compiler: Allow `extern "interrupt" fn() -> !`) - #145005 (strip prefix of temporary file names when it exceeds filesystem name length limit) - #145065 (resolve: Introduce `RibKind::Block`) - #145120 (llvm: Accept new LLVM lifetime format) - #145189 (Weekly `cargo update`) - #145261 (Improve tracing in bootstrap) - #145266 (Reduce some queries around associated items) - #145299 (doc test: fix mpsc.rs try_send doc test) - #145331 (Make std use the edition 2024 prelude) - #145353 (bootstrap: Fix jemalloc 64K page support for aarch64 tools) - #145361 (Suppress wrapper suggestion when expected and actual ty are the same adt and the variant is unresolved) Failed merges: - #145324 (Rename and document `ONLY_HOSTS` in bootstrap) - #145372 (resolve: Miscellaneous cleanups) r? `@ghost` `@rustbot` modify labels: rollup
Investigating mysterious rollup failure: #145373 (comment) @bors try jobs=i686-gnu-nopt-1 |
Change the desugaring of `assert!` for better error output try-job: i686-gnu-nopt-1
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
💔 Test for e9d9a33 failed: CI. Failed jobs:
|
Bingo! @bors r- |
ping @saethlin: this test is suddenly failing due to the change of desugaring to rust/tests/ui/mir/alignment/packed.rs Lines 14 to 17 in e9d9a33
It seems to me that the second pointer should have been |
@bors try jobs=i686-gnu-nopt-1 |
This comment has been minimized.
This comment has been minimized.
Change the desugaring of `assert!` for better error output try-job: i686-gnu-nopt-1
Yep, I think your fix to that test is correct. |
@bors r=petrochenkov |
…ochenkov Change the desugaring of `assert!` for better error output In the desugaring of `assert!`, we now expand to a `match` expression instead of `if !cond {..}`. The span of incorrect conditions will point only at the expression, and not the whole `assert!` invocation. ``` error[E0308]: mismatched types --> $DIR/issue-14091.rs:2:13 | LL | assert!(1,1); | ^ expected `bool`, found integer ``` We no longer mention the expression needing to implement the `Not` trait. ``` error[E0308]: mismatched types --> $DIR/issue-14091-2.rs:15:13 | LL | assert!(x, x); | ^ expected `bool`, found `BytePos` ``` Now `assert!(val)` desugars to: ```rust match val { true => {}, _ => $crate::panic::panic_2021!(), } ``` Fix rust-lang#122159.
Rollup of 22 pull requests Successful merges: - #118087 (Add Ref/RefMut try_map method) - #122661 (Change the desugaring of `assert!` for better error output) - #140740 (Add `-Zindirect-branch-cs-prefix`) - #142640 (Implement autodiff using intrinsics) - #143075 (compiler: Allow `extern "interrupt" fn() -> !`) - #144865 (Fix tail calls to `#[track_caller]` functions) - #144944 (E0793: Clarify that it applies to unions as well) - #144947 (Fix description of unsigned `checked_exact_div`) - #145004 (Couple of minor cleanups) - #145005 (strip prefix of temporary file names when it exceeds filesystem name length limit) - #145012 (Tail call diagnostics to include lifetime info) - #145065 (resolve: Introduce `RibKind::Block`) - #145120 (llvm: Accept new LLVM lifetime format) - #145189 (Weekly `cargo update`) - #145235 (Minor `[const]` tweaks) - #145275 (fix(compiler/rustc_codegen_llvm): apply `target-cpu` attribute) - #145322 (Resolve the prelude import in `build_reduced_graph`) - #145331 (Make std use the edition 2024 prelude) - #145369 (Do not ICE on private type in field of unresolved struct) - #145378 (Add `FnContext` in parser for diagnostic) - #145389 ([rustdoc] Revert "rustdoc search: prefer stable items in search results") - #145392 (coverage: Remove intermediate data structures from mapping creation) r? `@ghost` `@rustbot` modify labels: rollup
…ochenkov Change the desugaring of `assert!` for better error output In the desugaring of `assert!`, we now expand to a `match` expression instead of `if !cond {..}`. The span of incorrect conditions will point only at the expression, and not the whole `assert!` invocation. ``` error[E0308]: mismatched types --> $DIR/issue-14091.rs:2:13 | LL | assert!(1,1); | ^ expected `bool`, found integer ``` We no longer mention the expression needing to implement the `Not` trait. ``` error[E0308]: mismatched types --> $DIR/issue-14091-2.rs:15:13 | LL | assert!(x, x); | ^ expected `bool`, found `BytePos` ``` Now `assert!(val)` desugars to: ```rust match val { true => {}, _ => $crate::panic::panic_2021!(), } ``` Fix rust-lang#122159.
…ochenkov Change the desugaring of `assert!` for better error output In the desugaring of `assert!`, we now expand to a `match` expression instead of `if !cond {..}`. The span of incorrect conditions will point only at the expression, and not the whole `assert!` invocation. ``` error[E0308]: mismatched types --> $DIR/issue-14091.rs:2:13 | LL | assert!(1,1); | ^ expected `bool`, found integer ``` We no longer mention the expression needing to implement the `Not` trait. ``` error[E0308]: mismatched types --> $DIR/issue-14091-2.rs:15:13 | LL | assert!(x, x); | ^ expected `bool`, found `BytePos` ``` Now `assert!(val)` desugars to: ```rust match val { true => {}, _ => $crate::panic::panic_2021!(), } ``` Fix rust-lang#122159.
In the desugaring of
assert!
, we now expand to amatch
expression instead ofif !cond {..}
.The span of incorrect conditions will point only at the expression, and not the whole
assert!
invocation.We no longer mention the expression needing to implement the
Not
trait.Now
assert!(val)
desugars to:Fix #122159.