On Tue, 20 Sep 2016, Joe Perches wrote: > On Tue, 2016-09-20 at 15:14 +0200, Julia Lawall wrote: > > The semantic patch below finds a binary operator in a macro and a binary > > operator in the use of the macro, and checks if the priority of the > > operator in the macro is higher (lower number) than the priority of the > > operator in the use.  If this is the case, it adds parentheses in the use, > > which is not what one wants, but serves to show where the problem is. > > > > It doesn't turn up anything, except an occurrence of (u32)-1, which > > Coccinelle parses as a subtraction, due to not having any nearby evidence > > that u32 is a type. > > > > I didn't make any special effort on the include files, which means that > > only local include files and ones with the same name as the C file are > > taken into account.  I can try with more aggressive include options. > > > > This only works with the github version of Coccinelle, as it required > > quite a lot of improvement to the treatmern of #define. > > > > julia > > > > @initialize:ocaml@ > > @@ > > > > let binoptbl = > >     [("*",3);("/",3);("%",3); > > Shouldn't bitwise negation (~) and not (!) be added at 3? > > ("~",3);("!",3); My semantic patch only covers binary operators at the moment, so I didn't put the complete table. I can extend it. julia >   > >       ("+",4);("-",4); > >       ("<<",5);(">>",5); > >       ("<",6);(">",6);("<=",6);(">=",6); > >       ("==",7);("!=",7); > >       ("&",8); > >       ("^",9); > >       ("|",10); > >       ("&&",11); > >       ("||",12)] > > > > @r@ > > identifier i,j; > > identifier list[n] is; > > binary operator b; > > expression e; > > @@ > > > > #define i(is,j,...) (<+... \(j b e \| e b j\) ...+>) > > > > @s@ > > identifier r.i; > > expression list[r.n] es; > > binary operator b1; > > expression e1,e2; > > position p; > > @@ > > > > >  i@p(es,e1 b1 e2,...) > > > > @script:ocaml@ > > _p << s.p; > > b << r.b; > > b1 << s.b1; > > @@ > > > > try > >   let p1 = List.assoc b binoptbl in > >   let p2 = List.assoc b1 binoptbl in > >   if p1 >= p2 then Coccilib.include_match false > > with Not_found -> () > > > > @@ > > identifier r.i; > > expression list[r.n] es; > > expression e; > > position s.p; > > @@ > > > > i@p(es, > > +( > > e > > +) > > ,...) > > >