================ @@ -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))))) ---------------- haoNoQ wrote:
Does the exact shape of the offset expression really matter? Why not simply preserve it textually regardless of shape? 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