// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-rtti -fclangir -emit-cir %s -o %t.cir // RUN: FileCheck --input-file=%t.cir %s // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-rtti -fclangir -emit-llvm -o %t-cir.ll %s // RUN: FileCheck --check-prefix=LLVM --input-file=%t-cir.ll %s // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-rtti -emit-llvm -o %t.ll %s // RUN: FileCheck --check-prefix=OGCG --input-file=%t.ll %s // Note: This test is using -fno-rtti so that we can delay implemntation of that handling. // When rtti handling for vtables is implemented, that option should be removed. struct S { virtual void key(); virtual void nonKey() {} }; void S::key() {} // CHECK-DAG: !rec_anon_struct = !cir.record x 4>}> // The definition of the key function should result in the vtable being emitted. // CHECK: cir.global "private" external @_ZTV1S = #cir.vtable<{ // CHECK-SAME: #cir.const_array<[ // CHECK-SAME: #cir.ptr : !cir.ptr, // CHECK-SAME: #cir.ptr : !cir.ptr, // CHECK-SAME: #cir.global_view<@_ZN1S3keyEv> : !cir.ptr, // CHECK-SAME: #cir.global_view<@_ZN1S6nonKeyEv> : !cir.ptr]> // CHECK-SAME: : !cir.array x 4>}> : !rec_anon_struct // LLVM: @_ZTV1S = global { [4 x ptr] } { [4 x ptr] // LLVM-SAME: [ptr null, ptr null, ptr @_ZN1S3keyEv, ptr @_ZN1S6nonKeyEv] } // OGCG: @_ZTV1S = unnamed_addr constant { [4 x ptr] } { [4 x ptr] // OGCG-SAME: [ptr null, ptr null, ptr @_ZN1S3keyEv, ptr @_ZN1S6nonKeyEv] } // CHECK: cir.func dso_local @_ZN1S3keyEv // The reference from the vtable should result in nonKey being emitted. // CHECK: cir.func comdat linkonce_odr @_ZN1S6nonKeyEv