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