]> granicus.if.org Git - clang/commitdiff
[OPNEMP] Fixed instantiation of 'if' clause
authorAlexey Bataev <a.bataev@hotmail.com>
Wed, 5 Mar 2014 06:45:14 +0000 (06:45 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Wed, 5 Mar 2014 06:45:14 +0000 (06:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@202940 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TreeTransform.h
test/OpenMP/parallel_ast_print.cpp

index 5d2124f7ce6cd7c1961b75120cbd572b46118db9..d164bdd650df50e6b913577d99c0daff18f53b61 100644 (file)
@@ -6309,7 +6309,10 @@ TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
 template<typename Derived>
 OMPClause *
 TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
-  return getDerived().RebuildOMPIfClause(C->getCondition(), C->getLocStart(),
+  ExprResult Cond = getDerived().TransformExpr(C->getCondition());
+  if (Cond.isInvalid())
+    return 0;
+  return getDerived().RebuildOMPIfClause(Cond.take(), C->getLocStart(),
                                          C->getLParenLoc(), C->getLocEnd());
 }
 
index c197031c5926f8480dc049f845c027cb1c8eec14..e76a410522e8b6e454392009e0b7ed3697fe539a 100644 (file)
@@ -9,7 +9,7 @@
 void foo() {}
 
 
-template <typename T>
+template <typename T, int C>
 T tmain(T argc, T *argv) {
   T b = argc, c, d, e, f, g;
   static T a;
@@ -17,29 +17,37 @@ T tmain(T argc, T *argv) {
   a=2;
 #pragma omp parallel default(none), private(argc,b) firstprivate(argv) shared (d) if (argc > 0)
   foo();
+#pragma omp parallel if (C)
+  foo();
   return 0;
 }
-// CHECK: template <typename T = int> int tmain(int argc, int *argv) {
+// CHECK: template <typename T = int, int C = 2> int tmain(int argc, int *argv) {
 // CHECK-NEXT: int b = argc, c, d, e, f, g;
 // CHECK-NEXT: static int a;
 // CHECK-NEXT: #pragma omp parallel
 // CHECK-NEXT: a = 2;
 // CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0)
 // CHECK-NEXT: foo()
-// CHECK: template <typename T = float> float tmain(float argc, float *argv) {
+// CHECK-NEXT: #pragma omp parallel if(2)
+// CHECK-NEXT: foo()
+// CHECK: template <typename T = float, int C = 0> float tmain(float argc, float *argv) {
 // CHECK-NEXT: float b = argc, c, d, e, f, g;
 // CHECK-NEXT: static float a;
 // CHECK-NEXT: #pragma omp parallel
 // CHECK-NEXT: a = 2;
 // CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0)
 // CHECK-NEXT: foo()
-// CHECK: template <typename T> T tmain(T argc, T *argv) {
+// CHECK-NEXT: #pragma omp parallel if(0)
+// CHECK-NEXT: foo()
+// CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
 // CHECK-NEXT: T b = argc, c, d, e, f, g;
 // CHECK-NEXT: static T a;
 // CHECK-NEXT: #pragma omp parallel
 // CHECK-NEXT: a = 2;
 // CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0)
 // CHECK-NEXT: foo()
+// CHECK-NEXT: #pragma omp parallel if(C)
+// CHECK-NEXT: foo()
 
 int main (int argc, char **argv) {
   float x;
@@ -54,7 +62,7 @@ int main (int argc, char **argv) {
 // CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) if(argc > 0)
   foo();
 // CHECK-NEXT: foo();
-  return tmain(b, &b) + tmain(x, &x);
+  return tmain<int, 2>(b, &b) + tmain<float, 0>(x, &x);
 }
 
 #endif