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