|  | // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s -fsanitize=unreachable | FileCheck %s | 
|  |  | 
|  | extern void __attribute__((noreturn)) abort(); | 
|  |  | 
|  | // CHECK-LABEL: define void @_Z14calls_noreturnv | 
|  | void calls_noreturn() { | 
|  | abort(); | 
|  |  | 
|  | // Check that there are no attributes on the call site. | 
|  | // CHECK-NOT: call void @_Z5abortv{{.*}}# | 
|  |  | 
|  | // CHECK: __ubsan_handle_builtin_unreachable | 
|  | // CHECK: unreachable | 
|  | } | 
|  |  | 
|  | struct A { | 
|  | // CHECK: declare void @_Z5abortv{{.*}} [[ABORT_ATTR:#[0-9]+]] | 
|  |  | 
|  | // CHECK-LABEL: define linkonce_odr void @_ZN1A5call1Ev | 
|  | void call1() { | 
|  | // CHECK-NOT: call void @_ZN1A16does_not_return2Ev{{.*}}# | 
|  | does_not_return2(); | 
|  |  | 
|  | // CHECK: __ubsan_handle_builtin_unreachable | 
|  | // CHECK: unreachable | 
|  | } | 
|  |  | 
|  | // Test static members. | 
|  | static void __attribute__((noreturn)) does_not_return1() { | 
|  | // CHECK-NOT: call void @_Z5abortv{{.*}}# | 
|  | abort(); | 
|  | } | 
|  |  | 
|  | // CHECK-LABEL: define linkonce_odr void @_ZN1A5call2Ev | 
|  | void call2() { | 
|  | // CHECK-NOT: call void @_ZN1A16does_not_return1Ev{{.*}}# | 
|  | does_not_return1(); | 
|  |  | 
|  | // CHECK: __ubsan_handle_builtin_unreachable | 
|  | // CHECK: unreachable | 
|  | } | 
|  |  | 
|  | // Test calls through pointers to non-static member functions. | 
|  | typedef void __attribute__((noreturn)) (A::*MemFn)(); | 
|  |  | 
|  | // CHECK-LABEL: define linkonce_odr void @_ZN1A5call3Ev | 
|  | void call3() { | 
|  | MemFn MF = &A::does_not_return2; | 
|  | (this->*MF)(); | 
|  |  | 
|  | // CHECK-NOT: call void %{{.*}}# | 
|  | // CHECK: __ubsan_handle_builtin_unreachable | 
|  | // CHECK: unreachable | 
|  | } | 
|  |  | 
|  | // Test regular members. | 
|  | // CHECK-LABEL: define linkonce_odr void @_ZN1A16does_not_return2Ev({{.*}}) | 
|  | // CHECK-SAME: [[DOES_NOT_RETURN_ATTR:#[0-9]+]] | 
|  | void __attribute__((noreturn)) does_not_return2() { | 
|  | // CHECK-NOT: call void @_Z5abortv(){{.*}}# | 
|  | abort(); | 
|  |  | 
|  | // CHECK: call void @__ubsan_handle_builtin_unreachable | 
|  | // CHECK: unreachable | 
|  |  | 
|  | // CHECK: call void @__ubsan_handle_builtin_unreachable | 
|  | // CHECK: unreachable | 
|  | } | 
|  | }; | 
|  |  | 
|  | // CHECK: define linkonce_odr void @_ZN1A16does_not_return1Ev() [[DOES_NOT_RETURN_ATTR]] | 
|  |  | 
|  | void force_irgen() { | 
|  | A a; | 
|  | a.call1(); | 
|  | a.call2(); | 
|  | a.call3(); | 
|  | } | 
|  |  | 
|  | // CHECK-NOT: [[ABORT_ATTR]] = {{[^}]+}}noreturn | 
|  | // CHECK-NOT: [[DOES_NOT_RETURN_ATTR]] = {{[^}]+}}noreturn |