defcmp.pas 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl
  4. Compare definitions and parameter lists
  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 defcmp;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. cclasses,
  23. cpuinfo,
  24. globtype,globals,tokens,
  25. node,
  26. symconst,symbase,symtype,symdef;
  27. type
  28. { if acp is cp_all the var const or nothing are considered equal }
  29. tcompare_paras_type = ( cp_none, cp_value_equal_const, cp_all,cp_procvar);
  30. tcompare_paras_option = (cpo_allowdefaults,cpo_ignorehidden,cpo_allowconvert,cpo_comparedefaultvalue);
  31. tcompare_paras_options = set of tcompare_paras_option;
  32. tconverttype = (
  33. tc_equal,
  34. tc_not_possible,
  35. tc_string_2_string,
  36. tc_char_2_string,
  37. tc_char_2_chararray,
  38. tc_pchar_2_string,
  39. tc_cchar_2_pchar,
  40. tc_cstring_2_pchar,
  41. tc_ansistring_2_pchar,
  42. tc_string_2_chararray,
  43. tc_chararray_2_string,
  44. tc_array_2_pointer,
  45. tc_pointer_2_array,
  46. tc_int_2_int,
  47. tc_int_2_bool,
  48. tc_bool_2_bool,
  49. tc_bool_2_int,
  50. tc_real_2_real,
  51. tc_int_2_real,
  52. tc_real_2_currency,
  53. tc_proc_2_procvar,
  54. tc_arrayconstructor_2_set,
  55. tc_load_smallset,
  56. tc_cord_2_pointer,
  57. tc_intf_2_string,
  58. tc_intf_2_guid,
  59. tc_class_2_intf,
  60. tc_char_2_char,
  61. tc_normal_2_smallset,
  62. tc_dynarray_2_openarray,
  63. tc_pwchar_2_string,
  64. tc_variant_2_dynarray,
  65. tc_dynarray_2_variant,
  66. tc_variant_2_enum,
  67. tc_enum_2_variant
  68. );
  69. function compare_defs_ext(def_from,def_to : tdef;
  70. fromtreetype : tnodetype;
  71. explicit : boolean;
  72. check_operator : boolean;
  73. var doconv : tconverttype;
  74. var operatorpd : tprocdef):tequaltype;
  75. { Returns if the type def_from can be converted to def_to or if both types are equal }
  76. function compare_defs(def_from,def_to:tdef;fromtreetype:tnodetype):tequaltype;
  77. { Returns true, if def1 and def2 are semantically the same }
  78. function equal_defs(def_from,def_to:tdef):boolean;
  79. { Checks for type compatibility (subgroups of type)
  80. used for case statements... probably missing stuff
  81. to use on other types }
  82. function is_subequal(def1, def2: tdef): boolean;
  83. function assignment_overloaded(from_def,to_def : tdef) : tprocdef;
  84. {# true, if two parameter lists are equal
  85. if acp is cp_none, all have to match exactly
  86. if acp is cp_value_equal_const call by value
  87. and call by const parameter are assumed as
  88. equal
  89. allowdefaults indicates if default value parameters
  90. are allowed (in this case, the search order will first
  91. search for a routine with default parameters, before
  92. searching for the same definition with no parameters)
  93. }
  94. function compare_paras(paralist1,paralist2 : TLinkedList; acp : tcompare_paras_type; cpoptions: tcompare_paras_options):tequaltype;
  95. { True if a function can be assigned to a procvar }
  96. { changed first argument type to pabstractprocdef so that it can also be }
  97. { used to test compatibility between two pprocvardefs (JM) }
  98. function proc_to_procvar_equal(def1:tabstractprocdef;def2:tprocvardef;methoderr:boolean):tequaltype;
  99. implementation
  100. uses
  101. verbose,systems,
  102. symtable,symsym,
  103. defutil,symutil;
  104. function assignment_overloaded(from_def,to_def:tdef):tprocdef;
  105. begin
  106. if assigned(overloaded_operators[_ASSIGNMENT]) then
  107. assignment_overloaded:=overloaded_operators[_ASSIGNMENT].search_procdef_assignment_operator(from_def,to_def)
  108. else
  109. assignment_overloaded:=nil;
  110. end;
  111. function compare_defs_ext(def_from,def_to : tdef;
  112. fromtreetype : tnodetype;
  113. explicit : boolean;
  114. check_operator : boolean;
  115. var doconv : tconverttype;
  116. var operatorpd : tprocdef):tequaltype;
  117. { Tbasetype:
  118. uvoid,
  119. u8bit,u16bit,u32bit,u64bit,
  120. s8bit,s16bit,s32bit,s64bit,
  121. bool8bit,bool16bit,bool32bit,
  122. uchar,uwidechar }
  123. type
  124. tbasedef=(bvoid,bchar,bint,bbool);
  125. const
  126. basedeftbl:array[tbasetype] of tbasedef =
  127. (bvoid,
  128. bint,bint,bint,bint,
  129. bint,bint,bint,bint,
  130. bbool,bbool,bbool,
  131. bchar,bchar,bint);
  132. basedefconvertsimplicit : array[tbasedef,tbasedef] of tconverttype =
  133. { void, char, int, bool }
  134. ((tc_not_possible,tc_not_possible,tc_not_possible,tc_not_possible),
  135. (tc_not_possible,tc_char_2_char,tc_not_possible,tc_not_possible),
  136. (tc_not_possible,tc_not_possible,tc_int_2_int,tc_not_possible),
  137. (tc_not_possible,tc_not_possible,tc_not_possible,tc_bool_2_bool));
  138. basedefconvertsexplicit : array[tbasedef,tbasedef] of tconverttype =
  139. { void, char, int, bool }
  140. ((tc_not_possible,tc_not_possible,tc_not_possible,tc_not_possible),
  141. (tc_not_possible,tc_char_2_char,tc_int_2_int,tc_int_2_bool),
  142. (tc_not_possible,tc_int_2_int,tc_int_2_int,tc_int_2_bool),
  143. (tc_not_possible,tc_bool_2_int,tc_bool_2_int,tc_bool_2_bool));
  144. var
  145. subeq,eq : tequaltype;
  146. hd1,hd2 : tdef;
  147. hct : tconverttype;
  148. hd3 : tobjectdef;
  149. hpd : tprocdef;
  150. begin
  151. { safety check }
  152. if not(assigned(def_from) and assigned(def_to)) then
  153. begin
  154. compare_defs_ext:=te_incompatible;
  155. exit;
  156. end;
  157. { same def? then we've an exact match }
  158. if def_from=def_to then
  159. begin
  160. compare_defs_ext:=te_exact;
  161. exit;
  162. end;
  163. { we walk the wanted (def_to) types and check then the def_from
  164. types if there is a conversion possible }
  165. eq:=te_incompatible;
  166. doconv:=tc_not_possible;
  167. case def_to.deftype of
  168. orddef :
  169. begin
  170. case def_from.deftype of
  171. orddef :
  172. begin
  173. if (torddef(def_from).typ=torddef(def_to).typ) then
  174. begin
  175. case torddef(def_from).typ of
  176. uchar,uwidechar,
  177. u8bit,u16bit,u32bit,u64bit,
  178. s8bit,s16bit,s32bit,s64bit:
  179. begin
  180. if (torddef(def_from).low=torddef(def_to).low) and
  181. (torddef(def_from).high=torddef(def_to).high) then
  182. eq:=te_equal
  183. else
  184. begin
  185. doconv:=tc_int_2_int;
  186. eq:=te_convert_l1;
  187. end;
  188. end;
  189. uvoid,
  190. bool8bit,bool16bit,bool32bit:
  191. eq:=te_equal;
  192. else
  193. internalerror(200210061);
  194. end;
  195. end
  196. else
  197. begin
  198. if explicit then
  199. doconv:=basedefconvertsexplicit[basedeftbl[torddef(def_from).typ],basedeftbl[torddef(def_to).typ]]
  200. else
  201. doconv:=basedefconvertsimplicit[basedeftbl[torddef(def_from).typ],basedeftbl[torddef(def_to).typ]];
  202. if (doconv=tc_not_possible) then
  203. eq:=te_incompatible
  204. else
  205. { "punish" bad type conversions :) (JM) }
  206. if (not is_in_limit(def_from,def_to)) and
  207. (def_from.size > def_to.size) then
  208. eq:=te_convert_l3
  209. else
  210. eq:=te_convert_l1;
  211. end;
  212. end;
  213. enumdef :
  214. begin
  215. { needed for char(enum) }
  216. if explicit then
  217. begin
  218. doconv:=tc_int_2_int;
  219. eq:=te_convert_l1;
  220. end;
  221. end;
  222. floatdef :
  223. begin
  224. if is_currency(def_to) then
  225. begin
  226. doconv:=tc_real_2_currency;
  227. eq:=te_convert_l2;
  228. end;
  229. end;
  230. classrefdef,
  231. procvardef,
  232. pointerdef :
  233. begin
  234. if explicit then
  235. begin
  236. eq:=te_convert_l1;
  237. if (fromtreetype=niln) then
  238. begin
  239. { will be handled by the constant folding }
  240. doconv:=tc_equal;
  241. end
  242. else
  243. doconv:=tc_int_2_int;
  244. end;
  245. end;
  246. end;
  247. end;
  248. stringdef :
  249. begin
  250. case def_from.deftype of
  251. stringdef :
  252. begin
  253. { Constant string }
  254. if (fromtreetype=stringconstn) then
  255. begin
  256. if (tstringdef(def_from).string_typ=tstringdef(def_to).string_typ) then
  257. eq:=te_equal
  258. else
  259. begin
  260. doconv:=tc_string_2_string;
  261. { Don't prefer conversions from widestring to a
  262. normal string as we can loose information }
  263. if tstringdef(def_from).string_typ=st_widestring then
  264. eq:=te_convert_l1
  265. else
  266. begin
  267. if tstringdef(def_to).string_typ=st_widestring then
  268. eq:=te_convert_l1
  269. else
  270. eq:=te_equal; { we can change the stringconst node }
  271. end;
  272. end;
  273. end
  274. else
  275. { Same string type, for shortstrings also the length must match }
  276. if (tstringdef(def_from).string_typ=tstringdef(def_to).string_typ) and
  277. ((tstringdef(def_from).string_typ<>st_shortstring) or
  278. (tstringdef(def_from).len=tstringdef(def_to).len)) then
  279. eq:=te_equal
  280. else
  281. begin
  282. doconv:=tc_string_2_string;
  283. { Prefer conversions to shortstring over other
  284. conversions. This is compatible with Delphi (PFV) }
  285. if tstringdef(def_to).string_typ=st_shortstring then
  286. eq:=te_convert_l2
  287. else
  288. eq:=te_convert_l3;
  289. end;
  290. end;
  291. orddef :
  292. begin
  293. { char to string}
  294. if is_char(def_from) or
  295. is_widechar(def_from) then
  296. begin
  297. doconv:=tc_char_2_string;
  298. eq:=te_convert_l1;
  299. end;
  300. end;
  301. arraydef :
  302. begin
  303. { array of char to string, the length check is done by the firstpass of this node }
  304. if is_chararray(def_from) or
  305. (is_char(tarraydef(def_from).elementtype.def) and
  306. is_open_array(def_from)) then
  307. begin
  308. doconv:=tc_chararray_2_string;
  309. if is_open_array(def_from) or
  310. (is_shortstring(def_to) and
  311. (def_from.size <= 255)) or
  312. (is_ansistring(def_to) and
  313. (def_from.size > 255)) then
  314. eq:=te_convert_l1
  315. else
  316. eq:=te_convert_l2;
  317. end;
  318. end;
  319. pointerdef :
  320. begin
  321. { pchar can be assigned to short/ansistrings,
  322. but not in tp7 compatible mode }
  323. if not(m_tp7 in aktmodeswitches) then
  324. begin
  325. if is_pchar(def_from) then
  326. begin
  327. doconv:=tc_pchar_2_string;
  328. { prefer ansistrings because pchars can overflow shortstrings, }
  329. { but only if ansistrings are the default (JM) }
  330. if (is_shortstring(def_to) and
  331. not(cs_ansistrings in aktlocalswitches)) or
  332. (is_ansistring(def_to) and
  333. (cs_ansistrings in aktlocalswitches)) then
  334. eq:=te_convert_l1
  335. else
  336. eq:=te_convert_l2;
  337. end
  338. else if is_pwidechar(def_from) then
  339. begin
  340. doconv:=tc_pwchar_2_string;
  341. { prefer ansistrings because pchars can overflow shortstrings, }
  342. { but only if ansistrings are the default (JM) }
  343. if is_widestring(def_to) then
  344. eq:=te_convert_l1
  345. else
  346. eq:=te_convert_l3;
  347. end;
  348. end;
  349. end;
  350. end;
  351. end;
  352. floatdef :
  353. begin
  354. case def_from.deftype of
  355. orddef :
  356. begin { ordinal to real }
  357. if is_integer(def_from) or
  358. (is_currency(def_from) and
  359. (s64currencytype.def.deftype = floatdef)) then
  360. begin
  361. doconv:=tc_int_2_real;
  362. eq:=te_convert_l1;
  363. end
  364. else if is_currency(def_from)
  365. { and (s64currencytype.def.deftype = orddef)) } then
  366. begin
  367. { prefer conversion to orddef in this case, unless }
  368. { the orddef < currency (then it will get convert l3, }
  369. { and conversion to float is favoured) }
  370. doconv:=tc_int_2_real;
  371. eq:=te_convert_l2;
  372. end;
  373. end;
  374. floatdef :
  375. begin
  376. if tfloatdef(def_from).typ=tfloatdef(def_to).typ then
  377. eq:=te_equal
  378. else
  379. begin
  380. if not(explicit) or
  381. not(m_delphi in aktmodeswitches) then
  382. begin
  383. doconv:=tc_real_2_real;
  384. eq:=te_convert_l1;
  385. end;
  386. end;
  387. end;
  388. end;
  389. end;
  390. enumdef :
  391. begin
  392. case def_from.deftype of
  393. enumdef :
  394. begin
  395. if explicit then
  396. begin
  397. eq:=te_convert_l1;
  398. doconv:=tc_int_2_int;
  399. end
  400. else
  401. begin
  402. hd1:=def_from;
  403. while assigned(tenumdef(hd1).basedef) do
  404. hd1:=tenumdef(hd1).basedef;
  405. hd2:=def_to;
  406. while assigned(tenumdef(hd2).basedef) do
  407. hd2:=tenumdef(hd2).basedef;
  408. if (hd1=hd2) then
  409. begin
  410. eq:=te_convert_l1;
  411. { because of packenum they can have different sizes! (JM) }
  412. doconv:=tc_int_2_int;
  413. end;
  414. end;
  415. end;
  416. orddef :
  417. begin
  418. if explicit then
  419. begin
  420. eq:=te_convert_l1;
  421. doconv:=tc_int_2_int;
  422. end;
  423. end;
  424. variantdef :
  425. begin
  426. eq:=te_convert_l1;
  427. doconv:=tc_variant_2_enum;
  428. end;
  429. end;
  430. end;
  431. arraydef :
  432. begin
  433. { open array is also compatible with a single element of its base type }
  434. if is_open_array(def_to) and
  435. equal_defs(def_from,tarraydef(def_to).elementtype.def) then
  436. begin
  437. doconv:=tc_equal;
  438. eq:=te_convert_l1;
  439. end
  440. else
  441. begin
  442. case def_from.deftype of
  443. arraydef :
  444. begin
  445. { to dynamic array }
  446. if is_dynamic_array(def_to) then
  447. begin
  448. { dynamic array -> dynamic array }
  449. if is_dynamic_array(def_from) and
  450. equal_defs(tarraydef(def_from).elementtype.def,tarraydef(def_to).elementtype.def) then
  451. eq:=te_equal;
  452. end
  453. else
  454. { to open array }
  455. if is_open_array(def_to) then
  456. begin
  457. { array constructor -> open array }
  458. if is_array_constructor(def_from) then
  459. begin
  460. if is_void(tarraydef(def_from).elementtype.def) then
  461. begin
  462. doconv:=tc_equal;
  463. eq:=te_convert_l1;
  464. end
  465. else
  466. begin
  467. subeq:=compare_defs_ext(tarraydef(def_from).elementtype.def,
  468. tarraydef(def_to).elementtype.def,
  469. arrayconstructorn,false,true,hct,hpd);
  470. if (subeq>=te_equal) then
  471. begin
  472. doconv:=tc_equal;
  473. eq:=te_convert_l1;
  474. end
  475. else
  476. if (subeq>te_incompatible) then
  477. begin
  478. doconv:=hct;
  479. eq:=te_convert_l2;
  480. end;
  481. end;
  482. end
  483. else
  484. { dynamic array -> open array }
  485. if is_dynamic_array(def_from) and
  486. equal_defs(tarraydef(def_from).elementtype.def,tarraydef(def_to).elementtype.def) then
  487. begin
  488. doconv:=tc_dynarray_2_openarray;
  489. eq:=te_convert_l2;
  490. end
  491. else
  492. { array -> open array }
  493. if equal_defs(tarraydef(def_from).elementtype.def,tarraydef(def_to).elementtype.def) then
  494. eq:=te_equal;
  495. end
  496. else
  497. { to array of const }
  498. if is_array_of_const(def_to) then
  499. begin
  500. if is_array_of_const(def_from) or
  501. is_array_constructor(def_from) then
  502. begin
  503. eq:=te_equal;
  504. end
  505. else
  506. { array of tvarrec -> array of const }
  507. if equal_defs(tarraydef(def_to).elementtype.def,tarraydef(def_from).elementtype.def) then
  508. begin
  509. doconv:=tc_equal;
  510. eq:=te_convert_l1;
  511. end;
  512. end
  513. else
  514. { other arrays }
  515. begin
  516. { open array -> array }
  517. if is_open_array(def_from) and
  518. equal_defs(tarraydef(def_from).elementtype.def,tarraydef(def_to).elementtype.def) then
  519. begin
  520. eq:=te_equal
  521. end
  522. else
  523. { array -> array }
  524. if not(m_tp7 in aktmodeswitches) and
  525. not(m_delphi in aktmodeswitches) and
  526. (tarraydef(def_from).lowrange=tarraydef(def_to).lowrange) and
  527. (tarraydef(def_from).highrange=tarraydef(def_to).highrange) and
  528. equal_defs(tarraydef(def_from).elementtype.def,tarraydef(def_to).elementtype.def) and
  529. equal_defs(tarraydef(def_from).rangetype.def,tarraydef(def_to).rangetype.def) then
  530. begin
  531. eq:=te_equal
  532. end;
  533. end;
  534. end;
  535. pointerdef :
  536. begin
  537. { nil is compatible with dyn. arrays }
  538. if is_dynamic_array(def_to) and
  539. (fromtreetype=niln) then
  540. begin
  541. doconv:=tc_equal;
  542. eq:=te_convert_l1;
  543. end
  544. else
  545. if is_zero_based_array(def_to) and
  546. equal_defs(tpointerdef(def_from).pointertype.def,tarraydef(def_to).elementtype.def) then
  547. begin
  548. doconv:=tc_pointer_2_array;
  549. eq:=te_convert_l1;
  550. end;
  551. end;
  552. stringdef :
  553. begin
  554. { string to char array }
  555. if (not is_special_array(def_to)) and
  556. is_char(tarraydef(def_to).elementtype.def) then
  557. begin
  558. doconv:=tc_string_2_chararray;
  559. eq:=te_convert_l1;
  560. end;
  561. end;
  562. orddef:
  563. begin
  564. if is_chararray(def_to) and
  565. is_char(def_from) then
  566. begin
  567. doconv:=tc_char_2_chararray;
  568. eq:=te_convert_l2;
  569. end;
  570. end;
  571. recorddef :
  572. begin
  573. { tvarrec -> array of const }
  574. if is_array_of_const(def_to) and
  575. equal_defs(def_from,tarraydef(def_to).elementtype.def) then
  576. begin
  577. doconv:=tc_equal;
  578. eq:=te_convert_l1;
  579. end;
  580. end;
  581. variantdef :
  582. begin
  583. if is_dynamic_array(def_to) then
  584. begin
  585. doconv:=tc_variant_2_dynarray;
  586. eq:=te_convert_l1;
  587. end;
  588. end;
  589. end;
  590. end;
  591. end;
  592. variantdef :
  593. begin
  594. case def_from.deftype of
  595. enumdef :
  596. begin
  597. doconv:=tc_enum_2_variant;
  598. eq:=te_convert_l1;
  599. end;
  600. arraydef :
  601. begin
  602. if is_dynamic_array(def_from) then
  603. begin
  604. doconv:=tc_dynarray_2_variant;
  605. eq:=te_convert_l1;
  606. end;
  607. end;
  608. end;
  609. end;
  610. pointerdef :
  611. begin
  612. case def_from.deftype of
  613. stringdef :
  614. begin
  615. { string constant (which can be part of array constructor)
  616. to zero terminated string constant }
  617. if (fromtreetype in [arrayconstructorn,stringconstn]) and
  618. (is_pchar(def_to) or is_pwidechar(def_to)) then
  619. begin
  620. doconv:=tc_cstring_2_pchar;
  621. eq:=te_convert_l1;
  622. end
  623. else
  624. if explicit then
  625. begin
  626. { pchar(ansistring) }
  627. if is_pchar(def_to) and
  628. is_ansistring(def_from) then
  629. begin
  630. doconv:=tc_ansistring_2_pchar;
  631. eq:=te_convert_l1;
  632. end
  633. else
  634. { pwidechar(ansistring) }
  635. if is_pwidechar(def_to) and
  636. is_widestring(def_from) then
  637. begin
  638. doconv:=tc_ansistring_2_pchar;
  639. eq:=te_convert_l1;
  640. end;
  641. end;
  642. end;
  643. orddef :
  644. begin
  645. { char constant to zero terminated string constant }
  646. if (fromtreetype=ordconstn) then
  647. begin
  648. if is_char(def_from) and
  649. is_pchar(def_to) then
  650. begin
  651. doconv:=tc_cchar_2_pchar;
  652. eq:=te_convert_l1;
  653. end
  654. else
  655. if (m_delphi in aktmodeswitches) and is_integer(def_from) then
  656. begin
  657. doconv:=tc_cord_2_pointer;
  658. eq:=te_convert_l1;
  659. end;
  660. end;
  661. if (eq=te_incompatible) and explicit then
  662. begin
  663. doconv:=tc_int_2_int;
  664. eq:=te_convert_l1;
  665. end;
  666. end;
  667. arraydef :
  668. begin
  669. { chararray to pointer }
  670. if is_zero_based_array(def_from) and
  671. equal_defs(tarraydef(def_from).elementtype.def,tpointerdef(def_to).pointertype.def) then
  672. begin
  673. doconv:=tc_array_2_pointer;
  674. eq:=te_convert_l1;
  675. end;
  676. end;
  677. pointerdef :
  678. begin
  679. { check for far pointers }
  680. if (tpointerdef(def_from).is_far<>tpointerdef(def_to).is_far) then
  681. begin
  682. eq:=te_incompatible;
  683. end
  684. else
  685. { the types can be forward type, handle before normal type check !! }
  686. if assigned(def_to.typesym) and
  687. (tpointerdef(def_to).pointertype.def.deftype=forwarddef) then
  688. begin
  689. if (def_from.typesym=def_to.typesym) then
  690. eq:=te_equal
  691. end
  692. else
  693. { same types }
  694. if (tpointerdef(def_from).pointertype.def=tpointerdef(def_to).pointertype.def) then
  695. begin
  696. eq:=te_equal
  697. end
  698. else
  699. { child class pointer can be assigned to anchestor pointers }
  700. if (
  701. (tpointerdef(def_from).pointertype.def.deftype=objectdef) and
  702. (tpointerdef(def_to).pointertype.def.deftype=objectdef) and
  703. tobjectdef(tpointerdef(def_from).pointertype.def).is_related(
  704. tobjectdef(tpointerdef(def_to).pointertype.def))
  705. ) or
  706. { all pointers can be assigned to/from void-pointer }
  707. is_void(tpointerdef(def_to).pointertype.def) or
  708. is_void(tpointerdef(def_from).pointertype.def) then
  709. begin
  710. doconv:=tc_equal;
  711. { give pwidechar a penalty }
  712. if is_pwidechar(def_to) then
  713. eq:=te_convert_l2
  714. else
  715. eq:=te_convert_l1;
  716. end;
  717. end;
  718. procvardef :
  719. begin
  720. { procedure variable can be assigned to an void pointer }
  721. { Not anymore. Use the @ operator now.}
  722. if not(m_tp_procvar in aktmodeswitches) and
  723. { method pointers can't be assigned to void pointers
  724. not(tprocvardef(def_from).is_methodpointer) and }
  725. (tpointerdef(def_to).pointertype.def.deftype=orddef) and
  726. (torddef(tpointerdef(def_to).pointertype.def).typ=uvoid) then
  727. begin
  728. doconv:=tc_equal;
  729. eq:=te_convert_l1;
  730. end;
  731. end;
  732. classrefdef,
  733. objectdef :
  734. begin
  735. { class types and class reference type
  736. can be assigned to void pointers }
  737. if (
  738. is_class_or_interface(def_from) or
  739. (def_from.deftype=classrefdef)
  740. ) and
  741. (tpointerdef(def_to).pointertype.def.deftype=orddef) and
  742. (torddef(tpointerdef(def_to).pointertype.def).typ=uvoid) then
  743. begin
  744. doconv:=tc_equal;
  745. eq:=te_convert_l1;
  746. end;
  747. end;
  748. end;
  749. end;
  750. setdef :
  751. begin
  752. case def_from.deftype of
  753. setdef :
  754. begin
  755. if assigned(tsetdef(def_from).elementtype.def) and
  756. assigned(tsetdef(def_to).elementtype.def) then
  757. begin
  758. { sets with the same element base type are equal }
  759. if is_subequal(tsetdef(def_from).elementtype.def,tsetdef(def_to).elementtype.def) then
  760. eq:=te_equal;
  761. end
  762. else
  763. { empty set is compatible with everything }
  764. eq:=te_equal;
  765. end;
  766. arraydef :
  767. begin
  768. { automatic arrayconstructor -> set conversion }
  769. if is_array_constructor(def_from) then
  770. begin
  771. doconv:=tc_arrayconstructor_2_set;
  772. eq:=te_convert_l1;
  773. end;
  774. end;
  775. end;
  776. end;
  777. procvardef :
  778. begin
  779. case def_from.deftype of
  780. procdef :
  781. begin
  782. { proc -> procvar }
  783. if (m_tp_procvar in aktmodeswitches) then
  784. begin
  785. subeq:=proc_to_procvar_equal(tprocdef(def_from),tprocvardef(def_to),true);
  786. if subeq>te_incompatible then
  787. begin
  788. doconv:=tc_proc_2_procvar;
  789. eq:=te_convert_l1;
  790. end;
  791. end;
  792. end;
  793. procvardef :
  794. begin
  795. { procvar -> procvar }
  796. eq:=proc_to_procvar_equal(tprocvardef(def_from),tprocvardef(def_to),false);
  797. end;
  798. pointerdef :
  799. begin
  800. { nil is compatible with procvars }
  801. if (fromtreetype=niln) then
  802. begin
  803. doconv:=tc_equal;
  804. eq:=te_convert_l1;
  805. end
  806. else
  807. { for example delphi allows the assignement from pointers }
  808. { to procedure variables }
  809. if (m_pointer_2_procedure in aktmodeswitches) and
  810. (tpointerdef(def_from).pointertype.def.deftype=orddef) and
  811. (torddef(tpointerdef(def_from).pointertype.def).typ=uvoid) then
  812. begin
  813. doconv:=tc_equal;
  814. eq:=te_convert_l1;
  815. end;
  816. end;
  817. end;
  818. end;
  819. objectdef :
  820. begin
  821. { object pascal objects }
  822. if (def_from.deftype=objectdef) and
  823. (tobjectdef(def_from).is_related(tobjectdef(def_to)) or
  824. tobjectdef(def_to).is_related(tobjectdef(def_from))) then
  825. begin
  826. doconv:=tc_equal;
  827. eq:=te_convert_l1;
  828. end
  829. else
  830. { Class/interface specific }
  831. if is_class_or_interface(def_to) then
  832. begin
  833. { void pointer also for delphi mode }
  834. if (m_delphi in aktmodeswitches) and
  835. is_voidpointer(def_from) then
  836. begin
  837. doconv:=tc_equal;
  838. { prefer pointer-pointer assignments }
  839. eq:=te_convert_l2;
  840. end
  841. else
  842. { nil is compatible with class instances and interfaces }
  843. if (fromtreetype=niln) then
  844. begin
  845. doconv:=tc_equal;
  846. eq:=te_convert_l1;
  847. end
  848. { classes can be assigned to interfaces }
  849. else if is_interface(def_to) and
  850. is_class(def_from) and
  851. assigned(tobjectdef(def_from).implementedinterfaces) then
  852. begin
  853. { we've to search in parent classes as well }
  854. hd3:=tobjectdef(def_from);
  855. while assigned(hd3) do
  856. begin
  857. if hd3.implementedinterfaces.searchintf(def_to)<>-1 then
  858. begin
  859. doconv:=tc_class_2_intf;
  860. eq:=te_convert_l1;
  861. break;
  862. end;
  863. hd3:=hd3.childof;
  864. end;
  865. end
  866. { Interface 2 GUID handling }
  867. else if (def_to=tdef(rec_tguid)) and
  868. (fromtreetype=typen) and
  869. is_interface(def_from) and
  870. assigned(tobjectdef(def_from).iidguid) then
  871. begin
  872. eq:=te_convert_l1;
  873. doconv:=tc_equal;
  874. end;
  875. end;
  876. end;
  877. classrefdef :
  878. begin
  879. { similar to pointerdef wrt forwards }
  880. if assigned(def_to.typesym) and
  881. (tclassrefdef(def_to).pointertype.def.deftype=forwarddef) then
  882. begin
  883. if (def_from.typesym=def_to.typesym) then
  884. eq:=te_equal;
  885. end
  886. else
  887. { class reference types }
  888. if (def_from.deftype=classrefdef) then
  889. begin
  890. if equal_defs(tclassrefdef(def_from).pointertype.def,tclassrefdef(def_to).pointertype.def) then
  891. begin
  892. eq:=te_equal;
  893. end
  894. else
  895. begin
  896. doconv:=tc_equal;
  897. if explicit or
  898. tobjectdef(tclassrefdef(def_from).pointertype.def).is_related(
  899. tobjectdef(tclassrefdef(def_to).pointertype.def)) then
  900. eq:=te_convert_l1;
  901. end;
  902. end
  903. else
  904. { nil is compatible with class references }
  905. if (fromtreetype=niln) then
  906. begin
  907. doconv:=tc_equal;
  908. eq:=te_convert_l1;
  909. end;
  910. end;
  911. filedef :
  912. begin
  913. { typed files are all equal to the abstract file type
  914. name TYPEDFILE in system.pp in is_equal in types.pas
  915. the problem is that it sholud be also compatible to FILE
  916. but this would leed to a problem for ASSIGN RESET and REWRITE
  917. when trying to find the good overloaded function !!
  918. so all file function are doubled in system.pp
  919. this is not very beautiful !!}
  920. if (def_from.deftype=filedef) then
  921. begin
  922. if (tfiledef(def_from).filetyp=tfiledef(def_to).filetyp) then
  923. begin
  924. if
  925. (
  926. (tfiledef(def_from).typedfiletype.def=nil) and
  927. (tfiledef(def_to).typedfiletype.def=nil)
  928. ) or
  929. (
  930. (tfiledef(def_from).typedfiletype.def<>nil) and
  931. (tfiledef(def_to).typedfiletype.def<>nil) and
  932. equal_defs(tfiledef(def_from).typedfiletype.def,tfiledef(def_to).typedfiletype.def)
  933. ) or
  934. (
  935. (tfiledef(def_from).filetyp = ft_typed) and
  936. (tfiledef(def_to).filetyp = ft_typed) and
  937. (
  938. (tfiledef(def_from).typedfiletype.def = tdef(voidtype.def)) or
  939. (tfiledef(def_to).typedfiletype.def = tdef(voidtype.def))
  940. )
  941. ) then
  942. begin
  943. eq:=te_equal;
  944. end;
  945. end
  946. else
  947. if ((tfiledef(def_from).filetyp = ft_untyped) and
  948. (tfiledef(def_to).filetyp = ft_typed)) or
  949. ((tfiledef(def_from).filetyp = ft_typed) and
  950. (tfiledef(def_to).filetyp = ft_untyped)) then
  951. begin
  952. doconv:=tc_equal;
  953. eq:=te_convert_l1;
  954. end;
  955. end;
  956. end;
  957. recorddef :
  958. begin
  959. { interface -> guid }
  960. if is_interface(def_from) and
  961. (def_to=rec_tguid) then
  962. begin
  963. doconv:=tc_intf_2_guid;
  964. eq:=te_convert_l1;
  965. end;
  966. end;
  967. formaldef :
  968. begin
  969. doconv:=tc_equal;
  970. if (def_from.deftype=formaldef) then
  971. eq:=te_equal
  972. else
  973. { Just about everything can be converted to a formaldef...}
  974. if not (def_from.deftype in [abstractdef,errordef]) then
  975. eq:=te_convert_l1;
  976. end;
  977. end;
  978. { if we didn't find an appropriate type conversion yet
  979. then we search also the := operator }
  980. if (eq=te_incompatible) and
  981. check_operator and
  982. ((def_from.deftype in [objectdef,recorddef,arraydef,stringdef,variantdef]) or
  983. (def_to.deftype in [objectdef,recorddef,arraydef,stringdef,variantdef])) then
  984. begin
  985. operatorpd:=assignment_overloaded(def_from,def_to);
  986. if assigned(operatorpd) then
  987. eq:=te_convert_operator;
  988. end;
  989. { update convtype for te_equal when it is not yet set }
  990. if (eq=te_equal) and
  991. (doconv=tc_not_possible) then
  992. doconv:=tc_equal;
  993. compare_defs_ext:=eq;
  994. end;
  995. function equal_defs(def_from,def_to:tdef):boolean;
  996. var
  997. convtyp : tconverttype;
  998. pd : tprocdef;
  999. begin
  1000. { Compare defs with nothingn and no explicit typecasts and
  1001. searching for overloaded operators is not needed }
  1002. equal_defs:=(compare_defs_ext(def_from,def_to,nothingn,false,false,convtyp,pd)>=te_equal);
  1003. end;
  1004. function compare_defs(def_from,def_to:tdef;fromtreetype:tnodetype):tequaltype;
  1005. var
  1006. doconv : tconverttype;
  1007. pd : tprocdef;
  1008. begin
  1009. compare_defs:=compare_defs_ext(def_from,def_to,fromtreetype,false,true,doconv,pd);
  1010. end;
  1011. function is_subequal(def1, def2: tdef): boolean;
  1012. var
  1013. basedef1,basedef2 : tenumdef;
  1014. Begin
  1015. is_subequal := false;
  1016. if assigned(def1) and assigned(def2) then
  1017. Begin
  1018. if (def1.deftype = orddef) and (def2.deftype = orddef) then
  1019. Begin
  1020. { see p.47 of Turbo Pascal 7.01 manual for the separation of types }
  1021. { range checking for case statements is done with testrange }
  1022. case torddef(def1).typ of
  1023. u8bit,u16bit,u32bit,u64bit,
  1024. s8bit,s16bit,s32bit,s64bit :
  1025. is_subequal:=(torddef(def2).typ in [s64bit,u64bit,s32bit,u32bit,u8bit,s8bit,s16bit,u16bit]);
  1026. bool8bit,bool16bit,bool32bit :
  1027. is_subequal:=(torddef(def2).typ in [bool8bit,bool16bit,bool32bit]);
  1028. uchar :
  1029. is_subequal:=(torddef(def2).typ=uchar);
  1030. uwidechar :
  1031. is_subequal:=(torddef(def2).typ=uwidechar);
  1032. end;
  1033. end
  1034. else
  1035. Begin
  1036. { Check if both basedefs are equal }
  1037. if (def1.deftype=enumdef) and (def2.deftype=enumdef) then
  1038. Begin
  1039. { get both basedefs }
  1040. basedef1:=tenumdef(def1);
  1041. while assigned(basedef1.basedef) do
  1042. basedef1:=basedef1.basedef;
  1043. basedef2:=tenumdef(def2);
  1044. while assigned(basedef2.basedef) do
  1045. basedef2:=basedef2.basedef;
  1046. is_subequal:=(basedef1=basedef2);
  1047. end;
  1048. end;
  1049. end;
  1050. end;
  1051. function compare_paras(paralist1,paralist2 : TLinkedList; acp : tcompare_paras_type; cpoptions: tcompare_paras_options):tequaltype;
  1052. var
  1053. currpara1,
  1054. currpara2 : TParaItem;
  1055. eq,lowesteq : tequaltype;
  1056. hpd : tprocdef;
  1057. convtype : tconverttype;
  1058. begin
  1059. compare_paras:=te_incompatible;
  1060. { we need to parse the list from left-right so the
  1061. not-default parameters are checked first }
  1062. lowesteq:=high(tequaltype);
  1063. currpara1:=TParaItem(paralist1.first);
  1064. currpara2:=TParaItem(paralist2.first);
  1065. if cpo_ignorehidden in cpoptions then
  1066. begin
  1067. while assigned(currpara1) and currpara1.is_hidden do
  1068. currpara1:=tparaitem(currpara1.next);
  1069. while assigned(currpara2) and currpara2.is_hidden do
  1070. currpara2:=tparaitem(currpara2.next);
  1071. end;
  1072. while (assigned(currpara1)) and (assigned(currpara2)) do
  1073. begin
  1074. eq:=te_incompatible;
  1075. { Unique types must match exact }
  1076. if ((df_unique in currpara1.paratype.def.defoptions) or (df_unique in currpara2.paratype.def.defoptions)) and
  1077. (currpara1.paratype.def<>currpara2.paratype.def) then
  1078. exit;
  1079. { Handle hidden parameters separately, because self is
  1080. defined as voidpointer for methodpointers }
  1081. if (currpara1.is_hidden or
  1082. currpara2.is_hidden) then
  1083. begin
  1084. { both must be hidden }
  1085. if currpara1.is_hidden<>currpara2.is_hidden then
  1086. exit;
  1087. eq:=te_equal;
  1088. if not(vo_is_self in tvarsym(currpara1.parasym).varoptions) and
  1089. not(vo_is_self in tvarsym(currpara2.parasym).varoptions) then
  1090. begin
  1091. if (currpara1.paratyp<>currpara2.paratyp) then
  1092. exit;
  1093. eq:=compare_defs(currpara1.paratype.def,currpara2.paratype.def,nothingn);
  1094. end;
  1095. end
  1096. else
  1097. begin
  1098. case acp of
  1099. cp_value_equal_const :
  1100. begin
  1101. if (
  1102. (currpara1.paratyp<>currpara2.paratyp) and
  1103. ((currpara1.paratyp in [vs_var,vs_out]) or
  1104. (currpara2.paratyp in [vs_var,vs_out]))
  1105. ) then
  1106. exit;
  1107. eq:=compare_defs(currpara1.paratype.def,currpara2.paratype.def,nothingn);
  1108. end;
  1109. cp_all :
  1110. begin
  1111. if (currpara1.paratyp<>currpara2.paratyp) then
  1112. exit;
  1113. eq:=compare_defs(currpara1.paratype.def,currpara2.paratype.def,nothingn);
  1114. end;
  1115. cp_procvar :
  1116. begin
  1117. if (currpara1.paratyp<>currpara2.paratyp) then
  1118. exit;
  1119. eq:=compare_defs_ext(currpara1.paratype.def,currpara2.paratype.def,nothingn,
  1120. false,true,convtype,hpd);
  1121. if (eq>te_incompatible) and
  1122. (eq<te_equal) and
  1123. not(
  1124. (convtype in [tc_equal,tc_int_2_int]) and
  1125. (currpara1.paratype.def.size=currpara2.paratype.def.size)
  1126. ) then
  1127. begin
  1128. eq:=te_incompatible;
  1129. end;
  1130. end;
  1131. else
  1132. eq:=compare_defs(currpara1.paratype.def,currpara2.paratype.def,nothingn);
  1133. end;
  1134. end;
  1135. { check type }
  1136. if eq=te_incompatible then
  1137. exit;
  1138. if eq<lowesteq then
  1139. lowesteq:=eq;
  1140. { also check default value if both have it declared }
  1141. if (cpo_comparedefaultvalue in cpoptions) and
  1142. assigned(currpara1.defaultvalue) and
  1143. assigned(currpara2.defaultvalue) then
  1144. begin
  1145. if not equal_constsym(tconstsym(currpara1.defaultvalue),tconstsym(currpara2.defaultvalue)) then
  1146. exit;
  1147. end;
  1148. currpara1:=TParaItem(currpara1.next);
  1149. currpara2:=TParaItem(currpara2.next);
  1150. if cpo_ignorehidden in cpoptions then
  1151. begin
  1152. while assigned(currpara1) and currpara1.is_hidden do
  1153. currpara1:=tparaitem(currpara1.next);
  1154. while assigned(currpara2) and currpara2.is_hidden do
  1155. currpara2:=tparaitem(currpara2.next);
  1156. end;
  1157. end;
  1158. { when both lists are empty then the parameters are equal. Also
  1159. when one list is empty and the other has a parameter with default
  1160. value assigned then the parameters are also equal }
  1161. if ((currpara1=nil) and (currpara2=nil)) or
  1162. ((cpo_allowdefaults in cpoptions) and
  1163. ((assigned(currpara1) and assigned(currpara1.defaultvalue)) or
  1164. (assigned(currpara2) and assigned(currpara2.defaultvalue)))) then
  1165. compare_paras:=lowesteq;
  1166. end;
  1167. function proc_to_procvar_equal(def1:tabstractprocdef;def2:tprocvardef;methoderr:boolean):tequaltype;
  1168. var
  1169. eq : tequaltype;
  1170. po_comp : tprocoptions;
  1171. begin
  1172. proc_to_procvar_equal:=te_incompatible;
  1173. if not(assigned(def1)) or not(assigned(def2)) then
  1174. exit;
  1175. { check for method pointer }
  1176. if (def1.is_methodpointer xor def2.is_methodpointer) or
  1177. (def1.is_addressonly xor def2.is_addressonly) then
  1178. begin
  1179. if methoderr then
  1180. Message(type_e_no_method_and_procedure_not_compatible);
  1181. exit;
  1182. end;
  1183. { check return value and options, methodpointer is already checked }
  1184. po_comp:=[po_staticmethod,po_interrupt,
  1185. po_iocheck,po_varargs];
  1186. if (m_delphi in aktmodeswitches) then
  1187. exclude(po_comp,po_varargs);
  1188. if ((po_comp * def1.procoptions)= (po_comp * def2.procoptions)) and
  1189. equal_defs(def1.rettype.def,def2.rettype.def) then
  1190. begin
  1191. { return equal type based on the parameters, but a proc->procvar
  1192. is never exact, so map an exact match of the parameters to
  1193. te_equal }
  1194. eq:=compare_paras(def1.para,def2.para,cp_procvar,[]);
  1195. if eq=te_exact then
  1196. eq:=te_equal;
  1197. proc_to_procvar_equal:=eq;
  1198. end;
  1199. end;
  1200. end.
  1201. {
  1202. $Log$
  1203. Revision 1.40 2004-01-02 17:19:04 jonas
  1204. * if currency = int64, FPC_CURRENCY_IS_INT64 is defined
  1205. + round and trunc for currency and comp if FPC_CURRENCY_IS_INT64 is
  1206. defined
  1207. * if currency = orddef, prefer currency -> int64/qword conversion over
  1208. currency -> float conversions
  1209. * optimized currency/currency if currency = orddef
  1210. * TODO: write FPC_DIV_CURRENCY and FPC_MUL_CURRENCY routines to prevent
  1211. precision loss if currency=int64 and bestreal = double
  1212. Revision 1.39 2003/12/16 09:41:44 daniel
  1213. * Automatic conversion from integer constants to pointer constants is no
  1214. longer done except in Delphi mode
  1215. Revision 1.38 2003/11/26 15:11:42 michael
  1216. + Patch to prefer getpropinfo(ptypeinfo,name) over getpropinfo(tobject,name) when called with getpropinfo(aclass.classinfo) from Peter
  1217. Revision 1.37 2003/11/10 19:09:29 peter
  1218. * procvar default value support
  1219. Revision 1.36 2003/11/04 22:30:15 florian
  1220. + type cast variant<->enum
  1221. * cnv. node second pass uses now as well helper wrappers
  1222. Revision 1.35 2003/10/30 16:23:13 peter
  1223. * don't search for overloads in parents for constructors
  1224. Revision 1.34 2003/10/26 14:11:35 florian
  1225. * fixed web bug 2129: explicit float casts in Delphi mode must be handled by the default code
  1226. Revision 1.33 2003/10/14 12:23:06 florian
  1227. * fixed 2729: overloading problem with methodvars and procvars
  1228. Revision 1.32 2003/10/10 17:48:13 peter
  1229. * old trgobj moved to x86/rgcpu and renamed to trgx86fpu
  1230. * tregisteralloctor renamed to trgobj
  1231. * removed rgobj from a lot of units
  1232. * moved location_* and reference_* to cgobj
  1233. * first things for mmx register allocation
  1234. Revision 1.31 2003/10/07 21:14:32 peter
  1235. * compare_paras() has a parameter to ignore hidden parameters
  1236. * cross unit overload searching ignores hidden parameters when
  1237. comparing parameter lists. Now function(string):string is
  1238. not overriden with procedure(string) which has the same visible
  1239. parameter list
  1240. Revision 1.30 2003/10/05 13:05:05 peter
  1241. * when comparing hidden parameters both must be hidden
  1242. Revision 1.29 2003/10/05 12:57:11 peter
  1243. * set correct conversion for subranges
  1244. Revision 1.28 2003/09/09 21:03:17 peter
  1245. * basics for x86 register calling
  1246. Revision 1.27 2003/06/03 21:02:08 peter
  1247. * allow pointer(int64) in all modes
  1248. Revision 1.26 2003/05/26 21:17:17 peter
  1249. * procinlinenode removed
  1250. * aktexit2label removed, fast exit removed
  1251. + tcallnode.inlined_pass_2 added
  1252. Revision 1.25 2003/05/15 18:58:53 peter
  1253. * removed selfpointer_offset, vmtpointer_offset
  1254. * tvarsym.adjusted_address
  1255. * address in localsymtable is now in the real direction
  1256. * removed some obsolete globals
  1257. Revision 1.24 2003/05/09 17:47:02 peter
  1258. * self moved to hidden parameter
  1259. * removed hdisposen,hnewn,selfn
  1260. Revision 1.23 2003/04/23 20:16:04 peter
  1261. + added currency support based on int64
  1262. + is_64bit for use in cg units instead of is_64bitint
  1263. * removed cgmessage from n386add, replace with internalerrors
  1264. Revision 1.22 2003/04/23 11:37:33 peter
  1265. * po_comp for proc to procvar fixed
  1266. Revision 1.21 2003/04/10 17:57:52 peter
  1267. * vs_hidden released
  1268. Revision 1.20 2003/03/20 17:52:18 peter
  1269. * fix compare for unique types, they are allowed when they match
  1270. exact
  1271. Revision 1.19 2003/01/16 22:13:51 peter
  1272. * convert_l3 convertlevel added. This level is used for conversions
  1273. where information can be lost like converting widestring->ansistring
  1274. or dword->byte
  1275. Revision 1.18 2003/01/15 01:44:32 peter
  1276. * merged methodpointer fixes from 1.0.x
  1277. Revision 1.17 2003/01/09 21:43:39 peter
  1278. * constant string conversion fixed, it's now equal to both
  1279. shortstring, ansistring and the typeconvnode will return
  1280. te_equal but still return convtype to change the constnode
  1281. Revision 1.16 2003/01/05 22:42:13 peter
  1282. * use int_to_int conversion for pointer/procvar/classref to int
  1283. Revision 1.15 2003/01/05 15:54:15 florian
  1284. + added proper support of type = type <type>; for simple types
  1285. Revision 1.14 2003/01/03 17:16:04 peter
  1286. * fixed assignment operator checking for typecast
  1287. Revision 1.13 2002/12/29 18:15:19 peter
  1288. * varargs is not checked in proc->procvar for delphi
  1289. Revision 1.12 2002/12/29 14:57:50 peter
  1290. * unit loading changed to first register units and load them
  1291. afterwards. This is needed to support uses xxx in yyy correctly
  1292. * unit dependency check fixed
  1293. Revision 1.11 2002/12/27 15:26:12 peter
  1294. * procvar compare with 2 ints did not check the integer size
  1295. Revision 1.10 2002/12/23 22:22:16 peter
  1296. * don't allow implicit bool->int conversion
  1297. Revision 1.9 2002/12/18 21:37:36 peter
  1298. * allow classref-classref always when explicit
  1299. Revision 1.8 2002/12/15 22:37:53 peter
  1300. * give conversions from pointer to pwidechar a penalty (=prefer pchar)
  1301. Revision 1.7 2002/12/11 22:40:12 peter
  1302. * proc->procvar is never an exact match, convert exact parameters
  1303. to equal for the whole proc to procvar conversion level
  1304. Revision 1.6 2002/12/06 17:49:44 peter
  1305. * prefer string-shortstring over other string-string conversions
  1306. Revision 1.5 2002/12/05 14:27:26 florian
  1307. * some variant <-> dyn. array stuff
  1308. Revision 1.4 2002/12/01 22:07:41 carl
  1309. * warning of portabilitiy problems with parasize / localsize
  1310. + some added documentation
  1311. Revision 1.3 2002/11/27 15:33:46 peter
  1312. * the never ending story of tp procvar hacks
  1313. Revision 1.2 2002/11/27 02:32:14 peter
  1314. * fix cp_procvar compare
  1315. Revision 1.1 2002/11/25 17:43:16 peter
  1316. * splitted defbase in defutil,symutil,defcmp
  1317. * merged isconvertable and is_equal into compare_defs(_ext)
  1318. * made operator search faster by walking the list only once
  1319. }