================ @@ -1051,6 +1052,145 @@ CodeGenFunction::emitFlexibleArrayMemberSize(const Expr *E, unsigned Type, return Builder.CreateSelect(Cmp, Res, ConstantInt::get(ResType, 0, IsSigned)); } +namespace { + +/// \p StructBaseExpr returns the base \p Expr with a structure or union type. +struct StructBaseExpr : public ConstStmtVisitor<StructBaseExpr, const Expr *> { + StructBaseExpr() = default; + + //===--------------------------------------------------------------------===// + // Visitor Methods + //===--------------------------------------------------------------------===// + + const Expr *VisitStmt(const Stmt *S) { return nullptr; } + + const Expr *Visit(const Expr *E) { + QualType Ty = E->getType(); + if (Ty->isStructureType() || Ty->isUnionType()) + return E; + + return ConstStmtVisitor<StructBaseExpr, const Expr *>::Visit(E); + } + + const Expr *VisitDeclRefExpr(const DeclRefExpr *E) { return E; } + + const Expr *VisitMemberExpr(const MemberExpr *E) { + return Visit(E->getBase()); + } + const Expr *VisitArraySubscriptExpr(const ArraySubscriptExpr *E) { + return Visit(E->getBase()); + } + const Expr *VisitCastExpr(const CastExpr *E) { + return Visit(E->getSubExpr()); + } + const Expr *VisitParenExpr(const ParenExpr *E) { + return Visit(E->getSubExpr()); + } + const Expr *VisitUnaryAddrOf(const clang::UnaryOperator *E) { + return Visit(E->getSubExpr()); + } + const Expr *VisitUnaryDeref(const clang::UnaryOperator *E) { + return Visit(E->getSubExpr()); + } ---------------- bwendling wrote:
The Visitor is only to get the structure that the member resides in. The thing about `__builtin_dynamic_object_size(p, 0)` is that we're not trying to calculate what `p` points to, but the size of the struct from p to the end. It's counter-intuitive, but it's not (currently) supported to ask `__bdos` the size of what `p` points to is. https://github.com/llvm/llvm-project/pull/80256 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits