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