declare_variant_ast_print.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. // RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s -ast-print -o - -Wno-source-uses-openmp | FileCheck %s
  2. // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s -ast-print -o - -Wno-source-uses-openmp | FileCheck %s
  3. // expected-no-diagnostics
  4. // CHECK: int foo();
  5. int foo();
  6. // CHECK: template <typename T> T foofoo() {
  7. // CHECK-NEXT: return T();
  8. // CHECK-NEXT: }
  9. template <typename T>
  10. T foofoo() { return T(); }
  11. // CHECK: template<> int foofoo<int>() {
  12. // CHECK-NEXT: return int();
  13. // CHECK-NEXT: }
  14. // CHECK: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(score(5):ibm)})
  15. // CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(unknown)})
  16. // CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(ibm)})
  17. // CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(llvm)})
  18. // CHECK-NEXT: int bar();
  19. #pragma omp declare variant(foofoo <int>) match(xxx = {})
  20. #pragma omp declare variant(foofoo <int>) match(xxx = {vvv})
  21. #pragma omp declare variant(foofoo <int>) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
  22. #pragma omp declare variant(foofoo <int>) match(implementation={vendor(unknown)})
  23. #pragma omp declare variant(foofoo <int>) match(implementation={vendor(score(5): ibm)})
  24. int bar();
  25. // CHECK: #pragma omp declare variant(foofoo<T>) match(implementation={vendor(score(C + 5):ibm)})
  26. // CHECK: #pragma omp declare variant(foofoo<T>) match(implementation={vendor(score(C + 5):xxx)})
  27. // CHECK-NEXT: #pragma omp declare variant(foofoo<T>) match(implementation={vendor(unknown)})
  28. // CHECK-NEXT: #pragma omp declare variant(foofoo<T>) match(implementation={vendor(ibm)})
  29. // CHECK-NEXT: #pragma omp declare variant(foofoo<T>) match(implementation={vendor(llvm)})
  30. // CHECK-NEXT: template <typename T, int C> T barbar();
  31. #pragma omp declare variant(foofoo <T>) match(xxx = {})
  32. #pragma omp declare variant(foofoo <T>) match(xxx = {vvv})
  33. #pragma omp declare variant(foofoo <T>) match(user = {score(<expr>) : condition(<expr>)})
  34. #pragma omp declare variant(foofoo <T>) match(user = {score(<expr>) : condition(<expr>)}, user = {condition(<expr>)})
  35. #pragma omp declare variant(foofoo <T>) match(user = {condition(<expr>)})
  36. #pragma omp declare variant(foofoo <T>) match(user = {condition(<expr>)})
  37. #pragma omp declare variant(foofoo <T>) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
  38. #pragma omp declare variant(foofoo <T>) match(implementation={vendor(unknown)})
  39. #pragma omp declare variant(foofoo <T>) match(implementation={vendor(score(C+5): ibm, xxx)})
  40. template <typename T, int C>
  41. T barbar();
  42. // CHECK: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(score(3 + 5):ibm)})
  43. // CHECK: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(score(3 + 5):xxx)})
  44. // CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(unknown)})
  45. // CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(ibm)})
  46. // CHECK-NEXT: #pragma omp declare variant(foofoo<int>) match(implementation={vendor(llvm)})
  47. // CHECK-NEXT: template<> int barbar<int, 3>();
  48. // CHECK-NEXT: int baz() {
  49. // CHECK-NEXT: return barbar<int, 3>();
  50. // CHECK-NEXT: }
  51. int baz() {
  52. return barbar<int, 3>();
  53. }
  54. // CHECK: template <class C> void h_ref(C *hp, C *hp2, C *hq, C *lin) {
  55. // CHECK-NEXT: }
  56. // CHECK-NEXT: template<> void h_ref<double>(double *hp, double *hp2, double *hq, double *lin) {
  57. // CHECK-NEXT: }
  58. // CHECK-NEXT: template<> void h_ref<float>(float *hp, float *hp2, float *hq, float *lin) {
  59. // CHECK-NEXT: }
  60. template <class C>
  61. void h_ref(C *hp, C *hp2, C *hq, C *lin) {
  62. }
  63. // CHECK: #pragma omp declare variant(h_ref<C>) match(implementation={vendor(unknown)})
  64. // CHECK-NEXT: #pragma omp declare variant(h_ref<C>) match(implementation={vendor(ibm)})
  65. // CHECK-NEXT: #pragma omp declare variant(h_ref<C>) match(implementation={vendor(llvm)})
  66. // CHECK-NEXT: template <class C> void h(C *hp, C *hp2, C *hq, C *lin) {
  67. // CHECK-NEXT: }
  68. #pragma omp declare variant(h_ref <C>) match(xxx = {})
  69. #pragma omp declare variant(h_ref <C>) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
  70. #pragma omp declare variant(h_ref <C>) match(implementation={vendor(unknown)})
  71. template <class C>
  72. void h(C *hp, C *hp2, C *hq, C *lin) {
  73. }
  74. // CHECK: #pragma omp declare variant(h_ref<float>) match(implementation={vendor(unknown)})
  75. // CHECK-NEXT: #pragma omp declare variant(h_ref<float>) match(implementation={vendor(ibm)})
  76. // CHECK-NEXT: #pragma omp declare variant(h_ref<float>) match(implementation={vendor(llvm)})
  77. // CHECK-NEXT: template<> void h<float>(float *hp, float *hp2, float *hq, float *lin) {
  78. // CHECK-NEXT: }
  79. // CHECK-NEXT: template<> void h<double>(double *hp, double *hp2, double *hq, double *lin) {
  80. // CHECK-NEXT: h((float *)hp, (float *)hp2, (float *)hq, (float *)lin);
  81. // CHECK-NEXT: }
  82. #pragma omp declare variant(h_ref <double>) match(xxx = {})
  83. #pragma omp declare variant(h_ref <double>) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
  84. #pragma omp declare variant(h_ref <double>) match(implementation={vendor(unknown)})
  85. template <>
  86. void h(double *hp, double *hp2, double *hq, double *lin) {
  87. h((float *)hp, (float *)hp2, (float *)hq, (float *)lin);
  88. }
  89. // CHECK: int fn();
  90. int fn();
  91. // CHECK: int fn(int);
  92. int fn(int);
  93. // CHECK: #pragma omp declare variant(fn) match(implementation={vendor(unknown)})
  94. // CHECK-NEXT: #pragma omp declare variant(fn) match(implementation={vendor(ibm)})
  95. // CHECK-NEXT: #pragma omp declare variant(fn) match(implementation={vendor(llvm)})
  96. // CHECK-NEXT: int overload();
  97. #pragma omp declare variant(fn) match(xxx = {})
  98. #pragma omp declare variant(fn) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
  99. #pragma omp declare variant(fn) match(implementation={vendor(unknown)})
  100. int overload(void);
  101. // CHECK: int fn_deduced_variant() {
  102. // CHECK-NEXT: return 0;
  103. // CHECK-NEXT: }
  104. auto fn_deduced_variant() { return 0; }
  105. // CHECK: #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(unknown)})
  106. // CHECK-NEXT: #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(ibm)})
  107. // CHECK-NEXT: #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(llvm)})
  108. // CHECK-NEXT: int fn_deduced();
  109. #pragma omp declare variant(fn_deduced_variant) match(xxx = {})
  110. #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
  111. #pragma omp declare variant(fn_deduced_variant) match(implementation={vendor(unknown)})
  112. int fn_deduced();
  113. // CHECK: int fn_deduced_variant1();
  114. int fn_deduced_variant1();
  115. // CHECK: #pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(unknown)})
  116. // CHECK-NEXT: #pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(ibm)})
  117. // CHECK-NEXT: #pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(llvm)})
  118. // CHECK-NEXT: int fn_deduced1() {
  119. // CHECK-NEXT: return 0;
  120. // CHECK-NEXT: }
  121. #pragma omp declare variant(fn_deduced_variant1) match(xxx = {})
  122. #pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
  123. #pragma omp declare variant(fn_deduced_variant1) match(implementation={vendor(unknown)})
  124. auto fn_deduced1() { return 0; }
  125. // CHECK: struct SpecialFuncs {
  126. // CHECK-NEXT: void vd() {
  127. // CHECK-NEXT: }
  128. // CHECK-NEXT: SpecialFuncs();
  129. // CHECK-NEXT: ~SpecialFuncs() noexcept;
  130. // CHECK-NEXT: void baz() {
  131. // CHECK-NEXT: }
  132. // CHECK-NEXT: void bar() {
  133. // CHECK-NEXT: }
  134. // CHECK-NEXT: void bar(int) {
  135. // CHECK-NEXT: }
  136. // CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(unknown)})
  137. // CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::bar) match(implementation={vendor(ibm)})
  138. // CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::bar) match(implementation={vendor(llvm)})
  139. // CHECK-NEXT: void foo1() {
  140. // CHECK-NEXT: }
  141. // CHECK-NEXT: #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(unknown)})
  142. // CHECK-NEXT: void xxx();
  143. // CHECK-NEXT: } s;
  144. struct SpecialFuncs {
  145. void vd() {}
  146. SpecialFuncs();
  147. ~SpecialFuncs();
  148. void baz() {}
  149. void bar() {}
  150. void bar(int) {}
  151. #pragma omp declare variant(SpecialFuncs::baz) match(xxx = {})
  152. #pragma omp declare variant(SpecialFuncs::bar) match(xxx = {})
  153. #pragma omp declare variant(SpecialFuncs::bar) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
  154. #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(unknown)})
  155. void foo1() {}
  156. #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(unknown)})
  157. void xxx();
  158. } s;
  159. // CHECK: #pragma omp declare variant(SpecialFuncs::baz) match(implementation={vendor(unknown)})
  160. // CHECK-NEXT: void SpecialFuncs::xxx() {
  161. // CHECK-NEXT: }
  162. void SpecialFuncs::xxx() {}
  163. // CHECK: static void static_f_variant() {
  164. // CHECK-NEXT: }
  165. static void static_f_variant() {}
  166. // CHECK: #pragma omp declare variant(static_f_variant) match(implementation={vendor(unknown)})
  167. // CHECK-NEXT: #pragma omp declare variant(static_f_variant) match(implementation={vendor(ibm)})
  168. // CHECK-NEXT: #pragma omp declare variant(static_f_variant) match(implementation={vendor(llvm)})
  169. // CHECK-NEXT: static void static_f() {
  170. // CHECK-NEXT: }
  171. #pragma omp declare variant(static_f_variant) match(xxx = {})
  172. #pragma omp declare variant(static_f_variant) match(implementation={vendor(ibm)}, implementation={vendor(llvm)})
  173. #pragma omp declare variant(static_f_variant) match(implementation={vendor(unknown)})
  174. static void static_f() {}
  175. // CHECK: void bazzzz() {
  176. // CHECK-NEXT: s.foo1();
  177. // CHECK-NEXT: static_f();
  178. // CHECK-NEXT: }
  179. void bazzzz() {
  180. s.foo1();
  181. static_f();
  182. }