Rust: рд░рд┐рдкреЛрд░реНрдЯ рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ рдЗрдВрдбреЗрдХреНрд╕ рдЖрдЙрдЯ-рдСрдл-рдмрд╛рдЙрдВрдб рдХрдВрдбреАрд╢рди рдкрд╣рд▓реЗ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рдЕрдЧре░ 2012  ┬╖  24рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрджрд┐ рдЖрдк рдПрдХ рдХреЙрдиреНрд╕реНрдЯ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдЕрдиреБрдХреНрд░рдордгрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдХреЙрдиреНрд╕реНрдЯ рдПрдХреНрд╕рдкреНрд░ рдореЗрдВ, рд╣рдо рдЕрдиреБрд╡рд╛рдж рдХреЗ рджреМрд░рд╛рди рд╕рдВрдХрд▓рди рдореЗрдВ рджреЗрд░ рд╕реЗ рд╕реАрдорд╛-рдУрд╡рд░рд░рди рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ рдореВрд▓реНрдпрд╛рдВрдХрди рдкрд╛рд╕ рдореЗрдВ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

A-diagnostics C-cleanup P-low T-compiler

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

рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ 6 рд╕рд╛рд▓ рдмрд╛рдж рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦрддреНрдо рдХрд░ рджрд┐рдпрд╛ рд╣реИ: рд╣рдВрд╕рддреЗ рд╣реБрдП:

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

рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдпрд╣ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА "рддреНрд░реБрдЯрд┐" рдХреЗ рдХрд╛рд░рдг рд╕рдВрдХрд▓рди рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛ рдФрд░ rustc 0 рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред LLVM рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рдЖрдЙрдЯ-рдСрдл-рдмрд╛рдЙрдВрдб рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ index (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рдХреЙрдиреНрд╕ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИ, рдЬреЛ (рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдЪреЗрдХ-рдлрд╛рд╕реНрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░?) рд╕рдлрд▓рддрд╛ рдкрд░ рдЖрдЙрдЯрдкреБрдЯ/рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

0.6 рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ; рдореАрд▓ рдХрд╛ рдкрддреНрдерд░

рдореАрд▓ рдХреЗ рдкрддреНрдерд░ 5 рдХреЗ рд▓рд┐рдП рдирд╛рдорд╛рдВрдХрди, рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░

рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдореАрд▓ рдХреЗ рдкрддреНрдерд░ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХреГрдд

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИ:

static a: &'static [int] = &[];
static b: int = a[1];

fn main() {}

рдкреИрджрд╛рд╡рд╛рд░

$ rustc foo.rs
foo.rs:2:16: 2:19 error: const index-expr is out of bounds
foo.rs:2 static b: int = a[1];
                         ^~~
Assertion failed: (ReqTy && "extractvalue indices invalid!"), function getExtractValue, file ../../../../src/llvm/lib/IR/Constants.cpp, line 1982.
zsh: abort      rustc foo.rs

рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рджрд╛рд╡реЗ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдорд╛рд░ рд░рд╣реЗ рд╣реИрдВред

рдкреА-рд▓реЛ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХреГрддред

рдЯреНрд░рд╛рдЗрдПрдЬ: @alexcrichton рдХрд╛ (9 рдорд╣реАрдиреЗ рдкреБрд░рд╛рдирд╛) рдЙрджрд╛рд╣рд░рдг рдЕрднреА рднреА рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдорд╛рдиреНрдп рд╣реИ (рдпрд╛рдп!) рдФрд░ рдЕрднреА рднреА рдЙрд╕ рджрд╛рд╡реЗ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ (рдмреВ!)ред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рддрдп рд╣реИ ред

рдпрджрд┐ рдЖрдк @alexcrichton рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЕрдкрдбреЗрдЯ

#![allow(dead_code)]
const A: &'static [usize] = &[];
const B: usize = A[1];

fn main() {}

рдпрд╣ рдЕрдм рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╢рд┐рдХрд╛рдпрдд рдХреЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИред

рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЕрдорд╛рдиреНрдп рдорд╛рди B рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ rustc рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдЧрд╛ред

#![allow(dead_code)]
const A: &'static [usize] = &[];
const B: usize = A[1];

fn main() {
    println!("B={}", B);
}
<anon>:3:18: 3:22 error: const index-expr is out of bounds
<anon>:3 const B: usize = A[1];
                          ^~~~
rustc: /home/rustbuild/src/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/llvm/lib/IR/Constants.cpp:2174: static llvm::Constant* llvm::ConstantExpr::getExtractValue(llvm::Constant*, llvm::ArrayRef<unsigned int>, llvm::Type*): Assertion `ReqTy && "extractvalue indices invalid!"' failed.
Aborted (core dumped)
playpen: application terminated with error code 134

рддреНрд░реБрдЯрд┐: рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдиреНрдп рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдСрдкрд░реЗрдЯрд░ рдХреЗ рдкрддреЗ рдпрд╛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рд╣рд╛рдБ, рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред

рд░реБрдХреЛ, @JustAPerson рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдореБрдЭреЗ рдареАрдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ред рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЗ рд▓рд┐рдП рддрдп рд╣реИ:

$ cat foo.rs
#![allow(dead_code)]
const A: &'static [usize] = &[];
const B: usize = A[1];

fn main() {
    println!("B={}", B);
}
$ rustc foo.rs
foo.rs:3:18: 3:22 error: const index-expr is out of bounds
foo.rs:3 const B: usize = A[1];
                          ^~~~
error: aborting due to previous error
$ rustc --version
rustc 1.0.0-dev (a691f1eef 2015-04-15) (built 2015-04-15)

рддреЛ, рдкрд┐рдЫрд▓реЗ 11 рджрд┐рдиреЛрдВ рдореЗрдВ рдХрднреА-рдХрднреА:

hello.rs:3:18: 3:22 error: const index-expr is out of bounds
hello.rs:3 const B: usize = A[1];
                            ^~~~
rustc: /home/rustbuild/src/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/llvm/include/llvm/Support/Casting.h:237: typename llvm::cast_retty<X, Y*>::ret_type llvm::cast(Y*) [with X = llvm::SequentialType; Y = llvm::Type; typename llvm::cast_retty<X, Y*>::ret_type = llvm::SequentialType*]: Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!"' failed.

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ?

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

(рдирдорд╕реНрдХрд╛рд░, рдореИрдВ рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдИ-рдЖрд╕рд╛рди рдореБрджреНрджреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╕реБрд▓рдн рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: рдореБрд╕реНрдХрд╛рди_рдХреИрдЯ :)

рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЕрднрд┐рдХрдерди рдЕрдХреНрд╖рдо рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдЯреВрд▓рдЪреИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рд╣реИ (рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдерд╛)ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЧреИрд░-рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдЯреВрд▓рдЪреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреЛрдИ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдЬрд╛рддрд╛ рд╣реИ?

рдпрд╣ рдПрдХ рддрд░рд╣ рд╕реЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рд╕рднреА рд╕рдорд╛рдкрди-рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬреЗрдВ рдЪрд▓ рд░рд╣реА рд╣реИрдВред рдХреНрдпрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реИ?

./configure --enable-llvm-assertions

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдХреЗрд╡рд▓ рд░рд╛рдд рдореЗрдВ рдЬрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрд▓рдПрд▓рд╡реАрдПрдо рджрд╛рд╡реЗ рд╡рд╣рд╛рдВ рд╕рдХреНрд╖рдо рд╣реИрдВред http://is.gd/X2RztV рдЕрднреА рднреА рд░рд╛рдд рдореЗрдВ рджрд╛рд╡реЗ рдХреЛ рд╡рд┐рдлрд▓ рдХрд░рддрд╛ рд╣реИ:

<anon>:2:17: 2:21 error: const index-expr is out of bounds
<anon>:2 static b: i32 = a[1];
                         ^~~~
rustc: /home/rustbuild/src/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/llvm/include/llvm/Support/Casting.h:237: typename llvm::cast_retty<X, Y*>::ret_type llvm::cast(Y*) [with X = llvm::SequentialType; Y = llvm::Type; typename llvm::cast_retty<X, Y*>::ret_type = llvm::SequentialType*]: Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!"' failed.
Aborted (core dumped)
playpen: application terminated with error code 134

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рдЪреАрдЬ рд╕реЗ рдореИрдВ 2013 рдореЗрдВ рд╡реНрдпрдерд┐рдд рдерд╛, рд╡рд╣ рддрдп рд╣реИ: рдпрджрд┐ rustc const index-expr is out of bounds рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА LLVM рдЕрднрд┐рдХрдерди рдЕрдХреНрд╖рдо рд╣реЛ, рдпрд╣ рдПрдХ рд╡рд┐рдлрд▓рддрд╛ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ (рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд╡рд╛рдж рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рддреНрд░/рддреНрд░реБрдЯрд┐ рд╕рд╛рдордЧреНрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрддреА рдереА, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛? рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред

рджреВрд╕рд░реА рдмрд╛рдд рдЬреЛ рдореИрдВрдиреЗ рдЦреБрдж рдмрддрд╛рдИ рдереА... рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдо рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдПрд▓рдПрд▓рд╡реАрдПрдо рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рдереЗ, рднрд▓реЗ рд╣реА рд╣рдореЗрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп undef рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдм рдареАрдХ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред

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

C_undef(type_of::type_of(cx, bt).element_type())

рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдРрд╕рд╛ рдХреБрдЫ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЕрд╡рд╛рдВрдЫрд┐рдд):

C_undef(val_ty(arr).element_type())

рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдорд╛рди рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдпрд╛ рд╕реВрдЪрдХ рд╣реИ, рддреЛ bt (рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░) рдПрдХ рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП element_type рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рд▓реЗрдХрд┐рди , рдЬрд┐рд╕ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП @graydon рдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреЛрд▓рд╛, рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреА рд╣реИ, рдЙрд╕ рдЪреЗрдХ рдХреЛ рд╕рдВрдХрд▓рди рдХреЗ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рд╣реИред рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ #25370/#25570 рдХрдореЛрдмреЗрд╢ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реЛ рдЧрдпрд╛ рд╣реИред @ рдУрд▓реА-рдУрдмреАрдХреЗ?

рдирд╣реАрдВ, рдЗрд╕реЗ check_const рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рд░рд┐рдкреЛрд░реНрдЯ рд╕реНрдерд╛рди рдХреЛ рдмрдЧ рд╕реНрдерд╛рди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

@ oli-obk рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рд╣реИ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рд╕рдВрдХреЗрдд рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдирд╡рд╛рдЧрдВрддреБрдХ рдЗрд╕ рдкрд░ рдПрдХ рджрд░рд╛рд░ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХреЗрдВ?

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рд╣реИ (рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ https://github.com/rust-lang/rust/blob/master/src/librustc/middle/check_const.rs#L470-L490 рдЪреБрд░рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ ExprIndex рдФрд░ рдлрд┐рд░ https://github.com/rust-lang/rust/blob/master/src/librustc_trans/trans/consts.rs#L708-L712 рдХреЛ рдПрдХ рдмрдЧ/ unimplemented!() )ред

рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рднреА рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдкреНрд░рдпреБрдХреНрдд const ARR: [u32; 0] = []; const X: u32 = ARR[5]; рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИред рдФрд░ check_const рдЕрдкреНрд░рдпреБрдХреНрдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рднреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рде рд╣реА рдпрд╣ рд╕рднреА рдХреЙрдиреНрд╕реНрдЯ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЛ рджреЛ рдмрд╛рд░ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ред рдЬрд┐рд╕реЗ рдПрдХ рдмрд╛рд░ рдХреИрд╢рд┐рдВрдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдорд╕реНрдпрд╛ рдмрди рдЬрд╛рдиреЗ рдкрд░ рджреВрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдмреЗрд╢рдХ рдХреЗрд╡рд▓ const_err рд▓рд┐рдВрдЯ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рдХреЗ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЙрдкрдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ 'рд╣рд▓' рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╕рдВрднрд╡рддрдГ MIRI рдХреЗ рдХрд╛рд░рдг) рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдм LLVM рдЕрднрд┐рдХрдерди рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░

рд▓рд╛рдкрддрд╛ рд▓рд┐рдВрдЯ рдЬрдм рдХрд╛рд╕реНрдЯ рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реИ https://github.com/rust-lang/rust/pull/50110 рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ 6 рд╕рд╛рд▓ рдмрд╛рдж рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦрддреНрдо рдХрд░ рджрд┐рдпрд╛ рд╣реИ: рд╣рдВрд╕рддреЗ рд╣реБрдП:

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

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

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

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

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

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

lambda-fairy picture lambda-fairy  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ