1*41172a30SAlexey Samsonov // RUN: %clang -o %t1 %s 26f940873SPeter Collingbourne // RUN: %t1 2>&1 | FileCheck --check-prefix=NCFI %s 36f940873SPeter Collingbourne 4*41172a30SAlexey Samsonov // RUN: %clang_cfi -o %t2 %s 56f940873SPeter Collingbourne // RUN: %expect_crash %t2 2>&1 | FileCheck --check-prefix=CFI %s 66f940873SPeter Collingbourne 7*41172a30SAlexey Samsonov // RUN: %clang_cfi_diag -g -o %t3 %s 86f940873SPeter Collingbourne // RUN: %t3 2>&1 | FileCheck --check-prefix=CFI-DIAG %s 96f940873SPeter Collingbourne 106f940873SPeter Collingbourne #include <stdio.h> 116f940873SPeter Collingbourne f()126f940873SPeter Collingbournevoid f() { 136f940873SPeter Collingbourne } 146f940873SPeter Collingbourne main()156f940873SPeter Collingbourneint main() { 166f940873SPeter Collingbourne // CFI: 1 176f940873SPeter Collingbourne // NCFI: 1 186f940873SPeter Collingbourne fprintf(stderr, "1\n"); 196f940873SPeter Collingbourne 206f940873SPeter Collingbourne // CFI-DIAG: runtime error: control flow integrity check for type 'void (int)' failed during indirect function call 21*41172a30SAlexey Samsonov // CFI-DIAG: f defined here 226f940873SPeter Collingbourne ((void (*)(int))f)(42); // UB here 236f940873SPeter Collingbourne 246f940873SPeter Collingbourne // CFI-NOT: 2 256f940873SPeter Collingbourne // NCFI: 2 266f940873SPeter Collingbourne fprintf(stderr, "2\n"); 276f940873SPeter Collingbourne } 28