| 
 | 1 | +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -fclangir -emit-cir %s -o %t.cir  | 
 | 2 | +// RUN: FileCheck --input-file=%t.cir %s -check-prefix=CIR  | 
 | 3 | +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -fclangir -emit-llvm %s -o %t-cir.ll  | 
 | 4 | +// RUN: FileCheck --input-file=%t-cir.ll %s -check-prefix=LLVM  | 
 | 5 | +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -emit-llvm %s -o %t.ll  | 
 | 6 | +// RUN: FileCheck --input-file=%t.ll %s -check-prefix=OGCG  | 
 | 7 | + | 
 | 8 | +template<typename T, typename U>  | 
 | 9 | +class Templ {};  | 
 | 10 | + | 
 | 11 | +template<typename T>  | 
 | 12 | +class Templ<T, int>{};  | 
 | 13 | + | 
 | 14 | +Templ<int, int> t;  | 
 | 15 | + | 
 | 16 | +// CIR: !rec_Templ3Cint2C_int3E = !cir.record<class "Templ<int, int>" padded {!u8i}>  | 
 | 17 | +// CIR: cir.global external @t = #cir.zero : !rec_Templ3Cint2C_int3E  | 
 | 18 | + | 
 | 19 | +// LLVM: %"class.Templ<int, int>" = type { i8 }  | 
 | 20 | +// LLVM: @t = global %"class.Templ<int, int>" zeroinitializer  | 
 | 21 | + | 
 | 22 | +// OGCG: %class.Templ = type { i8 }  | 
 | 23 | +// OGCG: @t = global %class.Templ zeroinitializer  | 
 | 24 | + | 
 | 25 | +template<class T>  | 
 | 26 | +class X {  | 
 | 27 | +public:  | 
 | 28 | +  int f() { return 0; }  | 
 | 29 | +};  | 
 | 30 | + | 
 | 31 | +template<> class X<int> {  | 
 | 32 | +public:  | 
 | 33 | +  int f() { return 1; }  | 
 | 34 | +};  | 
 | 35 | + | 
 | 36 | +void test_double() {  | 
 | 37 | +  X<double> d;  | 
 | 38 | +  d.f();  | 
 | 39 | +}  | 
 | 40 | + | 
 | 41 | +// CIR: cir.func{{.*}} @_ZN1XIdE1fEv  | 
 | 42 | +// CIR:   cir.const #cir.int<0>  | 
 | 43 | +//  | 
 | 44 | +// CIR: cir.func{{.*}} @_Z11test_doublev()  | 
 | 45 | +// CIR:   cir.call @_ZN1XIdE1fEv  | 
 | 46 | + | 
 | 47 | +// LLVM: define{{.*}} i32 @_ZN1XIdE1fEv  | 
 | 48 | +// LLVM:   store i32 0  | 
 | 49 | +//  | 
 | 50 | +// LLVM: define{{.*}} void @_Z11test_doublev()  | 
 | 51 | +// LLVM:   call i32 @_ZN1XIdE1fEv  | 
 | 52 | + | 
 | 53 | +// OGCG: define{{.*}} void @_Z11test_doublev()  | 
 | 54 | +// OGCG:   call{{.*}} i32 @_ZN1XIdE1fEv  | 
 | 55 | +//  | 
 | 56 | +// OGCG: define{{.*}} i32 @_ZN1XIdE1fEv  | 
 | 57 | +// OGCG:   ret i32 0  | 
 | 58 | + | 
 | 59 | +void test_int() {  | 
 | 60 | +  X<int> n;  | 
 | 61 | +  n.f();  | 
 | 62 | +}  | 
 | 63 | + | 
 | 64 | +// CIR: cir.func{{.*}} @_ZN1XIiE1fEv  | 
 | 65 | +// CIR:   cir.const #cir.int<1>  | 
 | 66 | +//  | 
 | 67 | +// CIR: cir.func{{.*}} @_Z8test_intv()  | 
 | 68 | +// CIR:   cir.call @_ZN1XIiE1fEv  | 
 | 69 | + | 
 | 70 | +// LLVM: define{{.*}} i32 @_ZN1XIiE1fEv  | 
 | 71 | +// LLVM:   store i32 1  | 
 | 72 | +//  | 
 | 73 | +// LLVM: define{{.*}} void @_Z8test_intv()  | 
 | 74 | +// LLVM:   call i32 @_ZN1XIiE1fEv  | 
 | 75 | + | 
 | 76 | +// OGCG: define{{.*}} void @_Z8test_intv()  | 
 | 77 | +// OGCG:   call{{.*}} i32 @_ZN1XIiE1fEv  | 
 | 78 | +//  | 
 | 79 | +// OGCG: define{{.*}} i32 @_ZN1XIiE1fEv  | 
 | 80 | +// OGCG:   ret i32 1  | 
 | 81 | + | 
 | 82 | +void test_short() {  | 
 | 83 | +  X<short> s;  | 
 | 84 | +  s.f();  | 
 | 85 | +}  | 
 | 86 | + | 
 | 87 | +// CIR: cir.func{{.*}} @_ZN1XIsE1fEv  | 
 | 88 | +// CIR:   cir.const #cir.int<0>  | 
 | 89 | +//  | 
 | 90 | +// CIR: cir.func{{.*}} @_Z10test_shortv()  | 
 | 91 | +// CIR:   cir.call @_ZN1XIsE1fEv  | 
 | 92 | + | 
 | 93 | +// LLVM: define{{.*}} i32 @_ZN1XIsE1fEv  | 
 | 94 | +// LLVM: store i32 0  | 
 | 95 | +//  | 
 | 96 | +// LLVM: define{{.*}} void @_Z10test_shortv()  | 
 | 97 | +// LLVM:   call i32 @_ZN1XIsE1fEv  | 
 | 98 | + | 
 | 99 | +// OGCG: define{{.*}} void @_Z10test_shortv()  | 
 | 100 | +// OGCG:   call{{.*}} i32 @_ZN1XIsE1fEv  | 
 | 101 | +//  | 
 | 102 | +// OGCG: define{{.*}} i32 @_ZN1XIsE1fEv  | 
 | 103 | +// OGCG:   ret i32 0  | 
0 commit comments