Closed
Description
Alexander was having trouble on the mailing list doing this:
pub trait TupleVal<T> {
pub pure fn _1(&self) -> &self/T;
}
impl <T>(T, T): TupleVal<T> {
pure fn _1(&self) -> &self/T {
//match *self { (ref a, _) => a }
let &(ref a, _) = self;
a
}
}
fn main() {
let pair = (1, 2);
let left = *pair._1();
io::println(fmt!("pair left: %u", left));
}
This results in the following llvm error:
Assertion failed: (getOperand(0)->getType() == cast<PointerType>(getOperand(1)->getType())->getElementType() && "Ptr must be a pointer to Val type!"), function AssertOK, file /Users/erickt/Projects/rust/rust/src/llvm/lib/VMCore/Instructions.cpp, line 1062
If instead we use the commented out llvm form, it compiles and runs perfectly fine, so the let
destructuring mechanism is probably to blame. @catamorphism: You wrote that code, right? Can you take a look at this?
Also, I ran into a similar llvm assertion in #4759, so maybe it's the same bug.