================ @@ -966,9 +962,68 @@ static llvm::Value *getArrayIndexingBound(CodeGenFunction &CGF, return nullptr; } -FieldDecl *CodeGenFunction::FindCountedByField( - const Expr *Base, - LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel) { +Expr *CodeGenFunction::BuildCountedByFieldExpr(Expr *Base, + const ValueDecl *CountedByVD) { + // Find the outer struct expr (i.e. p in p->a.b.c.d). + Base = Base->IgnoreImpCasts(); + Base = Base->IgnoreParenNoopCasts(getContext()); + + // Work our way up the expression until we reach the DeclRefExpr. + while (!isa<DeclRefExpr>(Base)) + if (auto *ME = dyn_cast<MemberExpr>(Base->IgnoreImpCasts())) { + Base = ME->getBase()->IgnoreImpCasts(); + Base = Base->IgnoreParenNoopCasts(getContext()); + } + + // Add back an implicit cast to create the required pr-value. + Base = + ImplicitCastExpr::Create(getContext(), Base->getType(), CK_LValueToRValue, + Base, nullptr, VK_PRValue, FPOptionsOverride()); + + Expr *CountedByExpr = Base; + + if (const auto *IFD = dyn_cast<IndirectFieldDecl>(CountedByVD)) { + // The counted_by field is inside an anonymous struct / union. The + // IndirectFieldDecl has the correct order of FieldDecls to build this + // easily. (Yay!) + for (NamedDecl *ND : IFD->chain()) { + ValueDecl *VD = cast<ValueDecl>(ND); ---------------- bwendling wrote:
Done. Yeah, we need it. `ValueDecl` is a subtype of `NamedDecl`. https://github.com/llvm/llvm-project/pull/70606 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits