18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/// Device node iterators put the previous value of the index variable, so an
38c2ecf20Sopenharmony_ci/// explicit put causes a double put.
48c2ecf20Sopenharmony_ci///
58c2ecf20Sopenharmony_ci// Confidence: High
68c2ecf20Sopenharmony_ci// Copyright: (C) 2015 Julia Lawall, Inria.
78c2ecf20Sopenharmony_ci// URL: http://coccinelle.lip6.fr/
88c2ecf20Sopenharmony_ci// Options: --no-includes --include-headers
98c2ecf20Sopenharmony_ci// Requires: 1.0.4
108c2ecf20Sopenharmony_ci// Keywords: for_each_child_of_node, etc.
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci// This uses a conjunction, which requires at least coccinelle >= 1.0.4
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_civirtual patch
158c2ecf20Sopenharmony_civirtual context
168c2ecf20Sopenharmony_civirtual org
178c2ecf20Sopenharmony_civirtual report
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci@r exists@
208c2ecf20Sopenharmony_ciexpression e1,e2;
218c2ecf20Sopenharmony_cilocal idexpression n;
228c2ecf20Sopenharmony_ciiterator name for_each_node_by_name, for_each_node_by_type,
238c2ecf20Sopenharmony_cifor_each_compatible_node, for_each_matching_node,
248c2ecf20Sopenharmony_cifor_each_matching_node_and_match, for_each_child_of_node,
258c2ecf20Sopenharmony_cifor_each_available_child_of_node, for_each_node_with_property;
268c2ecf20Sopenharmony_ciiterator i;
278c2ecf20Sopenharmony_ciposition p1,p2;
288c2ecf20Sopenharmony_cistatement S;
298c2ecf20Sopenharmony_ci@@
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci(
328c2ecf20Sopenharmony_ci(
338c2ecf20Sopenharmony_cifor_each_node_by_name(n,e1) S
348c2ecf20Sopenharmony_ci|
358c2ecf20Sopenharmony_cifor_each_node_by_type(n,e1) S
368c2ecf20Sopenharmony_ci|
378c2ecf20Sopenharmony_cifor_each_compatible_node(n,e1,e2) S
388c2ecf20Sopenharmony_ci|
398c2ecf20Sopenharmony_cifor_each_matching_node(n,e1) S
408c2ecf20Sopenharmony_ci|
418c2ecf20Sopenharmony_cifor_each_matching_node_and_match(n,e1,e2) S
428c2ecf20Sopenharmony_ci|
438c2ecf20Sopenharmony_cifor_each_child_of_node(e1,n) S
448c2ecf20Sopenharmony_ci|
458c2ecf20Sopenharmony_cifor_each_available_child_of_node(e1,n) S
468c2ecf20Sopenharmony_ci|
478c2ecf20Sopenharmony_cifor_each_node_with_property(n,e1) S
488c2ecf20Sopenharmony_ci)
498c2ecf20Sopenharmony_ci&
508c2ecf20Sopenharmony_cii@p1(...) {
518c2ecf20Sopenharmony_ci   ... when != of_node_get(n)
528c2ecf20Sopenharmony_ci       when any
538c2ecf20Sopenharmony_ci   of_node_put@p2(n);
548c2ecf20Sopenharmony_ci   ... when any
558c2ecf20Sopenharmony_ci}
568c2ecf20Sopenharmony_ci)
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci@s exists@
598c2ecf20Sopenharmony_cilocal idexpression r.n;
608c2ecf20Sopenharmony_cistatement S;
618c2ecf20Sopenharmony_ciposition r.p1,r.p2;
628c2ecf20Sopenharmony_ciiterator i;
638c2ecf20Sopenharmony_ci@@
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci of_node_put@p2(n);
668c2ecf20Sopenharmony_ci ... when any
678c2ecf20Sopenharmony_ci i@p1(..., n, ...)
688c2ecf20Sopenharmony_ci S
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci@t depends on s && patch && !context && !org && !report@
718c2ecf20Sopenharmony_cilocal idexpression n;
728c2ecf20Sopenharmony_ciposition r.p2;
738c2ecf20Sopenharmony_ci@@
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci- of_node_put@p2(n);
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci// ----------------------------------------------------------------------------
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci@t_context depends on s && !patch && (context || org || report)@
808c2ecf20Sopenharmony_cilocal idexpression n;
818c2ecf20Sopenharmony_ciposition r.p2;
828c2ecf20Sopenharmony_ciposition j0;
838c2ecf20Sopenharmony_ci@@
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci*  of_node_put@j0@p2(n);
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci// ----------------------------------------------------------------------------
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ci@script:python t_org depends on org@
908c2ecf20Sopenharmony_cij0 << t_context.j0;
918c2ecf20Sopenharmony_ci@@
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_cimsg = "ERROR: probable double put."
948c2ecf20Sopenharmony_cicoccilib.org.print_todo(j0[0], msg)
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci// ----------------------------------------------------------------------------
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci@script:python t_report depends on report@
998c2ecf20Sopenharmony_cij0 << t_context.j0;
1008c2ecf20Sopenharmony_ci@@
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_cimsg = "ERROR: probable double put."
1038c2ecf20Sopenharmony_cicoccilib.report.print_report(j0[0], msg)
1048c2ecf20Sopenharmony_ci
105