Since https://github.com/llvm/llvm-project/pull/109628 landed, this test has been failing on 32-bit Arm. This is due to a codegen problem (whether added or uncovered by the change, not known) where the trap instruction is placed after the frame pointer and link register are restored. https://github.com/llvm/llvm-project/issues/113154 So the code was: ``` std::__1::vector<int>::operator[](unsigned int): sub sp, sp, #8 str r0, [sp, #4] str r1, [sp] add sp, sp, #8 .inst 0xe7ffdefe bx lr ``` When lldb saw the trap, the PC was inside operator[] but the frame information actually pointed to g. This bug only happens for leaf functions so adding a return type works around it: ``` std::__1::vector<int>::operator[](unsigned int): push {r11, lr} mov r11, sp sub sp, sp, #8 str r0, [sp, #4] str r1, [sp] mov sp, r11 pop {r11, lr} .inst 0xe7ffdefe bx lr ``` (and operator[] should return T& anyway) Now the PC location and frame information should match and the test passes.
18 lines
292 B
C++
18 lines
292 B
C++
namespace std {
|
|
inline namespace __1 {
|
|
template <typename T> struct vector {
|
|
T& operator[](unsigned) { __builtin_verbose_trap("Bounds error", "out-of-bounds access"); }
|
|
};
|
|
} // namespace __1
|
|
} // namespace std
|
|
|
|
void g() {
|
|
std::vector<int> v;
|
|
v[10];
|
|
}
|
|
|
|
int main() {
|
|
g();
|
|
return 0;
|
|
}
|