htypechk.pas 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  1. {
  2. $Id$
  3. Copyright (c) 1996-98 by Florian Klaempfl
  4. This unit exports some help routines for the type checking
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. unit htypechk;
  19. interface
  20. uses
  21. tree,symtable;
  22. const
  23. { firstcallparan without varspez we don't count the ref }
  24. count_ref : boolean = true;
  25. allow_array_constructor : boolean = false;
  26. { Conversion }
  27. function isconvertable(def_from,def_to : pdef;
  28. var doconv : tconverttype;fromtreetype : ttreetyp;
  29. explicit : boolean) : byte;
  30. { Register Allocation }
  31. procedure make_not_regable(p : ptree);
  32. procedure left_right_max(p : ptree);
  33. procedure calcregisters(p : ptree;r32,fpu,mmx : word);
  34. { subroutine handling }
  35. procedure test_protected_sym(sym : psym);
  36. procedure test_protected(p : ptree);
  37. function is_procsym_load(p:Ptree):boolean;
  38. function is_procsym_call(p:Ptree):boolean;
  39. function is_assignment_overloaded(from_def,to_def : pdef) : boolean;
  40. implementation
  41. uses
  42. globtype,systems,tokens,
  43. cobjects,verbose,globals,
  44. aasm,types,
  45. hcodegen;
  46. {****************************************************************************
  47. Convert
  48. ****************************************************************************}
  49. { Returns:
  50. 0 - Not convertable
  51. 1 - Convertable
  52. 2 - Convertable, but not first choice }
  53. function isconvertable(def_from,def_to : pdef;
  54. var doconv : tconverttype;fromtreetype : ttreetyp;
  55. explicit : boolean) : byte;
  56. { Tbasetype: uauto,uvoid,uchar,
  57. u8bit,u16bit,u32bit,
  58. s8bit,s16bit,s32,
  59. bool8bit,bool16bit,bool32bit,
  60. u64bit,s64bitint }
  61. type
  62. tbasedef=(bvoid,bchar,bint,bbool);
  63. const
  64. basedeftbl:array[tbasetype] of tbasedef =
  65. (bvoid,bvoid,bchar,
  66. bint,bint,bint,
  67. bint,bint,bint,
  68. bbool,bbool,bbool,bint,bint);
  69. basedefconverts : array[tbasedef,tbasedef] of tconverttype =
  70. ((tc_not_possible,tc_not_possible,tc_not_possible,tc_not_possible),
  71. (tc_not_possible,tc_equal,tc_not_possible,tc_not_possible),
  72. (tc_not_possible,tc_not_possible,tc_int_2_int,tc_int_2_bool),
  73. (tc_not_possible,tc_not_possible,tc_bool_2_int,tc_int_2_bool));
  74. var
  75. b : byte;
  76. hd1,hd2 : pdef;
  77. begin
  78. { safety check }
  79. if not(assigned(def_from) and assigned(def_to)) then
  80. begin
  81. isconvertable:=0;
  82. exit;
  83. end;
  84. b:=0;
  85. { we walk the wanted (def_to) types and check then the def_from
  86. types if there is a conversion possible }
  87. case def_to^.deftype of
  88. orddef :
  89. begin
  90. case def_from^.deftype of
  91. orddef :
  92. begin
  93. doconv:=basedefconverts[basedeftbl[porddef(def_from)^.typ],basedeftbl[porddef(def_to)^.typ]];
  94. b:=1;
  95. if (doconv=tc_not_possible) or
  96. ((doconv=tc_int_2_bool) and
  97. (not explicit) and
  98. (not is_boolean(def_from))) or
  99. ((doconv=tc_bool_2_int) and
  100. (not explicit) and
  101. (not is_boolean(def_to))) then
  102. b:=0;
  103. end;
  104. enumdef :
  105. begin
  106. doconv:=tc_int_2_int;
  107. b:=1;
  108. end;
  109. end;
  110. end;
  111. stringdef :
  112. begin
  113. case def_from^.deftype of
  114. stringdef : begin
  115. doconv:=tc_string_2_string;
  116. b:=1;
  117. end;
  118. orddef : begin
  119. { char to string}
  120. if is_char(def_from) then
  121. begin
  122. doconv:=tc_char_2_string;
  123. b:=1;
  124. end;
  125. end;
  126. arraydef : begin
  127. { string to array of char, the length check is done by the firstpass of this node }
  128. if is_equal(parraydef(def_from)^.definition,cchardef) then
  129. begin
  130. doconv:=tc_chararray_2_string;
  131. if (not(cs_ansistrings in aktlocalswitches) and
  132. is_shortstring(def_to)) or
  133. ((cs_ansistrings in aktlocalswitches) and
  134. is_ansistring(def_to)) then
  135. b:=1
  136. else
  137. b:=2;
  138. end;
  139. end;
  140. pointerdef : begin
  141. { pchar can be assigned to short/ansistrings }
  142. if is_pchar(def_from) and not(m_tp in aktmodeswitches) then
  143. begin
  144. doconv:=tc_pchar_2_string;
  145. b:=1;
  146. end;
  147. end;
  148. end;
  149. end;
  150. floatdef :
  151. begin
  152. case def_from^.deftype of
  153. orddef : begin { ordinal to real }
  154. if is_integer(def_from) then
  155. begin
  156. if pfloatdef(def_to)^.typ=f32bit then
  157. doconv:=tc_int_2_fix
  158. else
  159. doconv:=tc_int_2_real;
  160. b:=1;
  161. end;
  162. end;
  163. floatdef : begin { 2 float types ? }
  164. if pfloatdef(def_from)^.typ=pfloatdef(def_to)^.typ then
  165. doconv:=tc_equal
  166. else
  167. begin
  168. if pfloatdef(def_from)^.typ=f32bit then
  169. doconv:=tc_fix_2_real
  170. else
  171. if pfloatdef(def_to)^.typ=f32bit then
  172. doconv:=tc_real_2_fix
  173. else
  174. doconv:=tc_real_2_real;
  175. { comp isn't a floating type }
  176. {$ifdef i386}
  177. if (pfloatdef(def_to)^.typ=s64bit) and
  178. (pfloatdef(def_from)^.typ<>s64bit) and
  179. not (explicit) then
  180. CGMessage(type_w_convert_real_2_comp);
  181. {$endif}
  182. end;
  183. b:=1;
  184. end;
  185. end;
  186. end;
  187. enumdef :
  188. begin
  189. if (def_from^.deftype=enumdef) then
  190. begin
  191. if assigned(penumdef(def_from)^.basedef) then
  192. hd1:=penumdef(def_from)^.basedef
  193. else
  194. hd1:=def_from;
  195. if assigned(penumdef(def_to)^.basedef) then
  196. hd2:=penumdef(def_to)^.basedef
  197. else
  198. hd2:=def_to;
  199. if (hd1=hd2) then
  200. b:=1;
  201. end;
  202. end;
  203. arraydef :
  204. begin
  205. { open array is also compatible with a single element of its base type }
  206. if is_open_array(def_to) and
  207. is_equal(parraydef(def_to)^.definition,def_from) then
  208. begin
  209. doconv:=tc_equal;
  210. b:=1;
  211. end
  212. else
  213. begin
  214. case def_from^.deftype of
  215. pointerdef : begin
  216. if (parraydef(def_to)^.lowrange=0) and
  217. is_equal(ppointerdef(def_from)^.definition,parraydef(def_to)^.definition) then
  218. begin
  219. doconv:=tc_pointer_2_array;
  220. b:=1;
  221. end;
  222. end;
  223. stringdef : begin
  224. { array of char to string }
  225. if is_equal(parraydef(def_to)^.definition,cchardef) then
  226. begin
  227. doconv:=tc_string_2_chararray;
  228. b:=1;
  229. end;
  230. end;
  231. end;
  232. end;
  233. end;
  234. pointerdef :
  235. begin
  236. case def_from^.deftype of
  237. stringdef : begin
  238. { string constant to zero terminated string constant }
  239. if (fromtreetype=stringconstn) and
  240. is_pchar(def_to) then
  241. begin
  242. doconv:=tc_cstring_2_pchar;
  243. b:=1;
  244. end;
  245. end;
  246. orddef : begin
  247. { char constant to zero terminated string constant }
  248. if (fromtreetype=ordconstn) and is_equal(def_from,cchardef) and
  249. is_pchar(def_to) then
  250. begin
  251. doconv:=tc_cchar_2_pchar;
  252. b:=1;
  253. end;
  254. end;
  255. arraydef : begin
  256. { chararray to pointer }
  257. if (parraydef(def_from)^.lowrange=0) and
  258. is_equal(parraydef(def_from)^.definition,ppointerdef(def_to)^.definition) then
  259. begin
  260. doconv:=tc_array_2_pointer;
  261. b:=1;
  262. end;
  263. end;
  264. pointerdef : begin
  265. { child class pointer can be assigned to anchestor pointers }
  266. if (
  267. (ppointerdef(def_from)^.definition^.deftype=objectdef) and
  268. (ppointerdef(def_to)^.definition^.deftype=objectdef) and
  269. pobjectdef(ppointerdef(def_from)^.definition)^.isrelated(
  270. pobjectdef(ppointerdef(def_to)^.definition))
  271. ) or
  272. { all pointers can be assigned to void-pointer }
  273. is_equal(ppointerdef(def_to)^.definition,voiddef) or
  274. { in my opnion, is this not clean pascal }
  275. { well, but it's handy to use, it isn't ? (FK) }
  276. is_equal(ppointerdef(def_from)^.definition,voiddef) then
  277. begin
  278. doconv:=tc_equal;
  279. b:=1;
  280. end;
  281. end;
  282. procvardef : begin
  283. { procedure variable can be assigned to an void pointer }
  284. { Not anymore. Use the @ operator now.}
  285. if not(m_tp_procvar in aktmodeswitches) and
  286. (ppointerdef(def_to)^.definition^.deftype=orddef) and
  287. (porddef(ppointerdef(def_to)^.definition)^.typ=uvoid) then
  288. begin
  289. doconv:=tc_equal;
  290. b:=1;
  291. end;
  292. end;
  293. classrefdef,
  294. objectdef : begin
  295. { class types and class reference type
  296. can be assigned to void pointers }
  297. if (
  298. ((def_from^.deftype=objectdef) and pobjectdef(def_from)^.isclass) or
  299. (def_from^.deftype=classrefdef)
  300. ) and
  301. (ppointerdef(def_to)^.definition^.deftype=orddef) and
  302. (porddef(ppointerdef(def_to)^.definition)^.typ=uvoid) then
  303. begin
  304. doconv:=tc_equal;
  305. b:=1;
  306. end;
  307. end;
  308. end;
  309. end;
  310. setdef :
  311. begin
  312. { automatic arrayconstructor -> set conversion }
  313. if (def_from^.deftype=arraydef) and (parraydef(def_from)^.IsConstructor) then
  314. begin
  315. doconv:=tc_arrayconstructor_2_set;
  316. b:=1;
  317. end;
  318. end;
  319. procvardef :
  320. begin
  321. { proc -> procvar }
  322. if (def_from^.deftype=procdef) then
  323. begin
  324. def_from^.deftype:=procvardef;
  325. doconv:=tc_proc_2_procvar;
  326. if is_equal(def_from,def_to) then
  327. b:=1;
  328. def_from^.deftype:=procdef;
  329. end
  330. else
  331. { for example delphi allows the assignement from pointers }
  332. { to procedure variables }
  333. if (m_pointer_2_procedure in aktmodeswitches) and
  334. (def_from^.deftype=pointerdef) and
  335. (ppointerdef(def_from)^.definition^.deftype=orddef) and
  336. (porddef(ppointerdef(def_from)^.definition)^.typ=uvoid) then
  337. begin
  338. doconv:=tc_equal;
  339. b:=1;
  340. end
  341. else
  342. { nil is compatible with procvars }
  343. if (fromtreetype=niln) then
  344. begin
  345. doconv:=tc_equal;
  346. b:=1;
  347. end;
  348. end;
  349. objectdef :
  350. begin
  351. { object pascal objects }
  352. if (def_from^.deftype=objectdef) {and
  353. pobjectdef(def_from)^.isclass and pobjectdef(def_to)^.isclass }then
  354. begin
  355. doconv:=tc_equal;
  356. if pobjectdef(def_from)^.isrelated(pobjectdef(def_to)) then
  357. b:=1;
  358. end
  359. else
  360. { nil is compatible with class instances }
  361. if (fromtreetype=niln) and (pobjectdef(def_to)^.isclass) then
  362. begin
  363. doconv:=tc_equal;
  364. b:=1;
  365. end;
  366. end;
  367. classrefdef :
  368. begin
  369. { class reference types }
  370. if (def_from^.deftype=classrefdef) then
  371. begin
  372. doconv:=tc_equal;
  373. if pobjectdef(pclassrefdef(def_from)^.definition)^.isrelated(
  374. pobjectdef(pclassrefdef(def_to)^.definition)) then
  375. b:=1;
  376. end
  377. else
  378. { nil is compatible with class references }
  379. if (fromtreetype=niln) then
  380. begin
  381. doconv:=tc_equal;
  382. b:=1;
  383. end;
  384. end;
  385. filedef :
  386. begin
  387. { typed files are all equal to the abstract file type
  388. name TYPEDFILE in system.pp in is_equal in types.pas
  389. the problem is that it sholud be also compatible to FILE
  390. but this would leed to a problem for ASSIGN RESET and REWRITE
  391. when trying to find the good overloaded function !!
  392. so all file function are doubled in system.pp
  393. this is not very beautiful !!}
  394. if (def_from^.deftype=filedef) and
  395. (
  396. (
  397. (pfiledef(def_from)^.filetype = ft_typed) and
  398. (pfiledef(def_to)^.filetype = ft_typed) and
  399. (
  400. (pfiledef(def_from)^.typed_as = pdef(voiddef)) or
  401. (pfiledef(def_to)^.typed_as = pdef(voiddef))
  402. )
  403. ) or
  404. (
  405. (
  406. (pfiledef(def_from)^.filetype = ft_untyped) and
  407. (pfiledef(def_to)^.filetype = ft_typed)
  408. ) or
  409. (
  410. (pfiledef(def_from)^.filetype = ft_typed) and
  411. (pfiledef(def_to)^.filetype = ft_untyped)
  412. )
  413. )
  414. ) then
  415. begin
  416. doconv:=tc_equal;
  417. b:=1;
  418. end
  419. end;
  420. else
  421. begin
  422. { assignment overwritten ?? }
  423. if is_assignment_overloaded(def_from,def_to) then
  424. b:=1;
  425. end;
  426. end;
  427. { nil is compatible with ansi- and wide strings }
  428. { no, that isn't true, (FK)
  429. if (fromtreetype=niln) and (def_to^.deftype=stringdef)
  430. and (pstringdef(def_to)^.string_typ in [st_ansistring,st_widestring]) then
  431. begin
  432. doconv:=tc_equal;
  433. b:=1;
  434. end
  435. else
  436. }
  437. { ansi- and wide strings can be assigned to void pointers }
  438. { no, (FK)
  439. if (def_from^.deftype=stringdef) and
  440. (pstringdef(def_from)^.string_typ in [st_ansistring,st_widestring]) and
  441. (def_to^.deftype=pointerdef) and
  442. (ppointerdef(def_to)^.definition^.deftype=orddef) and
  443. (porddef(ppointerdef(def_to)^.definition)^.typ=uvoid) then
  444. begin
  445. doconv:=tc_equal;
  446. b:=1;
  447. end
  448. else
  449. }
  450. { ansistrings can be assigned to pchar
  451. this needs an explicit type cast (FK)
  452. if is_ansistring(def_from) and
  453. (def_to^.deftype=pointerdef) and
  454. (ppointerdef(def_to)^.definition^.deftype=orddef) and
  455. (porddef(ppointerdef(def_to)^.definition)^.typ=uchar) then
  456. begin
  457. doconv:=tc_ansistring_2_pchar;
  458. b:=1;
  459. end
  460. else
  461. }
  462. isconvertable:=b;
  463. end;
  464. {****************************************************************************
  465. Register Calculation
  466. ****************************************************************************}
  467. { marks an lvalue as "unregable" }
  468. procedure make_not_regable(p : ptree);
  469. begin
  470. case p^.treetype of
  471. typeconvn :
  472. make_not_regable(p^.left);
  473. loadn :
  474. if p^.symtableentry^.typ=varsym then
  475. pvarsym(p^.symtableentry)^.var_options :=
  476. pvarsym(p^.symtableentry)^.var_options and not vo_regable;
  477. end;
  478. end;
  479. procedure left_right_max(p : ptree);
  480. begin
  481. if assigned(p^.left) then
  482. begin
  483. if assigned(p^.right) then
  484. begin
  485. p^.registers32:=max(p^.left^.registers32,p^.right^.registers32);
  486. p^.registersfpu:=max(p^.left^.registersfpu,p^.right^.registersfpu);
  487. {$ifdef SUPPORT_MMX}
  488. p^.registersmmx:=max(p^.left^.registersmmx,p^.right^.registersmmx);
  489. {$endif SUPPORT_MMX}
  490. end
  491. else
  492. begin
  493. p^.registers32:=p^.left^.registers32;
  494. p^.registersfpu:=p^.left^.registersfpu;
  495. {$ifdef SUPPORT_MMX}
  496. p^.registersmmx:=p^.left^.registersmmx;
  497. {$endif SUPPORT_MMX}
  498. end;
  499. end;
  500. end;
  501. { calculates the needed registers for a binary operator }
  502. procedure calcregisters(p : ptree;r32,fpu,mmx : word);
  503. begin
  504. left_right_max(p);
  505. { Only when the difference between the left and right registers < the
  506. wanted registers allocate the amount of registers }
  507. if assigned(p^.left) then
  508. begin
  509. if assigned(p^.right) then
  510. begin
  511. if (abs(p^.left^.registers32-p^.right^.registers32)<r32) then
  512. inc(p^.registers32,r32);
  513. if (abs(p^.left^.registersfpu-p^.right^.registersfpu)<fpu) then
  514. inc(p^.registersfpu,fpu);
  515. {$ifdef SUPPORT_MMX}
  516. if (abs(p^.left^.registersmmx-p^.right^.registersmmx)<mmx) then
  517. inc(p^.registersmmx,mmx);
  518. {$endif SUPPORT_MMX}
  519. end
  520. else
  521. begin
  522. if (p^.left^.registers32<r32) then
  523. inc(p^.registers32,r32);
  524. if (p^.left^.registersfpu<fpu) then
  525. inc(p^.registersfpu,fpu);
  526. {$ifdef SUPPORT_MMX}
  527. if (p^.left^.registersmmx<mmx) then
  528. inc(p^.registersmmx,mmx);
  529. {$endif SUPPORT_MMX}
  530. end;
  531. end;
  532. { error CGMessage, if more than 8 floating point }
  533. { registers are needed }
  534. if p^.registersfpu>8 then
  535. CGMessage(cg_e_too_complex_expr);
  536. end;
  537. {****************************************************************************
  538. Subroutine Handling
  539. ****************************************************************************}
  540. { protected field handling
  541. protected field can not appear in
  542. var parameters of function !!
  543. this can only be done after we have determined the
  544. overloaded function
  545. this is the reason why it is not in the parser, PM }
  546. procedure test_protected_sym(sym : psym);
  547. begin
  548. if ((sym^.properties and sp_protected)<>0) and
  549. ((sym^.owner^.symtabletype=unitsymtable) or
  550. ((sym^.owner^.symtabletype=objectsymtable) and
  551. (pobjectdef(sym^.owner^.defowner)^.owner^.symtabletype=unitsymtable))) then
  552. CGMessage(parser_e_cant_access_protected_member);
  553. end;
  554. procedure test_protected(p : ptree);
  555. begin
  556. case p^.treetype of
  557. loadn : test_protected_sym(p^.symtableentry);
  558. typeconvn : test_protected(p^.left);
  559. derefn : test_protected(p^.left);
  560. subscriptn : begin
  561. { test_protected(p^.left);
  562. Is a field of a protected var
  563. also protected ??? PM }
  564. test_protected_sym(p^.vs);
  565. end;
  566. end;
  567. end;
  568. function is_procsym_load(p:Ptree):boolean;
  569. begin
  570. is_procsym_load:=((p^.treetype=loadn) and (p^.symtableentry^.typ=procsym)) or
  571. ((p^.treetype=addrn) and (p^.left^.treetype=loadn)
  572. and (p^.left^.symtableentry^.typ=procsym)) ;
  573. end;
  574. { change a proc call to a procload for assignment to a procvar }
  575. { this can only happen for proc/function without arguments }
  576. function is_procsym_call(p:Ptree):boolean;
  577. begin
  578. is_procsym_call:=(p^.treetype=calln) and (p^.left=nil) and
  579. (((p^.symtableprocentry^.typ=procsym) and (p^.right=nil)) or
  580. ((p^.right<>nil) and (p^.right^.symtableprocentry^.typ=varsym)));
  581. end;
  582. function is_assignment_overloaded(from_def,to_def : pdef) : boolean;
  583. var
  584. passproc : pprocdef;
  585. convtyp : tconverttype;
  586. begin
  587. is_assignment_overloaded:=false;
  588. if assigned(overloaded_operators[assignment]) then
  589. passproc:=overloaded_operators[assignment]^.definition
  590. else
  591. exit;
  592. while passproc<>nil do
  593. begin
  594. if is_equal(passproc^.retdef,to_def) and
  595. (isconvertable(from_def,passproc^.para1^.data,convtyp,ordconstn,false)=1) then
  596. begin
  597. is_assignment_overloaded:=true;
  598. break;
  599. end;
  600. passproc:=passproc^.nextoverloaded;
  601. end;
  602. end;
  603. end.
  604. {
  605. $Log$
  606. Revision 1.17 1999-03-02 18:24:20 peter
  607. * fixed overloading of array of char
  608. Revision 1.16 1999/01/27 13:53:27 pierre
  609. htypechk.pas
  610. Revision 1.15 1999/01/27 13:12:10 pierre
  611. * bool to int must be explicit
  612. Revision 1.14 1999/01/19 15:55:32 pierre
  613. * fix for boolean to comp conversion (now disabled)
  614. Revision 1.13 1998/12/15 17:11:37 peter
  615. * string:=pchar not allowed in tp mode
  616. Revision 1.12 1998/12/11 00:03:18 peter
  617. + globtype,tokens,version unit splitted from globals
  618. Revision 1.11 1998/12/10 09:47:21 florian
  619. + basic operations with int64/qord (compiler with -dint64)
  620. + rtti of enumerations extended: names are now written
  621. Revision 1.10 1998/11/29 12:40:23 peter
  622. * newcnv -> not oldcnv
  623. Revision 1.9 1998/11/26 13:10:42 peter
  624. * new int - int conversion -dNEWCNV
  625. * some function renamings
  626. Revision 1.8 1998/11/17 00:36:42 peter
  627. * more ansistring fixes
  628. Revision 1.7 1998/10/14 13:33:24 peter
  629. * fixed small typo
  630. Revision 1.6 1998/10/14 12:53:38 peter
  631. * fixed small tp7 things
  632. * boolean:=longbool and longbool fixed
  633. Revision 1.5 1998/10/12 09:49:58 florian
  634. + support of <procedure var type>:=<pointer> in delphi mode added
  635. Revision 1.4 1998/09/30 16:42:52 peter
  636. * fixed bool-bool cnv
  637. Revision 1.3 1998/09/24 23:49:05 peter
  638. + aktmodeswitches
  639. Revision 1.2 1998/09/24 09:02:14 peter
  640. * rewritten isconvertable to use case
  641. * array of .. and single variable are compatible
  642. Revision 1.1 1998/09/23 20:42:22 peter
  643. * splitted pass_1
  644. }