[clang] [OpenMP] Add diagnostic for 'factor' width mismatch in 'unroll partial' (PR #139986)

Shilei Tian via cfe-commits cfe-commits at lists.llvm.org
Thu May 15 06:54:11 PDT 2025


================
@@ -14924,8 +14924,25 @@ StmtResult SemaOpenMP::ActOnOpenMPUnrollDirective(ArrayRef<OMPClause *> Clauses,
   SourceLocation FactorLoc;
   if (Expr *FactorVal = PartialClause->getFactor();
       FactorVal && !FactorVal->containsErrors()) {
+    if (!VerifyPositiveIntegerConstantInClause(FactorVal, OMPC_partial,
+                                               /*StrictlyPositive=*/true,
+                                               /*SuppressExprDiags=*/false)
+             .isUsable()) {
+      return StmtError();
+    }
+    // Checking if Iterator Variable Type can hold the Factor Width
+    auto FactorValWidth = FactorVal->getIntegerConstantExpr(Context)->getActiveBits();
+    auto IteratorVWidth = Context.getTypeSize(OrigVar->getType());
+    if ( FactorValWidth > IteratorVWidth ) {
+      Diag(FactorVal->getExprLoc(), diag::err_omp_unroll_factor_width_mismatch)
+          << FactorValWidth << OrigVar->getType()
+          << IteratorVWidth;
+      return StmtError();
+    }
+
     Factor = FactorVal->getIntegerConstantExpr(Context)->getZExtValue();
     FactorLoc = FactorVal->getExprLoc();
+
----------------
shiltian wrote:

unrelated changes

https://github.com/llvm/llvm-project/pull/139986


More information about the cfe-commits mailing list