================ @@ -584,6 +585,39 @@ static Attr *handleOpenCLUnrollHint(Sema &S, Stmt *St, const ParsedAttr &A, return ::new (S.Context) OpenCLUnrollHintAttr(S.Context, A, UnrollFactor); } +static Attr *handleHLSLLoopHintAttr(Sema &S, Stmt *St, const ParsedAttr &A, + SourceRange Range) { + + if (A.getSemanticSpelling() == HLSLLoopHintAttr::Spelling::Microsoft_loop && + !A.checkAtMostNumArgs(S, 0)) + return nullptr; + + unsigned UnrollFactor = 0; + if (A.getNumArgs() == 1) { + + if (A.isArgIdent(0)) { + S.Diag(A.getLoc(), diag::err_attribute_argument_type) + << A << AANT_ArgumentIntegerConstant << A.getRange(); + return nullptr; + } + + Expr *E = A.getArgAsExpr(0); + + if (S.CheckLoopHintExpr(E, St->getBeginLoc(), + /*AllowZero=*/false)) + return nullptr; + + std::optional<llvm::APSInt> ArgVal = E->getIntegerConstantExpr(S.Context); + // CheckLoopHintExpr handles non int const cases + assert(ArgVal != std::nullopt && "ArgVal should be an integer constant."); + int Val = ArgVal->getSExtValue(); + // CheckLoopHintExpr handles negative and zero cases + assert(Val > 0 && "Val should be a positive integer greater than zero."); ---------------- bob80905 wrote:
As stated in your comment, CheckLoopHintExpr will check each of these asserts, and return true in each case, so nullptr will be returned by this function on line 608. That said, is there really a purpose for these asserts? I don't see how they can trigger when CheckLoopHintExpr confirms these conditions. https://github.com/llvm/llvm-project/pull/93879 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits