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