1*09a8b7cbSgbMattN // RUN: %clangxx_tysan -O0 %s -o %t && %run %t >%t.out 2>&1 2*09a8b7cbSgbMattN // RUN: FileCheck %s --implicit-check-not ERROR < %t.out 3*09a8b7cbSgbMattN 4*09a8b7cbSgbMattN // Modified reproducer from https://github.com/llvm/llvm-project/issues/105960 5*09a8b7cbSgbMattN 6*09a8b7cbSgbMattN #include <stdio.h> 7*09a8b7cbSgbMattN 8*09a8b7cbSgbMattN struct inner1 { 9*09a8b7cbSgbMattN char buffer; 10*09a8b7cbSgbMattN int i; 11*09a8b7cbSgbMattN }; 12*09a8b7cbSgbMattN 13*09a8b7cbSgbMattN struct inner2 { 14*09a8b7cbSgbMattN char buffer; 15*09a8b7cbSgbMattN int i; 16*09a8b7cbSgbMattN float endBuffer; 17*09a8b7cbSgbMattN }; 18*09a8b7cbSgbMattN 19*09a8b7cbSgbMattN void init_inner1(inner1 *iPtr) { iPtr->i = 200; } 20*09a8b7cbSgbMattN void init_inner2(inner2 *iPtr) { 21*09a8b7cbSgbMattN iPtr->i = 400; 22*09a8b7cbSgbMattN iPtr->endBuffer = 413.0f; 23*09a8b7cbSgbMattN } 24*09a8b7cbSgbMattN 25*09a8b7cbSgbMattN struct outer { 26*09a8b7cbSgbMattN inner1 foo; 27*09a8b7cbSgbMattN inner2 bar; 28*09a8b7cbSgbMattN char buffer; 29*09a8b7cbSgbMattN }; 30*09a8b7cbSgbMattN 31*09a8b7cbSgbMattN int main(void) { 32*09a8b7cbSgbMattN outer *l = new outer(); 33*09a8b7cbSgbMattN 34*09a8b7cbSgbMattN init_inner1(&l->foo); 35*09a8b7cbSgbMattN init_inner2(&l->bar); 36*09a8b7cbSgbMattN 37*09a8b7cbSgbMattN int access = l->foo.i; 38*09a8b7cbSgbMattN printf("Accessed value 1 is %d\n", access); 39*09a8b7cbSgbMattN access = l->bar.i; 40*09a8b7cbSgbMattN printf("Accessed value 2 is %d\n", access); 41*09a8b7cbSgbMattN float fAccess = l->bar.endBuffer; 42*09a8b7cbSgbMattN printf("Accessed value 3 is %f\n", fAccess); 43*09a8b7cbSgbMattN 44*09a8b7cbSgbMattN return 0; 45*09a8b7cbSgbMattN } 46*09a8b7cbSgbMattN 47*09a8b7cbSgbMattN // CHECK: Accessed value 1 is 200 48*09a8b7cbSgbMattN // CHECK: Accessed value 2 is 400 49*09a8b7cbSgbMattN // CHECK: Accessed value 3 is 413.0 50