31
31
32
32
import cpp as cpp
33
33
34
+ private string atomicInit ( ) { result = "atomic_init" }
35
+
36
+ class AtomicInitCall = StdFunctionOrMacro< C11FunctionWrapperMacro , atomicInit / 0 > :: Call ;
37
+
34
38
/** Specify the name of your function as a predicate */
35
- signature string getName ( ) ;
39
+ private signature string getName ( ) ;
36
40
37
41
/** Signature module to implement custom argument resolution behavior in expanded macros */
38
- signature module InferMacroExpansionArguments {
42
+ private signature module InferMacroExpansionArguments {
39
43
bindingset [ mi, argumentIdx]
40
44
cpp:: Expr inferArgument ( cpp:: MacroInvocation mi , int argumentIdx ) ;
41
45
}
42
46
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
-
51
47
/** Assume macro `f(x, y, ...)` expands to `__c11_f(x, y, ...)`. */
52
- module C11FunctionWrapperMacro implements InferMacroExpansionArguments {
48
+ private module C11FunctionWrapperMacro implements InferMacroExpansionArguments {
53
49
bindingset [ mi, argumentIdx]
54
50
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
+ )
58
56
}
59
57
}
60
58
@@ -72,7 +70,8 @@ module C11FunctionWrapperMacro implements InferMacroExpansionArguments {
72
70
* select c.getArgument(0)
73
71
* ```
74
72
*/
75
- module StdFunctionOrMacro< InferMacroExpansionArguments InferExpansion, getName / 0 getStdName> {
73
+ private module StdFunctionOrMacro< InferMacroExpansionArguments InferExpansion, getName / 0 getStdName>
74
+ {
76
75
final private class Expr = cpp:: Expr ;
77
76
78
77
final private class FunctionCall = cpp:: FunctionCall ;
0 commit comments