1/// Device node iterators put the previous value of the index variable, so an
2/// explicit put causes a double put.
3///
4// Confidence: High
5// Copyright: (C) 2015 Julia Lawall, Inria. GPLv2.
6// URL: http://coccinelle.lip6.fr/
7// Options: --no-includes --include-headers
8// Requires: 1.0.4
9// Keywords: for_each_child_of_node, etc.
10
11// This uses a conjunction, which requires at least coccinelle >= 1.0.4
12
13virtual patch
14virtual context
15virtual org
16virtual report
17
18@r exists@
19expression e1,e2;
20local idexpression n;
21iterator name for_each_node_by_name, for_each_node_by_type,
22for_each_compatible_node, for_each_matching_node,
23for_each_matching_node_and_match, for_each_child_of_node,
24for_each_available_child_of_node, for_each_node_with_property;
25iterator i;
26position p1,p2;
27statement S;
28@@
29
30(
31(
32for_each_node_by_name(n,e1) S
33|
34for_each_node_by_type(n,e1) S
35|
36for_each_compatible_node(n,e1,e2) S
37|
38for_each_matching_node(n,e1) S
39|
40for_each_matching_node_and_match(n,e1,e2) S
41|
42for_each_child_of_node(e1,n) S
43|
44for_each_available_child_of_node(e1,n) S
45|
46for_each_node_with_property(n,e1) S
47)
48&
49i@p1(...) {
50   ... when != of_node_get(n)
51       when any
52   of_node_put@p2(n);
53   ... when any
54}
55)
56
57@s exists@
58local idexpression r.n;
59statement S;
60position r.p1,r.p2;
61iterator i;
62@@
63
64 of_node_put@p2(n);
65 ... when any
66 i@p1(..., n, ...)
67 S
68
69@t depends on s && patch && !context && !org && !report@
70local idexpression n;
71position r.p2;
72@@
73
74- of_node_put@p2(n);
75
76// ----------------------------------------------------------------------------
77
78@t_context depends on s && !patch && (context || org || report)@
79local idexpression n;
80position r.p2;
81position j0;
82@@
83
84*  of_node_put@j0@p2(n);
85
86// ----------------------------------------------------------------------------
87
88@script:python t_org depends on org@
89j0 << t_context.j0;
90@@
91
92msg = "ERROR: probable double put."
93coccilib.org.print_todo(j0[0], msg)
94
95// ----------------------------------------------------------------------------
96
97@script:python t_report depends on report@
98j0 << t_context.j0;
99@@
100
101msg = "ERROR: probable double put."
102coccilib.report.print_report(j0[0], msg)
103
104