[clang] [clang][OpenMP] Diagnose badly-formed collapsed imperfect loop nests (#60678) (PR #101305)
Alexey Bataev via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 31 07:36:22 PDT 2024
================
@@ -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
More information about the cfe-commits
mailing list