On Tue, Mar 12, 2019 at 12:20:49PM +0100, Julia Lawall wrote: > > > On Tue, 12 Mar 2019, Maxime Ripard wrote: > > > Hi Julia, > > > > Thanks a lot for your answer, > > > > On Tue, Mar 12, 2019 at 10:03:57AM +0100, Julia Lawall wrote: > > > > @@ > > > > expression arg; > > > > identifier fb; > > > > @@ > > > > ... > > > > struct drm_framebuffer *fb; > > > > ... > > > > - drm_format_num_planes(arg) > > > > + fb->format->num_planes > > > > > > > > // This one seems to work in some cases, such as > > > > // https://elixir.bootlin.com/linux/v5.0/source/drivers/gpu/drm/vc4/vc4_plane.c#L490 > > > > // But it also matches in cases where fb hasn't been properly assigned before, such as: > > > > // https://elixir.bootlin.com/linux/v5.0/source/drivers/gpu/drm/tegra/fb.c#L142 > > > > > > OK, it looks like what you want is: > > > > > > @@ > > > struct drm_framebuffer *fb; > > > expression e. > > > @@ > > > > > > fb = e; > > > <... > > > - drm_format_num_planes(arg) > > > + fb->format->num_planes > > > ...> > > > > > > That is, you find an assignment of fb, and then anywhere after that you > > > have a call, you can replace it. This is <... ...> rather than <+... > > > ...+> so that it can match several 0 or more occurrences. > > > > It looks however that there's a difference between a variable > > declaration and assignment, and only an assignment. > > > > The snippet above doesn't match > > https://elixir.bootlin.com/linux/v5.0/source/drivers/gpu/drm/vc4/vc4_plane.c#L490 > > > > Whereas using > > > > @@ > > identifier fb; > > expression arg; > > expression e; > > @@ > > > > struct drm_framebuffer *fb = e; > > <... > > - drm_format_num_planes(arg) > > + fb->format->num_planes > > ...> > > > > Work for example. Is there a way to match both an assignment and a > > declaration + assignment? > > Try dropping the ; on the assignment fb = e It worked, thanks! What is the meaning of the semi-column in that case? The obvious would be that it matches an end of line, but given the behaviour shown above, I guess there's more to it? Maxime -- Maxime Ripard, Bootlin Embedded Linux and Kernel engineering https://bootlin.com