@@ type T; identifier i; expression dst; struct strvec *src_ptr; struct strvec src_arr; @@ ( - for (T i = 0; i < src_ptr->nr; i++) { strvec_push(dst, src_ptr->v[i]); } + strvec_pushv(dst, src_ptr->v); | - for (T i = 0; i < src_arr.nr; i++) { strvec_push(dst, src_arr.v[i]); } + strvec_pushv(dst, src_arr.v); ) @ separate_loop_index @ type T; identifier i; expression dst; struct strvec *src_ptr; struct strvec src_arr; @@ T i; ... ( - for (i = 0; i < src_ptr->nr; i++) { strvec_push(dst, src_ptr->v[i]); } + strvec_pushv(dst, src_ptr->v); | - for (i = 0; i < src_arr.nr; i++) { strvec_push(dst, src_arr.v[i]); } + strvec_pushv(dst, src_arr.v); ) @ unused_loop_index extends separate_loop_index @ @@ { ... - T i; ... when != i } @ depends on unused_loop_index @ @@ if (...) - { strvec_pushv(...); - }