1*641fbf15SFlorian Hahn // RUN: %clang_tysan -O0 %s -o %t && %run %t >%t.out 2>&1 2*641fbf15SFlorian Hahn // RUN: FileCheck %s < %t.out 3*641fbf15SFlorian Hahn 4*641fbf15SFlorian Hahn // https://github.com/llvm/llvm-project/issues/62828 5*641fbf15SFlorian Hahn #include <stdio.h> 6*641fbf15SFlorian Hahn 7*641fbf15SFlorian Hahn typedef int int_v8[8]; 8*641fbf15SFlorian Hahn typedef short short_v8[8]; 9*641fbf15SFlorian Hahn short *test1(int_v8 *cast_c_array, short_v8 *shuf_c_array1, int *ptr) { 10*641fbf15SFlorian Hahn int *input1 = reinterpret_cast<int *>(((int_v8 *)(cast_c_array))); 11*641fbf15SFlorian Hahn short *input2 = reinterpret_cast<short *>(reinterpret_cast<int_v8 *>(input1)); 12*641fbf15SFlorian Hahn 13*641fbf15SFlorian Hahn short *output1 = reinterpret_cast<short *>(((short_v8 *)(shuf_c_array1))); 14*641fbf15SFlorian Hahn short *output2 = 15*641fbf15SFlorian Hahn reinterpret_cast<short *>(reinterpret_cast<short_v8 *>(output1)); 16*641fbf15SFlorian Hahn 17*641fbf15SFlorian Hahn for (int r = 0; r < 8; ++r) { 18*641fbf15SFlorian Hahn int tmp = (int)((r * 4) + ptr[r]); 19*641fbf15SFlorian Hahn if ((ptr[r] / 4) == 0) { 20*641fbf15SFlorian Hahn int *input = reinterpret_cast<int *>(((int_v8 *)(cast_c_array))); 21*641fbf15SFlorian Hahn input[r] = tmp; 22*641fbf15SFlorian Hahn } 23*641fbf15SFlorian Hahn } 24*641fbf15SFlorian Hahn 25*641fbf15SFlorian Hahn // CHECK: ERROR: TypeSanitizer: type-aliasing-violation on address 26*641fbf15SFlorian Hahn // CHECK-NEXT: READ of size 2 at {{.+}} with type short accesses an existing object of type int 27*641fbf15SFlorian Hahn // CHECK-NEXT: in test1(int (*) [8], short (*) [8], int*) {{.*/?}}violation-pr62828.cpp:29 28*641fbf15SFlorian Hahn for (int i3 = 0; i3 < 4; ++i3) { 29*641fbf15SFlorian Hahn output2[i3] = input2[(i3 * 2)]; 30*641fbf15SFlorian Hahn } 31*641fbf15SFlorian Hahn return output2; 32*641fbf15SFlorian Hahn } 33*641fbf15SFlorian Hahn 34*641fbf15SFlorian Hahn int main() { 35*641fbf15SFlorian Hahn int_v8 in[4] = {{4, 4, 4, 4}}; 36*641fbf15SFlorian Hahn short_v8 out[4] = {{0}}; 37*641fbf15SFlorian Hahn int ptr[8] = {2}; 38*641fbf15SFlorian Hahn test1(in, out, ptr); 39*641fbf15SFlorian Hahn short *p = reinterpret_cast<short *>(out); 40*641fbf15SFlorian Hahn for (int i = 0; i < 32; i++) { 41*641fbf15SFlorian Hahn printf("%d ", p[i]); 42*641fbf15SFlorian Hahn } 43*641fbf15SFlorian Hahn return 0; 44*641fbf15SFlorian Hahn } 45