Ever since <https://github.com/llvm/llvm-project/commit/d2b7ef6ecea967b70bdeb8a1fd8004c5aef3e415> "Improve the representation of operator expressions like "x + y" within C++ templates", the documentation of BinaryOperator (clang/include/clang/AST/Expr.h) and CXXOperatorCallExpr (clang/include/clang/AST/ExprCXX.h) claim that if any of an operator's arguments are type-dependent, it is represented with CXXOperatorCallExpr. However,
template<typename T> void f(T x) {
int n;
x + n;
x += n;
} #pragma clang __debug dump f
shows both + and += to use BinaryOperator (derived CompoundAssignOperator for +=).
That looks like a documentation bug to me. I believe the actual rule is that CXXOperatorCallExpr is used if there is an associated set of functions (because either the operator has been resolved to a specific function or the operator is dependent and unqualified lookup found any potential function candidates), and BinaryOperator is used if there are no associated functions (because either the operator was resolved to a builtin operator or the operator is dependent and unqualified lookup found nothing).