> It can determine the type of t->entries if it has access to the definition > of the type of t. I would like to point another implementation detail out. Another known function was also an update candidate. https://github.com/git/git/blob/9a1180fc304ad9831641e5788e9c8d3dfc10ccdd/pretty.c#L90 elfring@Sonne:~/Projekte/git/lokal> spatch contrib/coccinelle/array.cocci pretty.c … @@ -106,8 +106,8 @@ static void setup_commit_formats(void) commit_formats_len = ARRAY_SIZE(builtin_formats); builtin_formats_len = commit_formats_len; ALLOC_GROW(commit_formats, commit_formats_len, commit_formats_alloc); - memcpy(commit_formats, builtin_formats, - sizeof(*builtin_formats)*ARRAY_SIZE(builtin_formats)); + COPY_ARRAY(commit_formats, builtin_formats, + ARRAY_SIZE(builtin_formats)); git_config(git_pretty_formats_config, NULL); } This patch generation can work based on the following SmPL code combination. “… expression n, x; … - , (n) * \( sizeof(T) \| sizeof(*(x)) \) …” The asterisk should refer to a pointer expression within a sizeof operator. I got informed that the semantic patch language would support such a restriction. Thus I have tried out to specify the corresponding metavariables in this way. “… expression n; expression* x; …” But the shown diff hunk is not regenerated by this SmPL script variant. How should an array like “builtin_formats” (which is even defined in the same function) be treated by the Coccinelle software in such use cases? Regards, Markus