| // RUN: %clang_cc1 %s -triple amdgpu-amd-amdhsa -emit-llvm -std=c++11 -O1 -o - | FileCheck %s \ |
| // RUN: --implicit-check-not='call {{.*}} @__dynamic_cast' |
| |
| struct A { |
| virtual ~A(); |
| }; |
| struct B final : A {}; |
| |
| // CHECK-LABEL: define {{.*}} ptr @_Z4castP1A( |
| // CHECK: %[[VTABLE:.*]] = load ptr addrspace(1), ptr %{{.*}} |
| // CHECK: %[[MATCH:.*]] = icmp eq ptr addrspace(1) %[[VTABLE]], getelementptr {{.*}} ptr addrspace(1) @_ZTV1B |
| B *cast(A *a) { |
| return dynamic_cast<B *>(a); |
| } |
| |
| struct Left : A {}; |
| struct Right : A {}; |
| struct Repeated final : Left, Right {}; |
| |
| // CHECK-LABEL: define {{.*}} ptr @_Z13cast_repeatedP1A( |
| // CHECK: %[[PRIMARY:.*]] = getelementptr inbounds i8, ptr %{{.*}}, i64 %{{.*}} |
| // CHECK: %[[VTABLE:.*]] = load ptr addrspace(1), ptr %[[PRIMARY]] |
| // CHECK: %[[MATCH:.*]] = icmp eq ptr addrspace(1) %[[VTABLE]], getelementptr {{.*}} ptr addrspace(1) @_ZTV8Repeated |
| Repeated *cast_repeated(A *a) { |
| return dynamic_cast<Repeated *>(a); |
| } |