[OpenMP] Parsing and sema support for num_teams clause

http://reviews.llvm.org/D14802

llvm-svn: 254019
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 24be7f7..079f87a 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -5085,6 +5085,9 @@
   case OMPC_device:
     Res = ActOnOpenMPDeviceClause(Expr, StartLoc, LParenLoc, EndLoc);
     break;
+  case OMPC_num_teams:
+    Res = ActOnOpenMPNumTeamsClause(Expr, StartLoc, LParenLoc, EndLoc);
+    break;
   case OMPC_if:
   case OMPC_default:
   case OMPC_proc_bind:
@@ -5375,6 +5378,7 @@
   case OMPC_threads:
   case OMPC_simd:
   case OMPC_map:
+  case OMPC_num_teams:
   case OMPC_unknown:
     llvm_unreachable("Clause is not allowed.");
   }
@@ -5505,6 +5509,7 @@
   case OMPC_threads:
   case OMPC_simd:
   case OMPC_map:
+  case OMPC_num_teams:
   case OMPC_unknown:
     llvm_unreachable("Clause is not allowed.");
   }
@@ -5637,6 +5642,7 @@
   case OMPC_depend:
   case OMPC_device:
   case OMPC_map:
+  case OMPC_num_teams:
   case OMPC_unknown:
     llvm_unreachable("Clause is not allowed.");
   }
@@ -5766,6 +5772,7 @@
   case OMPC_device:
   case OMPC_threads:
   case OMPC_simd:
+  case OMPC_num_teams:
   case OMPC_unknown:
     llvm_unreachable("Clause is not allowed.");
   }
@@ -7640,3 +7647,29 @@
   return OMPMapClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars,
                               MapTypeModifier, MapType, MapLoc);
 }
+
+OMPClause *Sema::ActOnOpenMPNumTeamsClause(Expr *NumTeams, 
+                                           SourceLocation StartLoc,
+                                           SourceLocation LParenLoc,
+                                           SourceLocation EndLoc) {
+  Expr *ValExpr = NumTeams;
+  if (!ValExpr->isTypeDependent() && !ValExpr->isValueDependent() &&
+      !ValExpr->isInstantiationDependent()) {
+    SourceLocation Loc = ValExpr->getExprLoc();
+    ExprResult Value = PerformOpenMPImplicitIntegerConversion(Loc, ValExpr);
+    if (Value.isInvalid())
+      return nullptr;
+
+    // OpenMP [teams Constrcut, Restrictions]
+    // The num_teams expression must evaluate to a positive integer value.
+    llvm::APSInt Result;
+    if (Value.get()->isIntegerConstantExpr(Result, Context) && 
+        Result.isSigned() && !Result.isStrictlyPositive()) {
+      Diag(Loc, diag::err_omp_negative_expression_in_clause)
+          << "num_teams" << ValExpr->getSourceRange();
+      return nullptr;
+    }
+  }
+
+  return new (Context) OMPNumTeamsClause(ValExpr, StartLoc, LParenLoc, EndLoc);
+}