23 const auto *CE = Result.Nodes.getNodeAs<CallExpr>(
"CE");
24 if (!CE->getDirectCallee())
28 FuncClassifier.emplace(*Result.Context);
30 const IdentifierInfo *Identifier = CE->getDirectCallee()->getIdentifier();
31 if (!Identifier || !FuncClassifier->isMPIType(Identifier))
35 SmallVector<const Type *, 1> BufferTypes;
36 SmallVector<const Expr *, 1> BufferExprs;
40 auto AddBuffer = [&CE, &Result, &BufferTypes,
41 &BufferExprs](
const size_t BufferIdx) {
43 if (CE->getArg(BufferIdx)->isNullPointerConstant(
44 *Result.Context, Expr::NPC_ValueDependentIsNull) ||
45 tooling::fixit::getText(*CE->getArg(BufferIdx), *Result.Context) ==
49 const Expr *ArgExpr = CE->getArg(BufferIdx);
52 const Type *ArgType = ArgExpr->IgnoreImpCasts()->getType().getTypePtr();
55 BufferExprs.push_back(ArgExpr);
56 BufferTypes.push_back(ArgType);
62 if (FuncClassifier->isPointToPointType(Identifier)) {
64 }
else if (FuncClassifier->isCollectiveType(Identifier)) {
65 if (FuncClassifier->isReduceType(Identifier)) {
68 }
else if (FuncClassifier->isScatterType(Identifier) ||
69 FuncClassifier->isGatherType(Identifier) ||
70 FuncClassifier->isAlltoallType(Identifier)) {
73 }
else if (FuncClassifier->isBcastType(Identifier)) {
78 checkBuffers(BufferTypes, BufferExprs);