htypechk.pas 26 KB

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