Rust: RFC 2342 рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛, "рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ `if` рдФрд░ `рдорд┐рд▓рд╛рди` рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ"

рдХреЛ рдирд┐рд░реНрдорд┐рдд 18 рдорд╛рд░реНрдЪ 2018  ┬╖  83рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

рдпрд╣ RFC рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рд╣реИ "рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ if рдФрд░ match рдЕрдиреБрдорддрд┐ рджреЗрдВ" (рд░рд╕реНрдЯ-рд▓реИрдВрдЧ/rfcs#2342)ред

рдХреГрдкрдпрд╛ рдЙрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдореБрджреНрджреЛрдВ рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рддрд╛рдЬрд╛ рдореБрджреНрджреЛрдВ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ F-const_if_match рд╕рд╛рде рд▓реЗрдмрд▓ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдореБрджреНрджреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рднрд░ рди рдЬрд╛рдПред

рдХрджрдо:

  • [x] рдЖрд░рдПрдлрд╕реА рд▓рд╛рдЧреВ рдХрд░реЗрдВ
  • [ ] рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ ( рдлреЛрд░реНрдЬ рдкрд░ рдирд┐рд░реНрджреЗрд╢ рджреЗрдЦреЗрдВ )
  • [x] рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░ ( рдлреЛрд░реНрдЬ рдкрд░ рдирд┐рд░реНрджреЗрд╢ рджреЗрдЦреЗрдВ )
  • [x] let рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЬреЛ && рдФрд░ || рд╢реЙрд░реНрдЯ рд╕рд░реНрдХрд┐рдЯрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрдиреНрд╣реЗрдВ рдЕрднреА & рдФрд░ | рдЕрдВрджрд░ const рдФрд░ static рдЖрдЗрдЯрдо рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдирд╕реБрд▓рдЭреЗ рдкреНрд░рд╢реНрди:

рдХреЛрдИ рдирд╣реАрдВ

A-const-eval A-const-fn B-RFC-approved C-tracking-issue F-const_if_match T-lang disposition-merge finished-final-comment-period

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЕрдм рдЬрдмрдХрд┐ #64470 рдФрд░ #63812 рдХреЛ рдорд┐рд▓рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЙрдкрдХрд░рдг рдХрдореНрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдЕрднреА рднреА рдХреЙрдиреНрд╕реНрдЯ рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреНрд╡реЗрд░реА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдпрд╣рд╛рдВ рдкреНрд░рдЧрддрд┐ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░рд╛рдд рдореЗрдВ рд╣рдлреНрддреЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рдорд╣реАрдиреЛрдВ рдореЗрдВ рдирд╣реАрдВ (рдкреНрд░рд╕рд┐рджреНрдз рдЕрдВрддрд┐рдо рд╢рдмреНрдж: рдореБрд╕реНрдХрд╛рди :)ред

рд╕рднреА 83 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

  1. рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдлреАрдЪрд░ рдЧреЗрдЯ рдЬреЛрдбрд╝реЗрдВ
  2. switch рдФрд░ switchInt рдЯрд░реНрдорд┐рдиреЗрдЯрд░ рдореЗрдВ https://github.com/rust-lang/rust/blob/master/src/librustc_mir/transform/qualify_consts.rs#L347 рдореЗрдВ рдХрд╕реНрдЯрдо рдХреЛрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдлреАрдЪрд░ рдЧреЗрдЯ рд╕рдХреНрд░рд┐рдп рд╣реИ
  3. рдПрдХ рдПрдХрд▓ рд╡рд░реНрддрдорд╛рди рдореВрд▓ рдмреНрд▓реЙрдХ (https://github.com/rust-lang/rust/blob/master/src/librustc_mir/transform/qualify_consts.rs#L328) рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдХреБрдЫ рдХрдВрдЯреЗрдирд░ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕реВрдЪреА рд╣реИ рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдЕрднреА рднреА рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реИред

@ рдУрд▓реА-рдУрдмреАрдХреЗ рдпрд╣ рдереЛрдбрд╝рд╛ рдкреЗрдЪреАрджрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдЯрд┐рд▓ рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдлреНрд▓реЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ @alexreg рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

@eddyb рд╢рд╛рдпрдж рдореЗрд░реА const-qualif рд╢рд╛рдЦрд╛ (рдорд╛рдЗрдирд╕ рдж рдЯреЙрдк рдХрдорд┐рдЯ) рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛, рдЗрд╕реЗ рдорд╛рд╕реНрдЯрд░ рдкрд░ рд░реАрдмреЗрд╕ рдХрд░реЗрдВ (рдордЬреЗрджрд╛рд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛), рдФрд░ рдлрд┐рд░ рдбреЗрдЯрд╛ рдПрдиреЛрдЯреЗрд╢рди рд╕рд╛рдорд╛рди рдЬреЛрдбрд╝реЗрдВ, рд╣реИ рдирд╛?

рдЗрд╕ рдкрд░ рдХреЛрдИ рднреА рд╕рдорд╛рдЪрд╛рд░?

@ рдорд╛рд░реНрдХ-рдЖрдИрдПрдо рд╣рд╛рдВ рдирд╣реАрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @eddyb рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╡реНрдпрд╕реНрдд рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╣рдлреНрддреЛрдВ рд╕реЗ рдЙрд╕реЗ IRC рдкрд░ рдкрд┐рдВрдЧ рдХрд░рдиреЗ рдореЗрдВ рднреА рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВред рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдореЗрд░реА рдХреЙрдиреНрд╕реНрдЯ-рдХреНрд╡рд╛рд▓рд┐рдл рд╢рд╛рдЦрд╛ рднреА рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдЗрд╕реЗ рдорд╛рд╕реНрдЯрд░ рдкрд░ рд░рд┐рдмреЗрдЯ рдХрд┐рдпрд╛ рдерд╛ред (рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдзрдХреНрдХрд╛ рджрд┐рдпрд╛ рд╣реИред)

thread 'main' panicked at 'assertion failed: position <= slice.len()', libserialize/leb128.rs:97:1
note: Run with `RUST_BACKTRACE=1` for a backtrace.
error: Could not compile `rustc_llvm`.

Caused by:
  process didn't exit successfully: `/Users/alex/Software/rust/build/bootstrap/debug/rustc --crate-name build_script_build librustc_llvm/build.rs --error-format json --crate-type bin --emit=dep-info,link -C opt-level=2 -C metadata=74f2a810ad96be1d -C extra-filename=-74f2a810ad96be1d --out-dir /Users/alex/Software/rust/build/x86_64-apple-darwin/stage1-rustc/release/build/rustc_llvm-74f2a810ad96be1d -L dependency=/Users/alex/Software/rust/build/x86_64-apple-darwin/stage1-rustc/release/deps --extern build_helper=/Users/alex/Software/rust/build/x86_64-apple-darwin/stage1-rustc/release/deps/libbuild_helper-89aaac40d3077cd7.rlib --extern cc=/Users/alex/Software/rust/build/x86_64-apple-darwin/stage1-rustc/release/deps/libcc-ead7d4af4a69e776.rlib` (exit code: 101)
warning: build failed, waiting for other jobs to finish...
error: build failed
command did not execute successfully: "/Users/alex/Software/rust/build/x86_64-apple-darwin/stage0/bin/cargo" "build" "--target" "x86_64-apple-darwin" "-j" "8" "--release" "--manifest-path" "/Users/alex/Software/rust/src/librustc_trans/Cargo.toml" "--features" " jemalloc" "--message-format" "json"
expected success, got: exit code: 101
thread 'main' panicked at 'cargo must succeed', bootstrap/compile.rs:1085:9
note: Run with `RUST_BACKTRACE=1` for a backtrace.
failed to run: /Users/alex/Software/rust/build/bootstrap/debug/bootstrap -i build

рдареАрдХ рд╣реИ, рдордЬреЗ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЖрдЬ рд╣реА рдлрд┐рд░ рд╕реЗ рд░рд┐рдмреЗрд╕ рдХрд┐рдпрд╛ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рд╕рдм рдареАрдХ рд╣реЛ рд░рд╣рд╛ рд╣реИ! рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рддрд┐рдЧрдорди рдерд╛, рдФрд░ рдпрд╣ рдЕрднреА рдареАрдХ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЕрдм @eddyb рдкрд░ред

@alexreg рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдиреАрдВрдж рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рдЬрд╛рдЧ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдЖрдкрдиреЗ рдореБрдЭреЗ рдкрд┐рдВрдЧ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдЬрд╛рдЧ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдЖрдк рдкреВрд░реЗ рджрд┐рди рдСрдлрд╝рд▓рд╛рдЗрди рд╣реИрдВ (
рдХреНрдпрд╛ рдореБрдЭреЗ рдЖрдкрдХреА рд╢рд╛рдЦрд╛ рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рдкреАрдЖрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рдерд╛?

@eddyb рдпрд╣ рдареАрдХ рд╣реИ рд╣реЗред рдЖрдкрдХреЛ рдЬрд▓реНрджреА рд╕реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ 8:00 PM GMT рд╕реЗ рдЪрд╛рд▓реВ рд░рд╣рддрд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдареАрдХ рд╣реИ! :-)

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреЗрдж рд╣реИ, рдореБрдЭреЗ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрд╛ рдХрд┐ рдкреНрд░рд╢реНрди рдореЗрдВ рдкреИрдЪ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ Qualif::STATIC{,_REF} , рдпрд╛рдиреА рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВред OTOH, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА const fn s рдФрд░ static s рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ:

#![feature(const_fn)]
const fn read<T: Copy>(x: &T) -> T { *x }
static FOO: u32 = read(&BAR);
static BAR: u32 = 5;
fn main() {
    println!("{}", FOO);
}

рдпрд╣ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп miri рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ "рд▓рдЯрдХрдиреЗ рд╡рд╛рд▓реЗ рд╕реВрдЪрдХ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛" (рдЬрд┐рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рд▓рдЯрдХрдиреЗ рд╡рд╛рд▓реЗ рд╕реВрдЪрдХ" рдХреЗ рдмрдЬрд╛рдп static s рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ static s рдкрдврд╝рдирд╛ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХреБрдЫ рд▓реЛрдЧ рд░рдирдЯрд╛рдЗрдо рдкрд░ const fn "рд╢реБрджреНрдз" (рдпрд╛рдиреА "рд╕рдВрджрд░реНрднрд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА" рдпрд╛ рдЙрд╕рдХреЗ рдЖрд╕-рдкрд╛рд╕) рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рдкреАрдЫреЗ рд╕реЗ const fn рдкрдврд╝рдирд╛ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди const fn рдХреЛ рдХрднреА рднреА рдкрддрд▓реА рд╣рд╡рд╛ рд╕реЗ рдмрд╛рд╣рд░ static рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕рд╣рд┐рдд const рдПрд╕ рд╕реЗ)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддрдм рд╣рдо const s, const fn , рдФрд░ рдЕрдиреНрдп рдирд┐рд░рдВрддрд░ рд╕рдВрджрд░реНрднреЛрдВ (рдкреНрд░рдореЛрд╢рди рд╕рд╣рд┐рдд) рдореЗрдВ static s (рднрд▓реЗ рд╣реА рдЙрдирдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реА) рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рд╕реЗ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА STATIC_REF рд╣реИрдХ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ static s рдХреЛ рдЕрдиреНрдп static s рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди (рдЦрд░рд╛рдм рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ) рдЙрди рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдкреАрдЫреЗ рд╕реЗ рдкрдврд╝рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ .

рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП RFC рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рд╕реЗ рдлреЗрдпрд░ рд░рд╛рдЗрдЯ рд░реАрдбрд┐рдВрдЧ рд▓рдЧрддрд╛ рд╣реИред рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЖрд░рдПрдлрд╕реА рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд╢рд╛рдпрдж рд╕рд┐рд░реНрдл рдПрдХ рдХреНрд░реЗрдЯрд░ рд░рди, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╢рд╛рдпрдж рдореИрдВ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реВрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд

рдУрд╣, рдореИрдВрдиреЗ рдЧрд▓рдд рдкрдврд╝рд╛ред рддреЛ рдХреЙрдиреНрд╕ рдореВрд▓реНрдпрд╛рдВрдХрди рдЕрднреА рднреА рдзреНрд╡рдирд┐ рд╣реЛрдЧрд╛, рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрднрд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рдирд╣реАрдВ?

рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдПрдХ рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рд╣рдо рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ рдпрджрд┐ рд╣рдо static s рдХреЛ const s рдФрд░ const fn s рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ)ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕реБрджреГрдврд╝рддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдереАред

рдареАрдХ рд╣реИ, "рд▓рдЯрдХрдиреЗ рд╡рд╛рд▓рд╛ рд╕реВрдЪрдХ" рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕реБрджреГрдврд╝рддрд╛ рдХреЗ рдореБрджреНрджреЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдкрд░ рдЖрдк рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░реВрдВрдЧрд╛!

"рдбреИрдВрдЧрд▓рд┐рдВрдЧ рдкреЙрдЗрдВрдЯрд░" рдПрдХ рдЦрд░рд╛рдм рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдорд┐рд░реА рдХреЛ static s рд╕реЗ рдкрдврд╝рдиреЗ рд╕реЗ рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдХреЗрд╡рд▓ рдирд┐рд░рдВрддрд░ рд╕рдВрджрд░реНрдн рдЬреЛ static s рдХреЛ рднреА рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡реЗ рдЕрдиреНрдп static s рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрди рдкрдврд╝рдиреЗ рдХреЛ "рдмрд╕" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рд╕рднреА рдХреЛрдб рд╣рдореЗрд╢рд╛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдПрдХ рдмрд╛рд░ рдЪрд▓рддреЗ рд╣реИрдВред

(рдЖрдИрдЖрд░рд╕реА рд╕реЗ) рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕рдВрджрд░реНрднрд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА const fn рддрд░реНрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХреЗрд╡рд▓ рдЬрдореЗ рд╣реБрдП рдЖрд╡рдВрдЯрди рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ const рдХреЛ рд╕рдорд╛рди рдкреНрд░рддрд┐рдмрдВрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЧреИрд░-рдЬрдореЗ рд╣реБрдП рдЖрд╡рдВрдЯрди рдХреЗрд╡рд▓ static рд╕реЗ рдЖ рд╕рдХрддреЗ рд╣реИрдВ

рдореБрдЭреЗ рд░реЗрдлрд░реЗрдВрд╢рд┐рдпрд▓ рдЯреНрд░рд╛рдВрд╕рдкреЗрд░реЗрдВрд╕реА рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдкрд╕рдВрдж рд╣реИ рдЗрд╕рд▓рд┐рдП @eddyb рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╢рд╛рдирджрд╛рд░ рд▓рдЧрддрд╛ рд╣реИ!

рд╣рд╛рдБ, рдореИрдВ рдХреЙрдиреНрд╕ fns рдХреЛ рднреА рд╢реБрджреНрдз рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдБред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреБрдЫ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рдпреЛрдЬрдирд╛рдПрдВ рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдЬреИрд╕реЗ:

let x = 0;
let non_deterministic = &x as *const _ as usize;
if non_deterministic.count_ones() % 2 == 0 {
    // do one thing
} else {
    // do a completely different thing
}

рдпрд╣ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдПрдХ рдорд┐рд░реА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рд╣реЛрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЙрд╕ рд╕реНрдореГрддрд┐ рдкрддреЗ рдХреЛ "рд╕рд╛рд░" рдЬреИрд╕реЗ рдорд┐рд░реА рдХреИрди рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: @Centril (рдЗрд╕ рддрд░рд╣ рдХреА рддреБрд▓рдирд╛ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд╛рд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ) рдХреБрдЫ рдХрдЪреНрдЪреЗ рд╕реВрдЪрдХ рдЖрдкрд░реЗрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ unsafe рднреАрддрд░ const fn (рдЬреЛ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рд╣рдо рд╕реНрдерд┐рд░ const fn ), рдФрд░ рдмрддрд╛рдПрдВ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрди рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдорд┐рд░реА рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реА рд╕реНрдерд╛рдиреАрдп рдореЗрдВ рджреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдШрдЯрд╛рдирд╛ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдкреЗрдХреНрд╖ рджреВрд░реА рдорд┐рд▓рддреА рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЗрдЖрдЙрдЯ, рд╕рд░рдгреА рдЗрдВрдбреЗрдХреНрд╕ рдЗрддреНрдпрд╛рджрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ), рд▓реЗрдХрд┐рди рд╕рдВрджрд░реНрдн рдХреЗ рдкрддреЗ рдХреЛ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рдирд╛ ( {:p} ) рдЧрд▓рдд рдЙрдкрдпреЛрдЧ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП fmt::Pointer::fmt рдХреЛ const fn рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рд╛рде рд╣реА рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП Ord / Eq рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдВрдХреЗрддреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА const рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬрдм рднреА рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдиреЛрдЯреЗрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдорд┐рд▓рддреА рд╣реИ), рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ рд▓реЗрдХрд┐рди рдСрдкрд░реЗрд╢рди unsafe рдореЗрдВ const fn ред

рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ "рд╣рд╛рдирд┐рд░рд╣рд┐рдд" рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ ... рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░рдг рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдРрд╕реЗ рдЧреИрд░-рдирд┐рд░реНрдзрд╛рд░рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЗрд╕ рдкрд░ рдХрд╛рдо рдЬрд╛рд░реА рд░рд╣рддрд╛ рддреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ред

@lachlansneff рдпрд╣ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ ... рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣рдо рдЪрд╛рд╣реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓ рд╣рдо рдПрдХ рдЕрд╡рд░реЛрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ https://github.com/rust-lang/rust/pull/51110 рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@alexreg рдЖрд╣, рдзрдиреНрдпрд╡рд╛рджред рдПрдХ рдореИрдЪ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдпрд╛ рдпрджрд┐ рдХреЙрдиреНрд╕ fn рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рднреА рдХреЙрдиреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВред

рдЕрдм рдХреЛрдИ рд╕реНрдерд┐рддрд┐ рдЕрдкрдбреЗрдЯ рд╣реИ рдХрд┐ #51110 рд╡рд┐рд▓рдп рд╣реЛ рдЧрдпрд╛ рд╣реИ?

@programmerjake рдореИрдВ рд╡рд┐рд▓рдп рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ https://github.com/rust-lang/rust/pull/52518 рдкрд░ @eddyb рд╕реЗ рдХреБрдЫ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдмрд╣реБрдд рдЬрд▓реНрдж)ред рд╡рд╣ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдмрд╣реБрдд рд╡реНрдпрд╕реНрдд рд░рд╣рд╛ рд╣реИ (рд╣рдореЗрд╢рд╛ рдЙрдЪреНрдЪ рдорд╛рдВрдЧ рдореЗрдВ), рд▓реЗрдХрд┐рди рд╡рд╣ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрд╢рд╛рдиреНрд╡рд┐рдд рд╣реВрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЙрд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдЪрд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗред

рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ TODO рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рдХрд╣реАрдВ, рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рднрдпрд╛рдирдХ рд╣реИрдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ && рдФрд░ || рд╕реЗ & рдФрд░ | рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдЕрдВрджрд░ред

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рдкреБрд░рд╛рдиреЗ рдХреЙрдиреНрд╕ eval рдХрд╛ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рдерд╛, рдЬреЛ рдЕрдм рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХрд┐ MIRI CTFE рдЬрдЧрд╣ рдкрд░ рд╣реИ?

AFAIK рд╣рдо рдЙрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЛ HIR рд▓реЛрдЕрд░рд┐рдВрдЧ рдореЗрдВ рдХрд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ const_qualify рдореЗрдВ рдХреЛрдб рд╣реИ рдЬреЛ SwitchInt рдЯрд░реНрдорд┐рдиреЗрдЯрд░ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдпрдерд╛ || / && рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдФрд░ рдмрд┐рдВрджреБ: @ рдУрд▓реА-рдУрдмреАрдХреЗ рдиреЗ рдХрд╣реАрдВ рдХрд╣рд╛ (рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХрд╣рд╛рдВ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ) рдХрд┐ рд╕рд╢рд░реНрдд рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИрдВ рдЬреЛ рднреЛрд▓реЗрдкрди рд╕реЗ рд╕реЛрдЪреЗрдВрдЧреЗ ... рдХреНрдпрд╛ рд╡рд╣ рдбреНрд░реЙрдк/рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ "рдмрд╕" рдерд╛?

рдХреНрдпрд╛ рд╡рд╣ рдбреНрд░реЙрдк/рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ "рдмрд╕" рдерд╛?

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕реЗ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЬрдм рдореЗрд░реЗ рдкрд╛рд╕ рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреА рддреЛ рдЖрдкрд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реВрдВрдЧрд╛

рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрдирд╢рдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдпрд╣ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЕрд╡рд░реВрджреНрдз рд╣реИ?

@ рдорд╛рд░реНрдХ-рдЖрдИрдПрдо рдпрд╣ рдХреЙрдиреНрд╕реНрдЯ рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рдбреЗрдЯрд╛рдлреНрд▓реЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИред @eddyb рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рдХреБрдЫ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛ред (рддреЛ рдореИрдВ рдерд╛, рд▓реЗрдХрд┐рди рдЙрд╕ рддрд░рд╣ рдХрд╛ рд╕реНрдерд┐рд░ ...) рдЕрдЧрд░ @eddyb рдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рд╕рдордп рдирд╣реАрдВ рд╣реИ, рддреЛ рд╢рд╛рдпрдж @ oli-obk рдпрд╛ @RalfJung рдЬрд▓реНрдж рд╣реА рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддреЗ рд╣реИрдВред :-)

58403 рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣-рдЖрдзрд╛рд░рд┐рдд рдпреЛрдЧреНрдпрддрд╛ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдХрджрдо рд╣реИред

@eddyb рдЖрдкрдиреЗ const fn рдореЗрдВ рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдкрдиреЗ const fn рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрд╛ рд╣реИ? рддреЛ рдЖрдкрдХрд╛ рдкрд┐рдЫрд▓рд╛ рдХреЛрдб рдирдореВрдирд╛ рдЕрдм рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛:

let x = 0;
// compile time error: cannot cast reference to pointer in `const fun`
let non_deterministic = &x as *const _ as usize;
if non_deterministic.count_ones() % 2 == 0 {
    // do one thing
} else {
    // do a completely different thing
}

рд╕рдВрджрд░реНрднреЛрдВ рдХреА рдЕрднреА рднреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреА рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЙрдирдХрд╛ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдПрдЧреА:

let x = 0;
let p = &x;
if *p != 0 {  // this is fine
    // do one thing
} else {
    // do a completely different thing
}

рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдзрд╛рд░ рд╕реЗ рдмрд╛рд╣рд░ рд╣реВрдВ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдирд┐рдпрддрд╛рддреНрдордХ рдмрдирд╛рдиреЗ рдХрд╛ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред

@ jyn514 рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд╕реНрдерд┐рд░ (https://github.com/rust-lang/rust/issues/51910) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рддреБрд▓рдирд╛ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (https://github.com/rust- lang/rust/issues/53020) рдЬреЛ рдЙрддрдирд╛ рд╣реА рдЦрд░рд╛рдм рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрд╕реНрдерд┐рд░ рднреА рд╣реИред рд╣рдо рдЗрдиреНрд╣реЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдкрд░ рдХреЛрдИ рдирдпрд╛?

https://rust-lang.zulipchat.com/#narrow/stream/146212 -t-compiler.2Fconst-eval/topic/dataflow-based.20const.20qualification.20MVP рдкрд░ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╣реИ

@ рдУрд▓реА-рдУрдмреАрдХреЗ рдЖрдкрдХрд╛ рд▓рд┐рдВрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИ?

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ... рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдкрдХреЛ Zulip рдореЗрдВ рд╕рд╛рдЗрди рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

@alexreg рд╣рдореНрдо рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ @alexreg рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ if рдФрд░ рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдЖрдзрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИ рддреЛ рд╣рдо рдпрд╛ рддреЛ рдЧрд▓рддреА рд╕реЗ &Cell<T> рдХреЛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдЕрдВрджрд░ рдЕрдиреБрдорддрд┐ рджреЗ рджреЗрддреЗ рд╣реИрдВ рдпрд╛ рдЧрд▓рддреА рд╕реЗ None::<&Cell<T>> (рдЬреЛ рд╕реНрдерд┐рд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЦрд░рд╛рдм рдЯреВрдЯрд╛ рд╣реБрдЖ рддрджрд░реНрде рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ)

@ est31 рдареАрдХ рд╣реИ, @ oli-obk рдЗрд╕реЗ рдореБрдЭрд╕реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╕рдордЭрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдЪреНрдЪ рд╕реНрддрд░ рд╕реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рд╕реЗ рдЬреБрдбрд╝реА рдХреЛрдИ рднреА рдЪреАрдЬрд╝ рдбреЗрдЯрд╛рдлрд╝реНрд▓реЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗред рд╡реИрд╕реЗ рднреА, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд╝реВрд▓рд┐рдк рдкрд░ рдпрд╣ рд╡реНрдпрдХреНрддрд┐ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдУрд▓реА-рдУрдмреАрдХреЗ рдФрд░ рдПрдбреАрдм рдХреЗ рдЗрд░рд╛рджреЗ рд╣реИрдВ, рд╢рд╛рдпрдж рдЗрд╕ рдорд╣реАрдиреЗ рдпрд╛ рдЕрдЧрд▓реЗ (рдЬрдм рд╕реЗ рдореИрдВрдиреЗ рдЙрдирд╕реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдмрд╛рдд рдХреА рдереА), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЙрдирдХреА рдУрд░ рд╕реЗ рд╡рд╛рджреЗ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ/рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

@alexreg @mark-im @est31 @oli-obk рдореБрдЭреЗ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХрднреА-рдХрднреА рдбреЗрдЯрд╛рдлреНрд▓реЛ-рдЖрдзрд╛рд░рд┐рдд рдХреЙрдиреНрд╕реНрдЯ рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рдЕрдкрдиреЗ рдбрдмреНрд▓реНрдпреВрдЖрдИрдкреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрдЧрддрддрд╛ рдЦрддрд░реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд░реНрдЬ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред

рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛; рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░реВрдВрдЧрд╛ред

(#57563 рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз рд╕реЗ рдХреЙрдкреА рдХрд░рдирд╛)

рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ bool && bool , bool || bool , рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реЛрдЧрд╛? рдЙрдиреНрд╣реЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ const fn рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрднреА-рдХрднреА рдЕрд╡рд╛рдВрдЫрд┐рдд рд╣реЛрддрд╛ рд╣реИред

рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА const рдФрд░ static рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖-рдЖрд╡рд░рдг рд╡рд╛рд▓реЗ рд╣реИрдВ - рдЙрдиреНрд╣реЗрдВ рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдХреЗред рд▓реЗрдХрд┐рди рд╡рд╣ рд╡рд┐рд╢реЗрд╖-рдЖрд╡рд░рдг рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИрдХ рд╣реИ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдХрд╣рд╛, рдпрд╣ рдХрднреА-рдХрднреА рдЕрд╡рд╛рдВрдЫрд┐рдд рднреА рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред

рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рд╣рдо рдЗрд╕ рдмреАрдЪ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИрдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЦреБрдж рдХреЛ рдПрдХ рдРрд╕реЗ рдХреЛрдиреЗ рдореЗрдВ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╣рдо рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓ рд╕рдХрддреЗ (рдпрджрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣реИрдХ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЧрд▓рддреА рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред

рдЕрдм рдЬрдмрдХрд┐ #64470 рдФрд░ #63812 рдХреЛ рдорд┐рд▓рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЙрдкрдХрд░рдг рдХрдореНрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдЕрднреА рднреА рдХреЙрдиреНрд╕реНрдЯ рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреНрд╡реЗрд░реА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдпрд╣рд╛рдВ рдкреНрд░рдЧрддрд┐ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░рд╛рдд рдореЗрдВ рд╣рдлреНрддреЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рдорд╣реАрдиреЛрдВ рдореЗрдВ рдирд╣реАрдВ (рдкреНрд░рд╕рд┐рджреНрдз рдЕрдВрддрд┐рдо рд╢рдмреНрдж: рдореБрд╕реНрдХрд╛рди :)ред

@ рдкрд░рдорд╛рдирдВрдж-рдореЛрд░реНрд╕ рд╕реБрдирдХрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛! рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдареЛрд╕ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж; рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╕рдордп рд╕реЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВред

рдпрд╣ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕реАрдЯреАрдПрдлрдИ рдХреЗ рд▓рд┐рдП рдвреЗрд░ рдЖрд╡рдВрдЯрди рд╕рдорд░реНрдерди рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдк рдпрд╛ рдХрд┐рд╕реА рдФрд░ рдХреА рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдирд╣реАрдВ рддреЛ рд╢рд╛рдпрдж рдореИрдВ рдорджрдж рдХрд░ рд╕рдХреВрдВред

@alexreg рдзрдиреНрдпрд╡рд╛рдж!

рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдвреЗрд░ рдЖрд╡рдВрдЯрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ rust-rfcs/const-eval#20 рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИред AFAIK, рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХреЗ рдШрдЯрдирд╛рдХреНрд░рдореЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдереЗ ConstSafe / ConstRefSafe рдкреНрд░рддрд┐рдорд╛рди рдирд┐рд░реНрдзрд╛рд░рдг рд╕реАрдзреЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ / рдПрдХ рдХреЗ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рдХреЗ рдкреАрдЫреЗ рдХреЗ рд▓рд┐рдП const ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдФрд░ рдЕрдзрд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛рд░реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╕рд╛рде рдЪрд▓рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, #65949 (рдЬреЛ рд╕реНрд╡рдпрдВ рдХреБрдЫ рдЫреЛрдЯреЗ рдкреАрдЖрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ) рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдЕрд╡рд░реЛрдзрдХ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдореВрд░реНрдд рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреАрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХреЙрдиреНрд╕реНрдЯ-рдЪреЗрдХрд┐рдВрдЧ/рдпреЛрдЧреНрдпрддрд╛ рдЗрддрдиреА рдХрд╕рдХрд░ рдкрджреЛрдиреНрдирддрд┐ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЗрддрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдерд╛ред рдореИрдВ рдПрдХ рдмрд╛рдж рдХреЗ рдкреАрдЖрд░ рдЦреЛрд▓рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдкреБрд░рд╛рдиреЗ рдХреЙрдиреНрд╕реНрдЯ-рдЪреЗрдХрд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрдЧрд╛ (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдо рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рджреЛрдиреЛрдВ рдЪреЗрдХрд░реНрд╕ рдЪрд▓рд╛рддреЗ рд╣реИрдВ)ред рдпрд╣ рдЙрди рдЕрдХреНрд╖рдорддрд╛рдУрдВ рд╕реЗ рдмрдЪ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рдирдХрд╛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ред

рдЙрдкрд░реЛрдХреНрдд рджреЛрдиреЛрдВ рдкреАрдЖрд░ рдХреЗ рд╡рд┐рд▓рдп рдХреЗ рдмрд╛рдж, рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ if рдФрд░ match рдХреБрдЫ рдирд┐рджрд╛рди рд╕реБрдзрд╛рд░ рд╣реЛрдВрдЧреЗ рдФрд░ рдПрдХ рдлреАрдЪрд░ рдлреНрд▓реИрдЧ рджреВрд░ рд╣реЛрдЧрд╛! рдУрд╣, рдФрд░ рдкрд░реАрдХреНрд╖рдг рднреА, рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг ...

рдпрджрд┐ рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдореИрдВ рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ! рдмрд╕ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд╣рд╛рдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП/рдЙрдиреНрд╣реЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП/рдореБрдЭреЗ рдХрд┐рд╕ рд╢рд╛рдЦрд╛ рдХрд╛ рдЖрдзрд╛рд░ рдХреЛрдб рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП :)

рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдкреАрдЖрд░ #66385 рд╣реИред рдпрд╣ рдирдП рдбреЗрдЯрд╛рдлреНрд▓реЛ-рдЖрдзрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдХреЙрдиреНрд╕реНрдЯ рдпреЛрдЧреНрдпрддрд╛ рддрд░реНрдХ (рдЬреЛ рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрд╛) рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред

@ jyn514 рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛! рдЬрдм рдореИрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдорд╕реМрджрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдкрд┐рдВрдЧ рдХрд░реВрдВрдЧрд╛ред рдПрдХ рдмрд╛рд░ рд░рд╛рдд рдореЗрдВ if рдФрд░ match рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рдиреЗ рдкрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрд╕реНрдЯ рд╕реБрд░рдХреНрд╖рд╛ (рд╡рд┐рд╢реЗрд╖рдХрд░ HasMutInterior рднрд╛рдЧ) рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рднреА рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ред

66507 рдореЗрдВ RFC 2342 рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЦреБрд░рджреБрд░реЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧреЗрдЧрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд┐рджрд╛рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд╡рд░реЗрдЬ рдмрд╣реБрдд рд╡рд┐рд░рд▓ рд╣реИ ( @ jyn514 рд╣рдореЗрдВ рдЙрд╕ рдореБрджреНрджреЗ рдкрд░ рд╕рдордиреНрд╡рдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдлрд┐рд░ рднреА, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдЕрдЧрд▓реЗ рдХреБрдЫ рд╣рдлрд╝реНрддреЛрдВ рдореЗрдВ рдлрд╝реАрдЪрд░ рдлрд╝реНрд▓реИрдЧ рдХреЗ рдкреАрдЫреЗ рд░рд┐рд▓реАрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕реЗ #66507 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЕрдм рдЗрд╕реЗ рдирд╡реАрдирддрдо рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЕрдВрджрд░реВрдиреА рдЬрдВрдЧ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рднреА рд╣реИ рдЬреЛ рдирдП рдЙрдкрд▓рдмреНрдз рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХреБрдЫ рдореБрджреНрджреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдпрд╛ рдПрдХ рдХрд╕реНрдЯрдо Drop impl рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЧреЗ рдмрдврд╝реЛ рдФрд░ рджреГрдврд╝ рдХрд░реЛ!

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рдирддрд╛ const ? рдпрд╛ рдореИрдВ рдЧрд▓рдд рд╣реВрдБ:

error[E0019]: constant function contains unimplemented expression type
  --> src/liballoc/raw_vec.rs:55:22
   |
55 |         let cap = if mem::size_of::<T>() == 0 { !0 } else { 0 };
   |                      ^^^^^^^^^^^^^^^^^^^^^^^^

error[E0019]: constant function contains unimplemented expression type
  --> src/liballoc/raw_vec.rs:55:19
   |
55 |         let cap = if mem::size_of::<T>() == 0 { !0 } else { 0 };
   |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 2 previous errors

@ рдорд╛рд░реНрдХ-рдЖрдИрдПрдо рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢рд╛рдпрдж рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛? рдЖрдЗрдП рдЬреВрд▓рд┐рдк рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдПрдирдо рдкрд░ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ

рдЕрдЧрдореНрдп рдХреЛрдб рдХреЗ рд╕рд╛рде const fn рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИ

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдПрдирдо рд╕рдВрдкреВрд░реНрдг рд╣реИ рдФрд░ рдПрдХ рд╣реА рдЯреЛрдХрд░реЗ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

@jhpratt рдХреНрдпрд╛ рдЖрдк рдХреЛрдб рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рдзрд╛рд░рдг рдПрдирдореНрд╕ рдкрд░ рдореИрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=585e9c2823afcb49c6682f69569c97ea

@jhpratt рдХреНрдпрд╛ рдЖрдк рдХреЛрдб рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рдзрд╛рд░рдг рдПрдирдо рдкрд░ рдореЗрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

рдпрд╣рд╛рдВ:
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=13a9fbc4251d7db80f5d63b1dc35a98b

рдореБрдЭреЗ рджреЛ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдорд╛рд░реЛред рдпрд╣ рдореЗрд░рд╛ рд╕рдЯреАрдХ рдорд╛рдорд▓рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рд╣реИред

@jhpratt рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдирд╣реАрдВред рдХреНрдпрд╛ рдЖрдк рдХреЛрдИ рдореБрджреНрджрд╛ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ?

рдХреГрдкрдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдореБрджреНрджреЛрдВ рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рддрд╛рдЬрд╛ рдореБрджреНрджреЛрдВ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ F-const_if_match рд╕рд╛рде рд▓реЗрдмрд▓ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдореБрджреНрджреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рднрд░ рди рдЬрд╛рдПред

@Centril рд╢реАрд░реНрд╖ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдмреБрд░реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рддрд╛рдХрд┐ рдЖрдкрдХрд╛ рджрдлрди рди рд╣реЛред

рд╕реНрдерд┐рддрд┐ рдЕрдкрдбреЗрдЯ:

рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдирдЬрд░рд┐рдП рд╕реЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдореВрд▓реНрдп рдЖрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛рдлреНрд▓реЛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рдЖрдзрд╛рд░рд┐рдд (рд▓реЗрдХрд┐рди рдХрдо рд╢рдХреНрддрд┐рд╢рд╛рд▓реА) рдХреЗ рдмрдЬрд╛рдп рд╣реИред рдореВрд▓реНрдп рдЖрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рд╣реИ (рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХ рдиреАрдЪреЗ), рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ

const fn foo<T>() {
    let x = Option::<T>::None;
    {x};
}

рдЬрд┐рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ Option<T> рдореЗрдВ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдм рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЧреИрд░-рдХреЙрдиреНрд╕реНрдЯ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЬрдм рд╢рд╛рдЦрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ рддреЛ рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдВрдЧреЗ

const fn foo<T>(b: bool) {
    let x = Option::<T>::None;
    assert!(b);
    {x};
}

рдЬреЛ рд╢рд╛рдпрдж рдпреВрдЬрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╣реИрд░рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред

@ ecstatic-morse рдиреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЪрд▓рд╛рдпрд╛, рди рдХрд┐ рдХреЗрд╡рд▓ const fn рдФрд░ 5% рддрдХ рдХреА рдордВрджреА рджреЗрдЦреА (https://perf.rust-lang.org/compare.html?start=93dc97a85381cc52eb872d27e50e4d518926a27c&end=51cf313c7946365d5be3811395702c6a)ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдирд┐рд░рд╛рд╢рд╛рд╡рд╛рджреА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рднреА рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ const fn рдирд╣реАрдВ рдмрди рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдХреНрд╕рд░ рдирд╣реАрдВ рдмрди рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдмрд╣реБрдд рд╕рд╛рд░реЗ рдлрдВрдХреНрд╢рди рдХреЙрдиреНрд╕реНрдЯ рдПрдлрдПрди рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рдореВрд▓реНрдп рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рд╕рдВрдХрд▓рди рдордВрджреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдордзреНрдпрдо рдЖрдзрд╛рд░ рдХреЗрд╡рд▓ рдореВрд▓реНрдп рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рд╡рд┐рдирд╛рд╢рдХ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрд╕реНрддрд┐рддреНрд╡рд╣реАрди рд╡рд┐рдирд╛рд╢рдХ рдирд╣реАрдВ рдЪрд▓реЗрдВрдЧреЗ (рд╣рд╛рдБ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдирдХрд╛рд░рд╛рддреНрдордХрддрд╛рдПрдВ рд╣реИрдВ)ред рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡рд╛рдХреНрдпрд╛рдВрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рд╣рдо рдХреЗрд╡рд▓ рдореВрд▓реНрдп рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдпрджрд┐ рд╡рд┐рдирд╛рд╢рдХ рдореМрдЬреВрдж рд╣реИрдВред

рдореИрдВ рдЗрд╕реЗ @rust-lang/lang рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдирд╛рдорд╛рдВрдХрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рд╕рд╛рде рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

  • рд▓реВрдк рдпрд╛ рд╢рд╛рдЦрд╛рдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рдХрд▓реНрдк (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдирд╛)
  • рдкреВрд░реНрдг рдореВрд▓реНрдп рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг (рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐)
  • рдорд┐рд╢реНрд░рд┐рдд рдпреЛрдЬрдирд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдкреВрд░реНрдг рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрдЯрд┐рд▓рддрд╛, рд▓реЗрдХрд┐рди рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдВрдХрд▓рди-рд╕рдордп рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@ рдУрд▓реА-рдУрдмреАрдХреЗ

рд▓реВрдк рдпрд╛ рд╢рд╛рдЦрд╛рдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рдХрд▓реНрдк (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдирд╛)

рдмрд╕ рдЗрд╕ рдкрд░ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдХреНрдпрд╛ рдпрд╣ рд╕реНрдЯреНрд░реЗрдЯрд▓рд╛рдЗрди рдХреЛрдб рдореЗрдВ рднреА рдЯрд╛рдЗрдк-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд┐рдЫрдбрд╝рд╛ рдЕрд╕рдВрдЧрдд рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд ( рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди ) рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:

struct Foo { }

impl Drop for Foo {
    fn drop(&mut self) { }
}

const T: Option<Foo> = None;

fn main() { }

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд, рдмреЗрд╣рддрд░ рдЕрдиреБрднрд╡ рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд╛рдЧрдд рдмрд╣реБрдд рдЦрд░рд╛рдм рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдЕрдзрд┐рдХ рдорд╣рдВрдЧреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ: рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рд╣рдо рдореВрд▓ рд░реВрдк рд╕реЗ "рдирд┐рд░рдВрддрд░ рдкреНрд░рдЪрд╛рд░" рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЬрдм рднреА рдХреБрдЫ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рдореВрд▓реНрдп рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд┐рдирд╛рд╢рдХ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА? (рдпрд╛рдиреА, рдпрджрд┐ рдпрд╣ None , рддреЛ Option<T> рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)

рдмрд╕ рдЗрд╕ рдкрд░ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдХреНрдпрд╛ рдпрд╣ рд╕реНрдЯреНрд░реЗрдЯрд▓рд╛рдЗрди рдХреЛрдб рдореЗрдВ рднреА рдЯрд╛рдЗрдк-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд┐рдЫрдбрд╝рд╛ рдЕрд╕рдВрдЧрдд рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд (рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди) рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:

рд╣рд╛рдВ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рдУрд░ рдирд╣реАрдВ рдмрдврд╝ рд╕рдХрддреЗред

рдХреНрдпрд╛ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рд╣рдо рдореВрд▓ рд░реВрдк рд╕реЗ "рдирд┐рд░рдВрддрд░ рдкреНрд░рдЪрд╛рд░" рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЬрдм рднреА рдХреБрдЫ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд┐рд░рд╛рдП рдЬрд╛ рд░рд╣реЗ рд╕рдЯреАрдХ рдореВрд▓реНрдп рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд┐рдирд╛рд╢рдХ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА? (рдЕрд░реНрдерд╛рдд, рдпрджрд┐ рдпрд╣ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ, рддреЛ Option . рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)

рд╣рдо рдХреЗрд╡рд▓ рдЭрдВрдбреЗ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ( Drop рдФрд░ Freeze , рдореИрдВрдиреЗ рдЕрднреА рдпрд╣рд╛рдВ Drop рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╕рдордЭрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ)ред рдЬрдм рд╣рдо Drop рдЯрд░реНрдорд┐рдиреЗрдЯрд░ рддрдХ рдмрд┐рдирд╛ Drop рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд┐рдП рдкрд╣реБрдБрдЪ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо Drop рдЯрд░реНрдорд┐рдиреЗрдЯрд░ рдХреЛ рдирдЬрд╝рд░рдЕрдВрджрд╛рдЬрд╝ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдХреЛрдб рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

{
    let mut x = None;
    // Drop flag for x: false
    let y = Some(Foo);
    // Drop flag for y: true
    x = y; // Dropping x is fine, because Drop flag for x is false
    // Drop flag for y: false, Drop flag for x: true
    x
    // Dropping y is fine, because Drop flag for y is false
}

рдпрд╣ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд╕рдордп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдареАрдХ рдирд╣реАрдВ рд╣реИ:

{
    let mut x = Some(Foo);
    if false {
        x = None;
    }
    x
}

рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдкрде Drop рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рд▓рдЧрд╛рддрд╛рд░ рдкреНрд░рдЪрд╛рд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╛рджреГрд╢реНрдп рд╣реИред рдпрд╣ рдПрдХ рдФрд░ рдбреЗрдЯрд╛рдлреНрд▓реЛ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдлрд╝рдВрдХреНрд╢рди рдЬреАрди/рдХрд┐рд▓ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЪрд░ рдХреЗ рдмреАрдЪ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рдкрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдирд┐рд░рдВрддрд░ рдкреНрд░рд╕рд╛рд░ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрдиреНрд╕реНрдЯ-рдЪреЗрдХрд┐рдВрдЧ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд┐рдЯ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрд╕ рдЪрд░ рдХрд╛ рдПрдХ рдХрд╕реНрдЯрдо Drop impl рд╣реИ рдпрд╛ Freeze рдЗрд╕реЗ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ рдирд┐рд░рдВрддрд░ рдкреНрд░рд╕рд╛рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдХрдо рдЦрд░реНрдЪреАрд▓рд╛ рд╣реЛрдЧрд╛ред

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, @ oli-obk рдХрд╛ рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдЖрдЬ рд╕реНрдерд┐рд░ рдкрд░ рд╕рдВрдХрд▓рд┐рдд рд╣реИ, рдФрд░ 1.38.0 рдХреЗ рдмрд╛рдж рд╕реЗ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ #64470 рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, const X: Option<Foo> = None; 1.0 рдХреЗ рдмрд╛рдж рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╣реИ, рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдЙрд╕ рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ рдЬреЛ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╣реИ рдЬреЛ рдХрд┐ const eval рдиреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рддрдм рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдореВрд▓реНрдп-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЕрдкрдирд╛рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдмреИрдардХ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рдкрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ =)

рд╕рд╛рд░рд╛рдВрд╢

рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде #![feature(const_if_match)] рдХреЛ рд╕реНрдерд┐рд░ рдХрд░реЗрдВред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, if рдФрд░ match рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдСрдкрд░реЗрдЯрд░ && рдФрд░ || рд╕рднреА рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдХрд╛рдиреВрдиреА рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдПрдХ рдХреЙрдиреНрд╕ рд╕рдВрджрд░реНрдн рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╣реИ:

  • const , static , static mut рдпрд╛ рдПрдирдо рд╡рд┐рд╡реЗрдЪрдХ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛ред
  • рдПрдХ const fn рдХрд╛ рд╢рд░реАрд░ред
  • рдПрдХ рдХрд╛рд╕реНрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рдорд╛рди (рдХреЗрд╡рд▓ рд░рд╛рдд рдореЗрдВ)ред
  • рдПрдХ рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдХреА рд▓рдВрдмрд╛рдИ ( [u8; 3] ) рдпрд╛ рдПрдХ рд╕рд░рдгреА рджреЛрд╣рд░рд╛рд╡ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ ( [0u8; 3] )ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЕрдм const рдФрд░ static рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░реНрд╕ рдореЗрдВ рдЙрдирдХреЗ рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рд╕рдордХрдХреНрд╖ ( & рдФрд░ | рдХреНрд░рдорд╢рдГ) рддрдХ рдХрдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рджреЗрдЦреЗрдВ #57175)ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, let рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░реНрд╕ рдореЗрдВ рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛: #49146
рд╕рдВрд╕реНрдХрд░рдг рд▓рдХреНрд╖реНрдп: 1.45 (2020-06-16)

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрддрд┐рд╣рд╛рд╕

64470 рдиреЗ рдПрдХ рдореВрд▓реНрдп-рдЖрдзрд╛рд░рд┐рдд рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬреЛ рд╕рд╢рд░реНрдд рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рдерд╛ рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛ред рдЗрд╕рдиреЗ, #63812 рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдХреЙрдиреНрд╕реНрдЯ-рдЪреЗрдХрд┐рдВрдЧ рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рдЧреНрд░рд╛рдлрд╝ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред рдкреБрд░рд╛рдиреЗ рдХреЙрдиреНрд╕реНрдЯ-рдЪреЗрдХрд░ рдХреЛ рдПрдХ рд╕рдордп рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдлреНрд▓реЛ-рдЖрдзрд╛рд░рд┐рдд рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рд╡реЗ рд╕рд░рд▓ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдкрд░ рд╕рд╣рдордд рд╣реИрдВред #66385 рдиреЗ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣-рдЖрдзрд╛рд░рд┐рдд рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдХреЙрдиреНрд╕реНрдЯ-рдЪреЗрдХрд░ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред

66507 рдиреЗ #![feature(const_if_match)] рдлреАрдЪрд░ рдЧреЗрдЯ рдХреЛ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд┐рд╕реЗ рдЕрдм рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдХреЙрдиреНрд╕реНрдЯ рдпреЛрдЧреНрдпрддрд╛

рдкреГрд╖реНрдарднреВрдорд┐

[рдорд┐рд░реА] рдиреЗ рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ rustc рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рдлрдВрдХреНрд╢рди рдореВрд▓реНрдпрд╛рдВрдХрди (CTFE) рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдХрдо рд╕реЗ рдХрдо рдЗрддрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕рд╢рд░реНрдд рдмрдпрд╛рдиреЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред CTFE рдХреЗ рджреМрд░рд╛рди, рд╣рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рдХрд╕реНрдЯрдо Drop impls рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдпрд╛ рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рд╡рд╛рд▓реЗ рдорд╛рди рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗрдирд╛ред рд╕рд╛рдореВрд╣рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрди рдЕрдпреЛрдЧреНрдп рдЧреБрдгреЛрдВ рдХреЛ "рдпреЛрдЧреНрдпрддрд╛" рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдореВрд▓реНрдп рдХреА рдпреЛрдЧреНрдпрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, "рдХреЙрдиреНрд╕реНрдЯ рдпреЛрдЧреНрдпрддрд╛" рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдорд┐рд░реА рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рдиреЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдХреНрд╖рдо рд╣реИ рдЬрдм рдЙрд╕реЗ рдПрдХ рдпреЛрдЧреНрдп рдореВрд▓реНрдп рдкрд░ рдПрдХ рдЕрд╡реИрдз рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдХреЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реАрдЯреАрдПрдлрдИ рдкреЛрд╕реНрдЯ-рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдЬрд╝реЗрд╢рди рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддрд╛ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рддрдм рддрдХ рдорд╛рдиреНрдп рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рддрддреНрдХрд╛рд▓ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗ, рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреНрд░реЗрдЯ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкреВрд░реНрд╡-рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдЬрд╝реЗрд╢рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд┐ рдпреЛрдЧреНрдпрддрд╛ рдпреЛрдЧреНрдпрддрд╛ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, const рдпреЛрдЧреНрдпрддрд╛ рдЕрдирд┐рд░реНрдгреАрдд рд╣реИ ( рд░рд╛рдЗрд╕ рдХрд╛ рдкреНрд░рдореЗрдп рджреЗрдЦреЗрдВ), рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рднреА рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗрд╡рд▓ рдЙрди рдЬрд╛рдБрдЪреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдорд┐рд░реА CTFE рдХреЗ рджреМрд░рд╛рди рдХрд░рддреА рд╣реИрдВред

рд╣рдорд╛рд░реЗ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ (рдЬреИрд╕реЗ &Cell<i32> ) рдХреЗ рд╕рд╛рде const рдХреЗ рдЕрдВрддрд┐рдо рдорд╛рди рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ, рддреЛ рд░рди-рдЯрд╛рдЗрдо рдкрд░ const рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

const X: &std::cell::Cell<i32> = std::cell::Cell::new(0);

fn main() {
  X.get(); // 0
  X.set(42);
  X.get(); // 42
}

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ const рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ ( !Freeze ) рд╣реИ, рдЬрдм рддрдХ рд╣рдо рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕ const рдХрд╛ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдерд┐рд░ рдЬрдВрдЧ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛

const _X: Option<&'static std::cell::Cell<i32>> = None;

рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЬрд┐рд╕реЗ рдореИрдВ рдЯрд╛рдЗрдк-рдЖрдзрд╛рд░рд┐рдд рдХреЗ рд╡рд┐рдкрд░реАрдд рдореВрд▓реНрдп-рдЖрдзрд╛рд░рд┐рдд рдХрд╣реВрдВрдЧрд╛, рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрд╕реНрдЯрдо Drop impl рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред Drop impls рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреЙрдиреНрд╕реНрдЯ-рдЪреЗрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЙрдиреНрд╕реНрдЯ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдПрдЧреАред рдореВрд▓реНрдп-рдЖрдзрд╛рд░рд┐рдд рддрд░реНрдХ рдХреЛ let рдХрдердиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЬрдВрдЧ 1.42.0 рд╕реНрдерд┐рд░ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд

const _: Option<Vec<i32>> = {
  let x = None;
  let mut y = x;
  y = Some(Vec::new()); // Causes the old value in `y` to be dropped.
  y
};

рд╡рд░реНрддрдорд╛рди рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рд╢рдмреНрджрд╛рд░реНрде

#![feature(const_if_match)] рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдбреЗрдЯрд╛рдлреНрд▓реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрдЯрд┐рд▓ рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рдЧреНрд░рд╛рдлрд╝ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп-рдЖрдзрд╛рд░рд┐рдд рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкрдереЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд░ рдХреЗ рдкрд╛рд╕ рдкреНрд░рд╢реНрди рдореЗрдВ рдпреЛрдЧреНрдпрддрд╛ рдирд╣реАрдВ рд╣реИред

enum Int {
    Zero,
    One,
    Many(String), // Dropping this variant is not allowed in a `const fn`...
}

// ...but the following code is legal under this proposal...
const fn good(x: i32) {
    let i = match x {
        0 => Int::Zero,
        1 => Int::One,
        _ => return,
    };

    // ...because `i` is never `Int::Many` on any possible path through the program.
    std::mem::drop(i);
}

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкрдереЛрдВ рдореЗрдВ рд╡реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдХрднреА рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг, рдКрдкрд░ рдХреЗ рд╕рдорд╛рди Int рдПрдирдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

const fn bad(b: bool) {
    let i = if b == true {
        Int::One
    } else if b == false {
        Int::Zero
    } else {
        // This branch is dead code. It can never be reached in practice.
        // However, const qualification treats it as a possible path because it
        // exists in the source.
        Int::Many(String::new())
    };

    // ILLEGAL: `i` was assigned the `Int::Many` variant on at least one code path.
    std::mem::drop(i);
}

рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдЕрдкрд╛рд░рджрд░реНрд╢реА рдорд╛рдирддрд╛ рд╣реИ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЙрдирдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдореЗрдВ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреЛрдИ рднреА рдореВрд▓реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрджрд░реНрдн рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реИрд╕реЗ рд╣реА рд╣рдо рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрдерд┐рд░ рдЬрдВрдЧ рдкрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрджрд░реНрдн рдмрдирд╛рдирд╛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реИред

#![feature(const_mut_refs)]

const fn none() -> Option<Cell<i32>> {
    None
}

// ILLEGAL: We must assume that `none` may return any value of type `Option<Cell<i32>>`.
const BAD: &Option<Cell<i32>> = none();

const fn also_bad() {
    let x = Option::<Box<i32>>::None;

    let _ = &mut x;

    // ILLEGAL: because a mutable reference to `x` was created, we can no
    // longer assume anything about its value.
    std::mem::drop(x)
}

рдЖрдк рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдореВрд▓реНрдп-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдФрд░ рдХрд╕реНрдЯрдо рдбреНрд░реЙрдк рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реИ, рд╕рд╛рде рд╣реА рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдПрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдореЗрдВ рдХреБрдЫ рднреА рдЕрд╡реИрдз рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╡реИрдХрд▓реНрдкрд┐рдХ

рдореБрдЭреЗ рдореМрдЬреВрджрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ, рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╣реБрдИ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдПрдХ рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд╢рд░реНрдд рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рд╕рднреА рдЪрд░ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдпрд╣ рд╕рдордЭрд╛рдирд╛ рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдкрд░рд┐рд╡рд░реНрдзрди рдХреЛрдб рдХреЛ рдЕрдм рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ assert рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ @oli-obk рд╕реЗред

const fn foo<T>(b: bool) {
    let x = Option::<T>::None;
    assert!(b);
    {x};
}

рдореВрд▓реНрдп-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рдмрдврд╝реА рд╣реБрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдПрдХ рдкреВрд░реНрдг рд░рди рдЬрд┐рд╕рдиреЗ рд╕рднреА рдЖрдЗрдЯрдо рдирд┐рдХрд╛рдпреЛрдВ рдкрд░ рдХреЗрд╡рд▓ const рд╡рд╛рд▓реЗ рдирд╣реАрдВ, рдкрд░ рдпреЛрдЧреНрдпрддрд╛ рдХреА, рдЪреЗрдХ рдмрд┐рд▓реНрдб рдкрд░ 5% рдкреНрд░рддрд┐рдЧрдорди рджрд┐рдЦрд╛рдпрд╛ред рдпрд╣ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ const рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдХреВрд▓рди, рдЬреИрд╕реЗ рдХрд┐ #71330 рдореЗрдВ рд╕реЗ рдПрдХ, рдкрд░ рдкрд╣рд▓реЗ рдереНрд░реЗрдб рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред

рднрд╡рд┐рд╖реНрдп рдХрд╛ рдХрд╛рд░реНрдп

рдлрд┐рд▓рд╣рд╛рд▓, рдбреНрд░реЙрдк рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдкрд╣рд▓реЗ рдХреЙрдиреНрд╕реНрдЯ-рдЪреЗрдХрд┐рдВрдЧ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХреБрдЫ рдбреНрд░реЙрдк рдЯрд░реНрдорд┐рдиреЗрдЯрд░ рдПрдордЖрдИрдЖрд░ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ Option::unwrap рдХреЛ const fn рдмрдирдиреЗ рд╕реЗ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ (#66753 рджреЗрдЦреЗрдВ)ред рдЗрд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрд╕реНрдЯ-рдЪреЗрдХрд┐рдВрдЧ рдкрд╛рд╕ рдХреЛ рджреЛ рдЪрд░рдгреЛрдВ (рдкреНрд░реА- рдФрд░ рдкреЛрд╕реНрдЯ-рдбреНрд░реЙрдк рд╡рд┐рд╕реНрддрд╛рд░) рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдПрдХ рдмрд╛рд░ #![feature(const_if_match)] рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдиреЗ рдкрд░, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╕реМрджрд╛ const fn рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдЖрджрд┐рдо рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрдИ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рдирдХреА рдЧрдгрдирд╛ #53718 рдореЗрдВ рдХреА рдЧрдИ рд╣реИред

рдПрдХ рдХреЙрдиреНрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓реВрдк рд╕рд╢рд░реНрдд рдХреЗ рд╕рдорд╛рди рдХреЙрдиреНрд╕реНрдЯ рдпреЛрдЧреНрдпрддрд╛ рдкреНрд░рд╢реНрди рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдВрд╢реЛрдзрди рдХреЗ рдЪрдХреНрд░реАрдп CFG рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ #![feature(const_if_match)] рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ #52000 рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЕрд╡рд░реЛрдзрдХ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рд╕реНрд╡реАрдХреГрддрд┐рдпрд╛рдБ

рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж @ oli-obk рдФрд░ @eddyb рдХреЗ рдХрд╛рд░рдг рд╣реИрдВ , рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рд╕рдореАрдХреНрд╖рдХ рдереЗ, рд╕рд╛рде рд╣реА рдмрд╛рдХреА @rust-lang/wg-const-eval рдиреЗ рдореБрдЭреЗ рдХреЙрдиреНрд╕реНрдЯ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдореБрджреНрджреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХреАред рдпреЛрдЧреНрдпрддрд╛ред рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдорд┐рд░реА рдХреЗ рдмрд┐рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ @solson рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЕрдм @RalfJung рдФрд░ @ oli-obk рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ FCP рд╕реЗ рдкрд╣рд▓реЗ рдХреА рд╕реНрдерд┐рд░реАрдХрд░рдг рд░рд┐рдкреЛрд░реНрдЯ рд╣реЛрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред рдореИрдВ рдирд╣реАрдВ рдЦреЛрд▓ рд╕рдХрддрд╛ FCP, рддрдерд╛рдкрд┐.

@ рдкрд░рдорд╛рдирдВрдж-рдореЛрд░реНрд╕ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЖрдкрдХреА рдХрдбрд╝реА рдореЗрд╣рдирдд рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рдмрдврд╝рд┐рдпрд╛ рд░рд┐рдкреЛрд░реНрдЯ!

рдПрдХ рдЪреАрдЬ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, @ рдкрд░рдорд╛рдирдВрдж-рдореЛрд░реНрд╕, рд╣реИ

  • рд░реЗрдкреЛ рдореЗрдВ рдХреБрдЫ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдВрдХ, рддрд╛рдХрд┐ рд╣рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреЗрдВ
  • рдХреНрдпрд╛ рд╕реЗрд╡рд░ рдпрд╛ рдХреБрдЫ рдФрд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╣реИрдВ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрддрд░ рдХрд╛рдлреА рд╣рдж рддрдХ рдирд╣реАрдВ рд╣реИ , рд╣реИ рдирд╛? рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдХреЙрдиреНрд╕ рдПрдлрдПрди рдХрд╛ рд╢рд░реАрд░ рдХрд╛рдиреВрдиреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдХреЙрдиреНрд╕ рдПрдлрдПрди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк "рдХреЙрдиреНрд╕реНрдЯ рдПрдлрдПрди рдХреЗ рдХреЙрд▓рд░ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ" рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдо", рд╣реИ рдирд╛? рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдХреЙрд▓рд░ рдХреЛ рдареАрдХ рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдПрдирдо рдХреЗ рдХреМрди рд╕реЗ рд╡реЗрд░рд┐рдПрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЗрд╡рд▓ рд╡рд╣ - рдЬреЛ рднреА рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЗрд╕рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдирд╣реАрдВ рдереА (рдЬреЛ рдХрд┐ рд╡реЗ рд╕рдВрднрд╡рддрдГ рдорд┐рд▓рд╛рди рдХрд░рддреЗ рд╕рдордп рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рддреЛ, рддрдм рд╕реЗ)ред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдХреЙрдиреНрд╕ рдПрдлрдПрди рдХрд╛ рд╢рд░реАрд░ рдХрд╛рдиреВрдиреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдХреЙрдиреНрд╕ рдПрдлрдПрди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк "рдХреЙрдиреНрд╕реНрдЯ рдПрдлрдПрди рдХреЗ рдХреЙрд▓рд░ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ" рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдо", рд╣реИ рдирд╛? рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдХреЙрд▓рд░ рдХреЛ рдареАрдХ рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдПрдирдо рдХреЗ рдХреМрди рд╕реЗ рд╡реЗрд░рд┐рдПрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЗрд╡рд▓ рд╡рд╣ - рдЬреЛ рднреА рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЗрд╕рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдирд╣реАрдВ рдереА (рдЬреЛ рдХрд┐ рд╡реЗ рд╕рдВрднрд╡рддрдГ рдорд┐рд▓рд╛рди рдХрд░рддреЗ рд╕рдордп рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рддреЛ, рддрдм рд╕реЗ)ред

рд╣рд╛рдБ, const fn рдХрд╛ рд╢рд░реАрд░ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдПрдХ const рдЖрдЗрдЯрдо рдХреЗ рдЗрдВрдЯрд┐рд▓рд╛рдЗрдЬрд╝рд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИред рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрдереНрдп рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐

const FOO: Option<Cell<i32>> = None;

рдПрдХ &'static Option<Cell<i32>> рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

const BAR: &'static Option<Cell<i32>> = &FOO;

рдЬрдмрдХрд┐ рдПрдХ рд╣реА рд╢рд░реАрд░ рдХреЗ рд╕рд╛рде рдПрдХ const fn рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛:

const fn foo() -> Option<Cell<i32>> { None }
const BAR: &'static Option<Cell<i32>> = &foo();

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдбреЗрдореЛ

рдЬрдм рд╣рдо рд╕реНрдерд┐рд░рд╛рдВрдХ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐

const FOO: Option<Cell<i32>> = if MEH { None } else { None };

рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛, MEH рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдФрд░

const FOO: Option<Cell<i32>> = if MEH { Some(Cell::new(42)) } else { None };

рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдлрд┐рд░ рд╕реЗ, MEH рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХред

рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ const fn рдХреА рдХреЙрд▓ рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдмрд╕ рдЙрд╕ рдХреЙрдиреНрд╕ fn рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕ рдХреЛрдб рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред

рд░реЗрдкреЛ рдореЗрдВ рдХреБрдЫ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдВрдХ, рддрд╛рдХрд┐ рд╣рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреЗрдВред

рдореИрдВрдиреЗ "рдХрд░рдВрдЯ рдирд╛рдЗрдЯрд▓реА рд╕рд┐рдореЗрдВрдЯрд┐рдХреНрд╕" рдЦрдВрдб рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдЬреЛрдбрд╝рд╛ рдЬреЛ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдПрдХ рдмрдпрд╛рди рдЬреЛ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдЪ рд╣реИ) рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдпрд╣ рддрдп рдХрд░ рд▓реЗрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рд╡рд╛рдВрдЫрдиреАрдп рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рддреЛ рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЪрд╛рд╣реЗ рд╕реЗрд╡рд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╣реЛрдВ рдпрд╛ рдХреБрдЫ рдФрд░ред

рдКрдкрд░ @ рдУрд▓реА-рдУрдмреАрдХреЗ рдиреЗ рдЬреЛ рдХрд╣рд╛ рд╣реИ, рдЙрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ const рдХреЗ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдирд╛ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕реЗрд╡рд░-рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ:

// Upstream crate
const IDX: usize = 1; // Changing this to `3` will break downstream code!

// Downstream crate

extern crate upstream;

const X: i32 = [0, 1, 2][upstream::IDX]; // Only compiles if `upstream::IDX <= 2`

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкреВрд░реНрдг рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ рдпреЛрдЧреНрдпрддрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, if рдпрд╛ match рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЛрдб рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИ , рднрд▓реЗ рд╣реА рдЕрдВрддрд┐рдо рдорд╛рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рди рд╣реЛред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

// Changing from `cfg` attributes...

#[cfg(not(FALSE))]
const X: Option<Vec<i32>> = None;
#[cfg(FALSE)]
const X: Option<Vec<i32>> = Some(Vec::new());

// ...to the `cfg` macro...

const X: Option<Vec<i32>> = if !cfg!(FALSE) { None } else { Some(Vec::new() };

// ...could break downstream crates, even though `X` is still `None`!

// Downstream

 // Only legal if static analysis can prove the qualifications in `X`
const _: () =  std::mem::drop(upstream::X); 

рдпрд╣ const fn рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╣рдореЗрд╢рд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк-рдЖрдзрд╛рд░рд┐рдд рдпреЛрдЧреНрдпрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╣реА рдХреНрд░реЗрдЯ рдХреЗ рднреАрддрд░ рднреАред

рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ, рдпрд╣рд╛рдВ "рдореВрд▓ рдкрд╛рдк" const рдФрд░ рдмрд╛рд╣рд░реА рдХреНрд░реЗрдЯ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд static s рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк-рдЖрдзрд╛рд░рд┐рдд рдпреЛрдЧреНрдпрддрд╛ рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ 1.0 рдХреЗ рдмрд╛рдж рд╕реЗ рдРрд╕рд╛ рд╣реА рд╣реИ, рдФрд░ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рдХрд╛рдлреА рдХреЛрдб рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдЖрдк рдХреЙрдиреНрд╕ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╕рдорд╛рди рдореВрд▓реНрдп рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдВрдЧреЗред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ if рдФрд░ match рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЕрдиреЛрдЦрд╛ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЯреЛрдХрд░рд╛ рдореВрд▓реНрдп-рдЖрдзрд╛рд░рд┐рдд рдпреЛрдЧреНрдпрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдерд╛, рддреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ const рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ const fn рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред

// Upstream
const fn none<T>() -> Option<T> { None }

const VALUE_BASED: Option<Vec<i32>> = None;
const TYPE_BASED: Option<Vec<i32>> = none();

// Downstream

const OK: () = { std::mem::drop(upstream::VALUE_BASED); };
const ERROR: () = { std::mem::drop(upstream::TYPE_BASED); };

@ рдкрд░рдорд╛рдирдВрдж-рдореЛрд░реНрд╕ рд╕реНрдерд┐рд░реАрдХрд░рдг рд░рд┐рдкреЛрд░реНрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдЖрдЗрдП рдЖрдо рд╕рд╣рдорддрд┐ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдорд╛рдкреЗрдВ:

@rfcbot рдорд░реНрдЬ

рдпрджрд┐ рдХреЛрдИ рдЗрд╕ рдкрд░ рдмреИрдардХ рдореЗрдВ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдкреБрдирдГ рдирд╛рдорд╛рдВрдХрд┐рдд рдХрд░реЗрдВред

рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп @joshtriplett рдиреЗ рдЗрд╕реЗ рдорд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рдЪрд░рдг рдмрд╛рдХреА рдЯреИрдЧ рдХреА рдЧрдИ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдореАрдХреНрд╖рд╛ рд╣реИ:

  • [рдПрдХреНрд╕] @ рдХреНрд░реИрдорд░реНрдЯрдЬ
  • [x] @joshtriplett
  • [x] @nikomatsakis
  • [x] @pkfelix
  • [ ] @scottmcm
  • [ ] @ рдирд╛рд╡реЛрдВ рдХреЗ рдмрд┐рдирд╛

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рдЪрд┐рдВрддрд╛ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рд╣реИред

рдПрдХ рдмрд╛рд░ рдЬрдм рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдореАрдХреНрд╖рдХ рд╕реНрд╡реАрдХреГрддрд┐ рджреЗ рджреЗрддреЗ рд╣реИрдВ (рдФрд░ рдЕрдзрд┐рдХрддрдо 2 рдЕрдиреБрдореЛрджрди рдмрдХрд╛рдпрд╛ рд╣реИрдВ), рддреЛ рдпрд╣ рдЕрдкрдиреА рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдкрд░ рдирд╣реАрдВ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдмреЛрд▓реЗрдВ!

рдЯреИрдЧ рдХреА рдЧрдИ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп рдореБрдЭреЗ рдХреНрдпрд╛ рдЖрджреЗрд╢ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП

:рдШрдВрдЯреА: рдЙрдкрд░реЛрдХреНрдд рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдЕрдм рдЕрдкрдиреА рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ ред рдШрдВрдЯреА:

рдХреНрдпрд╛ рдпрд╣ ? рдореЗрдВ const fn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ?

рдпрд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред const fn рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп

? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ Try рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред const fn рдореЗрдВ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕реНрдерд┐рд░ рд╣реИ, https://github.com/rust-lang/rust/issues/67794 рджреЗрдЦреЗрдВред

@TimDiekmann рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ loop рдФрд░ for , рдХрдо рд╕реЗ рдХрдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реАрдорд╛ рддрдХ (рдЖрджрд┐рдо рд░рд┐рдХрд░реНрд╕рди рд╢реИрд▓реА) рд▓реЗрдХрд┐рди const eval рдореЗрдВ рд╡реИрд╕реЗ рднреА рдРрд╕реА рд╕реАрдорд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рд╕рдХреНрд╖рдо рдХрд░рддреА рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕рдВрднрд╡ рдирд╣реАрдВ рдереАред рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ const fn рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ wasm vm рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрдкрд░реЛрдХреНрдд рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╡рд┐рд▓рдп рдХреЗ рд╕реНрд╡рднрд╛рд╡ рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдЕрдм рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИ ред

рд╢рд╛рд╕рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рд▓реЗрдЦрдХ рдХреЛ рдЙрдирдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдФрд░ рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЖрд░рдПрдлрд╕реА рдХрд╛ рдЬрд▓реНрдж рд╣реА рд╡рд┐рд▓рдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

eddyb picture eddyb  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

overvenus picture overvenus  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dwrensha picture dwrensha  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zhendongsu picture zhendongsu  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mcarton picture mcarton  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ