νμ¬ const exprμμ const 벑ν°μ λν μΈλ±μ±μ μλνλ©΄ λ²μ μ€ μ»΄νμΌ νλ°μ κ²½κ³ μ€λ²λ°μ΄ λ³΄κ³ λ©λλ€. const νκ° λ¨κ³μμ λ μΌμ° μμμ°¨λ €μΌ ν©λλ€.
λΆλͺ ν μ΄κ²μ΄ μμ±νλ "μ€λ₯"λ μ»΄νμΌ μ€ν¨λ₯Ό μΌμΌν€μ§ μμ΅λλ€. μ½λκ° μμ±λκ³ rustcλ 0μ λ°νν©λλ€. μΈλ±μ€κ° 물리μ μΌλ‘ λ²μλ₯Ό λ²μ΄λλ©΄ LLVMμ λΆνν κ²μ΄λ©°, μ΄λ νμ¬ νμ λ²μλ₯Ό λ²μ΄λ κ²κ³Ό λμΌν©λλ€. index (λ΄ μκ°μ) νμ§λ§ const μ¬λΌμ΄μ€μ κ²½μ°μλ κ·Έλ μ§ μμ΅λλ€.
μ΄κ²μ ν μ€νΈ μ€μ νΉν μμμΉ λͺ»ν μΌμ΄λ©°(λΉ λ₯Έ νμΈμ μ μΈνκ³ λ λΆλͺ ν?) μ±κ³΅ μ μΆλ ₯/μ€λ₯λ₯Ό νμνμ§ μμ΅λλ€.
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
μ°λ¦¬κ° LLVM μ£Όμ₯μ νκ³ μλ κ²μ΄ λμ κ² κ°μ΅λλ€.
P-lowμ λν΄ νμ©λ©λλ€.
λΆλ₯: @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.
sooooλ μ΄λ―Έ ν΄λ³΄ ν κ² κ°μ΅λκΉ?
ν μ΄κ±΄ λ΄ μ€μμμ΄ LLVM μ΄μ€μ μ΄ λΉνμ±νλ μνλ‘ μ»΄νμΌλ λꡬ λͺ¨μμ μ¬μ©νμ¬ μμ λ³΄κ³ μλ₯Ό μμ±νμ΅λλ€(κΈ°λ³Έκ°μΈμ§ λͺ°λμ΅λλ€).
(μλ νμΈμ, μ λ μ κ· μ΄λ―Όμλ€μ΄ E-easy λ¬Έμ μ λ μ½κ² μ κ·Όν μ μλλ‘ λκΈ° μν΄ λ Έλ ₯νκ³
LLVM μ΄μ€μ μ΄ λΉνμ±νλ μνλ‘ μ»΄νμΌλ λꡬ λͺ¨μμ μ¬μ©νμ¬ μμ λ³΄κ³ μλ₯Ό μμ±νμ΅λλ€(κΈ°λ³Έκ°μΈμ§ λͺ°λμ΅λλ€).
μ΄ λ¬Έμ λ₯Ό μ¬ννλ €λ©΄ κΈ°λ³Έκ°μ΄ μλ μ€μ μΌλ‘ μ»΄νμΌλ λꡬ λͺ¨μμ μ¬μ©ν΄μΌ νλ κ² κ°μ΅λκΉ? κ·Έλ λ€λ©΄ μ΄λ»κ² ν΄μΌ ν κΉμ?
μ¬κΈ°μμ λ¬΄μ¨ μΌμ΄ μΌμ΄λκΈ°λ‘ λμ΄ μλμ§ νΌλμ€λ½μ΅λλ€. λͺ¨λ λ§κ°-μ¬κ°λ΄ μΌμ΄ μ§ν μ€μ λλ€. λκ΅°κ°κ° μμλλ λμμ΄ λ¬΄μμ΄λ©° νμ¬ λμκ³Ό μ΄λ»κ² λ€λ₯Έμ§ λͺ νν ν μ μμ΅λκΉ?
./configure --enable-llvm-assertions
κ·Έλ¬λ LLVM μ£Όμ₯μ΄ νμ±νλμ΄ μκΈ° λλ¬Έμ Rustλ₯Ό λ°€λ§λ€ μ¬μ©ν μ μμ΅λλ€. 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 μ£Όμ₯μ΄ λΉνμ±νλμ΄λ μ€ν¨ μνλ‘ μ’
λ£λ©λλ€(μΆλ ₯ νμΌμ μμ±νμ§ μμ). κ²μ¬μμ λλ½λ μ€λ₯λ₯Ό μ°Ύμ μ μμ΄μΌ νκΈ° λλ¬Έμ κ²μ¬κ° μννλ μΈμ
/μ€λ₯ νλͺ©μ λν μ‘μΈμ€ κΆνμ΄ λ²μμ μμλ€κ³ μκ°ν©λλ€. νμ§λ§ μ§κΈμ κ·Έλ μ§ μμ κ² κ°μ΅λλ€.
λ΄ κ³Όκ±° μμ μ΄ μΈκΈν λ λ€λ₯Έ κ²μ... λ²μλ₯Ό λ²μ΄λ¬λ€λ κ²μ μλ©΄μλ μΈλ±μ€λ₯Ό LLVMμ μ λ¬νλ κ²μ²λΌ λ€λ Έμ§λ§ μ΄μ λ λμ undef
ν©λλ€. νμ§λ§ μ§κΈμ κ·Έ μ€λ₯κ° μ λλ‘ μ²λ¦¬λμκΈ° λλ¬Έμ μ΄λ€ κ²½μ°μλ κ·Έ λΆλΆμ μ²λ¦¬λ©λλ€.
μ€λ μ°λ¦¬κ° λ³΄κ³ μλ LLVM μ£Όμ₯μ λν΄ μΆμΈ‘ν μ μμ΅λλ€. μ€λ₯λ₯Ό λ³΄κ³ ν ν λ€μμ μνν©λλ€.
C_undef(type_of::type_of(cx, bt).element_type())
κ·Έλ¦¬κ³ λλ μ°λ¦¬κ° λ€μκ³Ό κ°μ κ²μ μνλ€κ³ μκ°ν©λλ€(ν μ€νΈλμ§ μμ).
C_undef(val_ty(arr).element_type())
μΈλ±μ±λλ κ°μ΄ μ¬λΌμ΄μ€ λλ ν¬μΈν°μΈ κ²½μ° bt
(ν΄λΉ μ ν)λ λ°°μ΄ μ νμΌλ‘ νμλμ§ μμΌλ―λ‘ element_type
κ° μ€ν¨ν©λλ€.
κ·Έλ¬λ @graydon μ΄ μ΄ λ¬Έμ λ₯Ό
λλ μ΄κ²μ΄ μ§κΈ μμ ν κ³ μ³μ‘λ€κ³ μκ°νλ€. @oli-obk?
μλμ, check_const
μμ ν΄κ²°ν΄μΌ νκ³ νμ¬ λ³΄κ³ μμΉλ₯Ό λ²κ·Έ μμΉλ‘ λ³κ²½ν΄μΌ ν©λλ€.
@oli-obk μ΄κ²μ μ¬μ΄ ν½μ€μΈκ°μ? κ·Έλ λ€λ©΄ λ©ν λ§μ νκ³ μλ‘μ΄ μ¬μ©μκ° ν¬λμ μλν μ μλλ‘ ννΈλ₯Ό λ¨κ²¨μ£Όμκ² μ΅λκΉ?
μ¬μ΄ μμ μ΄μ§λ§(κΈ°λ³Έμ μΌλ‘ https://github.com/rust-lang/rust/blob/master/src/librustc/middle/check_const.rs#L470-L490μ νμ³ ExprIndex
μνν μ μμ΅λλ€ unimplemented!()
λ°κΏλλ€.
κ·Έλ¬λ μ¬μ©νμ§ μμ const ARR: [u32; 0] = []; const X: u32 = ARR[5];
νμ¬ μ»΄νμΌ μ€λ₯λ₯Ό μΌμΌν€μ§ μκΈ° λλ¬Έμ μ΄λ λν νκΈ°μ μΈ λ³κ²½μ΄ λ κ²μ
λλ€. κ·Έλ¦¬κ³ check_const
λ μ¬μ©νμ§ μλ μμλ νμΈν©λλ€.
λν λͺ¨λ const νκ°λ₯Ό λ λ² μννκ² λ©λλ€. μμλ₯Ό μΊμ±νμ¬ λ¬Έμ κ° λλ©΄ ν΄κ²°ν μ μμ΅λλ€.
λ¬Όλ‘ const_err
보νΈλΌκΈ°λ₯Ό λ΄λ³΄λ΄λ κ²μΌλ‘ μ£Όμ λ³κ²½ μ¬νμ ν΄κ²°ν μ μμ΅λλ€.
μ΄κ²μ LLVM μ΄μ€μ μ΄ μλ μ¬μ© μ E0080 μ λμ§κΈ° λλ¬Έμ (MIRIλ‘ μΈν΄) 'ν΄κ²°λ' κ²μΌλ‘ 보μ λλ€. μ‘μΈμ€κ° μ¬μ©λμ§ μμΌλ©΄ μ¬μ ν ν΅κ³Όν©λλ€.
constκ° μ¬μ©λμ§ μμ λ λλ½λ Lintλ https://github.com/rust-lang/rust/pull/50110μμ μμ λ©λλ€.
λ€, 6λ λ§μ μ΄ λ¬Έμ λ₯Ό λλΈ κ² κ°μμ.μμ:
κ°μ₯ μ μ©ν λκΈ
λ€, 6λ λ§μ μ΄ λ¬Έμ λ₯Ό λλΈ κ² κ°μμ.μμ: