xref: /OK3568_Linux_fs/kernel/scripts/coccinelle/iterators/fen.cocci (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun/// These iterators only exit normally when the loop cursor is NULL, so there
3*4882a593Smuzhiyun/// is no point to call of_node_put on the final value.
4*4882a593Smuzhiyun///
5*4882a593Smuzhiyun// Confidence: High
6*4882a593Smuzhiyun// Copyright: (C) 2010-2012 Nicolas Palix.
7*4882a593Smuzhiyun// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
8*4882a593Smuzhiyun// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
9*4882a593Smuzhiyun// URL: http://coccinelle.lip6.fr/
10*4882a593Smuzhiyun// Comments:
11*4882a593Smuzhiyun// Options: --no-includes --include-headers
12*4882a593Smuzhiyun
13*4882a593Smuzhiyunvirtual patch
14*4882a593Smuzhiyunvirtual context
15*4882a593Smuzhiyunvirtual org
16*4882a593Smuzhiyunvirtual report
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun@depends on patch@
19*4882a593Smuzhiyuniterator name for_each_node_by_name;
20*4882a593Smuzhiyunexpression np,E;
21*4882a593Smuzhiyunidentifier l;
22*4882a593Smuzhiyun@@
23*4882a593Smuzhiyun
24*4882a593Smuzhiyunfor_each_node_by_name(np,...) {
25*4882a593Smuzhiyun  ... when != break;
26*4882a593Smuzhiyun      when != goto l;
27*4882a593Smuzhiyun}
28*4882a593Smuzhiyun... when != np = E
29*4882a593Smuzhiyun- of_node_put(np);
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun@depends on patch@
32*4882a593Smuzhiyuniterator name for_each_node_by_type;
33*4882a593Smuzhiyunexpression np,E;
34*4882a593Smuzhiyunidentifier l;
35*4882a593Smuzhiyun@@
36*4882a593Smuzhiyun
37*4882a593Smuzhiyunfor_each_node_by_type(np,...) {
38*4882a593Smuzhiyun  ... when != break;
39*4882a593Smuzhiyun      when != goto l;
40*4882a593Smuzhiyun}
41*4882a593Smuzhiyun... when != np = E
42*4882a593Smuzhiyun- of_node_put(np);
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun@depends on patch@
45*4882a593Smuzhiyuniterator name for_each_compatible_node;
46*4882a593Smuzhiyunexpression np,E;
47*4882a593Smuzhiyunidentifier l;
48*4882a593Smuzhiyun@@
49*4882a593Smuzhiyun
50*4882a593Smuzhiyunfor_each_compatible_node(np,...) {
51*4882a593Smuzhiyun  ... when != break;
52*4882a593Smuzhiyun      when != goto l;
53*4882a593Smuzhiyun}
54*4882a593Smuzhiyun... when != np = E
55*4882a593Smuzhiyun- of_node_put(np);
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun@depends on patch@
58*4882a593Smuzhiyuniterator name for_each_matching_node;
59*4882a593Smuzhiyunexpression np,E;
60*4882a593Smuzhiyunidentifier l;
61*4882a593Smuzhiyun@@
62*4882a593Smuzhiyun
63*4882a593Smuzhiyunfor_each_matching_node(np,...) {
64*4882a593Smuzhiyun  ... when != break;
65*4882a593Smuzhiyun      when != goto l;
66*4882a593Smuzhiyun}
67*4882a593Smuzhiyun... when != np = E
68*4882a593Smuzhiyun- of_node_put(np);
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun// ----------------------------------------------------------------------
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun@r depends on !patch forall@
73*4882a593Smuzhiyun//iterator name for_each_node_by_name;
74*4882a593Smuzhiyun//iterator name for_each_node_by_type;
75*4882a593Smuzhiyun//iterator name for_each_compatible_node;
76*4882a593Smuzhiyun//iterator name for_each_matching_node;
77*4882a593Smuzhiyunexpression np,E;
78*4882a593Smuzhiyunidentifier l;
79*4882a593Smuzhiyunposition p1,p2;
80*4882a593Smuzhiyun@@
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun(
83*4882a593Smuzhiyun*for_each_node_by_name@p1(np,...)
84*4882a593Smuzhiyun{
85*4882a593Smuzhiyun  ... when != break;
86*4882a593Smuzhiyun      when != goto l;
87*4882a593Smuzhiyun}
88*4882a593Smuzhiyun|
89*4882a593Smuzhiyun*for_each_node_by_type@p1(np,...)
90*4882a593Smuzhiyun{
91*4882a593Smuzhiyun  ... when != break;
92*4882a593Smuzhiyun      when != goto l;
93*4882a593Smuzhiyun}
94*4882a593Smuzhiyun|
95*4882a593Smuzhiyun*for_each_compatible_node@p1(np,...)
96*4882a593Smuzhiyun{
97*4882a593Smuzhiyun  ... when != break;
98*4882a593Smuzhiyun      when != goto l;
99*4882a593Smuzhiyun}
100*4882a593Smuzhiyun|
101*4882a593Smuzhiyun*for_each_matching_node@p1(np,...)
102*4882a593Smuzhiyun{
103*4882a593Smuzhiyun  ... when != break;
104*4882a593Smuzhiyun      when != goto l;
105*4882a593Smuzhiyun}
106*4882a593Smuzhiyun)
107*4882a593Smuzhiyun... when != np = E
108*4882a593Smuzhiyun* of_node_put@p2(np);
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun@script:python depends on org@
111*4882a593Smuzhiyunp1 << r.p1;
112*4882a593Smuzhiyunp2 << r.p2;
113*4882a593Smuzhiyun@@
114*4882a593Smuzhiyun
115*4882a593Smuzhiyuncocci.print_main("unneeded of_node_put",p2)
116*4882a593Smuzhiyuncocci.print_secs("iterator",p1)
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun@script:python depends on report@
119*4882a593Smuzhiyunp1 << r.p1;
120*4882a593Smuzhiyunp2 << r.p2;
121*4882a593Smuzhiyun@@
122*4882a593Smuzhiyun
123*4882a593Smuzhiyunmsg = "ERROR: of_node_put not needed after iterator on line %s" % (p1[0].line)
124*4882a593Smuzhiyuncoccilib.report.print_report(p2[0], msg)
125