9

Replace all const evaluation with miri by oli-obk · Pull Request #46882 · rust-l...

 3 years ago
source link: https://github.com/rust-lang/rust/pull/46882
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Contributor

oli-obk commented on Dec 21, 2017

edited
  • 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 unions 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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK