================ @@ -7668,6 +7669,47 @@ struct LoopIterationSpace final { Expr *FinalCondition = nullptr; }; +class ForSubExprChecker : public RecursiveASTVisitor<ForSubExprChecker> { + const llvm::SmallSet<Decl *, 4> *CollapsedLoopVarDecls; + VarDecl *ForbiddenVar; + SourceRange ErrLoc; + +public: + explicit ForSubExprChecker( + const llvm::SmallSet<Decl *, 4> *CollapsedLoopVarDecls) + : CollapsedLoopVarDecls(CollapsedLoopVarDecls), ForbiddenVar(nullptr) {} + + bool shouldVisitImplicitCode() const { return true; } + + bool VisitDeclRefExpr(DeclRefExpr *E) { + ValueDecl *VD = E->getDecl(); + if (!isa<VarDecl, BindingDecl>(VD)) + return true; + VarDecl *V = VD->getPotentiallyDecomposedVarDecl(); + if (V->getType()->isReferenceType()) { + VarDecl *VD = V->getDefinition(); + if (VD->hasInit()) { + Expr *I = VD->getInit(); + DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(I); + if (!DRE) + return true; + V = DRE->getDecl()->getPotentiallyDecomposedVarDecl(); + } + } + Decl *Canon = V->getCanonicalDecl(); + if (CollapsedLoopVarDecls->contains(Canon)) { + ForbiddenVar = V; + ErrLoc = E->getSourceRange(); + return false; + } + + return true; + } + + VarDecl *getForbiddenVar() { return ForbiddenVar; } + SourceRange &getErrRange() { return ErrLoc; } ---------------- alexey-bataev wrote:
const functions https://github.com/llvm/llvm-project/pull/101305 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits