brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · 7884fa3 Raw
105 lines · cpp
1// RUN: %clang_cc1 %s -triple %itanium_abi_triple -std=c++11 -disable-O0-optnone -emit-llvm -o - | FileCheck %s2 3// Test optnone on template instantiations.4 5//-- Effect of optnone on generic add template function.6 7template <typename T> T template_normal(T a)8{9  return a + a;10}11 12template <typename T> __attribute__((optnone)) T template_optnone(T a)13{14  return a + a + a;15}16 17// This function should cause instantiations of each template, one marked18// with the 'optnone' attribute.19int container(int i)20{21  return template_normal<int>(i) + template_optnone<int>(i);22}23 24// CHECK: @_Z15template_normalIiET_S0_({{.*}}) [[NORMAL:#[0-9]+]]25// CHECK: @_Z16template_optnoneIiET_S0_({{.*}}) [[OPTNONE:#[0-9]+]]26 27 28//-- Effect of optnone on a partial specialization.29//   FIRST TEST: a method becomes marked with optnone in the specialization.30 31template <typename T, typename U> class template_normal_base {32public:33  T method(T t, U u) 34  {35    return t + static_cast<T>(u);36  }37};38 39template <typename U> class template_normal_base<int, U>40{41public:42  __attribute__((optnone)) int method (int t, U u)43  {44    return t - static_cast<int>(u);45  }46};47 48// This function should cause an instantiation of the full template (whose49// method is not marked optnone) and an instantiation of the partially50// specialized template (whose method is marked optnone).51void container2() 52{53  int y = 2;54  float z = 3.0;55  template_normal_base<float, int> class_normal;56  template_normal_base<int, float> class_optnone;57  float r1 = class_normal.method(z, y);58  float r2 = class_optnone.method(y, z);59}60 61// CHECK: @_ZN20template_normal_baseIfiE6methodEfi({{.*}}) [[NORMAL]]62// CHECK: @_ZN20template_normal_baseIifE6methodEif({{.*}}) [[OPTNONE]]63 64 65//-- Effect of optnone on a partial specialization.66//   SECOND TEST: a method loses optnone in the specialization.67 68template <typename T, typename U> class template_optnone_base {69public:70  __attribute__((optnone)) T method(T t, U u) 71  {72    return t + static_cast<T>(u);73  }74};75 76template <typename U> class template_optnone_base<int, U>77{78public:79  int method (int t, U u)80  {81    return t - static_cast<int>(u);82  }83};84 85// This function should cause an instantiation of the full template (whose86// method is marked optnone) and an instantiation of the partially87// specialized template (whose method is not marked optnone).88void container3() 89{90  int y = 2;91  float z = 3.0;92  template_optnone_base<float, int> class_optnone;93  template_optnone_base<int, float> class_normal;94  float r1 = class_optnone.method(z, y);95  float r2 = class_normal.method(y, z);96}97 98// CHECK: @_ZN21template_optnone_baseIfiE6methodEfi({{.*}}) [[OPTNONE]]99// CHECK: @_ZN21template_optnone_baseIifE6methodEif({{.*}}) [[NORMAL]]100 101 102// CHECK: attributes [[NORMAL]] =103// CHECK-NOT: optnone104// CHECK: attributes [[OPTNONE]] = {{.*}} optnone105