Rust: RFC 2342์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ, "์ƒ์ˆ˜์—์„œ `if` ๋ฐ `match` ํ—ˆ์šฉ"

์— ๋งŒ๋“  2018๋…„ 03์›” 18์ผ  ยท  83์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

์ด๊ฒƒ์€ RFC "์ƒ์ˆ˜์—์„œ if ๋ฐ match "(rust-lang/rfcs#2342)์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋ณด๊ณ ํ•˜๋ ค๋Š” ํŠน์ • ๊ธฐ๋Šฅ ๋˜๋Š” ๋ฌธ์ œ์˜ ๊ตฌ์„ฑ์„ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๊ณ  F-const_if_match ์ ์ ˆํ•˜๊ฒŒ ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•˜์—ฌ ์ด ๋ฌธ์ œ๊ฐ€ ์ค‘์š”ํ•œ ๊ฐœ๋ฐœ์„ ๊ฐ€๋ฆฌ๋Š” ์ผ์‹œ์ ์ธ ๋Œ“๊ธ€๋กœ ๋„˜์ณ๋‚˜์ง€ ์•Š๋„๋ก ํ•˜์‹ญ์‹œ์˜ค.

๋‹จ๊ณ„:

  • [x] RFC ๊ตฌํ˜„
  • [ ] ๋ฌธ์„œ ์กฐ์ •( forge ์ง€์นจ ์ฐธ์กฐ )
  • [x] ์•ˆ์ •ํ™” PR( forge ์ง€์นจ ์ฐธ์กฐ )
  • [x] let && ๋ฐ || ๋‹จ๋ฝ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์ƒ์ˆ˜์˜ 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๊ฐ€ ๋ณ‘ํ•ฉ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋„๊ตฌ๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋น„ํšจ์œจ์ ์ด์ง€ ์•Š๋„๋ก const ์ž๊ฒฉ๊ณผ ๊ด€๋ จ๋œ ์ฟผ๋ฆฌ ์‹œ์Šคํ…œ์„ ์•ฝ๊ฐ„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์—์„œ ์ง„์ „์„ ์ด๋ฃจ๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ์˜ ์‹คํ—˜์  ๊ตฌํ˜„์€ ๋ช‡ ๋‹ฌ์ด ์•„๋‹ˆ๋ผ ๋ช‡ ์ฃผ ์•ˆ์— ๋ฐค๋งˆ๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค(์œ ๋ช…ํ•œ ๋งˆ์ง€๋ง‰ ๋‹จ์–ด:smile:).

๋ชจ๋“  83 ๋Œ“๊ธ€

  1. ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ ์ถ”๊ฐ€
  2. https://github.com/rust-lang/rust/blob/master/src/librustc_mir/transform/qualify_consts.rs#L347์˜ switch ๋ฐ switchInt ์ข…๊ฒฐ์ž๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ
  3. ๋‹จ์ผ ํ˜„์žฌ ๊ธฐ๋ณธ ๋ธ”๋ก(https://github.com/rust-lang/rust/blob/master/src/librustc_mir/transform/qualify_consts.rs#L328)์„ ๊ฐ–๋Š” ๋Œ€์‹  ๋‹ค์Œ ๋ชฉ๋ก์ด ์žˆ๋Š” ์ผ๋ถ€ ์ปจํ…Œ์ด๋„ˆ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋ณธ ๋ธ”๋ก.

@oli-obk ๋ณต์žกํ•œ ์ œ์–ด ํ๋ฆ„์€ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ถ„์„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข€ ๋” ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. @alexreg ๋กœ

@eddyb ์ข‹์€ ์ถœ๋ฐœ์ ์€ ์•„๋งˆ๋„ ๋‚ด const-qualif ๋ถ„๊ธฐ ๋ฅผ ๊ฐ€์ ธ ์˜ค๊ณ  (์ตœ์ƒ์œ„ ์ปค๋ฐ‹ ์ œ์™ธ) ๋งˆ์Šคํ„ฐ ์œ„์— ๋ฆฌ๋ฒ ์ด์Šคํ•œ ๋‹ค์Œ(์žฌ๋ฏธ์—†์„ ์˜ˆ์ •์ž„) ๋ฐ์ดํ„ฐ ์ฃผ์„ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ?

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@mark-im ์•„์•„ ์•„๋‹ˆ. ์ง€๋‚œ ๋ช‡ ์ฃผ ๋™์•ˆ IRC์—์„œ ๊ทธ๋ฅผ ํ•‘(ping)ํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— @eddyb ๋Š” ์ฐธ์œผ๋กœ ๋งค์šฐ ๋ฐ”๋นด์Šต๋‹ˆ๋‹ค. ์Šฌํ”„๊ฒŒ๋„ ๋‚ด const-qualif ๋ถ„๊ธฐ๋Š” ๋‚ด๊ฐ€ master ์œ„์— ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฆฌ๋ฒ ์ด์Šคํ•œ ์ดํ›„๋กœ ์ปดํŒŒ์ผ์กฐ์ฐจ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์•„์ง ๋ฐ€์—ˆ๋‹ค๋Š” ๊ฒŒ ๋ฏฟ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.)

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 ๊ทธ๋ ‡๊ตฐ์š” ํ—คํ—ค . ๋‚˜๋Š” ๋ณดํ†ต GMT ์˜คํ›„ 8์‹œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ ์ผ์ฐ ์ž ์ž๋ฆฌ์— ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค! :-)

์ •๋ง ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ์ผ๋ จ์˜ ํŒจ์น˜๊ฐ€ 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 "dangling pointer was dereferenced"(์ด๋Š” "dangling pointer" ๋Œ€์‹  static s์— ๋Œ€ํ•ด ์‹ค์ œ๋กœ ๋งํ•ด์•ผ ํ•จ)์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— static ์ฝ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ const fn ๊ฐ€ ๋Ÿฐํƒ€์ž„์— "์ˆœ์ˆ˜"(์ฆ‰, "์ฐธ์กฐ์ ์œผ๋กœ ํˆฌ๋ช…"ํ•˜๊ฑฐ๋‚˜ ๊ทธ ์ •๋„)๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. const fn ์ธ์ˆ˜๊ฐ€ ๊ดœ์ฐฎ๋กœ ์–ป์€ ์ฐธ์กฐ ๋’ค์—์„œ ์ฝ๊ธฐํ•˜์ง€๋งŒ const fn ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์–ป์„ ์ˆ˜ํ•ด์„œ๋Š” ์•ˆ static ๋ฐ–์œผ๋กœ ํ—ˆ๊ณต์„ (๋ฅผ ํฌํ•จํ•˜์—ฌ const ).

๊ทธ๋Ÿฌ๋ฉด const , const fn ๋ฐ ๊ธฐํƒ€ ์ƒ์ˆ˜ ์ปจํ…์ŠคํŠธ(์Šน๊ฒฉ ํฌํ•จ)์—์„œ static ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ์ •์ ์œผ๋กœ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” static ๊ฐ€ ๋‹ค๋ฅธ static ์˜ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€๋งŒ (์ž˜๋ชป ์‹œ๋„ํ–ˆ์ง€๋งŒ ์‹คํŒจ) ํ•ด๋‹น ์ฐธ์กฐ ๋’ค์—์„œ ์ฝ๊ธฐ ๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋Š” STATIC_REF ํ•ดํ‚น์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. .

์ด๋ฅผ ์œ„ํ•ด RFC๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

์ •์ ์—์„œ ์ฝ๋Š” ๊ฒƒ์ด ๊ณต์ •ํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. RFC๊ฐ€ ํ•„์š”ํ•œ์ง€ ์˜์‹ฌ์ด ๋“ค์ง€๋งŒ ์•„๋งˆ๋„ ๋ถ„ํ™”๊ตฌ์—์„œ ๋›ฐ๋Š” ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์€ ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์ œํ•œ

์•„, ์ œ๊ฐ€ ์ž˜๋ชป ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ const ํ‰๊ฐ€๋Š” ์—ฌ์ „ํžˆ ๊ฑด์ „ํ•˜๊ณ  ์ฐธ์กฐ์ ์œผ๋กœ ํˆฌ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋งˆ์ง€๋ง‰ ๋‹จ๋ฝ์€ ์ฐธ์กฐ์ ์œผ๋กœ ํˆฌ๋ช…ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ const s ๋ฐ const fn s์—์„œ const static ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ํ•ด๋‹น ์†์„ฑ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค). ๊ฑด์ „์„ฑ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ๋ณ„๋กœ ์—†์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์š”.

๊ธ€์Ž„, "๋งค๋‹ฌ๋ฆฐ ํฌ์ธํ„ฐ"๋Š” ํ™•์‹คํžˆ ๊ฑด์ „์„ฑ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ, ์ด๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹น์‹ ์„ ๋ฏฟ๊ฒ ์Šต๋‹ˆ๋‹ค!

"dangling pointer"๋Š” ์ž˜๋ชป๋œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์ด๋ฉฐ static ์—์„œ ์ฝ๊ธฐ๋ฅผ ๊ธˆ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. static ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ƒ์ˆ˜ ์ปจํ…์ŠคํŠธ๋Š” ๋‹ค๋ฅธ static . ๋”ฐ๋ผ์„œ ํ•ด๋‹น ์ฝ”๋“œ๋Š” ๋ชจ๋‘ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ•ญ์ƒ ํ•œ ๋ฒˆ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ฝ๊ธฐ๋ฅผ "๊ทธ๋ƒฅ" ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(IRC์—์„œ) ์š”์•ฝํ•˜๋ฉด ์ฐธ์กฐ ํˆฌ๋ช… const fn ๋Š” ์ธ์ˆ˜๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๊ณ ์ • ํ• ๋‹น์—๋งŒ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, const ์—๋Š” ๋™์ผํ•œ ์ œํ•œ์ด ํ•„์š”ํ•˜๊ณ  ๊ณ ์ •๋˜์ง€ ์•Š์€ ํ• ๋‹น์€ static ์—์„œ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” @eddyb ์˜ ์•„์ด๋””์–ด๊ฐ€ ํ™˜์ƒ์ ์œผ๋กœ ๋“ค๋ฆฌ๋„๋ก ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค!

์˜ˆ, ์ €๋Š” const 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
}

์ด๊ฒƒ์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— miri ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„์—๋Š” ๋น„๊ฒฐ์ •์ ์ž…๋‹ˆ๋‹ค(๋ฏธ๋ฆฌ์ฒ˜๋Ÿผ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ "์ถ”์ƒ"์œผ๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—).

ํŽธ์ง‘ : @Centril ์€ unsafe ๋‚ด์—์„œ ํŠน์ • ์›์‹œ ํฌ์ธํ„ฐ ์ž‘์—…(์˜ˆ: ๋น„๊ต ๋ฐ โ€‹โ€‹์ •์ˆ˜๋กœ ๋ณ€ํ™˜)์„ unsafe const fn ( const fn ์•ˆ์ •ํ™”๋  ๋•Œ๊นŒ์ง€ ํ•  ์ˆ˜ ์žˆ์Œ) ), ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ฏธ๋ฆฌ๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ๋‘ ํฌ์ธํ„ฐ๋ฅผ ๋™์ผํ•œ ๋กœ์ปฌ๋กœ ๋นผ๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์ง€๋งŒ(์œ ํ˜• ๋ ˆ์ด์•„์›ƒ, ๋ฐฐ์—ด ์ธ๋ฑ์Šค ๋“ฑ์— ์˜์กดํ•˜๋Š” ์ƒ๋Œ€ ๊ฑฐ๋ฆฌ๋งŒ ์–ป์Œ) ์ฐธ์กฐ ์ฃผ์†Œ ํ˜•์‹ ์ง€์ •( {:p} ) ๋Š” ์ž˜๋ชป๋œ ์‚ฌ์šฉ์ด๋ฏ€๋กœ fmt::Pointer::fmt ๋ฅผ const fn ๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์›์‹œ ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ Ord / Eq ํŠน์„ฑ impls๋Š” ์•ˆ์ „ํ•˜๊ธฐ ๋•Œ๋ฌธ์— const ๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž‘์—…์€ unsafe ์—์„œ const fn ์ž…๋‹ˆ๋‹ค.

"๋ฌดํ•ดํ•œ"์ด๋ž€ ๋ง์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค... ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋Ÿฌํ•œ ๋น„๊ฒฐ์ •์  ํ–‰๋™์„ ๊ธˆ์ง€ํ•˜๋ ค๋Š” ์ด์œ ๋ฅผ ํ™•์‹คํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์ด ๊ณ„์†๋œ๋‹ค๋ฉด ํ™˜์ƒ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@lachlansneff ์›€์ง์ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค... ์›ํ•˜๋Š” ๋งŒํผ https://github.com/rust-lang/rust/pull/51110 ์—์„œ ์ฐจ๋‹จ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@alexreg ์•„, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ผ์น˜๋ฅผ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ const fn์— ์žˆ์ง€ ์•Š์„ ๋•Œ๋„ const๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

#51110์ด ๋ณ‘ํ•ฉ๋œ ์ง€๊ธˆ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@programmerjake ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „์— https://github.com/rust-lang/rust/pull/52518 ์—์„œ @eddyb์˜ ํ”ผ๋“œ๋ฐฑ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ์ตœ๊ทผ์— ๋งค์šฐ ๋ฐ”๋นด์Šต๋‹ˆ๋‹ค(ํ•ญ์ƒ ๋†’์€ ์ˆ˜์š”๊ฐ€ ์žˆ์Œ). ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Š” ์ง€๋‚œ ๋ฉฐ์น  ๋™์•ˆ ๋ฆฌ๋ทฐ์™€ ๊ธฐํƒ€ ๋“ฑ๋“ฑ์œผ๋กœ ๋Œ์•„์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ํฌ๋ง์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ํ›„์—๋Š” ์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ถ„์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋ณต์žกํ•œ ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ์ธ์ ์œผ๋กœ ์•ฝ๊ฐ„์˜ ์ž‘์—…์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋ณด์ž.

์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ์˜ TODO ๋ชฉ๋ก ์–ด๋”˜๊ฐ€์— && ๋ฐ || ๋ฅผ & ๋ฐ | ๋ณ€ํ™˜ํ•˜๋Š” ํ˜„์žฌ์˜ ๋”์ฐํ•œ ํ•ดํ‚น์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@RalfJung ์ด์ „ const eval์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ

AFAIK ์šฐ๋ฆฌ๋Š” const_qualify ์— || / && ์˜ํ•ด ์ƒ์„ฑ๋  SwitchInt ์ข…๊ฒฐ์ž๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— HIR ๋‚ฎ์ถ”๊ธฐ์˜ ์–ด๋”˜๊ฐ€์—์„œ ํ•ด๋‹น ๋ฒˆ์—ญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ๋˜ ๋‹ค๋ฅธ ์š”์ : @oli-obk๋Š” ์กฐ๊ฑด๋ถ€๊ฐ€ ์ˆœ์ง„ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์–ด๋–ป๊ฒŒ ๋“  ๋” ๋ณต์žกํ•˜๋‹ค๊ณ  ์–ด๋”˜๊ฐ€์— (ํ•˜์ง€๋งŒ ์–ด๋””์—์„œ ์ฐพ์„ ์ˆ˜ ์—†์Œ) ๋งํ–ˆ์Šต๋‹ˆ๋‹ค ... ๋“œ๋กญ / ๋‚ด๋ถ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•œ ๋ถ„์„์— ๋Œ€ํ•œ "๊ทธ๋ƒฅ"์ด์—ˆ์Šต๋‹ˆ๊นŒ?

๋‚™ํ•˜/๋‚ด๋ถ€ ๊ฐ€๋ณ€์„ฑ์— ๋Œ€ํ•œ ๋ถ„์„์— ๋Œ€ํ•œ "๊ทธ๋ƒฅ"์ด์—ˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ํ˜„์žฌ ๊ทธ๊ฒƒ์„ ์ง€์šฐ๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ •๋ณด๊ฐ€ ํ™•๋ณด๋˜๋ฉด ๋‹ค์‹œ ์—ฐ๋ฝ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ์ƒํƒœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ธ๋ ฅ์ด ํ•„์š”ํ•œ ๊ฑธ๊นŒ์š”, ์•„๋‹ˆ๋ฉด ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋ง‰ํžŒ ๊ฑธ๊นŒ์š”?

@mark-im const ์ž๊ฒฉ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ถ„์„ ๊ตฌํ˜„์ด ์ฐจ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. @eddyb ๋Š” ์ด ๋ถ„์•ผ์—์„œ ๊ฐ€์žฅ ์ง€์‹์ด ํ’๋ถ€ํ•˜๋ฉฐ ์ด์ „์— ์ด์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. (๋‚˜๋„ ๊ทธ๋žฌ์ง€๋งŒ ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์ •์ฒด๋Š”...) @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 ๋Š” ์ด๋ฏธ asize ์บ์ŠคํŠธ๋ฅผ ๋ถˆ์•ˆ์ •ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”

์ด๊ฒƒ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

https://rust-lang.zulipchat.com/#narrow/stream/146212 -t-compiler.2Fconst-eval/topic/dataflow-based.20const.20qualification.20MVP์— ๋Œ€ํ•œ ํ† ๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@oli-obk ๋งํฌ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฌด์—‡์„ ๋งํ•˜๋Š”๊ฐ€?

๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ... ๊ทธ๋Ÿฌ๋‚˜ Zulip์— ๋กœ๊ทธ์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@alexreg ํ  ์˜ˆ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๊ธฐ๋ฐ˜ const ์ž๊ฒฉ ์ž‘์—…์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. @alexreg ์ƒ์ˆ˜์—์„œ if ๋ฐ match์— ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฐ์ดํ„ฐ ํ๋ฆ„ ๊ธฐ๋ฐ˜ ๋ฒ„์ „์ด ์—†์œผ๋ฉด ์‹ค์ˆ˜๋กœ ์ƒ์ˆ˜ ๋‚ด๋ถ€์—์„œ &Cell<T> ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ์‹ค์ˆ˜๋กœ None::<&Cell<T>> ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค(์•ˆ์ •์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์—†์ด ์ œ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ์ž˜๋ชป๋œ ์ž„์‹œ ๋ฒ„์ „์ด์–ด์•ผ ํ•จ)

@est31 ๊ธ€์Ž„์š”, @oli-obk๋Š” ์ด๊ฒƒ์„ ์ €๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ž˜ ์ดํ•ดํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถ„๊ธฐ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฒƒ์€ ๋‹น์‹ ์ด ๋งŽ์€ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ถ„์„์„ ์ „์ œ๋กœ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“ , Zulip์˜ ์ด ์‚ฌ๋žŒ์ด ์ž‘์—…ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด oli-obk์™€ eddyb๊ฐ€ ์˜๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๋ฒˆ ๋‹ฌ์ด๋‚˜ ๋‹ค์Œ(๋‚ด๊ฐ€ ๊ทธ๋“ค์—๊ฒŒ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ด์•ผ๊ธฐํ–ˆ์„ ๋•Œ๋ถ€ํ„ฐ)์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. '/๊ทธ๋“ค์„ ๋Œ€์‹ ํ•˜์—ฌ ์•ฝ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@alexreg @mark-im @est31 @oli-obk ์ด๋ฒˆ ์ฃผ ์–ธ์  ๊ฐ€ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๊ธฐ๋ฐ˜ const ์ž๊ฒฉ์˜ WIP ๊ตฌํ˜„์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋งŽ์€ ํ˜ธํ™˜์„ฑ ์œ„ํ—˜์ด ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ๋…์ž; ๊ทธ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•˜๋‹ค.

(์š”์ฒญ๋‹น #57563์—์„œ ๋ณต์‚ฌ)

bool && bool , bool || bool ๋“ฑ์˜ ํŠน์ˆ˜ ์ผ€์ด์Šค๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? ํ˜„์žฌ const fn ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋น„ํŠธ ์—ฐ์‚ฐ์ž๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ด๋Š” ๋•Œ๋•Œ๋กœ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

const ๋ฐ static ํ•ญ๋ชฉ์€ ์ด๋ฏธ ํŠน์ˆ˜ ์ผ€์ด์Šค๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋น„ํŠธ ์—ฐ์‚ฐ์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ํŠน์ˆ˜ ์ผ€์ด์Šค๋Š” ์—„์ฒญ๋‚œ ํ•ดํ‚น์ด๋ฉฐ ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ๋•Œ๋กœ๋Š” ์›์น˜ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์ž‘์—…์„ ๋” ์ž์ฃผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ผ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€๋งŒ ์ผ์–ด๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์‚ฌ์ด์— ํ•ดํ‚น์„ ๋„ˆ๋ฌด ๋งŽ์ด ํ•˜๋ฉด ๋น ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ถ์ง€์— ๋ชฐ๋ฆฌ๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(ํ•ด๋‹น ํ•ดํ‚น ์ค‘ ์ผ๋ถ€๊ฐ€ ์ž˜๋ชป๋œ ๋ฐฉ์‹์œผ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•˜์—ฌ ์‹ค์ˆ˜๋กœ ์›ํ•˜์ง€ ์•Š๋Š” ๋™์ž‘์„ ์•ˆ์ •ํ™”ํ•˜๋Š” ๊ฒฝ์šฐ).

์ด์ œ #64470๊ณผ #63812๊ฐ€ ๋ณ‘ํ•ฉ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋„๊ตฌ๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋น„ํšจ์œจ์ ์ด์ง€ ์•Š๋„๋ก const ์ž๊ฒฉ๊ณผ ๊ด€๋ จ๋œ ์ฟผ๋ฆฌ ์‹œ์Šคํ…œ์„ ์•ฝ๊ฐ„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์—์„œ ์ง„์ „์„ ์ด๋ฃจ๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ์˜ ์‹คํ—˜์  ๊ตฌํ˜„์€ ๋ช‡ ๋‹ฌ์ด ์•„๋‹ˆ๋ผ ๋ช‡ ์ฃผ ์•ˆ์— ๋ฐค๋งˆ๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค(์œ ๋ช…ํ•œ ๋งˆ์ง€๋ง‰ ๋‹จ์–ด:smile:).

@ecstatic-morse ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค! ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ˜‘๋ ฅํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ž ์‹œ ๋™์•ˆ ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„ CTFE์— ๋Œ€ํ•œ ํž™ ํ• ๋‹น ์ง€์›์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด๋‚˜ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ์ž‘์—…์— ๊ด€์‹ฌ์ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋‚ด๊ฐ€ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@alexreg ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ปดํŒŒ์ผ ์‹œ ํž™ ํ• ๋‹น์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” rust-rfcs/const-eval#20์—์„œ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. AFAIK, ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ๋ฐœ์ „์€ ์ฃผ๋ณ€์— ์žˆ์—ˆ๋‹ค ConstSafe / ConstRefSafe a์˜ ์ตœ์ข… ๊ฐ’์˜ ์ฐธ์กฐ ๋’ค์— / ์ง์ ‘ ๊ด€์ฐฐ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒฐ์ • ํŒจ๋Ÿฌ๋‹ค์ž„ const . ๊ทธ๋ž˜๋„ ๋””์ž์ธ ์ž‘์—…์ด ๋” ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์˜ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด #65949(๊ทธ ์ž์ฒด๊ฐ€ ๋ช‡ ๊ฐœ์˜ ๋” ์ž‘์€ PR์— ์ข…์†๋จ)๊ฐ€ ์ด์— ๋Œ€ํ•œ ๋‹ค์Œ ์ฐจ๋‹จ๊ธฐ์ž…๋‹ˆ๋‹ค. ์ ‘์„ ์ ์œผ๋กœ๋งŒ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ const-checking/qualification์ด ํ”„๋กœ๋ชจ์…˜๊ณผ ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์ด ๊ธฐ๋Šฅ์ด ์˜ค๋žซ๋™์•ˆ ์ฐจ๋‹จ๋œ ์ด์œ  ์ค‘ ์ผ๋ถ€์˜€์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด์ „ const-checker๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋Š” ํ›„์† PR์„ ์—ด ๊ณ„ํš์ž…๋‹ˆ๋‹ค(ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค). ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋น„ํšจ์œจ์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋‘ PR์ด ๋ณ‘ํ•ฉ๋œ ํ›„ ์ƒ์ˆ˜์—์„œ if ๋ฐ match ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ง„๋‹จ ๊ฐœ์„  ์‚ฌํ•ญ๊ณผ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค! ์•„, ๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ๋„ ๋งŽ์ด ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋„ ๋งŽ์ด ํ•˜๊ณ ...

ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ์‹œ์ž‘ํ•ด์•ผ ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๊ธฐ๊บผ์ด ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋””๋กœ ๊ฐ€์•ผ ํ•˜๋Š”์ง€/์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€/์–ด๋–ค ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. :)

๋‹ค์Œ PR์€ #66385์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒˆ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๊ธฐ๋ฐ˜ ๋ฒ„์ „์„ ์œ„ํ•ด ์ด์ „ const ์ž๊ฒฉ ๋…ผ๋ฆฌ(๋ถ„๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Œ)๊ฐ€ ์™„์ „ํžˆ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

@jyn514 ๋Œ€๋‹จํ•˜๊ตฐ์š” ! ๊ตฌํ˜„ ์ดˆ์•ˆ ์ž‘์„ฑ์„ ์‹œ์ž‘ํ•  ๋•Œ ping์„ ๋ณด๋‚ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์•ผ๊ฐ„์— if ๋ฐ match ๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด const ์•ˆ์ „ (ํŠนํžˆ HasMutInterior ๋ถ€๋ถ„)์„ ์œ„๋ฐ˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒƒ๋„ ๋งค์šฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

66507์—๋Š” RFC 2342์˜ ์ดˆ๊ธฐ ๊ตฌํ˜„์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ์ง„๋‹จ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ฑฐ์นœ ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ณ  ํ…Œ์ŠคํŠธ ๋ฒ”์œ„๊ฐ€ ๋งค์šฐ ํฌ๋ฐ•ํ•ฉ๋‹ˆ๋‹ค( @jyn514 ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•ด ์กฐ์ •ํ•ด์•ผ ํ•จ). ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์•ž์œผ๋กœ ๋ช‡ ์ฃผ ์•ˆ์— ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ๋’ค์— ์ด๋ฅผ ๋ฆด๋ฆฌ์Šคํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ #66507์—์„œ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ ์ด์ œ ์ตœ์‹  nightly ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ž‘์—…๊ณผ ๋‚ด๋ถ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ Drop impl์ด ์žˆ๋Š” ์œ ํ˜•๊ณผ ๊ด€๋ จ๋œ ๊ธฐ์กด ๊ตฌํ˜„์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋Š” Inside Rust ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์„œ ๊ตฌ์„ฑํ•˜๋ผ!

ํ‰๋“ฑ์ด 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

@mark-im ์‹ค์ œ๋กœ ์ž‘๋™ ํ•ด์•ผ

์ด๊ฒƒ์ด ์˜๋„์ ์ธ ๊ฒƒ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์—ด๊ฑฐํ˜•๊ณผ ์ผ์น˜์‹œํ‚ค๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” 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 ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์†Œ๋ฉธ์ž๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ํ˜• ๊ธฐ๋ฐ˜ ๋ถ„์„์ด ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„๊ธฐ๊ฐ€ ์žˆ๋Š” ์ˆœ๊ฐ„ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๋ถ„์„์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฑฐ๋ถ€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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=518926a27c&end=51cf46 ์ด๊ฒƒ์€ const fn ๊ฐ€ ๋˜์ง€๋„ ์•Š์„ ์ˆ˜๋„ ์—†๋Š” ํ•จ์ˆ˜์—์„œ๋„ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ด€์ ์ธ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

์ฆ‰, const fn ํ•จ์ˆ˜๋ฅผ ๋งŽ์ด ๋งŒ๋“ค๋ฉด ์ด ๊ฐ’ ๊ธฐ๋ฐ˜ ๋ถ„์„์œผ๋กœ ์ธํ•ด ์ปดํŒŒ์ผ ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘๊ฐ„ ๊ทผ๊ฑฐ๋Š” ์œ ํ˜• ๊ธฐ๋ฐ˜ ๋ถ„์„์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€์น˜ ๊ธฐ๋ฐ˜ ๋ถ„์„์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์†Œ๋ฉธ์ž๊ฐ€ ์—†์œผ๋ฉด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์†Œ๋ฉธ์ž๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ’ ๊ธฐ๋ฐ˜ ๋ถ„์„์„ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(์˜ˆ, ์—ฌ๊ธฐ์—์„œ ๋งŽ์€ ๋ถ€์ •). ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•˜์ž๋ฉด ์†Œ๋ฉธ์ž๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€์น˜ ๊ธฐ๋ฐ˜ ๋ถ„์„์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ @rust-lang/lang ํ† ๋ก ์„ ์œ„ํ•ด ์ง€๋ช…ํ•˜์—ฌ ์šฐ๋ฆฌ๊ฐ€ ํ•จ๊ป˜ ๊ฐ€๊ณ  ์‹ถ์€์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฃจํ”„ ๋˜๋Š” ๋ถ„๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์œ ํ˜• ๊ธฐ๋ฐ˜ ์˜ต์…˜(์‚ฌ์šฉ์ž์—๊ฒŒ ์ด์ƒํ•œ ๋™์ž‘ ์ œ๊ณต)
  • ์ „์ฒด ๊ฐ€์น˜ ๊ธฐ๋ฐ˜ ๋ถ„์„(๋” ๋น„์‹ธ์ง€๋งŒ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์™„์ „ํ•œ ํ‘œํ˜„๋ ฅ)
  • ํ˜ผํ•ฉ ๊ตฌ์„ฑํ‘œ, ์—ฌ์ „ํžˆ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์™„์ „ํ•œ ํ‘œํ˜„, ์ผ๋ถ€ ์ถ”๊ฐ€ impl ๋ณต์žก์„ฑ, ๊ทธ๋Ÿฌ๋‚˜ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋ฌธ์ œ๋ฅผ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@oli-obk

๋ฃจํ”„ ๋˜๋Š” ๋ถ„๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์œ ํ˜• ๊ธฐ๋ฐ˜ ์˜ต์…˜(์‚ฌ์šฉ์ž์—๊ฒŒ ์ด์ƒํ•œ ๋™์ž‘ ์ œ๊ณต)

์ด๊ฒƒ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด : ์ง์„  ์ฝ”๋“œ์—์„œ๋„ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๋ถ„์„์„ํ•˜๋Š” ๊ฒƒ์€ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๋‹ค์Œ( ๋†€์ดํ„ฐ )์„ ์ˆ˜๋ฝํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

struct Foo { }

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

const T: Option<Foo> = None;

fn main() { }

๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋” ์ผ๊ด€๋˜๊ณ  ๋” ๋‚˜์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•„์š”์— ๋”ฐ๋ผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๊ณ  ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ๋น„์šฉ์ด ๊ทธ๋ฆฌ ๋‚˜์˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋” ๋น„์‹ผ ๋ถ„์„์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์กฐ๊ธˆ ๋” ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ "์ผ์ •ํ•œ ์ „ํŒŒ"๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์œผ๋กœ, ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋–จ์–ด์งˆ ๋•Œ๋งˆ๋‹ค ๋“œ๋กญ๋˜๋Š” ์ •ํ™•ํ•œ ๊ฐ’์„ ๋ถ„์„ํ•˜์—ฌ ์†Œ๋ฉธ์ž๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฐ’์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (์ฆ‰, None ์ธ ๊ฒฝ์šฐ Option<T> ์˜ ์ผ๋ฐ˜์ ์ธ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด)

์ด๊ฒƒ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด : ์ง์„  ์ฝ”๋“œ์—์„œ๋„ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๋ถ„์„์„ํ•˜๋Š” ๊ฒƒ์€ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๋‹ค์Œ(๋†€์ดํ„ฐ)์„ ์ˆ˜๋ฝํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์ข…๋ฅ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์™„์ „ํžˆ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๋ถ„์„์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ "์ผ์ •ํ•œ ์ „ํŒŒ"๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€๊ฐ€ ์‚ญ์ œ๋  ๋•Œ๋งˆ๋‹ค ์‚ญ์ œ๋˜๋Š” ์ •ํ™•ํ•œ ๊ฐ’์„ ๋ถ„์„ํ•˜์—ฌ ์†Œ๋ฉธ์ž๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฐ’์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? (์ฆ‰, None์ธ ๊ฒฝ์šฐ 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 ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ง€์†์ ์ธ ์ „ํŒŒ๋Š” ์ข‹์€ ๋น„์œ ์ž…๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ๊ฐ„์˜ ์ƒํƒœ ๋ณต์‚ฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” gen/kill ์„ธํŠธ๋กœ ์ „๋‹ฌ ํ•จ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ผ์ •ํ•œ ์ „ํŒŒ ๊ฐ ๋ณ€์ˆ˜์˜ ์‹ค์ œ ๊ฐ’์„ ์ €์žฅํ•ด์•ผํ•˜์ง€๋งŒ, CONST ๊ฒ€์‚ฌ๋ฟ๋งŒ ๋‹จ์ผ ๋น„ํŠธ๊ฐ€ ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ €์žฅํ•ด์•ผ 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 ์ปจํ…์ŠคํŠธ ์—์„œ ์œ ํšจ

  • const , static , static mut ๋˜๋Š” ์—ด๊ฑฐํ˜• ํŒ๋ณ„์ž์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €.
  • const fn ์˜ ๋ณธ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • const ์ œ๋„ค๋ฆญ์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค(์•ผ๊ฐ„ ์ „์šฉ).
  • ๋ฐฐ์—ด ์œ ํ˜•( [u8; 3] ) ๋˜๋Š” ๋ฐฐ์—ด ๋ฐ˜๋ณต ํ‘œํ˜„์‹( [0u8; 3] )์˜ ๊ธธ์ด์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ, ๋‹จ๋ฝ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋Š” ๋” ์ด์ƒ const ๋ฐ static ์ด๋‹ˆ์…œ๋ผ์ด์ €์—์„œ ํ•ด๋‹นํ•˜๋Š” ๋น„ํŠธ ๋‹จ์œ„(๊ฐ๊ฐ & ๋ฐ | )๋กœ ๋‚ฎ์•„์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ฐธ์กฐ #57175). ๊ฒฐ๊ณผ์ ์œผ๋กœ let ๋ฐ”์ธ๋”ฉ์€ ํ•ด๋‹น ์ด๋‹ˆ์…œ๋ผ์ด์ €์—์„œ ๋‹จ๋ฝ ๋…ผ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์  ๋ฌธ์ œ: #49146
๋ฒ„์ „ ๋Œ€์ƒ: 1.45 (2020-06-16)

๊ตฌํ˜„ ์ด๋ ฅ

64470์€ ์กฐ๊ฑด๋ถ€ ์ œ์–ด ํ๋ฆ„์„ ์ง€์›ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ฐ’ ๊ธฐ๋ฐ˜ ์ •์  ๋ถ„์„์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ #63812์™€ ํ•จ๊ป˜ ๋ณต์žกํ•œ ์ œ์–ด ํ๋ฆ„ ๊ทธ๋ž˜ํ”„์—์„œ ์ž‘๋™ํ•˜๋Š” ์˜ค๋ž˜๋œ const-checking ์ฝ”๋“œ๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด const-checker๋Š” ๊ฐ„๋‹จํ•œ ์ œ์–ด ํ๋ฆ„์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์— ๋™์˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๊ธฐ๋ฐ˜์˜ ๊ฒƒ๊ณผ ๋ณ‘๋ ฌ๋กœ ํ•œ๋™์•ˆ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. #66385 ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๊ธฐ๋ฐ˜์„ ์œ„ํ•ด ์ด์ „ const-checker๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.

66507์€ ํ˜„์žฌ ์•ˆ์ •ํ™”๋ฅผ ์œ„ํ•ด ์ œ์•ˆ๋˜๊ณ  ์žˆ๋Š” ์˜๋ฏธ ์ฒด๊ณ„๋กœ #![feature(const_if_match)] ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Const ์ž๊ฒฉ

๋ฐฐ๊ฒฝ

[Miri]๋Š” ๋ช‡ ๋…„ ๋™์•ˆ rustc ์—์„œ CTFE(์ปดํŒŒ์ผ ํƒ€์ž„ ํ•จ์ˆ˜ ํ‰๊ฐ€)๋ฅผ ์ œ๊ณตํ–ˆ์œผ๋ฉฐ ์ ์–ด๋„ ๊ทธ ๊ธฐ๊ฐ„ ๋™์•ˆ ์กฐ๊ฑด๋ฌธ์„ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. CTFE ๋™์•ˆ ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ Drop impls๋ฅผ ํ˜ธ์ถœ ํ•˜๊ฑฐ๋‚˜ ๋‚ด๋ถ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฐ’์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํŠน์ • ์ž‘์—…์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง‘ํ•ฉ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๋ถ€์ ๊ฒฉ ์†์„ฑ์„ "์ž๊ฒฉ"์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ์˜ ํŠน์ • ์ง€์ ์—์„œ ๊ฐ’์— ์ž๊ฒฉ์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ "const ์ž๊ฒฉ"์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Miri๋Š” ๊ทœ์ •๋œ ๊ฐ’์— ๋Œ€ํ•ด ์ž˜๋ชป๋œ ์—ฐ์‚ฐ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์˜คํƒ ์—†์ด ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ CTFE๋Š” ๋‹จํ˜•ํ™” ํ›„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ์ƒ์ž์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ๊นŒ์ง€ ์ผ๋ฐ˜ ์ปจํ…์ŠคํŠธ์— ์ •์˜๋œ ์ƒ์ˆ˜๊ฐ€ ์œ ํšจํ•œ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. pre-monomorphization ์˜ค๋ฅ˜๋ฅผ ์–ป์œผ๋ ค๋ฉด const ์ž๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ •์  ๋ถ„์„์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ const ์ž๊ฒฉ์€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ( Rice์˜ ์ •๋ฆฌ ์ฐธ์กฐ) ๋ชจ๋“  ์ •์  ๋ถ„์„์€ Miri๊ฐ€ 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๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ const ํ™•์ธ๋˜์ง€ ์•Š๊ณ  const ์ปจํ…์ŠคํŠธ์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ€์น˜ ๊ธฐ๋ฐ˜ ์ถ”๋ก ์ด let ๋ฌธ์„ ์ง€์›ํ•˜๋„๋ก ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค์Œ ์€ rust 1.42.0 stable ์—์„œ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค .

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);
}

์ด ๋ถ„์„์€ ๋ฐ˜ํ™˜ ๊ฐ’์— ํ•ด๋‹น ์œ ํ˜•์˜ ๊ฐ’์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋ถˆํˆฌ๋ช…ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ฐธ์กฐ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์ฆ‰์‹œ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๋ถ„์„์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. const ์ปจํ…์ŠคํŠธ์—์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ฐธ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ํ˜„์žฌ ์•ˆ์ •์ ์ธ ๋…น์—์„œ ๊ธˆ์ง€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

#![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)
}

๊ฐ’ ๊ธฐ๋ฐ˜ ๋ถ„์„์ด ๋‚ด๋ถ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ ๋ฐ ์‚ฌ์šฉ์ž ์ง€์ • drop impls์— ๋Œ€ํ•ด ๋ณด์ˆ˜์ ์ธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์˜ˆ์™€ ๋ณด์ˆ˜์  ๋ถ„์„์ด ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์—์„œ ๋ถˆ๋ฒ•์ ์ธ ์ผ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์—†์Œ ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ถ€ ๊ฒฝ์šฐ๋ฅผ

๋Œ€์•ˆ

๊ธฐ์กด ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์‹ค์šฉ์ ์ด๊ณ  ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋Œ€์•ˆ์„ ์ฐพ๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. const ์ปจํ…์ŠคํŠธ์—์„œ ์กฐ๊ฑด๋ฌธ์ด ์‚ฌ์šฉ๋˜์ž๋งˆ์ž ๋ชจ๋“  ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๋ถ„์„์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ๊ด€๋ จ์ด ์—†์–ด ๋ณด์ด๋Š” ์ถ”๊ฐ€๋กœ ์ธํ•ด ์ฝ”๋“œ๊ฐ€ ๋” ์ด์ƒ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๊ฒŒ ๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: @oli-obk์˜ ๋‹ค์Œ ์˜ˆ์ œ์—์„œ assert .

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

๊ฐ€์น˜ ๊ธฐ๋ฐ˜ ๋ถ„์„์˜ ํ‘œํ˜„๋ ฅ ์ฆ๊ฐ€๋Š” ๊ณต์งœ๊ฐ€ ์•„๋‹ˆ๋‹ค. const ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ํ•ญ๋ชฉ ๋ณธ๋ฌธ์— ๋Œ€ํ•ด const ์ž๊ฒฉ์„ ์ˆ˜ํ–‰ํ•œ perf ์‹คํ–‰์€ ๋นŒ๋“œ ํ™•์ธ ์—์„œ ์ตœ๋Œ€ const ๋กœ ๋งŒ๋“ค์–ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์•…์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค. #71330์— ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐ€๋Šฅํ•œ ์ตœ์ ํ™”๋Š” ์Šค๋ ˆ๋“œ์˜ ์•ž๋ถ€๋ถ„์—์„œ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ž˜ ์ž‘์—…

ํ˜„์žฌ const-checking์€ drop elaboration ์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์‹ค์ œ๋กœ๋Š” ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ์ผ๋ถ€ drop terminator๊ฐ€ MIR์— ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Option::unwrap ๊ฐ€ const fn ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค(#66753 ์ฐธ์กฐ). ์ด๊ฒƒ์€ ํ•ด๊ฒฐํ•˜๊ธฐ๊ฐ€ ๊ทธ๋ฆฌ ์–ด๋ ต์ง€๋Š” ์•Š์ง€๋งŒ const-checking ํŒจ์Šค๋ฅผ ๋‘ ๋‹จ๊ณ„(์‚ญ์ œ ์ „ ๋ฐ ํ›„ ์ •๊ตํ™”)๋กœ ๋ถ„ํ• ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

#![feature(const_if_match)] ๊ฐ€ ์•ˆ์ •ํ™”๋˜๋ฉด ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋ฅผ const fn ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” #53718์— ์—ด๊ฑฐ๋œ ์›์‹œ ์ •์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•œ ๋งŽ์€ ๋ฉ”์†Œ๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

const ์ปจํ…์ŠคํŠธ์˜ ๋ฃจํ”„๋Š” ์กฐ๊ฑด๋ฌธ๊ณผ ๋™์ผํ•œ const ์ž๊ฒฉ ์งˆ๋ฌธ์—์„œ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ˆ˜์ • ์—†์ด ์ˆœํ™˜ CFG์—๋„ ์ž‘๋™ํ•˜๋ฏ€๋กœ #![feature(const_if_match)] ๊ฐ€ ์•ˆ์ •ํ™”๋˜๋ฉด #52000์— ๋Œ€ํ•œ ์ฃผ์š” ์ฐจ๋‹จ๊ธฐ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๊ฐ์‚ฌ์˜ ๋ง

ํŠน๋ณ„ ๊ฐ์‚ฌ๋Š” ๊ตฌํ˜„ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๊ฒ€ํ† ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋‚˜๋ฅผ const๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ์ดํ•ด ๋•๋Š” @ ๋…น LANG / WG-const๋ฅผ-ํ‰๊ฐ€์˜ ๋‚˜๋จธ์ง€์ด์—ˆ๋‹ค @ OLI-OBK์™€ @eddyb์— ๊ธฐ์ธ ์ž๊ฒฉ. @solson์ด ๋งŒ๋“ค๊ณ  ํ˜„์žฌ @RalfJung ๊ณผ @oli-obk๊ฐ€ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” Miri ์—†์ด๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ FCP ์ด์ „์˜ ์•ˆ์ •ํ™” ๋ณด๊ณ ์„œ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ FCP๋ฅผ ์—ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@ecstatic-morse ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋…ธ๊ณ ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์ข‹์€ ๋ณด๊ณ ์„œ!

๋‚ด๊ฐ€ ๋ณด๊ณ  ์‹ถ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ํ•œ ๊ฐ€์ง€๋Š” @ecstatic-morse์ž…๋‹ˆ๋‹ค.

  • ๋™์ž‘์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋„๋ก repo์˜ ์ผ๋ถ€ ๋Œ€ํ‘œ์ ์ธ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ๋งํฌ
  • semver ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์— ๋Œ€ํ•œ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ - ๋Œ€๋‹ต์€ ๋Œ€์ฒด๋กœ ์•„๋‹ˆ์˜ค ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ? ์ฆ‰, ์šฐ๋ฆฌ๋Š” const fn์˜ ๋ณธ๋ฌธ์ด ํ•ฉ๋ฒ•์ ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ถ„์„์„ ๊ฒฐ์ •ํ•˜์ง€๋งŒ const fn์ด ์ฃผ์–ด์ง€๋ฉด ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ์˜ ์„ ํƒ์€ "const fn์˜ ํ˜ธ์ถœ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…"๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ"๋ผ๊ณ ์š”? ๋‚˜๋Š” ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์˜ ์˜ˆ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„ ๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅ ์ค‘์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๋Š” ์—ด๊ฑฐ ํ˜•์˜ ์–ด๋–ค ๋ณ€ํ˜•์ด ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์ด ๋ฌด์—‡์ด๋“  ๋ฐ˜ํ™˜๋จ -- ๋‚ด๋ถ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค(๋งค์นญํ•  ๋•Œ ์˜์กดํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—).

์ฆ‰, ์šฐ๋ฆฌ๋Š” const fn์˜ ๋ณธ๋ฌธ์ด ํ•ฉ๋ฒ•์ ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ถ„์„์„ ๊ฒฐ์ •ํ•˜์ง€๋งŒ const fn์ด ์ฃผ์–ด์ง€๋ฉด ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ์˜ ์„ ํƒ์€ "const fn์˜ ํ˜ธ์ถœ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…"๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ"๋ผ๊ณ ์š”? ๋‚˜๋Š” ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์˜ ์˜ˆ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„ ๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅ ์ค‘์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๋Š” ์—ด๊ฑฐ ํ˜•์˜ ์–ด๋–ค ๋ณ€ํ˜•์ด ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์ด ๋ฌด์—‡์ด๋“  ๋ฐ˜ํ™˜๋จ -- ๋‚ด๋ถ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค(๋งค์นญํ•  ๋•Œ ์˜์กดํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—).

์˜ˆ, 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 ์˜ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์— ๋Œ€ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•ด๋‹น const fn ๋‚ด๋ถ€์—์„œ ํ—ˆ์šฉ๋˜๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋ช‡ ๊ฐ€์ง€ ๋Œ€ํ‘œ์ ์ธ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ํ†ตํ•ด ๋™์ž‘์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กœ์šด ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€๋กœ ์—ฐ๊ฒฐ๋˜๋Š” "Current Nightly Semantics" ์„น์…˜์˜ ๋์— ๋‹จ๋ฝ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์•ˆ์ •ํ™”๋˜๊ธฐ ์ „์— ๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ(์ƒํ™ฉ์— ๊ด€๊ณ„์—†์ด ์‚ฌ์‹ค์ธ ์ง„์ˆ )๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ํ˜„์žฌ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ๋ฐ”๋žŒ์งํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

semver ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์— ๋Œ€ํ•œ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€.

์œ„์—์„œ @oli-obk๊ฐ€ ๋งํ•œ ๊ฒƒ ์™ธ์—๋„ 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`

๊ทธ๋Ÿฌ๋‚˜ ์™„๋ฒฝํ•œ ์ •๋ฐ€๋„๋กœ const ํ•œ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— 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 ๋Œ€ํ•œ ์œ ํ˜• ๊ธฐ๋ฐ˜ ์ž๊ฒฉ์œผ๋กœ ๋˜๋Œ์•„๊ฐ€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ 1.0๋ถ€ํ„ฐ ๊ทธ๋žฌ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ , ๊ฝค ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ๊ทธ๊ฒƒ์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ •์  ๋ถ„์„์ด ์™„๋ฒฝํ•˜๊ฒŒ ์ •ํ™•ํ•  ์ˆ˜ ์—†๋Š” const ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ํ—ˆ์šฉํ•˜์ž๋งˆ์ž ์ •์  ๋ถ„์„์ด ์ฆ๋ช…ํ•  ์ˆ˜ ์—†๋Š” ๋™์ผํ•œ ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๋‹น ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค:

์ด์™€ ๊ด€๋ จํ•˜์—ฌ 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); };

@ecstatic-morse ์•ˆ์ •ํ™” ๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋น„๋™๊ธฐ์‹์œผ๋กœ ํ•ฉ์˜๋ฅผ ์ธก์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@rfcbot ๋ณ‘ํ•ฉ

ํšŒ์˜์—์„œ ๋™์‹œ์— ์ด๋ฅผ ๋…ผ์˜ํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ๋‹ค์‹œ ์ง€๋ช…ํ•˜์‹ญ์‹œ์˜ค.

ํŒ€ ๊ตฌ์„ฑ์› @joshtriplett ์ด ์ด๋ฅผ ๋ณ‘ํ•ฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ๋‚˜๋จธ์ง€ ํŒ€์›์ด ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • [x] @cramertj
  • [x] @joshtriplett
  • [x] @nikomatsakis
  • [x] @pnkfelix
  • [ ] @scottmcm
  • [ ] @๋ณดํŠธ ์—†์ด

ํ˜„์žฌ ๋‚˜์—ด๋œ ์šฐ๋ ค ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ์˜ ๊ฒ€ํ† ์ž๊ฐ€ ์Šน์ธํ•˜๋ฉด(์ตœ๋Œ€ 2๊ฐœ์˜ ์Šน์ธ์ด ๋ฏธ๊ฒฐ ์ƒํƒœ์ž„) ์ตœ์ข… ์˜๊ฒฌ ์ˆ˜๋ ด ๊ธฐ๊ฐ„์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค์˜ ์–ด๋Š ์‹œ์ ์—์„œ๋„ ์ œ๊ธฐ๋˜์ง€ ์•Š์€ ์ฃผ์š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”!

ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ํŒ€ ๊ตฌ์„ฑ์›์ด ๋‚˜์—๊ฒŒ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์ด ๋ฌธ์„œ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

:bell: ์œ„ ์˜ ์ด์ œ ๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€ ๊ธฐ๊ฐ„์— ์ ‘์–ด๋“ค์—ˆ์Šต๋‹ˆ๋‹ค . :๋ฒจ:

? ์—์„œ const fn ? ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๊นŒ?

? ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ Try ํŠน์„ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. const fn ์—์„œ ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ์•ˆ์ • ํ•ฉ๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/issues/67794๋ฅผ ์ฐธ์กฐ

@TimDiekmann ๋‹น๋ถ„๊ฐ„ ์€ ? ์ˆ˜๋™์œผ๋กœ. loop ๋ฐ for ๋˜์ง€๋งŒ ์ตœ์†Œํ•œ ํŠน์ • ์ œํ•œ(๊ธฐ๋ณธ ์žฌ๊ท€ ์Šคํƒ€์ผ)๊นŒ์ง€๋Š” const eval์—๋„ ์ด๋Ÿฌํ•œ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋งค์šฐ ํ›Œ๋ฅญํ•˜์—ฌ ์ด์ „์—๋Š” ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋˜ ๋งŽ์€ ์ผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ const fn์—์„œ ์ž‘์€ wasm vm์„ ๋นŒ๋“œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ์˜ ๋ณ‘ํ•ฉ ์ฒ˜๋ฆฌ๊ฐ€ ํฌํ•จ๋œ ์ตœ์ข… ์˜๊ฒฌ ์ˆ˜๋ ด ๊ธฐ๊ฐ„์ด ์ด์ œ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค .

๊ฑฐ๋ฒ„๋„Œ์Šค ํ”„๋กœ์„ธ์Šค์˜ ์ž๋™ํ™”๋œ ๋Œ€ํ‘œ์ž๋กœ์„œ ๋‚˜๋Š” ๊ทธ๋“ค์˜ ์ž‘์—…์— ๋Œ€ํ•ด ์ €์ž์™€ ๊ธฐ์—ฌํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฐ์‚ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

RFC๋Š” ๊ณง ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰