================ @@ -1061,6 +1070,59 @@ ExprResult Sema::ActOnSizeofParameterPackExpr(Scope *S, RParenLoc); } +static bool isParameterPack(Expr *PackExpression) { + if (auto D = dyn_cast<DeclRefExpr>(PackExpression); D) { + ValueDecl *VD = D->getDecl(); + return VD->isParameterPack(); + } + return false; +} + +ExprResult Sema::ActOnPackIndexingExpr(Scope *S, Expr *PackExpression, + SourceLocation EllipsisLoc, + SourceLocation LSquareLoc, + Expr *IndexExpr, + SourceLocation RSquareLoc) { + bool isParameterPack = ::isParameterPack(PackExpression); + if (!isParameterPack) { + CorrectDelayedTyposInExpr(IndexExpr); + Diag(PackExpression->getBeginLoc(), diag::err_expected_name_of_pack) + << PackExpression; + return ExprError(); + } + return BuildPackIndexingExpr(PackExpression, EllipsisLoc, IndexExpr, + RSquareLoc); +} + +ExprResult +Sema::BuildPackIndexingExpr(Expr *PackExpression, SourceLocation EllipsisLoc, + Expr *IndexExpr, SourceLocation RSquareLoc, + ArrayRef<Expr *> ExpandedExprs, bool EmptyPack) { + + std::optional<int64_t> Index; + if (!IndexExpr->isValueDependent() && !IndexExpr->isTypeDependent()) { + llvm::APSInt Value(Context.getIntWidth(Context.getSizeType())); + // TODO: do we need a new enumerator instead of CCEK_ArrayBound? + ExprResult Res = CheckConvertedConstantExpression( + IndexExpr, Context.getSizeType(), Value, CCEK_ArrayBound); + if (!Res.isUsable()) + return ExprError(); + Index = Value.getExtValue(); + } + + if (Index && (!ExpandedExprs.empty() || EmptyPack)) { ---------------- cor3ntin wrote:
I think once we have an index, it's always a ConstantExpr so presumably we could extract the value from that. I suppose keeping the expression is best if people want to do funny things with matchers? https://github.com/llvm/llvm-project/pull/72644 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits