On Wed, Feb 19, 2020 at 11:37:03PM +0100, Julia Lawall wrote: > > > --- Please note the new email address --- > > > On Wed, 19 Feb 2020, Ville Syrjälä wrote: > > > Hi all, > > > > I was trying to do the following transformation: > > @@ > > identifier M; > > expression E; > > @@ > > - struct foo M = E; > > + struct foo M; > > + copy_struct(&M, &E); > > > > but without inserting the function call in the middle of the > > declarations and instead pushing it past them. > > > > This is one attempt: > > @decl@ > > identifier M; > > expression E; > > @@ > > - struct foo M = E; > > + struct foo M; > > > > @copy@ > > identifier decl.M; > > expression decl.E; > > declaration D; > > statement S; > > @@ > > struct foo M; > > ... > > D > > + copy_struct(&M, &E); > > S > > > > The copy rule fails to match anything when I have != 1 > > declarations after the struct. So the ... doesn't seem > > to eat the extra declarations for some reason. > > @copy@ > identifier decl.M; > expression decl.E; > declaration D; > statement S; > @@ > struct foo M; > ... when any > D > + copy_struct(&M, &E); > S > > Otherwise, ... doesn't match code that includes what is before or after > it, ie struct foo M or D.
This one still inserts the code after all declarations in nested blocks. Also misses cases where there are no extra declarations. So not quite what I need. > > Aternatively: > > @copy@ > identifier decl.M; > expression decl.E; > declaration D; > statement S,S1; > @@ > struct foo M; > ... when != S1 > + copy_struct(&M, &E); > S This on the other hand seems to work very nicely. Thanks. Earlier I tried to play around with some '... when !=' stuff, but this double statement trick did not occur to me. -- Ville Syrjälä Intel _______________________________________________ Cocci mailing list [email protected] https://systeme.lip6.fr/mailman/listinfo/cocci
