xref: /linux/scripts/coccinelle/iterators/device_node_continue.cocci (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
17f904d7eSThomas Gleixner// SPDX-License-Identifier: GPL-2.0-only
241167d07SJulia Lawall/// Device node iterators put the previous value of the index variable, so an
341167d07SJulia Lawall/// explicit put causes a double put.
441167d07SJulia Lawall///
541167d07SJulia Lawall// Confidence: High
67f904d7eSThomas Gleixner// Copyright: (C) 2015 Julia Lawall, Inria.
7*f01701ceSJulia Lawall// URL: https://coccinelle.gitlabpages.inria.fr/website
841167d07SJulia Lawall// Options: --no-includes --include-headers
9cc65e823SLuis R. Rodriguez// Requires: 1.0.4
1041167d07SJulia Lawall// Keywords: for_each_child_of_node, etc.
1141167d07SJulia Lawall
12cc65e823SLuis R. Rodriguez// This uses a conjunction, which requires at least coccinelle >= 1.0.4
13cc65e823SLuis R. Rodriguez
1441167d07SJulia Lawallvirtual patch
1541167d07SJulia Lawallvirtual context
1641167d07SJulia Lawallvirtual org
1741167d07SJulia Lawallvirtual report
1841167d07SJulia Lawall
1941167d07SJulia Lawall@r exists@
2041167d07SJulia Lawallexpression e1,e2;
2141167d07SJulia Lawalllocal idexpression n;
2241167d07SJulia Lawalliterator name for_each_node_by_name, for_each_node_by_type,
2341167d07SJulia Lawallfor_each_compatible_node, for_each_matching_node,
2441167d07SJulia Lawallfor_each_matching_node_and_match, for_each_child_of_node,
2541167d07SJulia Lawallfor_each_available_child_of_node, for_each_node_with_property;
2641167d07SJulia Lawalliterator i;
2741167d07SJulia Lawallposition p1,p2;
2841167d07SJulia Lawallstatement S;
2941167d07SJulia Lawall@@
3041167d07SJulia Lawall
3141167d07SJulia Lawall(
3241167d07SJulia Lawall(
3341167d07SJulia Lawallfor_each_node_by_name(n,e1) S
3441167d07SJulia Lawall|
3541167d07SJulia Lawallfor_each_node_by_type(n,e1) S
3641167d07SJulia Lawall|
3741167d07SJulia Lawallfor_each_compatible_node(n,e1,e2) S
3841167d07SJulia Lawall|
3941167d07SJulia Lawallfor_each_matching_node(n,e1) S
4041167d07SJulia Lawall|
4141167d07SJulia Lawallfor_each_matching_node_and_match(n,e1,e2) S
4241167d07SJulia Lawall|
4341167d07SJulia Lawallfor_each_child_of_node(e1,n) S
4441167d07SJulia Lawall|
4541167d07SJulia Lawallfor_each_available_child_of_node(e1,n) S
4641167d07SJulia Lawall|
4741167d07SJulia Lawallfor_each_node_with_property(n,e1) S
4841167d07SJulia Lawall)
4941167d07SJulia Lawall&
5041167d07SJulia Lawalli@p1(...) {
5141167d07SJulia Lawall   ... when != of_node_get(n)
5241167d07SJulia Lawall       when any
5341167d07SJulia Lawall   of_node_put@p2(n);
5441167d07SJulia Lawall   ... when any
5541167d07SJulia Lawall}
5641167d07SJulia Lawall)
5741167d07SJulia Lawall
5841167d07SJulia Lawall@s exists@
5941167d07SJulia Lawalllocal idexpression r.n;
6041167d07SJulia Lawallstatement S;
6141167d07SJulia Lawallposition r.p1,r.p2;
6241167d07SJulia Lawalliterator i;
6341167d07SJulia Lawall@@
6441167d07SJulia Lawall
6541167d07SJulia Lawall of_node_put@p2(n);
6641167d07SJulia Lawall ... when any
6741167d07SJulia Lawall i@p1(..., n, ...)
6841167d07SJulia Lawall S
6941167d07SJulia Lawall
7041167d07SJulia Lawall@t depends on s && patch && !context && !org && !report@
7141167d07SJulia Lawalllocal idexpression n;
7241167d07SJulia Lawallposition r.p2;
7341167d07SJulia Lawall@@
7441167d07SJulia Lawall
7541167d07SJulia Lawall- of_node_put@p2(n);
7641167d07SJulia Lawall
7741167d07SJulia Lawall// ----------------------------------------------------------------------------
7841167d07SJulia Lawall
7941167d07SJulia Lawall@t_context depends on s && !patch && (context || org || report)@
8041167d07SJulia Lawalllocal idexpression n;
8141167d07SJulia Lawallposition r.p2;
8241167d07SJulia Lawallposition j0;
8341167d07SJulia Lawall@@
8441167d07SJulia Lawall
8541167d07SJulia Lawall*  of_node_put@j0@p2(n);
8641167d07SJulia Lawall
8741167d07SJulia Lawall// ----------------------------------------------------------------------------
8841167d07SJulia Lawall
8941167d07SJulia Lawall@script:python t_org depends on org@
9041167d07SJulia Lawallj0 << t_context.j0;
9141167d07SJulia Lawall@@
9241167d07SJulia Lawall
9341167d07SJulia Lawallmsg = "ERROR: probable double put."
9441167d07SJulia Lawallcoccilib.org.print_todo(j0[0], msg)
9541167d07SJulia Lawall
9641167d07SJulia Lawall// ----------------------------------------------------------------------------
9741167d07SJulia Lawall
9841167d07SJulia Lawall@script:python t_report depends on report@
9941167d07SJulia Lawallj0 << t_context.j0;
10041167d07SJulia Lawall@@
10141167d07SJulia Lawall
10241167d07SJulia Lawallmsg = "ERROR: probable double put."
10341167d07SJulia Lawallcoccilib.report.print_report(j0[0], msg)
10441167d07SJulia Lawall
105