htypechk.pas 26 KB

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