// Verifies that speculative loads from unions do not happen under asan. | |
// RUN: %clangxx_asan -O0 %s -o %t && %run %t 2>&1 | |
// RUN: %clangxx_asan -O1 %s -o %t && %run %t 2>&1 | |
// RUN: %clangxx_asan -O2 %s -o %t && %run %t 2>&1 | |
// RUN: %clangxx_asan -O3 %s -o %t && %run %t 2>&1 | |
typedef union { | |
short q; | |
struct { | |
short x; | |
short y; | |
int for_alignment; | |
} w; | |
} U; | |
int main() { | |
char *buf = new char[2]; | |
buf[0] = buf[1] = 0x0; | |
U *u = (U *)buf; | |
short result = u->q == 0 ? 0 : u->w.y; | |
delete[] buf; | |
return result; | |
} | |