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