Commit Graph

75265 Commits

Author SHA1 Message Date
bors c90f68224b Auto merge of #46882 - oli-obk:miri3, r=eddyb
Replace all const evaluation with miri

* error reporting in constants prints a stacktrace through all called const fns
* Trivial constant propagation and folding in MIR (always active, irrelevant of the optimization level)
* can now use floating constants in patterns (previously only floating point literals were allowed)
    * the future compat lint is still produced for both cases
* can index into constant arrays during const eval (previously feature gated)
* can create a constant union value with field `a` and read from field `b`
* can dereference references into constants
* can create references inside constants (`const X: &u32 = &22`)
* Tuple struct constructors can be used in constants
* regression in const eval errors spans (some of these need improvements in mir debug info)
* can cast floats to ints and vice versa (in constants, and even nan/inf constants)
* Mir dump prints false/true instead of 0u8/1u8
* `1i8 >> [8][0]` does not lint about exceeding bitshifts anymore.
    * Needs const propagation across projections
* `foo[I]` produces a const eval lint if `foo: [T; N]` and `N < I`
    * Essentially all builtin panics produce lints if they can be statically proven to trigger at runtime. This is on a best effort basis, so there might be some complex cases that don't trigger. (The runtime panic stays there, irrelevant of whether the lint is produced or not)
* can use `union`s to implement `transmute` for `Copy` types in constants without a feature gate. With all the greatness and nasal demons that come with this.
* can convert integers to `&'static T` in constants (useful for embedded)

fixes #34997 (stack overflow with many constants)
fixes #25574 (deref byte strings in patterns)
fixes #27918 (broken mir ICE)
fixes #46114 (ICE on struct constructors in patterns)
fixes #37448 (`SomeStruct { foo } as SomeStruct`)
fixes #43754 (`return` in const fn)
fixes #41898 (tuple struct constructors)
fixes #31364 (infinite recursion with const fn, fixed by miri's recursion limit)
closes #29947 (const indexing stabilization)
fixes #45044 (pattern matching repeat expressions)
fixes #47971 (ICE on const fn + references)
fixes #48081 (ICE on cyclic assoc const error)
fixes #48746 (nonhelpful error message with unions)

r? @eddyb

even though 1k loc are added in tests, this PR reduces the loc in this repository by 700
2018-03-08 08:52:23 +00:00
Oliver Schneider 52dec0e1c9
Don't derive traits on packed structs 2018-03-08 08:35:39 +01:00
Oliver Schneider 47e0bb59db
Clean up the binary hex lint 2018-03-08 08:35:39 +01:00
Oliver Schneider c0fc6a8b6b
simplify constant value pair field access 2018-03-08 08:35:39 +01:00
Oliver Schneider b5ace9a906
Unify the const folding errors
before they differed depending on whether optimizations were on or not
2018-03-08 08:35:39 +01:00
Oliver Schneider edc5f73433
Correct the shift overflow check in miri 2018-03-08 08:35:39 +01:00
Oliver Schneider aedd4c61ea
Regenerate tests 2018-03-08 08:35:38 +01:00
Oliver Schneider 6cfda078bf
Use clearer name for integer bit width helper function 2018-03-08 08:35:38 +01:00
Oliver Schneider eb18d39a04
Reuse `Integer::from_attr` 2018-03-08 08:35:38 +01:00
Oliver Schneider 273025675d
Remove unused error code 2018-03-08 08:35:38 +01:00
Oliver Schneider 3dc7e93db6
Generator assertions are unconditionally triggered 2018-03-08 08:35:38 +01:00
Oliver Schneider 47913ee8f4
Address review comments 2018-03-08 08:35:38 +01:00
Oliver Schneider 208d764833
Adjust test which differs between 32 bit and 64 bit
The differences are not part of what the test is testing, so they were simply removed.
2018-03-08 08:35:38 +01:00
Oliver Schneider e8d357f070
Decide signdedness on the layout instead of the type 2018-03-08 08:35:37 +01:00
Oliver Schneider 889a4ebfa9
Deduplicate some code 2018-03-08 08:34:18 +01:00
Oliver Schneider df283df887
Don't use the undefined bytes of PrimVal::Bytes 2018-03-08 08:34:18 +01:00
Oliver Schneider 7218836500
Fix mozjs crater failure 2018-03-08 08:34:18 +01:00
Oliver Schneider 134c2910ec
Const eval will oom together with rustc now 2018-03-08 08:34:18 +01:00
Oliver Schneider 0ca4b45a0c
Step limit is now terminator limit 2018-03-08 08:34:17 +01:00
Oliver Schneider b63c6bbfee
Add regression test 2018-03-08 08:34:17 +01:00
Oliver Schneider d98a2b90b2
Rebase fallout 2018-03-08 08:34:17 +01:00
Oliver Schneider 2f0e077300
Report tcx errors with the span of the currently evaluating statement 2018-03-08 08:34:17 +01:00
Oliver Schneider 1e653aa96b
Report a best guess span if no stack is available anymore 2018-03-08 08:34:17 +01:00
Oliver Schneider f363e08c9d
Update compile-fail tests 2018-03-08 08:34:17 +01:00
Oliver Schneider f68dc0190a
Add a test for transmuting via unions in constants 2018-03-08 08:34:17 +01:00
Oliver Schneider 0a1278aea8
Typo 2018-03-08 08:34:17 +01:00
Oliver Schneider 5b698a1040
Unregress error spans in constant errors 2018-03-08 08:34:17 +01:00
Oliver Schneider 421622d8f7
Stage 2 doesn't see suggestion_approximate 2018-03-08 08:34:16 +01:00
Oliver Schneider f5cc5ca8c7
Remove dead code 2018-03-08 08:34:16 +01:00
Oliver Schneider 1f9d846a58
Add some documentation to pattern/const conversions 2018-03-08 08:34:16 +01:00
Oliver Schneider b985399831
Reduce code duplication 2018-03-08 08:34:16 +01:00
Oliver Schneider 3c663d0607
Tidy fix 2018-03-08 08:34:16 +01:00
Oliver Schneider 8500c2fab2
Const eval error refactoring 2018-03-08 08:34:16 +01:00
Oliver Schneider bd03371f71
Add stack traces to miri errors 2018-03-08 08:34:16 +01:00
Oliver Schneider 8c53d54b98
Update tests 2018-03-08 08:34:16 +01:00
Oliver Schneider d2f363ba89
Report all errors other than those about insufficient type information 2018-03-08 08:34:15 +01:00
Oliver Schneider 64fbf5d5ad
Compute the ParamEnv only once and use it to call tcx.const_eval 2018-03-08 08:34:15 +01:00
Oliver Schneider a678044c77
Add regression test for const prop 2018-03-08 08:34:15 +01:00
Oliver Schneider dde68dcfe5
Can only const prop temporaries
Variables might error in branches that are not reachable due to the variable value.
2018-03-08 08:34:15 +01:00
Oliver Schneider 05a03d7537
Update tests 2018-03-08 08:34:15 +01:00
Oliver Schneider 1561b4ad50
Simplify const propagator by removing unused code paths 2018-03-08 08:34:15 +01:00
Oliver Schneider 411fcf58fd
Rename OptimizationFinder and don't propagate any borrows 2018-03-08 08:34:15 +01:00
Oliver Schneider 57ae890265
Simplify const prop checks through PlaceContext 2018-03-08 08:34:15 +01:00
Oliver Schneider 65ed591197
Move the resource limits to the session in preparation for attributes configuring them 2018-03-08 08:34:15 +01:00
Oliver Schneider 0462d092d2
Figure out const propgatable locals in a single pass 2018-03-08 08:34:14 +01:00
Oliver Schneider 16d560fd99
Remove unused error E0020 2018-03-08 08:34:14 +01:00
Oliver Schneider ceb634a732
Update tests 2018-03-08 08:34:14 +01:00
Oliver Schneider 45abb1ba84
Stabilize const_indexing feature 2018-03-08 08:34:14 +01:00
Oliver Schneider 600fcc7159
Report const eval errors at the correct span 2018-03-08 08:34:14 +01:00
Oliver Schneider 13c0dc56df
Only report bitshift lints on bitshift ops 2018-03-08 08:34:14 +01:00