@@ -37,6 +37,13 @@ void LIBCURule::registerMatcher(ast_matchers::MatchFinder &MF) {
3737 " compare_exchange_strong" , " fetch_add" , " fetch_sub" ,
3838 " at" );
3939 };
40+ auto LIBCUMemberHasNames = [&]() {
41+ return anyOf (
42+ hasMemberName (" load" ), hasMemberName (" store" ),
43+ hasMemberName (" exchange" ), hasMemberName (" compare_exchange_weak" ),
44+ hasMemberName (" compare_exchange_strong" ), hasMemberName (" fetch_add" ),
45+ hasMemberName (" fetch_sub" ), hasMemberName (" at" ));
46+ };
4047 auto LIBCUTypesHasNames = [&]() {
4148 return hasAnyName (" cuda::atomic" , " cuda::std::atomic" ,
4249 " cuda::std::array" );
@@ -47,6 +54,9 @@ void LIBCURule::registerMatcher(ast_matchers::MatchFinder &MF) {
4754 callee (cxxMethodDecl (LIBCUMemberFuncHasNames ()))))
4855 .bind (" MemberCall" ),
4956 this );
57+ MF.addMatcher (cxxDependentScopeMemberExpr (LIBCUMemberHasNames ())
58+ .bind (" DependentMemCall" ),
59+ this );
5060 }
5161 {
5262 MF.addMatcher (dependentScopeDeclRefExpr ().bind (" DependentScope" ),
@@ -88,6 +98,16 @@ void LIBCURule::runRule(const ast_matchers::MatchFinder::MatchResult &Result) {
8898 if (const CXXMemberCallExpr *MC =
8999 getNodeAsType<CXXMemberCallExpr>(Result, " MemberCall" )) {
90100 EA.analyze (MC);
101+ } else if (const CXXDependentScopeMemberExpr *CDSE =
102+ getNodeAsType<CXXDependentScopeMemberExpr>(
103+ Result, " DependentMemCall" )) {
104+ auto Parent = dpct::DpctGlobalInfo::getContext ().getParents (*CDSE);
105+ auto *CE = Parent[0 ].get <CallExpr>();
106+ if (CE) {
107+ for (size_t i = 0 ; i < CE->getNumArgs (); i++) {
108+ EA.analyze (CE->getArg (i));
109+ }
110+ }
91111 } else if (const CallExpr *CE = getNodeAsType<CallExpr>(Result, " FuncCall" )) {
92112 EA.analyze (CE);
93113 } else if (auto TL = getNodeAsType<TypeLoc>(Result, " TypeLoc" )) {
0 commit comments