xref: /llvm-project/clang/test/CodeGen/no-devirt.cpp (revision 2246167362bf3596f13988723b363449b8427cfd)
115ed2929SSunil Srivastava // RUN: %clang_cc1 %s -DUSEIT -triple %itanium_abi_triple -emit-llvm -o - |  FileCheck %s
215ed2929SSunil Srivastava 
315ed2929SSunil Srivastava // Test with decls and template defs in pch, and just use in .cpp
415ed2929SSunil Srivastava // RUN:  %clang_cc1 %s -DTMPL_DEF_IN_HEADER -triple %itanium_abi_triple -emit-pch -o %t
515ed2929SSunil Srivastava // RUN:  %clang_cc1 %s -DTMPL_DEF_IN_HEADER -DUSEIT -triple %itanium_abi_triple -include-pch %t -emit-llvm -o - | FileCheck %s
615ed2929SSunil Srivastava 
715ed2929SSunil Srivastava // Test with A in pch, and B and C in main
815ed2929SSunil Srivastava // Test with just decls in pch, and template defs and use in .cpp
915ed2929SSunil Srivastava // RUN:  %clang_cc1 %s -triple %itanium_abi_triple -emit-pch -o %t
1015ed2929SSunil Srivastava // RUN:  %clang_cc1 %s -DUSEIT -triple %itanium_abi_triple -include-pch %t -emit-llvm -o - | FileCheck %s
1115ed2929SSunil Srivastava 
1215ed2929SSunil Srivastava #ifndef HEADER
1315ed2929SSunil Srivastava #define HEADER
1415ed2929SSunil Srivastava template < typename T, int N = 0 > class TmplWithArray {
1515ed2929SSunil Srivastava public:
1615ed2929SSunil Srivastava   virtual T& operator [] (int idx);
1715ed2929SSunil Srivastava   virtual T& func1 (int idx);
1815ed2929SSunil Srivastava   virtual T& func2 (int idx);
1915ed2929SSunil Srivastava   T ar[N+1];
2015ed2929SSunil Srivastava };
2115ed2929SSunil Srivastava struct Wrapper {
2215ed2929SSunil Srivastava   TmplWithArray<bool, 10> data;
indexItWrapper2315ed2929SSunil Srivastava   bool indexIt(int a) {
24*22461673SAkira Hatanaka     if (a > 6) return data[a] ;      // Should devirtualize
2515ed2929SSunil Srivastava     if (a > 4) return data.func1(a); // Should devirtualize
2615ed2929SSunil Srivastava     return data.func2(a);            // Should devirtualize
2715ed2929SSunil Srivastava   }
2815ed2929SSunil Srivastava };
2915ed2929SSunil Srivastava 
3015ed2929SSunil Srivastava #ifdef TMPL_DEF_IN_HEADER
operator [](int idx)3115ed2929SSunil Srivastava template <typename T, int N> T& TmplWithArray<T, N >::operator[](int idx) {
3215ed2929SSunil Srivastava   return ar[idx];
3315ed2929SSunil Srivastava }
func1(int idx)3415ed2929SSunil Srivastava template <typename T, int N> T& TmplWithArray<T, N >::func1(int idx) {
3515ed2929SSunil Srivastava   return ar[idx];
3615ed2929SSunil Srivastava }
3715ed2929SSunil Srivastava #endif // TMPL_DEF_IN_HEADER
3815ed2929SSunil Srivastava #endif // HEADER
3915ed2929SSunil Srivastava 
4015ed2929SSunil Srivastava #ifdef USEIT
4115ed2929SSunil Srivastava #ifndef TMPL_DEF_IN_HEADER
operator [](int idx)4215ed2929SSunil Srivastava template <typename T, int N> T& TmplWithArray<T, N >::operator[](int idx) {
4315ed2929SSunil Srivastava   return ar[idx];
4415ed2929SSunil Srivastava }
func1(int idx)4515ed2929SSunil Srivastava template <typename T, int N> T& TmplWithArray<T, N >::func1(int idx) {
4615ed2929SSunil Srivastava   return ar[idx];
4715ed2929SSunil Srivastava }
4815ed2929SSunil Srivastava #endif // !TMPL_DEF_IN_HEADER
4915ed2929SSunil Srivastava extern Wrapper ew;
stuff(int p)5015ed2929SSunil Srivastava bool stuff(int p)
5115ed2929SSunil Srivastava {
5215ed2929SSunil Srivastava   return ew.indexIt(p);
5315ed2929SSunil Srivastava }
5415ed2929SSunil Srivastava #endif
5515ed2929SSunil Srivastava 
56*22461673SAkira Hatanaka // CHECK-DAG: call {{.*}} @_ZN13TmplWithArrayIbLi10EEixEi
5715ed2929SSunil Srivastava // CHECK-DAG: call {{.*}} @_ZN13TmplWithArrayIbLi10EE5func1Ei
5815ed2929SSunil Srivastava // CHECK-DAG: call {{.*}} @_ZN13TmplWithArrayIbLi10EE5func2Ei
5915ed2929SSunil Srivastava 
60