================ @@ -222,6 +222,49 @@ bool Expr::isFlexibleArrayMemberLike( IgnoreTemplateOrMacroSubstitution); } +namespace { + +/// MemberExprVisitor - Find the MemberExpr through all of the casts, array +/// subscripts, and unary ops. This intentionally avoids all of them because +/// we're interested only in the MemberExpr to check if it's a flexible array +/// member. +class MemberExprVisitor + : public ConstStmtVisitor<MemberExprVisitor, const Expr *> { +public: + //===--------------------------------------------------------------------===// + // Visitor Methods + //===--------------------------------------------------------------------===// + + const Expr *Visit(const Expr *E) { + return ConstStmtVisitor<MemberExprVisitor, const Expr *>::Visit(E); + } + const Expr *VisitStmt(const Stmt *S) { return nullptr; } + + const Expr *VisitMemberExpr(const MemberExpr *E) { return E; } + + 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 UnaryOperator *E) { + return Visit(E->getSubExpr()); + } + const Expr *VisitUnaryDeref(const UnaryOperator *E) { + return Visit(E->getSubExpr()); + } ---------------- Sirraide wrote:
> Wouldn’t it be enough to just accept a (possibly parenthesised) `MemberExpr`? I just saw that you also have `&foo.x[0]` as a test case, but given that this is a new builtin that no compiler supports (yet), is it too much to ask for to require people to just write `foo.x` (or maybe e.g. `(foo.x)` because macro shenanigans)? ;Þ https://github.com/llvm/llvm-project/pull/102549 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits