================ @@ -1028,6 +1028,50 @@ class UPCPreIncrementGadget : public FixableGadget { } }; +// Representing a pointer type expression of the form `Ptr += n` in an +// Unspecified Untyped Context (UUC): +class UUCAddAssignGadget : public FixableGadget { +private: + static constexpr const char *const UUCAddAssignTag = + "PointerAddAssignUnderUUC"; + static constexpr const char *const IntOffsetTag = "IntOffset"; + static constexpr const char *const OffsetTag = "Offset"; + + const BinaryOperator *Node; // the `Ptr += n` node + const IntegerLiteral *IntOffset = nullptr; + const DeclRefExpr *Offset = nullptr; + +public: + UUCAddAssignGadget(const MatchFinder::MatchResult &Result) + : FixableGadget(Kind::UUCAddAssign), + Node(Result.Nodes.getNodeAs<BinaryOperator>(UUCAddAssignTag)), + IntOffset(Result.Nodes.getNodeAs<IntegerLiteral>(IntOffsetTag)), + Offset(Result.Nodes.getNodeAs<DeclRefExpr>(OffsetTag)) { + assert(Node != nullptr && "Expecting a non-null matching result"); + } + + static bool classof(const Gadget *G) { + return G->getKind() == Kind::UUCAddAssign; + } + + static Matcher matcher() { + return stmt(isInUnspecifiedUntypedContext(expr(ignoringImpCasts( + binaryOperator( + hasOperatorName("+="), hasLHS(declRefExpr(toSupportedVariable())), + hasRHS(expr(anyOf(ignoringImpCasts(declRefExpr().bind(OffsetTag)), + integerLiteral().bind(IntOffsetTag))))) ---------------- ziqingluo-90 wrote:
For RHS, if it is not a constant, all we need to know about it is whether it is an unsigned integer. It doesn't have to be a DRE, e.g., `p += (x + 1)` can be transformed to `p = p.subspan(x + 1)` as long as `(x + 1)` has unsigned integer type. https://github.com/llvm/llvm-project/pull/71862 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits