[clang] [OpenMP] Add diagnostic for 'factor' width mismatch in 'unroll partial' (PR #139986)
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Thu May 22 05:01:04 PDT 2025
================
@@ -14924,6 +14924,21 @@ 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();
+ // Check that the iterator variable’s type can hold the factor’s bit-width
+ unsigned factorValWidth =
+ FactorVal->getIntegerConstantExpr(Context)->getActiveBits();
+ unsigned iteratorVWidth = Context.getTypeSize(OrigVar->getType());
+ if (factorValWidth > iteratorVWidth) {
+ Diag(FactorVal->getExprLoc(), diag::err_omp_unroll_factor_width_mismatch)
+ << factorValWidth << OrigVar->getType() << iteratorVWidth;
+ return StmtError();
----------------
AaronBallman wrote:
```suggestion
unsigned FactorValWidth =
FactorVal->getIntegerConstantExpr(Context)->getActiveBits();
unsigned IteratorVWidth = Context.getTypeSize(OrigVar->getType());
if (FactorValWidth > IteratorVWidth) {
Diag(FactorVal->getExprLoc(), diag::err_omp_unroll_factor_width_mismatch)
<< FactorValWidth << OrigVar->getType() << IteratorVWidth;
return StmtError();
```
https://github.com/llvm/llvm-project/pull/139986
More information about the cfe-commits
mailing list