84 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s -fsanitize=unreachable | FileCheck %s2 3void abort() __attribute__((noreturn));4 5// CHECK-LABEL: define{{.*}} void @_Z14calls_noreturnv()6void calls_noreturn() {7 // Check absence (ptr) of call site attributes (including noreturn)8 // CHECK: call void @_Z5abortv(){{[^#]*}}9 abort();10 11 // CHECK: __ubsan_handle_builtin_unreachable12 // CHECK: unreachable13}14 15struct A {16 // CHECK: declare void @_Z5abortv() [[EXTERN_FN_ATTR:#[0-9]+]]17 18 // CHECK-LABEL: define linkonce_odr void @_ZN1A5call1Ev19 void call1() {20 // CHECK: call void @_ZN1A16does_not_return2Ev({{.*}}){{[^#]*}}21 does_not_return2();22 23 // CHECK: __ubsan_handle_builtin_unreachable24 // CHECK: unreachable25 }26 27 // Test static members. Checks are below after `struct A` scope ends.28 static void does_not_return1() __attribute__((noreturn)) {29 abort();30 }31 32 // CHECK-LABEL: define linkonce_odr void @_ZN1A5call2Ev33 void call2() {34 // CHECK: call void @_ZN1A16does_not_return1Ev(){{[^#]*}}35 does_not_return1();36 37 // CHECK: __ubsan_handle_builtin_unreachable38 // CHECK: unreachable39 }40 41 // Test calls through pointers to non-static member functions.42 typedef void (A::*MemFn)() __attribute__((noreturn));43 44 // CHECK-LABEL: define linkonce_odr void @_ZN1A5call3Ev45 void call3() {46 MemFn MF = &A::does_not_return2;47 // CHECK: call void %{{[0-9]+\(.*}}){{[^#]*}}48 (this->*MF)();49 50 // CHECK: __ubsan_handle_builtin_unreachable51 // CHECK: unreachable52 }53 54 // Test regular members.55 // CHECK-LABEL: define linkonce_odr void @_ZN1A16does_not_return2Ev({{.*}})56 // CHECK-SAME: [[USER_FN_ATTR:#[0-9]+]]57 void does_not_return2() __attribute__((noreturn)) {58 // CHECK: call void @_Z5abortv(){{[^#]*}}59 abort();60 61 // CHECK: call void @__ubsan_handle_builtin_unreachable62 // CHECK: unreachable63 64 // CHECK: call void @__ubsan_handle_builtin_unreachable65 // CHECK: unreachable66 }67};68 69// CHECK-LABEL: define linkonce_odr void @_ZN1A16does_not_return1Ev()70// CHECK-SAME: [[USER_FN_ATTR]]71// CHECK: call void @_Z5abortv(){{[^#]*}}72 73void force_irgen() {74 A a;75 a.call1();76 a.call2();77 a.call3();78}79 80// `noreturn` should be removed from functions and call sites81// CHECK-LABEL: attributes82// CHECK-NOT: [[USER_FN_ATTR]] = { {{.*noreturn.*}} }83// CHECK-NOT: [[EXTERN_FN_ATTR]] = { {{.*noreturn.*}} }84