@@ -37,6 +37,13 @@ void LIBCURule::registerMatcher(ast_matchers::MatchFinder &MF) {
37
37
" compare_exchange_strong" , " fetch_add" , " fetch_sub" ,
38
38
" at" );
39
39
};
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
+ };
40
47
auto LIBCUTypesHasNames = [&]() {
41
48
return hasAnyName (" cuda::atomic" , " cuda::std::atomic" ,
42
49
" cuda::std::array" );
@@ -47,6 +54,9 @@ void LIBCURule::registerMatcher(ast_matchers::MatchFinder &MF) {
47
54
callee (cxxMethodDecl (LIBCUMemberFuncHasNames ()))))
48
55
.bind (" MemberCall" ),
49
56
this );
57
+ MF.addMatcher (cxxDependentScopeMemberExpr (LIBCUMemberHasNames ())
58
+ .bind (" DependentMemCall" ),
59
+ this );
50
60
}
51
61
{
52
62
MF.addMatcher (dependentScopeDeclRefExpr ().bind (" DependentScope" ),
@@ -88,6 +98,16 @@ void LIBCURule::runRule(const ast_matchers::MatchFinder::MatchResult &Result) {
88
98
if (const CXXMemberCallExpr *MC =
89
99
getNodeAsType<CXXMemberCallExpr>(Result, " MemberCall" )) {
90
100
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
+ }
91
111
} else if (const CallExpr *CE = getNodeAsType<CallExpr>(Result, " FuncCall" )) {
92
112
EA.analyze (CE);
93
113
} else if (auto TL = getNodeAsType<TypeLoc>(Result, " TypeLoc" )) {
0 commit comments