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