| Age | Commit message (Collapse) | Author | Lines |
|
|
|
Co-authored-by: Aaron Hill <aa1ronham@gmail.com>
|
|
|
|
|
|
miri validation: clarify valid values of 'char'
The old text said "expected a valid unicode codepoint", which is not actually correct -- it has to be a scalar value (which is a code point that is not part of a surrogate pair).
|
|
|
|
We now perform the correct checks even if the pointer size differs
between the host and target.
Signed-off-by: Joe Richey <joerichey@google.com>
|
|
The previous code paniced if offset_bytes == i64::MIN. This commit:
- Properly computes the absoulte value to avoid this panic
- Adds a test for this edge case
Signed-off-by: Joe Richey <joerichey@google.com>
|
|
Signed-off-by: Joe Richey <joerichey@google.com>
|
|
Signed-off-by: Joe Richey <joerichey@google.com>
|
|
Dumb NRVO
This is a very simple version of an NRVO pass, which scans backwards from the `return` terminator to see if there is an an assignment like `_0 = _1`. If a basic block with two or more predecessors is encountered during this scan without first seeing an assignment to the return place, we bail out. This avoids running a full "reaching definitions" dataflow analysis.
I wanted to see how much `rustc` would benefit from even a very limited version of this optimization. We should be able to use this as a point of comparison for more advanced versions that are based on live ranges.
r? @ghost
|
|
Stabilize saturating_abs and saturating_neg
Stabilizes the following signed integer functions with saturation mechanics:
* saturating_abs()
* saturating_neg()
Closes #59983
|
|
|
|
|
|
Miri interning: replace ICEs by proper errors
Fixes https://github.com/rust-lang/rust/issues/71316
I also did some refactoring, as I kept being confused by all the parameters to `intern_shallow`, some of which have invalid combinations (such as a mutable const). So instead `InternMode` now contains all the information that is needed and invalid combinations are ruled out by the type system.
Also I removed interpreter errors from interning. We already ignored almost all errors, and the `ValidationFailure` errors that we handled separately actually cannot ever happen here. The only interpreter failure that was actually reachable was the UB on dangling pointers -- and arguably, a dangling raw pointer is not UB, so the error was not even correct. It's just that the rest of the compiler does not like "dangling" `AllocId`.
It should be possible to review the 3 commits separately.
r? @oli-obk
Cc @rust-lang/wg-const-eval
|
|
|
|
Pointer printing: do not print 0 offset
r? @eddyb Cc @oli-obk
|
|
|
|
|
|
|
|
|
|
signature more precise
|
|
Move tests from `test/run-fail` to UI
Fixes #65440
cc #65865 #65506
r? @nikomatsakis
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Suggest to add missing feature when using gated const features
Fixes #71797
|
|
|
|
Stabilizes the following signed integer functions with saturation
mechanics:
* saturating_abs()
* saturating_neg()
Closes #59983
|
|
Move recursion check for zsts back to read site instead of access check site
Reverts https://github.com/rust-lang/rust/pull/71140#discussion_r413709446
Fix #71612
Fix #71709
r? @RalfJung
|
|
Miri: unleash all feature gates
IMO it is silly to unleash features that do not even have a feature gate yet, but not unleash features that do. The only thing this achieves is making unleashed mode annoying to use as we have to figure out the feature flags to enable (and not always do the error messages say what that flag is).
Given that the point of `-Z unleash-the-miri-inside-of-you` is to debug the Miri internals, I see no good reason for this extra hurdle. I cannot imagine a situation where we'd use that flag, realize the program also requires some feature gate, and then be like "oh I guess if this feature is unstable I will do something else". Instead, we'll always just add that flag to the code as well, so requiring the flag achieves nothing.
r? @oli-obk @ecstatic-morse
Fixes https://github.com/rust-lang/rust/issues/71630
|
|
|
|
|
|
This also tests for the ICE in #71734
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Allow `Downcast` projections unconditionally in const-checking
`ProjectionElem::Downcast` sounds scary, but it's really just the projection we use to access a particular enum variant. They usually appear in the lowering of a `match` statement, so they have been associated with control flow in const-checking, but they don't do any control flow by themselves. We already have a HIR pass that looks for `if` and `match` (even ones that have 1 or fewer reachable branches). That pass is double-checked by a MIR pass that looks for `SwitchInt`s and `FakeRead`s for match scrutinees. In my opinion, there's no need to look for `Downcast` as well.
r? @oli-obk
|
|
MIR dump: print pointers consistently with Miri output
This makes MIR allocation dump pointer printing consistent with Miri output: both use hexadecimal offsets with a `0x` prefix. To save some space, MIR dump replaces the `alloc` prefix by `a` when necessary.
I also made AllocId/Pointer printing more consistent in their Debug/Display handling, and adjusted Display printing for Scalar a bit to avoid using decimal printing when we do not know the sign with which to interpret the value (IMO using decimal then is misleading).
|
|
Rename Unique::empty() -> Unique::dangling()
A `FIXME` comment in `src/libcore/ptr/unique.rs` suggested refactoring `Unique::empty()` to `Unique::dangling()` which this PR does.
|
|
|
|
|
|
Miri: better document and fix dynamic const pattern soundness checks
https://github.com/rust-lang/const-eval/issues/42 got me thinking about soundness for consts being used in patterns, and I found a hole in our existing dynamic checks: a const referring to a mutable static *in a different crate* was not caught. This PR fixes that. It also adds some comments that explain which invariants are crucial for soundness of const-patterns.
Curiously, trying to weaponize this soundness hole failed: pattern matching compilation ICEd when encountering the cross-crate static, saying "expected allocation ID alloc0 to point to memory". I don't know why that would happen, statics *should* be entirely normal memory for pattern matching to access.
r? @oli-obk
Cc @rust-lang/wg-const-eval
|
|
rename-unique: Change calls and doc in raw_vec.rs
rename-unique: Change empty() -> dangling() in const-ptr-unique-rpass.rs
|