3131
3232import cpp as cpp
3333
34+ private string atomicInit ( ) { result = "atomic_init" }
35+
36+ class AtomicInitCall = StdFunctionOrMacro< C11FunctionWrapperMacro , atomicInit / 0 > :: Call ;
37+
3438/** Specify the name of your function as a predicate */
35- signature string getName ( ) ;
39+ private signature string getName ( ) ;
3640
3741/** Signature module to implement custom argument resolution behavior in expanded macros */
38- signature module InferMacroExpansionArguments {
42+ private signature module InferMacroExpansionArguments {
3943 bindingset [ mi, argumentIdx]
4044 cpp:: Expr inferArgument ( cpp:: MacroInvocation mi , int argumentIdx ) ;
4145}
4246
43- /** Assume all subexpressions of an expanded macro may be the result of any ith argument */
44- module NoMacroExpansionInference implements InferMacroExpansionArguments {
45- bindingset [ mi, argumentIdx]
46- cpp:: Expr inferArgument ( cpp:: MacroInvocation mi , int argumentIdx ) {
47- result .getParent * ( ) = mi .getExpr ( )
48- }
49- }
50-
5147/** Assume macro `f(x, y, ...)` expands to `__c11_f(x, y, ...)`. */
52- module C11FunctionWrapperMacro implements InferMacroExpansionArguments {
48+ private module C11FunctionWrapperMacro implements InferMacroExpansionArguments {
5349 bindingset [ mi, argumentIdx]
5450 cpp:: Expr inferArgument ( cpp:: MacroInvocation mi , int argumentIdx ) {
55- if mi .getExpr ( ) .( cpp:: FunctionCall ) .getTarget ( ) .hasName ( "__c11_" + mi .getMacroName ( ) )
56- then result = mi .getExpr ( ) .( cpp:: FunctionCall ) .getArgument ( argumentIdx )
57- else result = NoMacroExpansionInference:: inferArgument ( mi , argumentIdx )
51+ exists ( cpp:: FunctionCall fc |
52+ fc = mi .getExpr ( ) and
53+ fc .getTarget ( ) .hasName ( "__c11_" + mi .getMacroName ( ) ) and
54+ result = mi .getExpr ( ) .( cpp:: FunctionCall ) .getArgument ( argumentIdx )
55+ )
5856 }
5957}
6058
@@ -72,7 +70,8 @@ module C11FunctionWrapperMacro implements InferMacroExpansionArguments {
7270 * select c.getArgument(0)
7371 * ```
7472 */
75- module StdFunctionOrMacro< InferMacroExpansionArguments InferExpansion, getName / 0 getStdName> {
73+ private module StdFunctionOrMacro< InferMacroExpansionArguments InferExpansion, getName / 0 getStdName>
74+ {
7675 final private class Expr = cpp:: Expr ;
7776
7877 final private class FunctionCall = cpp:: FunctionCall ;
0 commit comments