1*f85a9a64SBill Wendling // RUN: %clang_cc1 -triple=x86_64-unknown-linux -emit-llvm -frandomize-layout-seed=1234567890abcdef < %s | FileCheck %s 2*f85a9a64SBill Wendling // PR60349 3*f85a9a64SBill Wendling 4*f85a9a64SBill Wendling // Clang will add a forward declaration of "struct bar" and "enum qux" to the 5*f85a9a64SBill Wendling // structures. This shouldn't prevent these structures from being randomized. 6*f85a9a64SBill Wendling // So the 'f' element shouldn't be at the start of the structure anymore. 7*f85a9a64SBill Wendling 8*f85a9a64SBill Wendling struct foo { 9*f85a9a64SBill Wendling struct bar *(*f)(void); 10*f85a9a64SBill Wendling struct bar *(*g)(void); 11*f85a9a64SBill Wendling struct bar *(*h)(void); 12*f85a9a64SBill Wendling struct bar *(*i)(void); 13*f85a9a64SBill Wendling struct bar *(*j)(void); 14*f85a9a64SBill Wendling struct bar *(*k)(void); 15*f85a9a64SBill Wendling }; 16*f85a9a64SBill Wendling 17*f85a9a64SBill Wendling // CHECK-LABEL: define {{.*}}@t1( 18*f85a9a64SBill Wendling // CHECK-NOT: getelementptr inbounds %struct.foo, ptr %3, i32 0, i32 0 t1(struct foo * z)19*f85a9a64SBill Wendlingstruct bar *t1(struct foo *z) { 20*f85a9a64SBill Wendling return z->f(); 21*f85a9a64SBill Wendling } 22*f85a9a64SBill Wendling 23*f85a9a64SBill Wendling struct baz { 24*f85a9a64SBill Wendling enum qux *(*f)(void); 25*f85a9a64SBill Wendling enum qux *(*g)(void); 26*f85a9a64SBill Wendling enum qux *(*h)(void); 27*f85a9a64SBill Wendling enum qux *(*i)(void); 28*f85a9a64SBill Wendling enum qux *(*j)(void); 29*f85a9a64SBill Wendling enum qux *(*k)(void); 30*f85a9a64SBill Wendling }; 31*f85a9a64SBill Wendling 32*f85a9a64SBill Wendling // CHECK-LABEL: define {{.*}}@t2( 33*f85a9a64SBill Wendling // CHECK-NOT: getelementptr inbounds %struct.baz, ptr %3, i32 0, i32 0 t2(struct baz * z)34*f85a9a64SBill Wendlingenum qux *t2(struct baz *z) { 35*f85a9a64SBill Wendling return z->f(); 36*f85a9a64SBill Wendling } 37