From 4dfbc1c2559051afaa06fbd7f7be19276d24bf44 Mon Sep 17 00:00:00 2001 From: Coccinelle Date: Thu, 17 Mar 2011 14:09:14 +0100 Subject: [PATCH] Coccinelle release 0.2.5-rc7. ** Language: - Make a very small attempt to parse C++ code, amounting to accepting identifiers containing ::, tilde, and template invocations. Use the option -c++. This is not likely to be very useful in practice. - Added metavariable metavariable type. - Add disjunctions on identifiers in some contexts - Pretend that & indicates a pointer in -c++ mode - Support for new ** Features: - support transformations on variables (only) in declarations that declare multiple variables - allow #endif XXX in C code - relax_include_path now applied to non local includes too, in which case it tries to find a unique file with a suffix of the provided name. this is useful for directories that are intended to be symbolic links. - support matching and removing #undef - support for iteration in ocaml, requires use of -no_show_diff - calls to likely and unlikely propagate test expression status to their arguments - reuse typedefs and macros from complete parsing when reparsing the transformed code - optimization for an if branch that is just { ... } - spatch -control_flow_to_file file.c generates a file file.dot ** Bugfix: - improved parsing of expressions to allow ... to the right of operators in more places - Fix check_config for Python 2.7 on Fedora 14 (Reported-by: Michael Stefaniuc) - Check for ocamlfind in configure (Reported-by: Paul E. McKenney) - Postpone use of ocamlfind at runtime to report fewer errors - Add support for Python 2.4 binding with the provided pycaml library --- changes.txt | 2 + docs/manual/main_grammar.pdf | Bin 337830 -> 337830 bytes docs/manual/manual.pdf | Bin 441609 -> 442509 bytes docs/manual/options.pdf | Bin 136473 -> 138014 bytes docs/manual/spatch_options.tex | 7 +++ engine/cocci_vs_c.ml | 35 +++++++++----- globals/config.ml.in | 2 +- parsing_c/ast_c.ml | 8 +++- parsing_c/lexer_c.mll | 38 ++++++++++++++- parsing_c/parser_c.mly | 47 +++++++++++++----- parsing_c/parsing_hacks.ml | 85 +++++++++++++++++++-------------- parsing_c/pretty_print_c.ml | 23 +++++---- parsing_c/test_parsing_c.ml | 24 ++++++---- parsing_c/token_helpers.ml | 6 ++- parsing_c/type_annoter_c.ml | 15 ++++-- parsing_c/visitor_c.ml | 25 ++++++---- 16 files changed, 221 insertions(+), 96 deletions(-) diff --git a/changes.txt b/changes.txt index b8dfee8..011dd85 100644 --- a/changes.txt +++ b/changes.txt @@ -22,6 +22,7 @@ - Added metavariable metavariable type. - Add disjunctions on identifiers in some contexts - Pretend that & indicates a pointer in -c++ mode +- Support for new ** Features: - support transformations on variables (only) in declarations that declare @@ -37,6 +38,7 @@ - reuse typedefs and macros from complete parsing when reparsing the transformed code - optimization for an if branch that is just { ... } +- spatch -control_flow_to_file file.c generates a file file.dot ** Bugfix: - improved parsing of expressions to allow ... to the right of operators in diff --git a/docs/manual/main_grammar.pdf b/docs/manual/main_grammar.pdf index f415fd4fcc0c238187abfae149ff24ccb1d9c856..fa23684f6942d7405760f8436aeb91fed58d451a 100644 GIT binary patch delta 2257 zcmV;?2rl=g&lIN56tD^ie_7mlf{R&=l9idvP>X}eQ^qr~JH#0)G8wFG?EVl79-VYO zcB&uf>uNy3e(-Yx`UHt{@I=hZNI%`olE;v0tNuJzXFon#bt3Bca#>22m1K#uHst8;yG6 z$MdCeaR=m3{k#WHfBIFr4}|gCbYL*~5I@jpPc`QY8FN58ERGgYWrO&=D5A5AD$vy( z8fDil$EvlOCkm1+vc>9Gq57h!iu{MCMgr}?HAO#huD10e?h9nDrLv8-2ktO5TKLEWsk@jyt2RSY%|9MptcZbELq_qHhj! zg~3?}zJ8#Xe=rp18OAvk&)b8~;-zkHo?6U`Jbq;X2y+&I0I~oE&;m!0ve`=6^p&zs zV&!uJYTln{_-~Itd{5N6y#PPpOXaP|S(2segcw{2$I2f{xT{$-6sD@ZqQxS1Wd!zM z-lPCHf8-8~68`icX5%fcoTVw~yjWSInow)cu4MbHxqrwP>|^j+zU2P94c0D-@B|Jb zWoiDV;$P*7@-0tLPkk*tP62#OtL$K=WnzU^AOMnl9q9kvk_pDndVQVHYc*UR_oa;V zcUC`O9887cZ5^_&)!|EHhOufl3QqzUPKtM{eD${UZ91xa8%OES zXfvLQH_y`6rnwHE*HT~myW~u8vDgHK3W5rD*81d;sVsB2W5htfo#X9=Hx7abkYlu{C7G?Gd^VxQ&`8x?(NX_2hHC|YT&$Tib;EcsxuZ~7T*7=(G*27m$P^IgjBb9@9B7WCu|9kg zaD7>V=4-=VHgB zRlkg2UHh^Yo6%JfMk@L_sjKP%%GW;8aSY?rIXp#3nA~Dt6cUR`ftV6U#&VwX4>>?# zeQ1?~-AVMXi^8m?nTmd9i#<=z(z8A(13W&_f494%d6hQm zN5Yw$`^VugTfiV;GMx@qUp>MH-r?7qD_tnLyu(q1_uCLVP7{`-Mkg1*O#>{f(x(0i)3S8cp6 zikR+SMdEz{1D&%Y+Vl=HeelsCFXN_+LsJ8(wjI(V6x(RzvH$ zLLcb@3;)`3RMV@=$*=9{7woQ;B|Jbv7mE0YBnmS3q7*U-#Qri?fBq_72k)X*n9<=? zj3fXGw_6W9p*>1jkb)8v?3=~2nspfp(=H5Qn%Y2P2YdynT9@Fle`~^JE?sC7svVy7 zwmL!#kTjj}rur2hLhZcv2EFn*5S#wgfW_{VK&C$>8C(ZLVDX?#Poqs(r|J9X7llTt zP60PU`RB#D{8v5~e>-gWQ%k8r<8j^yiiZ~D4$Fnb=y%s)!_mJ0_%Ogldi`twy`%9{ z^!SO?H2_BUVKn4c=iel^-eKQP`}wYd`HGpj;qAC!#r%4;Nc-F;Wf8I~e>3fi+qBQ8 zl5XiU?9k3h$n)hI=7N|l?tY0sby)P=v@MMty;9!0FgLZdI9$4Sw3VCIXBxo75dJGc z6?eMo(2)Snb+6Q0uOZ*I(20s0@B8iO(rhcXZWhcXZX zhcXZYw=xg}Ex9T(I59CaF)%bMFfk`EFefPrFHLV`L}7GgASgsSGB7bQFfuYYF)=hT zFt>@x1if8DF+o8_IYmZ7L_;+>Fh)2*I72ZpMlm@wHaIdlG(<2$LpihuE2T#PjjP%pZEO`v6w(8Ggb@t<_S&{5tQGiL=g`h@7?XfBS5jVNgANjJD~| zMB1V1PnAJ+Ga2=Is0KJ>&?rmd=sUmO>P``5##UKWq9~(_-h(R73jg{5*(W^mvt$5l zY1PwkxPTPTt2wE)YE4hVt9B2oi5{<4W$MaKJV1G4nKPQN&4u{IWe_D%WjxVUwb7_2 zemq|q7k5Ao)z5qIf23cf`#>1KO$P>(5Ag$y_EdAekTD0e!{TTWRW^v>GP~Rdw?d=MtkzW-%O75ANui-nq=#nPrh3otZEX3Q<1f zy8`kdqvVG)C?S*Ta$$pnRhW!8WykYb*&!H@Ddl#Am3`Hzplh*IgO^Okv%ySZkg^Sh zg=AbNzh!svuIoycmNKkxhFNcszR?#fqvTC^#u6-Y?zl7BibX~yX>`@rHb)A)Ec)g! zR~Vdy;Ohs9e+ffzo?)C*@w`3wEMDsN=BdT3$m3TQfG}qP2p|h!04;C?DVwd7OhC(J;A*K+&48!%~{e3-EZPqr|e~dkudysAKyQ=9w`^;vSp=-DN zT0mCK(dFYW;XA0^agw=?c}S9y`J!Jn)`=*!9E7B5Gy;j5JabLqwpkv;iP!Ce`-SIEz_y!Ak^HD7qeIt?^S2-w6E@L zGjLr6E6Sm0%HECDg8=-D9-x2{?}qFDmtUP4sxOsku!2El%b*$zl)k-v(x#)zw{evI zj5gz`c=If6ZJO)wc`fy|ze~;p7mH0$s353dXRS{jnaVPUJ4Ory+&SJ}c;g_5K%UPn zf7`)v0mh=qFZAJdI?4e@Ap=&1sf)G_;{r{l5YC0q(2*S0j-yY`hsI9xgzXo+tm>d; zH8p)f3L&^c@}!kl3(#_qtLmSLoc2@iX`53sy!ducwyloDiRHrgv>1*T&HFu~{A^)1 ztWd^iV~KV+7Z)P{Fz$W;qbD_}+QB58e|o++Pw=1;pFGE@OFE_~;8)ju>k+o1cL1t9 zj0QFtgu{1R`3U7DlM|r$iG>6_j!Xe@&gkYh&4K1P8tcP1 z0oRws`UsvII4%#p6g#uKfWF+1?{I)sQKCr<+;P&aP6I6*fu(E0dQjiE$Dl^$ZkbA2fe3id)3DK zqKN7KRV3aQFwi+W!p(>5f1o84=+(Rz3MLWmdEx1WmR*g$Dv;o;pCrUCUSQgX2=1cS z1{kaS(q`}kUC1GrLrlUV9Gh8Ed>1Uw@~!yxZ!Z2}glZ>JjsK;zvEdcR7oBNuV>Ps{ zEA){ru<)-fM>V~=oc!9Je!=cqS;7M(bfJiUNTMKfFG?YkK@b?`1~g&7@Q z#Yh66aJ%)u6WXJc1t};&!M<5Mt67(!Fzvz+rl}1ycEDGFs&xq-`?n@s=F){Wq1xeD zZ>uB307=scZ>nGMA=J)mZ_q2B1F`8(4Or|>31s?HlEHN_1Qrj<^fcOpb(+49eo<(Y z>J)Gzlz(2V%YWr_f3d@cKed!9G#=-Tpm=CO?yy`~jDB|=HXQv6fDZ#)q}R^|&^sDG zMUS6IT?1frA4WrNb^c9q>mBy(w4d)Pn6H?b8{Uo!R?M$gi?q*uQWhb*@;B4IxJ~3v*LTILoDbM_ajReWn3S4B@{L zRB@-P4jl>LT=z=7^%@d>A+!ZcIRfrDVOf!dN0sHKzdnBWAF)ZA7lSeohcXZWhcXZX zhcXZYw=xg}Ex9T&HZn3XHZwFUFfk`EFefPrFHLV`L}7GgASgsSGB7bQFfuVVGBPnX zGq;J!1if8DHZ?LbLN-P?GdVRwGetr~FfcPQLq~xmiuNTf6?2LF!aO^P1Uq_*8f#q`TF^F>!LS` zrv&RCu2<38sG>zGQPCn>9VW5TQah~#_0t2kb)HjQvu}2=@knDz$XUZ;F{af(`7&)FG5{qV%ecGLa<0zP`UJ;7 z!9(TFqt2-DvuC|am2YF$iEq#Q_PwyW$*``U_&CgR&ak?`Mndr>}Lh#u-y)E9S; zlkQ!>(XHL->lu2@Y}g&0`APpRHa%msE%Re+b-djp-{O#s-e_2e#e7$v{gxfYX#<;6yZhFdH?yH@AApyky-ZF=nx{`wgQ$8NtX9Z_jGZ&K(h z%G81RSM9oN@#LV^8C6RbSZ-~6Qtag9H8%bF`}%o`ql+Wj?7b;!xAa8Tc>xP@o9x~*SdjVM`nC79sYjwv* zO2VP2&4Q12UYv4Jei>kHJuJ3I*D9%5Z`?eios9H??jNL`SJ+n75i1@R|5&cB>6EnN zgs+;?xHi|ZGdJ!~=*qmMw`tg@u_`+UCR-&%B<}Ecl`U_78R%Gwy5hmUq)3%nUoNC-)Fk%iEr`3+72a@vrOL?0=;b;i;LPc%=lw7OJf^WKlru-Q1M_AvcPWUoQ;1W%RhJuV-XFDrO;JASKO@pL(+hnL&X z;TiVn)d?Fs#uP9;9HdyDW~41DV?Asi_(+d^XTWirrlq-NW<$I{BT?6{eh$;1N<}kd zH~H@B&#&bVy?9hik&PdWYJBT<#OdvNW40F4_j>=)C7&KYd-nKo<)I6zjn8{rj)xP|CJlDJ9GV(_@8Ta z4ccaCxp_+e-OvVBd*J(#PLmeD$l1JGiFYXbUMGw6>hq-3;cki(jOSU`1l-uuyD#0t zXW!`J6!XoY%{q>nsJx@Pd_zge0u=2b^4jT_YBMFu*lMfkvbp*HF`oujIGlw1PvZKcyJm(4p=P z>lnG#YGbh9y*=?CR@86vdfuHnlHBh)#%UuOzk*u7dreVD(N1^9mybG&JV~)Es^JhO z@5T2?FSv51UIFBcl0?_r57#R+@IUX8&5A30>fj(lGrr-q_1)~tiq{q`x%Z9#T3O(} z(n|T^3wLtDM2d5Ua?OsyiYYQ?sX13-M|_sTg7Wh(gg>tSvOvG=ZcSt1+TABKt~(Tk z?_6&f9kg$;@4`UuqI4y>`3tA=Gy}Tp+M51*+OJN}c$9RmYS+?7+`%XDEz_>KEq{M_ z%oU9vUs~R*)Npuu&~4@H7DJDw<>M*+@sC~$4l(rIrx;az?r30pcg)vVs&ud6-e)t# zsI|r;&u{Q5vd13#P=g*`se6%`A6IkgbCYv`RvP z(vD-_emt}))c)iho#WrICngWdjz=BpqE=0--r{>;wv)?hA6`jLpW{Ba$=-=Qy`3MH zX0Cm%CwM>3N!w-iZqs3>uk)8wSQQ=pG3ov5Y_pO5y>h{0-?%Pt^SI?;H2m0{s}?x< za7|Ky(a6Lf*R)GE|&2 zPf50vuRZMGX2ZHv7uo8pO^2xy7rA2Rsy*6KDTgedWWRJ_qD9;Jqa7>n=%&u;;q=U` zRtR{u(&Tzil3=Dr>477~3okE=QDe<5xo~S}pysRi1*cT}UpSlzJ-uk!%d)aX3YX8P z&Z|??s`cx;{gr2Y??Rs0fz!eJ7xgO19PqBunQeVAU+x^GSCCV$e(>BJel_+)!}9Q~ z{lg~2?ium!Wg|AN$Ku$yK-y*vXM;YE7LHrG(@;!pR#KzmrYJ#6{?g3K)zQ7Dmvt4c z>XP{nPu7?d-1wy@?*6AD=2Cejrvo#W_cFd7_nZB-df{oA;p2AR_*Pn{ynW>IAsKR> z%46imFFDIQbLrEhOV<t&QYnIGG5t+}+gefY(mb4)qIo4anmN&a4kS6pu%@?yusk=Kk91R?q|9+mN- zNA=km!Cky14$4EXp^e`!lt+(I+%`$P-aB5u zjxIJ=;~mP=Ow;YWKa&G9v!Cj&7hDfANjJLsDg9)UWBD$bqP8QBmyYx;Iu_o%tGsr2 zt#ahJ)ge)K%FgW5x^>@uid~(8a_`KWe(HYos!=}1vUY{mau0R08j_q!cI`M^qZ2;k z{Wipa5evU^Z+UF`FUkK)3JD9^QdgNeJ?hKlzVkoG%rM0U8UIcnv%j`xR~Q10q&&YN{D`D8$y;VIJ9l`R3RMzz-Z zGt+xKdt$R@@3Wbjy2AgX_jY&c_|3QG+`G2oWOe=JE$2R88(!I^{OPsxSN{WCcmD&7 zi={3P&6n?X?;fv}?0coTe)Z~i`+@|69fN{30~717xsTPcRMR?Xw)DZM*Mjk@4aPJ3 zA4QeU&(MtSza+i-e44594Xs)`+J~)SEmQB_|H2u!Zua5go+bRAj4#L5hZ`NbNN?jT zouX8B`<`cZXL8AaX=2p-ilPy3yXO|Fvv)SJZiBj@k7qOjoB+l+Utbcgw zq={~`*-O7MSL+#aXU2v0)5KPj=G?tWd;CXr*02;uTB#<|tQ@*%{ukWZ zO|@=pyqe{(UMYE?I;q_~)@m_UJ1xS5*57AVsW~CQcOd0jbK=b><$I^SrwO$>56?#$&3)gLHYeof?-41Uo{q&#B+GNDJ zUVquNwtdLu*1$Lc$840LbCL1dNouWMq$W0`&wFLnnz3Q;xLJjLSugTvK6#o|x6mD% zEP;RX__Jl?Y+a`lBRqkUa(t&ED@ELY||gZ&`Gk}}h0N=SUg zTFNKI6;F#CBl^8or81s{<`l*ce4q_?Q0mBH?v1uEX!kvGG!^J~K~UeG(y)=EC!F5%n^%;3=KxXAen=DXafNc3J? zijC-amG>w?u)@p6f3Vdtz^t{|*ms}Z^nJ^R4&M8)?Q6Kn>-%HL8uRua4ksP@)F>F) za(vC_0=Jn?iqRo^W!Fd<-K>i18JC{8RNl^!nWA7!eSh&}j$Io$h(79D6RBbH`NeZ4n}W|;2Ci3Z z&2)2`s+2s2R?ynxxb5PG(_d<%@ABmy=}TE-JuWkv_l7*bGIDBIyt7f+)fJ=qv2mYc zo65#iENRlNsO5I2j*iS&5i|V=)iFb}URlc7HSdCQe2c&K&ehM9y;rsQTkZ(f8jQRU zdb85_*~yaUpW;4UnJ%F4hq`A+UB!D6LgK!an!nrD-j!S2kW{$XFj(i%lLS3`|9f>W zn-zW9&m2BHA%gaH#puPu!(~ncgeos{<<9u}uq&r@8h&mMI`pwl+q2*vxB7 zJf1uJo$EHwBTIJd-SaZz8n1r+*#|cKl_}x(NA;$EiEygQPkd#N&|(mg(8C-!(%22-Wuw(z7OgJ@+oPc87e&Gwm-^7H^(C zaFFqKnawKu^0h(cJ{O#B;Ls41Q(&2|o?M_8eQ|#sijC^MY|3Smv&p8W zL62OQ+`iqxbmXXN7cf@Nc&L(cBu=or_2KdUvu93kt{NSmuwi#@(|hjDO&slI5!)Ys zU9|qd3Fkhe=Ah^?VI_%|qt+&*qy?TnLyD4-t1`dEiEA!jIl}ej;Yeo^d%ALjLDCFo?qp1LOHE1)^zSv{DJD>Ubw&KIcYaRAmc5HB6aj32N@cm1%={{X{suAX| zWfYpa?u=O6STad!^Z27S>!$4roHFEeXUu+=kFj|(?o4Kvu8Mh?cAbXawvODg*vIQQ zy?cE*mVIpDvLVzm-(d46UG6{3WM-Xjoxm8(74-PeIo{GZLS9|>+lRBw{2H0bIg>82 zBB{lG%irfH`w)vswaSN5%h(Yb>VWE?R7byRJ_gV%GL-B4bSdaXzhP0Zjgoe$Afc^8O>7d zcU5Ukoj!?-s;LK_VvCW%XOYz zPMI)K$D(F~@uE_Nx|5Z$@`W$g2JO0%n#Ox;Rk8YTu4DJ+sD-zRkGkr-pcGqNi0Vx5 zIdnSLazpwN13^Ll?HkRd_Fj~{k8zXx-VIjltABQI&bUn(OWTb8d$-i=%-crGjs5JQ zk8~eKcSTp3Q}4I@@UvZa!e`2f$g+=**?Bu;wxS>P-O^^D?NF+M_?_J-3-0XV_p#drwQI&S7@Fb?@)?Wby=N+4pxn>HBXb zedVJ-a+L0b&|t@;5j!ub?5-)=a{Z^WCwMnt>J(1$Sk-f%aQq0K-i8gO4W^}C2 zx7@yVu@!Rgzww5Ovp=tMHFQ0Cxnq3MK~Srccuy zN~?EFudo}PGwx{p%ii#!=;@0)4IX#;>~op;}V_G>wIhM!nBQE@@><(nQ8ZkTi}q<6W51zBnu?&8HO)qeBd7_TuM+?~uWALfmpIv}sE7?qn#-y^+f>)}e zW3A9KaM;jJq~23Ual{ytN9CrGwyL9UVvNqC($a2ES4ZY;LOwL;E-EiTH!-`7Y)*6+ z48CZc4BcjL42maoGHIzPI65`25> z)w3;yk-Hf4ez_^IwNH?FY`F4>NuTxIazpw&zL&nf*&28>?@_MRr4U;s?+^2FQ^T^o zdg+->uhe#7pRQ$`_o+^aT-D(b9JFcFs4JCOo0lH-`m%(2_3c1cq9A;VAbh!M)^vsa z-6i2Vt32}LHm5pX+n?*vtY|j=rPAo|;fC+*6*|urwvN$QR$QxQk`^y0PBG0b{_pAO z-sy)=sl-oz)v%%`g?VOk`T5hDX9AjL*l)}Xv~#x!nffl2Hh5~t)yNe$M>`+>yl=h9 z{pSy}Qr6He+}XBZCstt8bFAxPz~h&O%dbxRlJj4E(Gd4rmp7d3HF!|gHQ`H>!Lj7x z{Z7=-!n(^GrS-L)-tn%=tLFUK<;^or*2Q9|iI*nxt7EbGHTBexcac4oNUA(Dd)N7vaVx5#V zr&o--!{WVfPkw=|ZaKzi%+TC?>1Aq2XXSL=CfDH~azBj>yQ{O4)V8!ByVWCa@MD4X z-Xdw&8udNWV_FI;FTKocvb3C(X7Xh835EH2T2=W2*Yb+=99L{{JhU*Dmip**pn%+d zAu2RXP@1%3Pg6q4-4hnwo9yxpdTwlAzrG`6Ooy~v#~i(>_u^wWZ+PZ%uQRo*;fi+1 zm{YQI?`SVr9yg`eKe#a5c9#CpdNgInfo<(gxusY1bap>Ezu@`DrrwWp&eh84that# z9YJ5SVdBDN#!ozBSra~&sqdN}lpZ#B*ag3wlN$6r<)MO6f!%hPuOj9)=fMi~Ne{0t z%1>IF8a`(Bk-**WQtwVMTh=o6ka1h!%V0`&!;mNqo%dST2BE9}GGbvNt`b54$^ zt<>HI`lJSn4N zpv;vN+Fy8` z+N?2r-j1{-WeMuMQC~Oe{J0~aMSajRHMuflY3Ga=kxTc_VrM!f6qJ#!jX0XM`q=0l zg`c9V2KTi#_?)&FVf1b5vl>rUfa>>;MV`ZLtM>09{>+(jed>W}O!@xuD9?&?#hNgs z`#WV`UCCX0B`TcuA9H7`V9`qX?Wa#T=Xge%HZke`yRU1GnaUskVpApM$1#D?jB%^_ zH!hhbe>N~OUioxh*7*@_pIR6Z)1NW=FP5$&1x?y-U8tP-I^q@e@vsRW&m2+CN%_{) z*GsYKV-9=gyg+f|n4sLW?)Dk7mu0869oucA>ak);^}ThYtPb{#`reXRdAf6Cq(-0P zxm(5IH;n9lXx<#F)P3-+8FSGAiX6#Eund*YohYN;g0)w%=Brwy-dw0?7f`jj(e~qJ z-WtWdX5UUa+#C~eGr;ZM_~yEX+YhEuzJE^`vAN)w{$K>VbL-tHPfKSPET8d-LFr&6 z9WON8ENw%s&{Hs?AE9GcKHb9>pD3aYJ{o&)`qOYm_O;VW>-8$$m`c_lI68 zf*Nb1)4O(kQF%4b^JHU+S^z8H=FXWFYd-9BUVAIXR(|?g8II?c?PZ?4zBcJF>$MMG z$8Vopv^TYsE4{sRXxO=wzKH4ieC0;={>aS0o=2CmynAvEA1u_3HFG-RYyRcN!aXq@ z`Ow?Cj+@ZXL=Wv(X4uiQ>w{j6V@)ByC}XP>2_6^T>^jPKRk)h9!9r!oScm*l*CB4r z+4ZNYs+$_`ZRCC2HJ(&jnMhSy?Dq=yTa`WWdBn-}pDt`4IA))jGCBXq;fq+nVv~2= z)G^M3R}D-$-;!@@DW}Vg9L%_{-~TmK<7LH^nEB(UX-#X~{gsk-ztD4B@`wo|N_>WR z4|bXL%@i1Xi+8-g)805@_mtdkZ%x;#-hIW}RznKfIE}6JbU{d%N4Lcq`7f*TZ%J97 zD}KIV=FFPMPL-wYU6}W@(<$`_+u>%U*tH`x2!Knwj0LXBO04 zjlOoOFiclZ&tSjD{R0KQnBv4!DH2c0EoAO$` z@?1M647|yWy<8M5I5$l`YOTYI@wIk^W!$c&4-W6&$)*@y8hhG&l4(Y#;p{t83LYKU zk$?MQpCjYK7x$TLRzDbi8t<&&X7nm{8*WIzRtYPZRk&A4~ znslf5RSt7Jk{8`RVb;y)t(4x-$1{h%U)J~j$@(XD8WkUOM}||})iFV7nXbGyE?e~B zjQiw$mb)+S_h{0Ovdnva^rg*8zq59w&kp7ojJZ_#N=-FMeg3sJ+i8_9w9PK}?x)(K zOKzPJ%FVVbWh&K1XnZ)P>X|)z!6P5L&g6Zq<^{f|=PnCcDQ}kgv}8|?*AMM&+M$o- z{FG$t!XLD*ohU0?*;mwX#A%}7^;E{9wZ-GsoZ}_#`h4c}EXoT%BcEQ~p<|VYyRJ-c zan4rzLMnT%)<3WQa^UW%3P%n+8#5uIB+%<)S6Hd%G1p60=J(!D^*VUUo$KM!J=6Sw z#-o+FW5%`}nf={C&pFQC{KYFdnXJ10l@l-BeD4<(vw7aUvxA>~(-*STbGNN}nIhP5 z@a^cbx6)^Cyn63Dx!{Y_!us1@TBe7g^)Y-`r1Z+Fa;zL3X4yGxvT(fs(1Z>FJbuvMb^srg<9$z4tX(<;Uo@q@blehE z?8+~oVkh(HX+H`zkxe(0%xo5wpO%}VjzWni1`kT@gh+Li(+veQ2d?L7DEIX1 zJ*gpcn934T8n_renNwAgNSG$vI34T^zGyQAp@w zW56-cs2Z{(iugoUPpir|MQQ_NO%fA5#z`h<-zTyLz^6Zv`S9n}C$c5-9U!X#Y&Af( zLMb9Rgn+9>@ZJHk1^PZ9oYq9(hkq8*tA7S~sR*7xz`Y_k`LmGqWdb$qi;(m?!0K#} zG-ghO@rV&}4x^1{fSgRk{{lo=BBD3~zAu80e<53{^Zw6-ZXi*_-j2 zf2?LW!38~+rYNVaekWbhK1kjpk8TW-6_9;CCWnjzDT16JZj+&C0vsVju|oAS6g7bJ30PWI2tSem2CgDlPZsd2MX(^S;`UYSLv$E)PWG7D< zMyAui8m354PgY8MzCZ`{m6H|GVR?!xnrKYXDET2zp~#?Kd5QvBI^Zg zqa&QyPrzG5u&s`8cBl@Zu8UAP0IL(H=5JqQF}SD|21uM=9yA}-7*G^Sw&+r>Q_ve{ zikTLRD`_7Vo3PI?D;Aq09CUUz4vn4*oaN{&mbm}2SR9cBIffuRM`XbmL$DwRjWYxZ ziwr>l4oV{67b3WVfCG($_(4NZhJ)BffZ8oWEd*H717MvaFhF7pmFYI3%qQ{FVtpYB z8dGkjkzScl=peXiI7q=pBWuW((m&-#!44EXY2t9Q*t|3ocT?160z^F2ZvyPNz|J0J zJHYbas1${?i-FQ538oYo1+>tMY^u%TFeMGdp$iT4dx2pN6k`%YWQI%^ilS&S4kOKQ zyan1og|qqXDf#R|X;nfd`Ir_F3Y66UPb5eqU9+?XQ%LSDmr(T|2ZB2tI34CB z;?VtEYc)g|1P&x!(&|HTP(;^#;H)|A7sVbWO%d0>BR7l7`qx^U!++_*WeeFOxj-=d z*YWa%HVj1COwuS(n?-4rLwNyYHMI6PSw)-0qe<=qm-o|Ac_Kakc2pi+LK(hD8Qw2t z7-&Nz?8f_W$_^6x9tGf@NJ=P)#4h;}MOjN8{!%x(T+}%8VXuS@fFhivTQJuM@;+aSHV0E@$@s}1@qa&6OmOW z$pK3wSVS=_!DA`wNJu`8qFIu?h!R60(MuHLC=1CNKezWU2_gNYE~Thzi1__26eLg( zDvb;jJ_{*9qlHOUOeP`+L9i6b#Q$k=kxYETobk2Xn3DWId~QpTvBB6Ud8*lapSByhHr6va5rbebA!h^9y( z-*imtV4b-XNkiiFvFW@L5a^EnFZCX}N}ba9t==!Avl%oI=W}jSBZmD_(l|n@MUx?^ zBtxjAMu}OZl=Xz4N|wZzN=+im{?-y5zbhp)oNUS4^HSHe(J6B{bic(#U3aB^{2vV= zi3+zw;hvPHGsH5mpIylWb!^rD(~a?S|K4g~7UO>^c+hPQM*eI6XkZ&+|71%d=VG_$ zKUFIUOUH~!noJ4ZSWupVA6u1NMpzhl9J0y4>|oNg3@ilxoX^1Qk#rWOf(A0MDWLlJ zOw1Zh$-vamrc7)yq=>dm%obT?1BG@L<_8)q$ii%aa8DL6;G=KwgcA3{FfSXM1sqW} zW`|<;VnpV6kc}+>Qun=>ordVFI{bYGc_?Ww5U`0w4Uoz{Oj+aS$@-Uyxer?i3m@2r z*=qcZEdLU85(IpLz!_Fe%faG65Sd(9_5YlF9`ek^oKV97OcCwK#ll69Ox`bO&2Q-a zZzy6v7Ddo0p{M(?7_>JZ<^~A>My;rpTd+{jg!g z40k9Cg#HXjz!6GF07A_G;QnI86`CxNh;P5#n#E(JC9pKp3m}ik7hrl67MG76 zJV=0j6a7GhBLw&s|Iu-E84AvHUMNcxYV#HY{!JI4MF- zSrk=(DJuUIiOm#h7l?YwFg=u4fW<(_S38J(mxsTq#n^sn*t#=im>cRpk7*!<^Vn0A zdI2D*3)mL)RX{pdWAY@#zYbvFRjiGK zKGk5FB@?b=he_z!4Iq`jfwiLMTFeZ|)?&BNjXHn^Yq17&t{yW*eRWtZI(!pM^`IWR zgR*adkQFzvcC@JhMlapMYS4n)mXMjq;MY=a=r&k4%`P~hx@>)^8t+NJOH{oO#o4vV6?g!=sq-oKqW0e z_q-XP!d8HqTd>4G7>16uW7TL@2au#c1ol3UU_j6T z3|t=r@me-6g_bXE|}c%1tf)-~uP<~{*_Do+9D(g|x&x_|-mDNOs=1vrZ?z&(8i zbmh-59O*y9uA`dgU?IwLSnc!+u*UWmpn2bO7|82}84q3n=Pf-jqpBOA_+EgDdH@P} z3DE9dfF|?-wEiVPj;{cU?gKp>Uc=m(udutwxF2vnuVG!SH-K~P2ORzu7UH}C+=sWY z_^r1fi``q$^3gjO(0T{EaQQtzr1w}AI{pC|biN0sIUfPK^#P{+_X(z5`UvVT8vv%q zKEd3XpJB%C0oY5IFEG0DGt4y}1l+7IfWy85?1GV6|9`eHRZ74|^aPM%yaby6uPZ~$4 zO9pU0GWbY1cH3oeGZHf$2gWrrxIRjk1*#u1I36U7pvG1UgXe`(Sq$R1344)Azfer! z2^8juUnrIkC5jC{C$fd8e|T{S6j!w73RzgwSq|hmE{jWxg7PnJJc5o#M>k~gIP_8u zB%CaV??&&GaIF%OJpPV?Myuc&B{ItR2ohSX3gZDPcm~9-_bRvmjZ?!7QK~8)FGJ%K zjM!{sq6O<%tKlkS8Xw84<5VQ8hRc(TQJ@;W2w7<1nksa4U+OoP266QLCC{oi!6s4H1LI@ zwF&$mY9~HAQP{DT9&!qT(YxZBRsC3zr26qqKnP+*?cmHE82!E*)G;8RG3 z2zj;Z;ISeq*xEl-92%OThf@{6q;O3mN=B$i_m>Sh|CkyYFx#QP(ne3na*ZCa+-Qoc ztJzRF{}>xuq_0Ck!a+TugcFA1&ct?Z9f~tVX5@me{t9OrYMJ^ZH8bPVoOvA{9p8Zq-2cSDbZrZW)P1YbQh*5FhnzmPQn<`jq&*i9||_53h}?`SyTqfF~O;Fz@9IvC(uV@JQ_Vy zBZ&C~li$RA_yRz^DQNu_hgT!&B|D1K%1pkjPue!Wwz-n>af;hC^9LOh`;%t&} zNxv!XOG48$aYX`SkLazW0JN};WQznAI34+#;|fUA0#`w2%<)xdyaleWDO`QYoS&zX z&N5rv>FRkeU1c)~(7MNf*rBb8x*i?9S=@wJ2~>^uyY6R|!r3<3(U z*3;q;^Q{*DVGiHApt8^*E8HAyvBZ@T%@UVIm?f@?vMljr6ljGHC9|y&)q>1I*;SY# zg~NicZJdWXZIu;nF9(iJ6O~`6)(U?iA1LSG9ljtu4vHqU(h4LYog>+jqLGU&guSol zF&UJ%jBJe_TH`}e!7{Q1d7-tC1nuR32`<|bG0z6Kkus*US*U}9yP`51d>0yS2bx9M z;x-sDz(qT3!TBo)D zz(KhWATxE}!&K4!7EBHKQgJO5VlNuyqJ(A`J!lVm`G5-3x_=Gq8U@NkKf%63lQ*mOmL9}4AELl zMAyUhRQ?V3kZ>9aqHZ99ec~{opx43ml>dp55IG`QKorUp5wYOQHjt%cMG=EIJj!es zCb4iE4dB5NCepvX%GVTkK;&~I8}O=~K&mRrD}R&ZE+gCg?O3YFodeqCvTze6;K>%n zIRK!;tI8V$YFnl5#H%2qKaA0RLa2a$1h!ug~ zul@rfy2(pSe<*|xVE_kZtpDjj;AV}mzaB?a9nd*kVM_d4^xxVM2SOD&@P004@T<4s zaDVm~9N}f!Bv>D=zd((Z)FlJNDzr!+|2xEhvTy(E-E~l zcmu*_iijO11TP?-Ib05^<>GUpF{JVE4KfTK9ojV-1C{gep?{tp^YAQaA=mKn(G(t? zg{t}ZcnTM?ucjja90n7G5&#?G#u);D#tmV^ac?O$6Rzj{L=gPKBVPzH=xp>s2+`m^ z$$bP&;6q8YO9;@osEYu2a7V#*0)PueLlOaS;PUn!0kGi=SvUg#cU)+RGc3bmf`O_< z5S@uMT?iZly3J4_1S+93LWl+qjE#h;d`OOd1i%AKJ^^rn=mP<8paXLs1pphE!hs{! zVW2JoVDdpIS76R$z|BFD2%>>lLI_NUEZm4u8XTr2ZZLt*q@ij8;ISD4CI^KQ z0Ef**X9$1|M-g)efVc(sbBFm1CWN|tA;f^N@IeUC!9?yJ_;BKOl=v7&8_N-YnOp`9 z?7qtbcO(OGsyhUY_W=-T-+SP;aKnop0|qV#*kf=$ahHbZ9`Fp(6VE)j?M@(`K?mZQ zPh+Cn#4{IJc;Y-_{}{+*3?Nu&34!3#I6M?fAlRtd6X$DliRPa8{E>&w1obt?66|Sk z?d2()9SYCdJmMl;jF=AUpBW3RnKUN6EF`GGdB)*99VUYg4*V}UjnCvGzj45ePuvoS z4f4PM`NSX?S7MM02K+D%&$i_;;e7owlf$Rc#JO?!Ob)x`q8I*{3>U}Zf^c|DI<4f) z1pE!HW3KBa&T>uCIq9u6{qtU5D}1S9zM*5Ew+y^#v@7~F?t@v zmf$>G-APO`Am_uqvluy(M%=3W%YsRVBYF~8OcdJ&I&2J4XNr+Ch&yC49Fs^IVmKCr z4$b|zr9g}YlM9{`>ox#t*NCzbG z669Y(bTSE77x3u}+P_w#0Xc)XZ~T`WVwvPxOyWI~7#)i#?k0RXTrW$|v5Cke5Sz@A zR8o}J#pobzNHFB`B@|(Ei5Elv&Si1ve*_c=GY4qQ=SoNjw-^#egNsxNjaht-1da_> z6knK4lUzfzh+X?!sk0}ImGY_T{CNCwe3 z{JRK~DV|Xwt|1Qkpiu*CpK?x?okSFfP zK*!@tSQSExm@op+geLB@kn9=ary1zDbTQus983J<0uIV;aRDJZ{L=Wh!hEhCDqt`mv5T9U4y~2A6@*fYEesJ&Jbf@2Or9`egLC}~ zOAH7VMEUnm5(PrOcx?o}z!Wd_8L$Xnd_Ng1I1&=VKo}RtLACV9f}$h};fTu=Hz9+~ zlL$TxHf+2&Lk?5C?_e-E9PvB|oh(y4i82@hE}J2-FqiWyJpM5kL}iJExm@ug4;GOq z8<-ppPdubUtc9!$iV*hyvj~sJ6?Ym2pU#yKkT1Ni_$O8{Ay0`5$fSX3#H8!c3GuR$ z!G>~L+zK3~WYXa6TYecM;IXlLsxB*dYZRizTiIT!Q>n)`)^G z5W+>2xYTf6Br%yG5jdeU=7?7Vfa6KHCl5}6SXhGJHp50sEX-t!Hw#QSdXn0)pkNUf zn#GXt61bETFVG+ha)nkP?ElC7aGfXaIuM*C4j&I{9f>_=bHy_SlgH*u`T_^)@IOKe z_n*n*{GWXya>XA);=lo&WN6_@mK;pDuMjUk0VjD#d0c@+K7#*;2zTPfMknTfq;|rez*#k z*b+V*CJ8IR-JT@wm$M4~m>+I}#jAB_@95$k9^hEwjTYdz5=WK~r%Buw`0$O&zr0^q z^e~C8SdtLFR4Km4Y`7GZ!14ZyW}*vxP(zX*har*P_#7r*;&PMEWl4lv@Ii?j0ga`^ z*@l-O;x}$gKGfTPJDkwp;L!b4H$062-;Ex_@` zLb`wkH3MDzt{QMmabEx&oA_2d@%eRR0Vi=h0Vh%MK_epJM}T9|7-CH~AUWc-E8uwI z8pBM9-Ue{+5f>1$te9`HXiyCQs(+AG8Ll7@J0C#77Ox=yClT6MP#=lcr+|}aBLK%0 zfAs>m-}n2!od6OVUA*D~oWw0Y;F#hC0N^ChGOE>|CD}H8RGTh{ePlkr{Urj(jxSEg<5Ke-G zBHTYY{MXG3Ooo@D5{pQ@u>d-Wy9pN2s7nY4jw_ZTfllJ3g8-1Mzcq0L}r905Y?Abt@rHaaYZc!WbKe1u=qj9|L5=`0U7cj!Ufcr*{% zsL|Zfqg@&99C@y|cXqX&G2epHog@wD1hur@F Dp(12+ delta 22846 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 diff --git a/docs/manual/options.pdf b/docs/manual/options.pdf index 4b9da5ede9ebe9cffe85a03438e5830bfe03505c..bd235e7d5f66f5f3ec5112b273672e245cf7c015 100644 GIT binary patch delta 34217 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 bAtpXyNPPDmAy7yXg^(QO%hzjOKji-aItcLn delta 32857 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 diff --git a/docs/manual/spatch_options.tex b/docs/manual/spatch_options.tex index 8247ed2..09fe72e 100644 --- a/docs/manual/spatch_options.tex +++ b/docs/manual/spatch_options.tex @@ -132,6 +132,13 @@ $\langle$file$\rangle$:$\langle$function$\rangle$}{ Print a control-flow graph for all of the functions in a file or for a specific function in a file. This requires {\tt dot} (http://www.graphviz.org/) and {\tt gv}.} +\rare{-control\_flow\_to\_file $\langle$file$\rangle$, + -control\_flow\_to\_file + $\langle$file$\rangle$:$\langle$function$\rangle$}{ Like -control\_flow + but just puts the dot output in a file in the {\em current} directory. + For PATH/file.c, this produces file:xxx.dot for each (selected) function + xxx in PATH/file.c.} + \rare{-type\_c $\langle$file$\rangle$}{ Parse a C file and pretty-print a version including type information.} diff --git a/engine/cocci_vs_c.ml b/engine/cocci_vs_c.ml index 468db18..fa0e1fe 100644 --- a/engine/cocci_vs_c.ml +++ b/engine/cocci_vs_c.ml @@ -503,7 +503,7 @@ let one_initialisation_to_affectation x = match var with | Some (name, iniopt) -> (match iniopt with - | Some (iini, (B.InitExpr e, ii_empty2)) -> + | B.ValInit (iini, (B.InitExpr e, ii_empty2)) -> let local = match local with Ast_c.NotLocalDecl -> Ast_c.NotLocalVar @@ -1361,6 +1361,7 @@ let rec (expression: (A.expression, Ast_c.expression) matcher) = | _, ((B.StatementExpr _,_),_) | _, ((B.Constructor _,_),_) | _, ((B.New _,_),_) + | _, ((B.Delete _,_),_) -> fail @@ -1790,7 +1791,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> *) | A.TyDecl (tya0, ptvirga), - ({B.v_namei = Some (nameidb, None); + ({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb0; B.v_storage = (B.StoTypedef, inl); B.v_local = local; @@ -1854,7 +1855,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> return ( (A.TyDecl (tya0, ptvirga)) +> A.rewrap decla, - (({B.v_namei = Some (nameidb, None); + (({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb0; B.v_storage = (B.StoTypedef, inl); B.v_local = local; @@ -1883,7 +1884,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> return ( (A.TyDecl (tya0, ptvirga)) +> A.rewrap decla, - (({B.v_namei = Some (nameidb, None); + (({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb0; B.v_storage = (B.StoTypedef, inl); B.v_local = local; @@ -1915,7 +1916,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> (* could handle iso here but handled in standard.iso *) | A.UnInit (stoa, typa, ida, ptvirga), - ({B.v_namei = Some (nameidb, None); + ({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb; B.v_storage = stob; B.v_local = local; @@ -1929,7 +1930,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> (fun stoa (stob, iistob) -> return ( (A.UnInit (stoa, typa, ida, ptvirga)) +> A.rewrap decla, - (({B.v_namei = Some (nameidb, None); + (({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb; B.v_storage = stob; B.v_local = local; @@ -1940,7 +1941,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> ))))) | A.Init (stoa, typa, ida, eqa, inia, ptvirga), - ({B.v_namei = Some(nameidb, Some (iieqb, inib)); + ({B.v_namei = Some(nameidb, B.ValInit (iieqb, inib)); B.v_type = typb; B.v_storage = stob; B.v_local = local; @@ -1957,7 +1958,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> initialiser inia inib >>= (fun inia inib -> return ( (A.Init (stoa, typa, ida, eqa, inia, ptvirga)) +> A.rewrap decla, - (({B.v_namei = Some(nameidb, Some (iieqb, inib)); + (({B.v_namei = Some(nameidb, B.ValInit (iieqb, inib)); B.v_type = typb; B.v_storage = stob; B.v_local = local; @@ -1967,6 +1968,16 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> iiptvirgb,iistob) ))))))) + | A.Init (stoa, typa, ida, eqa, inia, ptvirga), + ({B.v_namei = Some(nameidb, B.ConstrInit _); + B.v_type = typb; + B.v_storage = stob; + B.v_local = local; + B.v_attr = attrs; + B.v_type_bis = typbbis; + },iivirg) + -> fail (* C++ constructor declaration not supported in SmPL *) + (* do iso-by-absence here ? allow typedecl and var ? *) | A.TyDecl (typa, ptvirga), ({B.v_namei = None; B.v_type = typb; @@ -1994,7 +2005,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> | A.Typedef (stoa, typa, ida, ptvirga), - ({B.v_namei = Some (nameidb, None); + ({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb; B.v_storage = (B.StoTypedef,inline); B.v_local = local; @@ -2047,7 +2058,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) -> ) >>= (fun ida nameidb -> return ( (A.Typedef (stoa, typa, ida, ptvirga)) +> A.rewrap decla, - (({B.v_namei = Some (nameidb, None); + (({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb; B.v_storage = (B.StoTypedef,inline); B.v_local = local; @@ -2403,7 +2414,7 @@ and (struct_field: (A.declaration, B.field) matcher) = fun fa fb -> let iisto = [] in let stob = B.NoSto, false in let fake_var = - ({B.v_namei = Some (nameidb, None); + ({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb; B.v_storage = stob; B.v_local = Ast_c.NotLocalDecl; @@ -2418,7 +2429,7 @@ and (struct_field: (A.declaration, B.field) matcher) = fun fa fb -> (fun fa (var,iiptvirgb,iisto) -> match fake_var with - | ({B.v_namei = Some (nameidb, None); + | ({B.v_namei = Some (nameidb, B.NoInit); B.v_type = typb; B.v_storage = stob; }, iivirg) -> diff --git a/globals/config.ml.in b/globals/config.ml.in index 13d843a..148728e 100644 --- a/globals/config.ml.in +++ b/globals/config.ml.in @@ -1,4 +1,4 @@ -let version = "0.2.5-rc6" +let version = "0.2.5-rc7" let path = try (Sys.getenv "COCCINELLE_HOME") diff --git a/parsing_c/ast_c.ml b/parsing_c/ast_c.ml index 431d107..c4d7254 100644 --- a/parsing_c/ast_c.ml +++ b/parsing_c/ast_c.ml @@ -337,10 +337,11 @@ and expression = (expressionbis * exp_info ref (* semantic: *)) wrap3 (* for C++: *) | New of argument + | Delete of expression (* cppext: IfdefExpr TODO *) - (* cppext: normmally just expression *) + (* cppext: normally just expression *) and argument = (expression, weird_argument) Common.either and weird_argument = | ArgType of parameterType @@ -516,7 +517,7 @@ and declaration = | MacroDecl of (string * argument wrap2 list) wrap (* fakestart *) and onedecl = - { v_namei: (name * (info (* = *) * initialiser) option) option; + { v_namei: (name * v_init) option; v_type: fullType; (* semantic: set in type annotated and used in cocci_vs_c * when we transform some initialisation into affectation @@ -526,6 +527,9 @@ and declaration = v_local: local_decl; (* cocci: *) v_attr: attribute list; (* gccext: *) } + and v_init = + NoInit | ValInit of info * initialiser + | ConstrInit of argument wrap2 (* , *) list wrap and storage = storagebis * bool (* gccext: inline or not *) and storagebis = NoSto | StoTypedef | Sto of storageClass and storageClass = Auto | Static | Register | Extern diff --git a/parsing_c/lexer_c.mll b/parsing_c/lexer_c.mll index a45e120..fbad367 100644 --- a/parsing_c/lexer_c.mll +++ b/parsing_c/lexer_c.mll @@ -170,7 +170,8 @@ let keyword_table = Common.hash_of_list [ ] let cpp_keyword_table = Common.hash_of_list [ - "new", (fun ii -> Tnew ii) ] + "new", (fun ii -> Tnew ii); + "delete",(fun ii -> Tdelete ii) ] let error_radix s = ("numeric " ^ s ^ " constant contains digits beyond the radix:") @@ -685,6 +686,7 @@ rule token = parse TIdent (s, info) } | (letter | '$') (letter | digit | '$') * + ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ? ("::~" (letter | '$') (letter | digit | '$') * ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?) + @@ -700,7 +702,23 @@ rule token = parse raise (Lexical "~ and :: not allowed in C identifiers, try -c++ option") } + | ((letter | '$') (letter | digit | '$') *) + ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') + + { + if !Flag.c_plus_plus + then + begin + let info = tokinfo lexbuf in + let s = tok lexbuf in + TypedefIdent (s, info) + end + else raise (Lexical "<> detected, try -c++ option") + } + + | (((letter | '$') (letter | digit | '$') *) as first) + ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ? "::" (((letter | '$') (letter | digit | '$') *) as second) ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ? ("::" ((letter | '$') (letter | digit | '$') *) @@ -721,6 +739,24 @@ rule token = parse (Lexical "~ and :: not allowed in C identifiers, try -c++ option") } + | "::" ((letter | '$') (letter | digit | '$') *) + ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ? + ("::" ((letter | '$') (letter | digit | '$') *) + ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?) * + + { + if !Flag.c_plus_plus + then + begin + let info = tokinfo lexbuf in + let s = tok lexbuf in + TIdent (s, info) + end + else + raise + (Lexical "~ and :: not allowed in C identifiers, try -c++ option") + } + (* ----------------------------------------------------------------------- *) (* C constant *) diff --git a/parsing_c/parser_c.mly b/parsing_c/parser_c.mly index 75dde11..54e22c3 100644 --- a/parsing_c/parser_c.mly +++ b/parsing_c/parser_c.mly @@ -436,7 +436,7 @@ let mk_string_wrap (s,info) = (s, [info]) Tstruct Tunion Tenum Tbreak Telse Tswitch Tcase Tcontinue Tfor Tdo Tif Twhile Treturn Tgoto Tdefault - Tsizeof Tnew + Tsizeof Tnew Tdelete TOParCplusplusInit /*(* C99 *)*/ %token @@ -738,15 +738,38 @@ unary_expr: | Tsizeof unary_expr { mk_e(SizeOfExpr ($2)) [$1] } | Tsizeof topar2 type_name tcpar2 { mk_e(SizeOfType ($3)) [$1;$2;$4] } | Tnew new_argument { mk_e(New $2) [$1] } + | Tdelete cast_expr { mk_e(Delete $2) [$1] } new_argument: - | postfix_expr { Left $1 } - | decl_spec - { let ((returnType,hasreg), iihasreg) = fixDeclSpecForParam $1 in + | TIdent TOPar argument_list_ne TCPar + { let fn = mk_e(Ident (RegularName (mk_string_wrap $1))) [] in + Left (mk_e(FunCall (fn, $3)) [$2;$4]) } + | TIdent TOPar TCPar + { let fn = mk_e(Ident (RegularName (mk_string_wrap $1))) [] in + Left(mk_e(FunCall (fn, [])) [$2;$3]) } + | TypedefIdent TOPar argument_list_ne TCPar + { let fn = mk_e(Ident (RegularName (mk_string_wrap $1))) [] in + Left (mk_e(FunCall (fn, $3)) [$2;$4]) } + | TypedefIdent TOPar TCPar + { let fn = mk_e(Ident (RegularName (mk_string_wrap $1))) [] in + Left (mk_e(FunCall (fn, [])) [$2;$3]) } + | type_spec + { let ty = addTypeD ($1,nullDecl) in + let ((returnType,hasreg), iihasreg) = fixDeclSpecForParam ty in Right (ArgType { p_namei = None; p_type = returnType; p_register = hasreg, iihasreg; } ) } + | new_argument TOCro expr TCCro + { + match $1 with + Left(e) -> Left(mk_e(ArrayAccess (e, $3)) [$2;$4]) + | Right(ArgType(ty)) -> (* lots of hacks to make the right type *) + let fty = mk_ty (Array (Some $3, ty.Ast_c.p_type)) [$2;$4] in + let pty = { ty with p_type = fty } in + Right(ArgType pty) + | _ -> raise Impossible + } unary_op: | TAnd { GetRef, $1 } @@ -778,6 +801,7 @@ postfix_expr: | topar2 type_name tcpar2 TOBrace initialize_list gcc_comma_opt TCBrace { mk_e(Constructor ($2, List.rev $5)) ([$1;$3;$4;$7] ++ $6) } + primary_expr: | identifier_cpp { mk_e(Ident ($1)) [] } | TInt @@ -1298,14 +1322,9 @@ decl2: DeclList ( ($2 +> List.map (fun ((((name,f),attrs), ini), iivirg) -> let s = str_of_name name in - let iniopt = - match ini with - | None -> None - | Some (ini, iini) -> Some (iini, ini) - in if fst (unwrap storage) =*= StoTypedef then LP.add_typedef s; - {v_namei = Some (name, iniopt); + {v_namei = Some (name, ini); v_type = f returnType; v_storage = unwrap storage; v_local = local; @@ -1370,9 +1389,11 @@ decl_spec: decl_spec2 { dt "declspec" (); $1 } /*(* declarators (right part of type and variable) *)*/ /*(*-----------------------------------------------------------------------*)*/ init_declarator2: - | declaratori { ($1, None) } - | declaratori teq initialize { ($1, Some ($3, $2)) } - + | declaratori { ($1, NoInit) } + | declaratori teq initialize { ($1, ValInit($2, $3)) } + /* C++ only */ + | declaratori TOParCplusplusInit argument_list TCPar + { ($1, ConstrInit($3,[$2;$4])) } /*(*----------------------------*)*/ diff --git a/parsing_c/parsing_hacks.ml b/parsing_c/parsing_hacks.ml index 835fa8c..f9019e8 100644 --- a/parsing_c/parsing_hacks.ml +++ b/parsing_c/parsing_hacks.ml @@ -81,12 +81,13 @@ let is_known_typdef = * because it would compute msg_typedef at compile time when * the flag debug_typedef is always false *) -let msg_typedef s = +let msg_typedef s n = incr Stat.nTypedefInfer; msg_gen (!Flag_parsing_c.debug_typedef) is_known_typdef (fun s -> - pr2_cpp ("TYPEDEF: promoting: " ^ s) + (*pr2_cpp (Printf.sprintf "TYPEDEF: promoting(%d): %s" n s)*) + pr2_cpp (Printf.sprintf "TYPEDEF: promoting: %s" s) ) s @@ -1643,6 +1644,16 @@ let lookahead2 ~pass next before = match (next, before) with + (* c++ hacks *) + (* yy xx( and in function *) + | TOPar i1::_, TIdent(s,i2)::TypedefIdent _::_ + when !Flag.c_plus_plus && (LP.current_context () = (LP.InFunction)) -> + pr2_cpp("constructed_object: " ^s); + TOParCplusplusInit i1 + | TypedefIdent(s,i)::TOPar i1::_,_ + when !Flag.c_plus_plus && (LP.current_context () = (LP.InFunction)) -> + TIdent(s,i) + (*-------------------------------------------------------------*) (* typedef inference, parse_typedef_fix3 *) (*-------------------------------------------------------------*) @@ -1663,7 +1674,7 @@ let lookahead2 ~pass next before = LP.disable_typedef(); - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 1; LP.add_typedef_root s; TypedefIdent (s, i1) (* xx yy *) @@ -1672,7 +1683,7 @@ let lookahead2 ~pass next before = -> (* && not_annot s2 BUT lead to false positive*) - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 2; LP.add_typedef_root s; TypedefIdent (s, i1) @@ -1680,7 +1691,7 @@ let lookahead2 ~pass next before = | (TIdent (s, i1)::Tinline i2::_ , _) when not_struct_enum before && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 3; LP.add_typedef_root s; TypedefIdent (s, i1) @@ -1689,7 +1700,7 @@ let lookahead2 ~pass next before = when not_struct_enum before && (LP.current_context() =*= LP.InParameter) && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 4; LP.add_typedef_root s; TypedefIdent (s, i1) (* xx* [,)] *) @@ -1699,7 +1710,7 @@ let lookahead2 ~pass next before = (* && !LP._lexer_hint = Some LP.ParameterDeclaration *) && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 5; LP.add_typedef_root s; TypedefIdent (s, i1) @@ -1710,7 +1721,7 @@ let lookahead2 ~pass next before = (* && !LP._lexer_hint = Some LP.ParameterDeclaration *) && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 6; LP.add_typedef_root s; TypedefIdent (s, i1) @@ -1722,7 +1733,7 @@ let lookahead2 ~pass next before = && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 7; LP.add_typedef_root s; TypedefIdent (s, i1) (* xx const *) @@ -1732,7 +1743,7 @@ let lookahead2 ~pass next before = (* && !LP._lexer_hint = Some LP.ParameterDeclaration *) -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 8; LP.add_typedef_root s; TypedefIdent (s, i1) @@ -1743,14 +1754,14 @@ let lookahead2 ~pass next before = -> (* && !LP._lexer_hint = Some LP.ParameterDeclaration *) - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 9; LP.add_typedef_root s; TypedefIdent (s, i1) (* ( const xx) *) | (TIdent (s, i1)::TCPar _::_, (Tconst _ | Tvolatile _|Trestrict _)::TOPar _::_) when ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 10; LP.add_typedef_root s; TypedefIdent (s, i1) @@ -1760,7 +1771,7 @@ let lookahead2 ~pass next before = when not_struct_enum before && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 11; LP.add_typedef_root s; TypedefIdent (s, i1) (* [(,] xx [ AND parameterdeclaration *) @@ -1768,7 +1779,7 @@ let lookahead2 ~pass next before = when (LP.current_context() =*= LP.InParameter) && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 12; LP.add_typedef_root s; TypedefIdent (s, i1) (*------------------------------------------------------------*) @@ -1781,7 +1792,7 @@ let lookahead2 ~pass next before = (Tregister _|Tstatic _ |Tvolatile _|Tconst _|Trestrict _)::_) when pointer ptr && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 13; LP.add_typedef_root s; TypedefIdent (s, i1) (* TODO xx * yy ; AND in start of compound element *) @@ -1793,7 +1804,7 @@ let lookahead2 ~pass next before = && pointer ptr && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 14; LP.add_typedef_root s; TypedefIdent (s, i1) @@ -1804,7 +1815,7 @@ let lookahead2 ~pass next before = when not_struct_enum before && pointer ptr && (LP.is_top_or_struct (LP.current_context ())) -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 15; LP.add_typedef_root s; TypedefIdent (s, i1) (* xx * yy , AND in Toplevel *) @@ -1813,7 +1824,7 @@ let lookahead2 ~pass next before = && ok_typedef s && pointer ptr -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 16; LP.add_typedef_root s; TypedefIdent (s, i1) (* xx * yy ( AND in Toplevel *) @@ -1822,7 +1833,7 @@ let lookahead2 ~pass next before = && (LP.is_top_or_struct (LP.current_context ())) && ok_typedef s && pointer ptr -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 17; LP.add_typedef_root s; TypedefIdent (s, i1) (* xx * yy [ *) @@ -1832,7 +1843,7 @@ let lookahead2 ~pass next before = (LP.is_top_or_struct (LP.current_context ())) && ok_typedef s && pointer ptr -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 18; LP.add_typedef_root s; TypedefIdent (s, i1) (* u16: 10; in struct *) @@ -1840,7 +1851,7 @@ let lookahead2 ~pass next before = when (LP.is_top_or_struct (LP.current_context ())) && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 19; LP.add_typedef_root s; TypedefIdent (s, i1) @@ -1853,7 +1864,7 @@ let lookahead2 ~pass next before = (take_safe 1 !passed_tok <> [Tenum])) && !LP._lexer_hint = Some LP.Toplevel -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 20; LP.add_typedef_root s; TypedefIdent s *) @@ -1862,7 +1873,7 @@ let lookahead2 ~pass next before = when not_struct_enum before && ok_typedef s && pointer ptr -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 21; LP.add_typedef_root s; TypedefIdent (s, i1) @@ -1871,7 +1882,7 @@ let lookahead2 ~pass next before = when not_struct_enum before && (LP.current_context () =*= LP.InParameter) && ok_typedef s && pointer ptr -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 22; LP.add_typedef_root s; TypedefIdent (s, i1) @@ -1880,7 +1891,7 @@ let lookahead2 ~pass next before = (TOBrace _| TPtVirg _)::_) when not_struct_enum before && ok_typedef s & pointer ptr -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 23; LP.add_typedef_root s; msg_maybe_dangereous_typedef s; TypedefIdent (s, i1) @@ -1890,7 +1901,7 @@ let lookahead2 ~pass next before = (TOBrace _| TPtVirg _)::_) when ok_typedef s && pointer ptr -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 24; LP.add_typedef_root s; TypedefIdent (s, i1) @@ -1900,7 +1911,7 @@ let lookahead2 ~pass next before = (* struct user_info_t sometimes *) && ok_typedef s && pointer ptr -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 25; LP.add_typedef_root s; TypedefIdent (s, i1) (* xx ** yy *) (* wrong ? *) @@ -1909,7 +1920,7 @@ let lookahead2 ~pass next before = (* && !LP._lexer_hint = Some LP.ParameterDeclaration *) && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 26; LP.add_typedef_root s; TypedefIdent (s, i1) (* xx *** yy *) @@ -1918,7 +1929,7 @@ let lookahead2 ~pass next before = && ok_typedef s (* && !LP._lexer_hint = Some LP.ParameterDeclaration *) -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 27; LP.add_typedef_root s; TypedefIdent (s, i1) (* xx ** ) *) @@ -1927,7 +1938,7 @@ let lookahead2 ~pass next before = (* && !LP._lexer_hint = Some LP.ParameterDeclaration *) && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 28; LP.add_typedef_root s; TypedefIdent (s, i1) @@ -1947,7 +1958,7 @@ let lookahead2 ~pass next before = && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 29; LP.add_typedef_root s; (*TOPar info*) TypedefIdent (s, i1) @@ -1960,7 +1971,7 @@ let lookahead2 ~pass next before = when not (TH.is_stuff_taking_parenthized x) && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 30; LP.add_typedef_root s; (* TOPar info *) TypedefIdent (s, i1) *) @@ -1969,7 +1980,7 @@ let lookahead2 ~pass next before = (TOPar info)::(TEq _ |TEqEq _)::_) when ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 31; LP.add_typedef_root s; (* TOPar info *) TypedefIdent (s, i1) @@ -1978,7 +1989,7 @@ let lookahead2 ~pass next before = | (TIdent (s, i1)::ptr::TCPar _::TIdent (s2, i2)::_ , (TOPar info)::_) when ok_typedef s && pointer ptr -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 32; LP.add_typedef_root s; (*TOPar info*) TypedefIdent (s,i1) @@ -1988,7 +1999,7 @@ let lookahead2 ~pass next before = when (*s ==~ regexp_typedef && *) not (TH.is_stuff_taking_parenthized x) && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 33; LP.add_typedef_root s; TypedefIdent (s, i1) @@ -2005,7 +2016,7 @@ let lookahead2 ~pass next before = when not_struct_enum before && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 34; LP.add_typedef_root s; TypedefIdent (s, i1) (* x* ( *y )(params), function pointer 2 *) @@ -2013,7 +2024,7 @@ let lookahead2 ~pass next before = when not_struct_enum before && ok_typedef s -> - msg_typedef s; LP.add_typedef_root s; + msg_typedef s 35; LP.add_typedef_root s; TypedefIdent (s, i1) diff --git a/parsing_c/pretty_print_c.ml b/parsing_c/pretty_print_c.ml index 80e8eea..66060d3 100644 --- a/parsing_c/pretty_print_c.ml +++ b/parsing_c/pretty_print_c.ml @@ -145,7 +145,8 @@ let mk_pretty_printers | ParenExpr (e), [i1;i2] -> pr_elem i1; pp_expression e; pr_elem i2; - | New (t), [i1] -> pr_elem i1; pp_argument t + | New (t), [i1] -> pr_elem i1; pp_argument t + | Delete(t), [i1] -> pr_elem i1; pp_expression t | (Ident (_) | Constant _ | FunCall (_,_) | CondExpr (_,_,_) | Sequence (_,_) @@ -154,7 +155,7 @@ let mk_pretty_printers | ArrayAccess (_,_) | RecordAccess (_,_) | RecordPtAccess (_,_) | SizeOfExpr (_) | SizeOfType (_) | Cast (_,_) | StatementExpr (_) | Constructor _ - | ParenExpr (_) | New (_)),_ -> raise Impossible + | ParenExpr (_) | New (_) | Delete (_)),_ -> raise Impossible ); if !Flag_parsing_c.pretty_print_type_info @@ -860,9 +861,12 @@ let mk_pretty_printers pp_type_with_ident (Some (s, iis)) (Some (storage, iisto)) returnType attrs; - iniopt +> do_option (fun (iini, init) -> - pr_elem iini; - pp_init init); + (match iniopt with + Ast_c.NoInit -> () + | Ast_c.ValInit(iini,init) -> pr_elem iini; pp_init init + | Ast_c.ConstrInit((init,[lp;rp])) -> + pr_elem lp; pp_arg_list init; pr_elem rp + | Ast_c.ConstrInit _ -> raise Impossible) | None -> pp_type returnType ); @@ -879,9 +883,12 @@ let mk_pretty_printers iivirg +> List.iter pr_elem; pp_type_with_ident_rest (Some (s, iis)) returnType attrs; - iniopt +> do_option (fun (iini, init) -> - pr_elem iini; pp_init init - ); + (match iniopt with + Ast_c.NoInit -> () + | Ast_c.ValInit(iini,init) -> pr_elem iini; pp_init init + | Ast_c.ConstrInit((init,[lp;rp])) -> + pr_elem lp; pp_arg_list init; pr_elem rp + | Ast_c.ConstrInit _ -> raise Impossible); | x -> raise Impossible diff --git a/parsing_c/test_parsing_c.ml b/parsing_c/test_parsing_c.ml index fc0e980..9150a8a 100644 --- a/parsing_c/test_parsing_c.ml +++ b/parsing_c/test_parsing_c.ml @@ -138,16 +138,18 @@ let local_test_cfg launchgv file = program +> List.iter (fun (e,_) -> let toprocess = match specific_func, e with - | None, _ -> true + | None, Ast_c.Definition (defbis,_) -> + Some (Ast_c.str_of_name (defbis.Ast_c.f_name)) | Some s, Ast_c.Definition (defbis,_) -> - s =$= Ast_c.str_of_name (defbis.Ast_c.f_name) - | _, _ -> false + let nm = Ast_c.str_of_name (defbis.Ast_c.f_name) in + if s =$= nm then Some nm else None + | _, _ -> None in - if toprocess - then - (* old: Flow_to_ast.test !Flag.show_flow def *) - (try + match toprocess with + None -> () + | Some fn -> (* old: Flow_to_ast.test !Flag.show_flow def *) + try let flow = Ast_to_flow.ast_to_control_flow e in flow +> do_option (fun flow -> Ast_to_flow.deadcode_detection flow; @@ -161,12 +163,16 @@ let local_test_cfg launchgv file = *) flow in - let filename = Filename.temp_file "output" ".dot" in + let filename = + if launchgv + then Filename.temp_file "output" ".dot" + else + let fl = Filename.chop_extension (Filename.basename file) in + fl^":"^fn^".dot" in Ograph_extended.print_ograph_mutable flow' (filename) launchgv ) with Ast_to_flow.Error (x) -> Ast_to_flow.report_error x ) - ) let test_cfg = local_test_cfg true diff --git a/parsing_c/token_helpers.ml b/parsing_c/token_helpers.ml index 492c5cd..a8ecfa3 100644 --- a/parsing_c/token_helpers.ml +++ b/parsing_c/token_helpers.ml @@ -359,6 +359,8 @@ let info_of_tok = function | Tinline (i) -> i | Ttypeof (i) -> i | Tnew (i) -> i + | Tdelete (i) -> i + | TOParCplusplusInit (i) -> i | EOF (i) -> i @@ -510,10 +512,12 @@ let visitor_info_of_tok f = function | Tsizeof (i) -> Tsizeof (f i) | Tasm (i) -> Tasm (f i) | Tattribute (i) -> Tattribute (f i) - | TattributeNoarg (i) -> TattributeNoarg (f i) + | TattributeNoarg (i) -> TattributeNoarg (f i) | Tinline (i) -> Tinline (f i) | Ttypeof (i) -> Ttypeof (f i) | Tnew (i) -> Tnew (f i) + | Tdelete (i) -> Tdelete (f i) + | TOParCplusplusInit (i) -> TOParCplusplusInit (f i) | EOF (i) -> EOF (f i) diff --git a/parsing_c/type_annoter_c.ml b/parsing_c/type_annoter_c.ml index b52b593..010f2ab 100644 --- a/parsing_c/type_annoter_c.ml +++ b/parsing_c/type_annoter_c.ml @@ -945,6 +945,11 @@ let annotater_expr_visitor_subpart = (fun (k,bigf) expr -> pr2_once "Type annotater:not handling New"; Type_c.noTypeHere (* TODO *) + | Delete e -> + k expr; + pr2_once "Type annotater:not handling Delete"; + Type_c.noTypeHere (* TODO *) + in Ast_c.set_type_expr expr ty @@ -1085,9 +1090,13 @@ let rec visit_toplevel ~just_add_in_env ~depth elem = if need_annotate_body then begin (* int x = sizeof(x) is legal so need process ini *) - iniopt +> Common.do_option (fun (info, ini) -> - Visitor_c.vk_ini bigf ini - ); + match iniopt with + Ast_c.NoInit -> () + | Ast_c.ValInit(iini,init) -> Visitor_c.vk_ini bigf init + | Ast_c.ConstrInit((args,_)) -> + args +> List.iter (fun (e,ii) -> + Visitor_c.vk_argument bigf e + ) end ); ); diff --git a/parsing_c/visitor_c.ml b/parsing_c/visitor_c.ml index b8f16dd..867b18e 100644 --- a/parsing_c/visitor_c.ml +++ b/parsing_c/visitor_c.ml @@ -330,7 +330,8 @@ let rec vk_expr = fun bigf expr -> | ParenExpr (e) -> exprf e - | New t -> vk_argument bigf t + | New t -> vk_argument bigf t + | Delete e -> vk_expr bigf e in exprf expr @@ -519,10 +520,10 @@ and vk_onedecl = fun bigf onedecl -> attrs +> List.iter (vk_attribute bigf); var +> Common.do_option (fun (name, iniopt) -> vk_name bigf name; - iniopt +> Common.do_option (fun (info, ini) -> - iif [info]; - vk_ini bigf ini; - ); + (match iniopt with + Ast_c.NoInit -> () + | Ast_c.ValInit(iini,init) -> iif [iini]; vk_ini bigf init + | Ast_c.ConstrInit((init,ii)) -> iif ii; vk_argument_list bigf init) ) in f (k, bigf) onedecl @@ -1058,6 +1059,7 @@ let rec vk_expr_s = fun bigf expr -> | ParenExpr (e) -> ParenExpr (exprf e) | New t -> New (vk_argument_s bigf t) + | Delete e -> Delete (vk_expr_s bigf e) in (e', typ'), (iif ii) @@ -1298,10 +1300,15 @@ and vk_decl_s = fun bigf d -> {v_namei = (var +> map_option (fun (name, iniopt) -> vk_name_s bigf name, - iniopt +> map_option (fun (info, init) -> - vk_info_s bigf info, - vk_ini_s bigf init - ))); + (match iniopt with + Ast_c.NoInit -> iniopt + | Ast_c.ValInit(iini,init) -> + Ast_c.ValInit(vk_info_s bigf iini,vk_ini_s bigf init) + | Ast_c.ConstrInit((init,ii)) -> + let init = + init +> List.map (fun (e,ii) -> vk_argument_s bigf e, iif ii) in + Ast_c.ConstrInit((init, List.map (vk_info_s bigf) ii))) + )); v_type = vk_type_s bigf t; (* !!! dont go in semantic related stuff !!! *) v_type_bis = tbis; -- 2.20.1