defcmp.pas 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431
  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. { do we loose precision? }
  385. if def_to.size<def_from.size then
  386. eq:=te_convert_l2
  387. else
  388. eq:=te_convert_l1;
  389. end;
  390. end;
  391. end;
  392. end;
  393. end;
  394. enumdef :
  395. begin
  396. case def_from.deftype of
  397. enumdef :
  398. begin
  399. if explicit then
  400. begin
  401. eq:=te_convert_l1;
  402. doconv:=tc_int_2_int;
  403. end
  404. else
  405. begin
  406. hd1:=def_from;
  407. while assigned(tenumdef(hd1).basedef) do
  408. hd1:=tenumdef(hd1).basedef;
  409. hd2:=def_to;
  410. while assigned(tenumdef(hd2).basedef) do
  411. hd2:=tenumdef(hd2).basedef;
  412. if (hd1=hd2) then
  413. begin
  414. eq:=te_convert_l1;
  415. { because of packenum they can have different sizes! (JM) }
  416. doconv:=tc_int_2_int;
  417. end;
  418. end;
  419. end;
  420. orddef :
  421. begin
  422. if explicit then
  423. begin
  424. eq:=te_convert_l1;
  425. doconv:=tc_int_2_int;
  426. end;
  427. end;
  428. variantdef :
  429. begin
  430. eq:=te_convert_l1;
  431. doconv:=tc_variant_2_enum;
  432. end;
  433. end;
  434. end;
  435. arraydef :
  436. begin
  437. { open array is also compatible with a single element of its base type }
  438. if is_open_array(def_to) and
  439. equal_defs(def_from,tarraydef(def_to).elementtype.def) then
  440. begin
  441. doconv:=tc_equal;
  442. eq:=te_convert_l1;
  443. end
  444. else
  445. begin
  446. case def_from.deftype of
  447. arraydef :
  448. begin
  449. { to dynamic array }
  450. if is_dynamic_array(def_to) then
  451. begin
  452. { dynamic array -> dynamic array }
  453. if is_dynamic_array(def_from) and
  454. equal_defs(tarraydef(def_from).elementtype.def,tarraydef(def_to).elementtype.def) then
  455. eq:=te_equal;
  456. end
  457. else
  458. { to open array }
  459. if is_open_array(def_to) then
  460. begin
  461. { array constructor -> open array }
  462. if is_array_constructor(def_from) then
  463. begin
  464. if is_void(tarraydef(def_from).elementtype.def) then
  465. begin
  466. doconv:=tc_equal;
  467. eq:=te_convert_l1;
  468. end
  469. else
  470. begin
  471. subeq:=compare_defs_ext(tarraydef(def_from).elementtype.def,
  472. tarraydef(def_to).elementtype.def,
  473. arrayconstructorn,false,true,hct,hpd);
  474. if (subeq>=te_equal) then
  475. begin
  476. doconv:=tc_equal;
  477. eq:=te_convert_l1;
  478. end
  479. else
  480. if (subeq>te_incompatible) then
  481. begin
  482. doconv:=hct;
  483. eq:=te_convert_l2;
  484. end;
  485. end;
  486. end
  487. else
  488. { dynamic array -> open array }
  489. if is_dynamic_array(def_from) and
  490. equal_defs(tarraydef(def_from).elementtype.def,tarraydef(def_to).elementtype.def) then
  491. begin
  492. doconv:=tc_dynarray_2_openarray;
  493. eq:=te_convert_l2;
  494. end
  495. else
  496. { array -> open array }
  497. if equal_defs(tarraydef(def_from).elementtype.def,tarraydef(def_to).elementtype.def) then
  498. eq:=te_equal;
  499. end
  500. else
  501. { to array of const }
  502. if is_array_of_const(def_to) then
  503. begin
  504. if is_array_of_const(def_from) or
  505. is_array_constructor(def_from) then
  506. begin
  507. eq:=te_equal;
  508. end
  509. else
  510. { array of tvarrec -> array of const }
  511. if equal_defs(tarraydef(def_to).elementtype.def,tarraydef(def_from).elementtype.def) then
  512. begin
  513. doconv:=tc_equal;
  514. eq:=te_convert_l1;
  515. end;
  516. end
  517. else
  518. { other arrays }
  519. begin
  520. { open array -> array }
  521. if is_open_array(def_from) and
  522. equal_defs(tarraydef(def_from).elementtype.def,tarraydef(def_to).elementtype.def) then
  523. begin
  524. eq:=te_equal
  525. end
  526. else
  527. { array -> array }
  528. if not(m_tp7 in aktmodeswitches) and
  529. not(m_delphi in aktmodeswitches) and
  530. (tarraydef(def_from).lowrange=tarraydef(def_to).lowrange) and
  531. (tarraydef(def_from).highrange=tarraydef(def_to).highrange) and
  532. equal_defs(tarraydef(def_from).elementtype.def,tarraydef(def_to).elementtype.def) and
  533. equal_defs(tarraydef(def_from).rangetype.def,tarraydef(def_to).rangetype.def) then
  534. begin
  535. eq:=te_equal
  536. end;
  537. end;
  538. end;
  539. pointerdef :
  540. begin
  541. { nil is compatible with dyn. arrays }
  542. if is_dynamic_array(def_to) and
  543. (fromtreetype=niln) then
  544. begin
  545. doconv:=tc_equal;
  546. eq:=te_convert_l1;
  547. end
  548. else
  549. if is_zero_based_array(def_to) and
  550. equal_defs(tpointerdef(def_from).pointertype.def,tarraydef(def_to).elementtype.def) then
  551. begin
  552. doconv:=tc_pointer_2_array;
  553. eq:=te_convert_l1;
  554. end;
  555. end;
  556. stringdef :
  557. begin
  558. { string to char array }
  559. if (not is_special_array(def_to)) and
  560. is_char(tarraydef(def_to).elementtype.def) then
  561. begin
  562. doconv:=tc_string_2_chararray;
  563. eq:=te_convert_l1;
  564. end;
  565. end;
  566. orddef:
  567. begin
  568. if is_chararray(def_to) and
  569. is_char(def_from) then
  570. begin
  571. doconv:=tc_char_2_chararray;
  572. eq:=te_convert_l2;
  573. end;
  574. end;
  575. recorddef :
  576. begin
  577. { tvarrec -> array of const }
  578. if is_array_of_const(def_to) and
  579. equal_defs(def_from,tarraydef(def_to).elementtype.def) then
  580. begin
  581. doconv:=tc_equal;
  582. eq:=te_convert_l1;
  583. end;
  584. end;
  585. variantdef :
  586. begin
  587. if is_dynamic_array(def_to) then
  588. begin
  589. doconv:=tc_variant_2_dynarray;
  590. eq:=te_convert_l1;
  591. end;
  592. end;
  593. end;
  594. end;
  595. end;
  596. variantdef :
  597. begin
  598. case def_from.deftype of
  599. enumdef :
  600. begin
  601. doconv:=tc_enum_2_variant;
  602. eq:=te_convert_l1;
  603. end;
  604. arraydef :
  605. begin
  606. if is_dynamic_array(def_from) then
  607. begin
  608. doconv:=tc_dynarray_2_variant;
  609. eq:=te_convert_l1;
  610. end;
  611. end;
  612. end;
  613. end;
  614. pointerdef :
  615. begin
  616. case def_from.deftype of
  617. stringdef :
  618. begin
  619. { string constant (which can be part of array constructor)
  620. to zero terminated string constant }
  621. if (fromtreetype in [arrayconstructorn,stringconstn]) and
  622. (is_pchar(def_to) or is_pwidechar(def_to)) then
  623. begin
  624. doconv:=tc_cstring_2_pchar;
  625. eq:=te_convert_l1;
  626. end
  627. else
  628. if explicit then
  629. begin
  630. { pchar(ansistring) }
  631. if is_pchar(def_to) and
  632. is_ansistring(def_from) then
  633. begin
  634. doconv:=tc_ansistring_2_pchar;
  635. eq:=te_convert_l1;
  636. end
  637. else
  638. { pwidechar(ansistring) }
  639. if is_pwidechar(def_to) and
  640. is_widestring(def_from) then
  641. begin
  642. doconv:=tc_ansistring_2_pchar;
  643. eq:=te_convert_l1;
  644. end;
  645. end;
  646. end;
  647. orddef :
  648. begin
  649. { char constant to zero terminated string constant }
  650. if (fromtreetype=ordconstn) then
  651. begin
  652. if is_char(def_from) and
  653. is_pchar(def_to) then
  654. begin
  655. doconv:=tc_cchar_2_pchar;
  656. eq:=te_convert_l1;
  657. end
  658. else
  659. if (m_delphi in aktmodeswitches) and is_integer(def_from) then
  660. begin
  661. doconv:=tc_cord_2_pointer;
  662. eq:=te_convert_l1;
  663. end;
  664. end;
  665. if (eq=te_incompatible) and explicit then
  666. begin
  667. doconv:=tc_int_2_int;
  668. eq:=te_convert_l1;
  669. end;
  670. end;
  671. arraydef :
  672. begin
  673. { chararray to pointer }
  674. if is_zero_based_array(def_from) and
  675. equal_defs(tarraydef(def_from).elementtype.def,tpointerdef(def_to).pointertype.def) then
  676. begin
  677. doconv:=tc_array_2_pointer;
  678. eq:=te_convert_l1;
  679. end;
  680. end;
  681. pointerdef :
  682. begin
  683. { check for far pointers }
  684. if (tpointerdef(def_from).is_far<>tpointerdef(def_to).is_far) then
  685. begin
  686. eq:=te_incompatible;
  687. end
  688. else
  689. { the types can be forward type, handle before normal type check !! }
  690. if assigned(def_to.typesym) and
  691. (tpointerdef(def_to).pointertype.def.deftype=forwarddef) then
  692. begin
  693. if (def_from.typesym=def_to.typesym) then
  694. eq:=te_equal
  695. end
  696. else
  697. { same types }
  698. if (tpointerdef(def_from).pointertype.def=tpointerdef(def_to).pointertype.def) then
  699. begin
  700. eq:=te_equal
  701. end
  702. else
  703. { child class pointer can be assigned to anchestor pointers }
  704. if (
  705. (tpointerdef(def_from).pointertype.def.deftype=objectdef) and
  706. (tpointerdef(def_to).pointertype.def.deftype=objectdef) and
  707. tobjectdef(tpointerdef(def_from).pointertype.def).is_related(
  708. tobjectdef(tpointerdef(def_to).pointertype.def))
  709. ) or
  710. { all pointers can be assigned to/from void-pointer }
  711. is_void(tpointerdef(def_to).pointertype.def) or
  712. is_void(tpointerdef(def_from).pointertype.def) then
  713. begin
  714. doconv:=tc_equal;
  715. { give pwidechar a penalty }
  716. if is_pwidechar(def_to) then
  717. eq:=te_convert_l2
  718. else
  719. eq:=te_convert_l1;
  720. end;
  721. end;
  722. procvardef :
  723. begin
  724. { procedure variable can be assigned to an void pointer }
  725. { Not anymore. Use the @ operator now.}
  726. if not(m_tp_procvar in aktmodeswitches) and
  727. { method pointers can't be assigned to void pointers
  728. not(tprocvardef(def_from).is_methodpointer) and }
  729. (tpointerdef(def_to).pointertype.def.deftype=orddef) and
  730. (torddef(tpointerdef(def_to).pointertype.def).typ=uvoid) then
  731. begin
  732. doconv:=tc_equal;
  733. eq:=te_convert_l1;
  734. end;
  735. end;
  736. classrefdef,
  737. objectdef :
  738. begin
  739. { class types and class reference type
  740. can be assigned to void pointers, but it is less
  741. preferred than assigning to a related objectdef }
  742. if (
  743. is_class_or_interface(def_from) or
  744. (def_from.deftype=classrefdef)
  745. ) and
  746. (tpointerdef(def_to).pointertype.def.deftype=orddef) and
  747. (torddef(tpointerdef(def_to).pointertype.def).typ=uvoid) then
  748. begin
  749. doconv:=tc_equal;
  750. eq:=te_convert_l2;
  751. end;
  752. end;
  753. end;
  754. end;
  755. setdef :
  756. begin
  757. case def_from.deftype of
  758. setdef :
  759. begin
  760. if assigned(tsetdef(def_from).elementtype.def) and
  761. assigned(tsetdef(def_to).elementtype.def) then
  762. begin
  763. { sets with the same element base type are equal }
  764. if is_subequal(tsetdef(def_from).elementtype.def,tsetdef(def_to).elementtype.def) then
  765. eq:=te_equal;
  766. end
  767. else
  768. { empty set is compatible with everything }
  769. eq:=te_equal;
  770. end;
  771. arraydef :
  772. begin
  773. { automatic arrayconstructor -> set conversion }
  774. if is_array_constructor(def_from) then
  775. begin
  776. doconv:=tc_arrayconstructor_2_set;
  777. eq:=te_convert_l1;
  778. end;
  779. end;
  780. end;
  781. end;
  782. procvardef :
  783. begin
  784. case def_from.deftype of
  785. procdef :
  786. begin
  787. { proc -> procvar }
  788. if (m_tp_procvar in aktmodeswitches) then
  789. begin
  790. subeq:=proc_to_procvar_equal(tprocdef(def_from),tprocvardef(def_to),true);
  791. if subeq>te_incompatible then
  792. begin
  793. doconv:=tc_proc_2_procvar;
  794. eq:=te_convert_l1;
  795. end;
  796. end;
  797. end;
  798. procvardef :
  799. begin
  800. { procvar -> procvar }
  801. eq:=proc_to_procvar_equal(tprocvardef(def_from),tprocvardef(def_to),false);
  802. end;
  803. pointerdef :
  804. begin
  805. { nil is compatible with procvars }
  806. if (fromtreetype=niln) then
  807. begin
  808. doconv:=tc_equal;
  809. eq:=te_convert_l1;
  810. end
  811. else
  812. { for example delphi allows the assignement from pointers }
  813. { to procedure variables }
  814. if (m_pointer_2_procedure in aktmodeswitches) and
  815. (tpointerdef(def_from).pointertype.def.deftype=orddef) and
  816. (torddef(tpointerdef(def_from).pointertype.def).typ=uvoid) then
  817. begin
  818. doconv:=tc_equal;
  819. eq:=te_convert_l1;
  820. end;
  821. end;
  822. end;
  823. end;
  824. objectdef :
  825. begin
  826. { object pascal objects }
  827. if (def_from.deftype=objectdef) and
  828. (tobjectdef(def_from).is_related(tobjectdef(def_to))) then
  829. begin
  830. doconv:=tc_equal;
  831. eq:=te_convert_l1;
  832. end
  833. else
  834. { Class/interface specific }
  835. if is_class_or_interface(def_to) then
  836. begin
  837. { void pointer also for delphi mode }
  838. if (m_delphi in aktmodeswitches) and
  839. is_voidpointer(def_from) then
  840. begin
  841. doconv:=tc_equal;
  842. { prefer pointer-pointer assignments }
  843. eq:=te_convert_l2;
  844. end
  845. else
  846. { nil is compatible with class instances and interfaces }
  847. if (fromtreetype=niln) then
  848. begin
  849. doconv:=tc_equal;
  850. eq:=te_convert_l1;
  851. end
  852. { classes can be assigned to interfaces }
  853. else if is_interface(def_to) and
  854. is_class(def_from) and
  855. assigned(tobjectdef(def_from).implementedinterfaces) then
  856. begin
  857. { we've to search in parent classes as well }
  858. hd3:=tobjectdef(def_from);
  859. while assigned(hd3) do
  860. begin
  861. if hd3.implementedinterfaces.searchintf(def_to)<>-1 then
  862. begin
  863. doconv:=tc_class_2_intf;
  864. eq:=te_convert_l1;
  865. break;
  866. end;
  867. hd3:=hd3.childof;
  868. end;
  869. end
  870. { Interface 2 GUID handling }
  871. else if (def_to=tdef(rec_tguid)) and
  872. (fromtreetype=typen) and
  873. is_interface(def_from) and
  874. assigned(tobjectdef(def_from).iidguid) then
  875. begin
  876. eq:=te_convert_l1;
  877. doconv:=tc_equal;
  878. end;
  879. end;
  880. end;
  881. classrefdef :
  882. begin
  883. { similar to pointerdef wrt forwards }
  884. if assigned(def_to.typesym) and
  885. (tclassrefdef(def_to).pointertype.def.deftype=forwarddef) then
  886. begin
  887. if (def_from.typesym=def_to.typesym) then
  888. eq:=te_equal;
  889. end
  890. else
  891. { class reference types }
  892. if (def_from.deftype=classrefdef) then
  893. begin
  894. if equal_defs(tclassrefdef(def_from).pointertype.def,tclassrefdef(def_to).pointertype.def) then
  895. begin
  896. eq:=te_equal;
  897. end
  898. else
  899. begin
  900. doconv:=tc_equal;
  901. if explicit or
  902. tobjectdef(tclassrefdef(def_from).pointertype.def).is_related(
  903. tobjectdef(tclassrefdef(def_to).pointertype.def)) then
  904. eq:=te_convert_l1;
  905. end;
  906. end
  907. else
  908. { nil is compatible with class references }
  909. if (fromtreetype=niln) then
  910. begin
  911. doconv:=tc_equal;
  912. eq:=te_convert_l1;
  913. end;
  914. end;
  915. filedef :
  916. begin
  917. { typed files are all equal to the abstract file type
  918. name TYPEDFILE in system.pp in is_equal in types.pas
  919. the problem is that it sholud be also compatible to FILE
  920. but this would leed to a problem for ASSIGN RESET and REWRITE
  921. when trying to find the good overloaded function !!
  922. so all file function are doubled in system.pp
  923. this is not very beautiful !!}
  924. if (def_from.deftype=filedef) then
  925. begin
  926. if (tfiledef(def_from).filetyp=tfiledef(def_to).filetyp) then
  927. begin
  928. if
  929. (
  930. (tfiledef(def_from).typedfiletype.def=nil) and
  931. (tfiledef(def_to).typedfiletype.def=nil)
  932. ) or
  933. (
  934. (tfiledef(def_from).typedfiletype.def<>nil) and
  935. (tfiledef(def_to).typedfiletype.def<>nil) and
  936. equal_defs(tfiledef(def_from).typedfiletype.def,tfiledef(def_to).typedfiletype.def)
  937. ) or
  938. (
  939. (tfiledef(def_from).filetyp = ft_typed) and
  940. (tfiledef(def_to).filetyp = ft_typed) and
  941. (
  942. (tfiledef(def_from).typedfiletype.def = tdef(voidtype.def)) or
  943. (tfiledef(def_to).typedfiletype.def = tdef(voidtype.def))
  944. )
  945. ) then
  946. begin
  947. eq:=te_equal;
  948. end;
  949. end
  950. else
  951. if ((tfiledef(def_from).filetyp = ft_untyped) and
  952. (tfiledef(def_to).filetyp = ft_typed)) or
  953. ((tfiledef(def_from).filetyp = ft_typed) and
  954. (tfiledef(def_to).filetyp = ft_untyped)) then
  955. begin
  956. doconv:=tc_equal;
  957. eq:=te_convert_l1;
  958. end;
  959. end;
  960. end;
  961. recorddef :
  962. begin
  963. { interface -> guid }
  964. if is_interface(def_from) and
  965. (def_to=rec_tguid) then
  966. begin
  967. doconv:=tc_intf_2_guid;
  968. eq:=te_convert_l1;
  969. end;
  970. end;
  971. formaldef :
  972. begin
  973. doconv:=tc_equal;
  974. if (def_from.deftype=formaldef) then
  975. eq:=te_equal
  976. else
  977. { Just about everything can be converted to a formaldef...}
  978. if not (def_from.deftype in [abstractdef,errordef]) then
  979. eq:=te_convert_l1;
  980. end;
  981. end;
  982. { if we didn't find an appropriate type conversion yet
  983. then we search also the := operator }
  984. if (eq=te_incompatible) and
  985. check_operator and
  986. ((def_from.deftype in [objectdef,recorddef,arraydef,stringdef,variantdef]) or
  987. (def_to.deftype in [objectdef,recorddef,arraydef,stringdef,variantdef])) then
  988. begin
  989. operatorpd:=assignment_overloaded(def_from,def_to);
  990. if assigned(operatorpd) then
  991. eq:=te_convert_operator;
  992. end;
  993. { update convtype for te_equal when it is not yet set }
  994. if (eq=te_equal) and
  995. (doconv=tc_not_possible) then
  996. doconv:=tc_equal;
  997. compare_defs_ext:=eq;
  998. end;
  999. function equal_defs(def_from,def_to:tdef):boolean;
  1000. var
  1001. convtyp : tconverttype;
  1002. pd : tprocdef;
  1003. begin
  1004. { Compare defs with nothingn and no explicit typecasts and
  1005. searching for overloaded operators is not needed }
  1006. equal_defs:=(compare_defs_ext(def_from,def_to,nothingn,false,false,convtyp,pd)>=te_equal);
  1007. end;
  1008. function compare_defs(def_from,def_to:tdef;fromtreetype:tnodetype):tequaltype;
  1009. var
  1010. doconv : tconverttype;
  1011. pd : tprocdef;
  1012. begin
  1013. compare_defs:=compare_defs_ext(def_from,def_to,fromtreetype,false,true,doconv,pd);
  1014. end;
  1015. function is_subequal(def1, def2: tdef): boolean;
  1016. var
  1017. basedef1,basedef2 : tenumdef;
  1018. Begin
  1019. is_subequal := false;
  1020. if assigned(def1) and assigned(def2) then
  1021. Begin
  1022. if (def1.deftype = orddef) and (def2.deftype = orddef) then
  1023. Begin
  1024. { see p.47 of Turbo Pascal 7.01 manual for the separation of types }
  1025. { range checking for case statements is done with testrange }
  1026. case torddef(def1).typ of
  1027. u8bit,u16bit,u32bit,u64bit,
  1028. s8bit,s16bit,s32bit,s64bit :
  1029. is_subequal:=(torddef(def2).typ in [s64bit,u64bit,s32bit,u32bit,u8bit,s8bit,s16bit,u16bit]);
  1030. bool8bit,bool16bit,bool32bit :
  1031. is_subequal:=(torddef(def2).typ in [bool8bit,bool16bit,bool32bit]);
  1032. uchar :
  1033. is_subequal:=(torddef(def2).typ=uchar);
  1034. uwidechar :
  1035. is_subequal:=(torddef(def2).typ=uwidechar);
  1036. end;
  1037. end
  1038. else
  1039. Begin
  1040. { Check if both basedefs are equal }
  1041. if (def1.deftype=enumdef) and (def2.deftype=enumdef) then
  1042. Begin
  1043. { get both basedefs }
  1044. basedef1:=tenumdef(def1);
  1045. while assigned(basedef1.basedef) do
  1046. basedef1:=basedef1.basedef;
  1047. basedef2:=tenumdef(def2);
  1048. while assigned(basedef2.basedef) do
  1049. basedef2:=basedef2.basedef;
  1050. is_subequal:=(basedef1=basedef2);
  1051. end;
  1052. end;
  1053. end;
  1054. end;
  1055. function compare_paras(paralist1,paralist2 : TLinkedList; acp : tcompare_paras_type; cpoptions: tcompare_paras_options):tequaltype;
  1056. var
  1057. currpara1,
  1058. currpara2 : TParaItem;
  1059. eq,lowesteq : tequaltype;
  1060. hpd : tprocdef;
  1061. convtype : tconverttype;
  1062. begin
  1063. compare_paras:=te_incompatible;
  1064. { we need to parse the list from left-right so the
  1065. not-default parameters are checked first }
  1066. lowesteq:=high(tequaltype);
  1067. currpara1:=TParaItem(paralist1.first);
  1068. currpara2:=TParaItem(paralist2.first);
  1069. if cpo_ignorehidden in cpoptions then
  1070. begin
  1071. while assigned(currpara1) and currpara1.is_hidden do
  1072. currpara1:=tparaitem(currpara1.next);
  1073. while assigned(currpara2) and currpara2.is_hidden do
  1074. currpara2:=tparaitem(currpara2.next);
  1075. end;
  1076. while (assigned(currpara1)) and (assigned(currpara2)) do
  1077. begin
  1078. eq:=te_incompatible;
  1079. { Unique types must match exact }
  1080. if ((df_unique in currpara1.paratype.def.defoptions) or (df_unique in currpara2.paratype.def.defoptions)) and
  1081. (currpara1.paratype.def<>currpara2.paratype.def) then
  1082. exit;
  1083. { Handle hidden parameters separately, because self is
  1084. defined as voidpointer for methodpointers }
  1085. if (currpara1.is_hidden or
  1086. currpara2.is_hidden) then
  1087. begin
  1088. { both must be hidden }
  1089. if currpara1.is_hidden<>currpara2.is_hidden then
  1090. exit;
  1091. eq:=te_equal;
  1092. if not(vo_is_self in tvarsym(currpara1.parasym).varoptions) and
  1093. not(vo_is_self in tvarsym(currpara2.parasym).varoptions) then
  1094. begin
  1095. if (currpara1.paratyp<>currpara2.paratyp) then
  1096. exit;
  1097. eq:=compare_defs(currpara1.paratype.def,currpara2.paratype.def,nothingn);
  1098. end;
  1099. end
  1100. else
  1101. begin
  1102. case acp of
  1103. cp_value_equal_const :
  1104. begin
  1105. if (
  1106. (currpara1.paratyp<>currpara2.paratyp) and
  1107. ((currpara1.paratyp in [vs_var,vs_out]) or
  1108. (currpara2.paratyp in [vs_var,vs_out]))
  1109. ) then
  1110. exit;
  1111. eq:=compare_defs(currpara1.paratype.def,currpara2.paratype.def,nothingn);
  1112. end;
  1113. cp_all :
  1114. begin
  1115. if (currpara1.paratyp<>currpara2.paratyp) then
  1116. exit;
  1117. eq:=compare_defs(currpara1.paratype.def,currpara2.paratype.def,nothingn);
  1118. end;
  1119. cp_procvar :
  1120. begin
  1121. if (currpara1.paratyp<>currpara2.paratyp) then
  1122. exit;
  1123. eq:=compare_defs_ext(currpara1.paratype.def,currpara2.paratype.def,nothingn,
  1124. false,true,convtype,hpd);
  1125. if (eq>te_incompatible) and
  1126. (eq<te_equal) and
  1127. not(
  1128. (convtype in [tc_equal,tc_int_2_int]) and
  1129. (currpara1.paratype.def.size=currpara2.paratype.def.size)
  1130. ) then
  1131. begin
  1132. eq:=te_incompatible;
  1133. end;
  1134. end;
  1135. else
  1136. eq:=compare_defs(currpara1.paratype.def,currpara2.paratype.def,nothingn);
  1137. end;
  1138. end;
  1139. { check type }
  1140. if eq=te_incompatible then
  1141. exit;
  1142. if eq<lowesteq then
  1143. lowesteq:=eq;
  1144. { also check default value if both have it declared }
  1145. if (cpo_comparedefaultvalue in cpoptions) and
  1146. assigned(currpara1.defaultvalue) and
  1147. assigned(currpara2.defaultvalue) then
  1148. begin
  1149. if not equal_constsym(tconstsym(currpara1.defaultvalue),tconstsym(currpara2.defaultvalue)) then
  1150. exit;
  1151. end;
  1152. currpara1:=TParaItem(currpara1.next);
  1153. currpara2:=TParaItem(currpara2.next);
  1154. if cpo_ignorehidden in cpoptions then
  1155. begin
  1156. while assigned(currpara1) and currpara1.is_hidden do
  1157. currpara1:=tparaitem(currpara1.next);
  1158. while assigned(currpara2) and currpara2.is_hidden do
  1159. currpara2:=tparaitem(currpara2.next);
  1160. end;
  1161. end;
  1162. { when both lists are empty then the parameters are equal. Also
  1163. when one list is empty and the other has a parameter with default
  1164. value assigned then the parameters are also equal }
  1165. if ((currpara1=nil) and (currpara2=nil)) or
  1166. ((cpo_allowdefaults in cpoptions) and
  1167. ((assigned(currpara1) and assigned(currpara1.defaultvalue)) or
  1168. (assigned(currpara2) and assigned(currpara2.defaultvalue)))) then
  1169. compare_paras:=lowesteq;
  1170. end;
  1171. function proc_to_procvar_equal(def1:tabstractprocdef;def2:tprocvardef;methoderr:boolean):tequaltype;
  1172. var
  1173. eq : tequaltype;
  1174. po_comp : tprocoptions;
  1175. begin
  1176. proc_to_procvar_equal:=te_incompatible;
  1177. if not(assigned(def1)) or not(assigned(def2)) then
  1178. exit;
  1179. { check for method pointer }
  1180. if (def1.is_methodpointer xor def2.is_methodpointer) or
  1181. (def1.is_addressonly xor def2.is_addressonly) then
  1182. begin
  1183. if methoderr then
  1184. Message(type_e_no_method_and_procedure_not_compatible);
  1185. exit;
  1186. end;
  1187. { check return value and options, methodpointer is already checked }
  1188. po_comp:=[po_staticmethod,po_interrupt,
  1189. po_iocheck,po_varargs];
  1190. if (m_delphi in aktmodeswitches) then
  1191. exclude(po_comp,po_varargs);
  1192. if ((po_comp * def1.procoptions)= (po_comp * def2.procoptions)) and
  1193. equal_defs(def1.rettype.def,def2.rettype.def) then
  1194. begin
  1195. { return equal type based on the parameters, but a proc->procvar
  1196. is never exact, so map an exact match of the parameters to
  1197. te_equal }
  1198. eq:=compare_paras(def1.para,def2.para,cp_procvar,[]);
  1199. if eq=te_exact then
  1200. eq:=te_equal;
  1201. proc_to_procvar_equal:=eq;
  1202. end;
  1203. end;
  1204. end.
  1205. {
  1206. $Log$
  1207. Revision 1.43 2004-01-31 14:50:54 peter
  1208. * prefere tobject-tobject over tobject-pointer
  1209. Revision 1.42 2004/01/14 21:44:16 peter
  1210. * give penalty in float-float conversion when precision is lost
  1211. Revision 1.41 2004/01/06 02:17:44 florian
  1212. * fixed webbug 2878
  1213. Revision 1.40 2004/01/02 17:19:04 jonas
  1214. * if currency = int64, FPC_CURRENCY_IS_INT64 is defined
  1215. + round and trunc for currency and comp if FPC_CURRENCY_IS_INT64 is
  1216. defined
  1217. * if currency = orddef, prefer currency -> int64/qword conversion over
  1218. currency -> float conversions
  1219. * optimized currency/currency if currency = orddef
  1220. * TODO: write FPC_DIV_CURRENCY and FPC_MUL_CURRENCY routines to prevent
  1221. precision loss if currency=int64 and bestreal = double
  1222. Revision 1.39 2003/12/16 09:41:44 daniel
  1223. * Automatic conversion from integer constants to pointer constants is no
  1224. longer done except in Delphi mode
  1225. Revision 1.38 2003/11/26 15:11:42 michael
  1226. + Patch to prefer getpropinfo(ptypeinfo,name) over getpropinfo(tobject,name) when called with getpropinfo(aclass.classinfo) from Peter
  1227. Revision 1.37 2003/11/10 19:09:29 peter
  1228. * procvar default value support
  1229. Revision 1.36 2003/11/04 22:30:15 florian
  1230. + type cast variant<->enum
  1231. * cnv. node second pass uses now as well helper wrappers
  1232. Revision 1.35 2003/10/30 16:23:13 peter
  1233. * don't search for overloads in parents for constructors
  1234. Revision 1.34 2003/10/26 14:11:35 florian
  1235. * fixed web bug 2129: explicit float casts in Delphi mode must be handled by the default code
  1236. Revision 1.33 2003/10/14 12:23:06 florian
  1237. * fixed 2729: overloading problem with methodvars and procvars
  1238. Revision 1.32 2003/10/10 17:48:13 peter
  1239. * old trgobj moved to x86/rgcpu and renamed to trgx86fpu
  1240. * tregisteralloctor renamed to trgobj
  1241. * removed rgobj from a lot of units
  1242. * moved location_* and reference_* to cgobj
  1243. * first things for mmx register allocation
  1244. Revision 1.31 2003/10/07 21:14:32 peter
  1245. * compare_paras() has a parameter to ignore hidden parameters
  1246. * cross unit overload searching ignores hidden parameters when
  1247. comparing parameter lists. Now function(string):string is
  1248. not overriden with procedure(string) which has the same visible
  1249. parameter list
  1250. Revision 1.30 2003/10/05 13:05:05 peter
  1251. * when comparing hidden parameters both must be hidden
  1252. Revision 1.29 2003/10/05 12:57:11 peter
  1253. * set correct conversion for subranges
  1254. Revision 1.28 2003/09/09 21:03:17 peter
  1255. * basics for x86 register calling
  1256. Revision 1.27 2003/06/03 21:02:08 peter
  1257. * allow pointer(int64) in all modes
  1258. Revision 1.26 2003/05/26 21:17:17 peter
  1259. * procinlinenode removed
  1260. * aktexit2label removed, fast exit removed
  1261. + tcallnode.inlined_pass_2 added
  1262. Revision 1.25 2003/05/15 18:58:53 peter
  1263. * removed selfpointer_offset, vmtpointer_offset
  1264. * tvarsym.adjusted_address
  1265. * address in localsymtable is now in the real direction
  1266. * removed some obsolete globals
  1267. Revision 1.24 2003/05/09 17:47:02 peter
  1268. * self moved to hidden parameter
  1269. * removed hdisposen,hnewn,selfn
  1270. Revision 1.23 2003/04/23 20:16:04 peter
  1271. + added currency support based on int64
  1272. + is_64bit for use in cg units instead of is_64bitint
  1273. * removed cgmessage from n386add, replace with internalerrors
  1274. Revision 1.22 2003/04/23 11:37:33 peter
  1275. * po_comp for proc to procvar fixed
  1276. Revision 1.21 2003/04/10 17:57:52 peter
  1277. * vs_hidden released
  1278. Revision 1.20 2003/03/20 17:52:18 peter
  1279. * fix compare for unique types, they are allowed when they match
  1280. exact
  1281. Revision 1.19 2003/01/16 22:13:51 peter
  1282. * convert_l3 convertlevel added. This level is used for conversions
  1283. where information can be lost like converting widestring->ansistring
  1284. or dword->byte
  1285. Revision 1.18 2003/01/15 01:44:32 peter
  1286. * merged methodpointer fixes from 1.0.x
  1287. Revision 1.17 2003/01/09 21:43:39 peter
  1288. * constant string conversion fixed, it's now equal to both
  1289. shortstring, ansistring and the typeconvnode will return
  1290. te_equal but still return convtype to change the constnode
  1291. Revision 1.16 2003/01/05 22:42:13 peter
  1292. * use int_to_int conversion for pointer/procvar/classref to int
  1293. Revision 1.15 2003/01/05 15:54:15 florian
  1294. + added proper support of type = type <type>; for simple types
  1295. Revision 1.14 2003/01/03 17:16:04 peter
  1296. * fixed assignment operator checking for typecast
  1297. Revision 1.13 2002/12/29 18:15:19 peter
  1298. * varargs is not checked in proc->procvar for delphi
  1299. Revision 1.12 2002/12/29 14:57:50 peter
  1300. * unit loading changed to first register units and load them
  1301. afterwards. This is needed to support uses xxx in yyy correctly
  1302. * unit dependency check fixed
  1303. Revision 1.11 2002/12/27 15:26:12 peter
  1304. * procvar compare with 2 ints did not check the integer size
  1305. Revision 1.10 2002/12/23 22:22:16 peter
  1306. * don't allow implicit bool->int conversion
  1307. Revision 1.9 2002/12/18 21:37:36 peter
  1308. * allow classref-classref always when explicit
  1309. Revision 1.8 2002/12/15 22:37:53 peter
  1310. * give conversions from pointer to pwidechar a penalty (=prefer pchar)
  1311. Revision 1.7 2002/12/11 22:40:12 peter
  1312. * proc->procvar is never an exact match, convert exact parameters
  1313. to equal for the whole proc to procvar conversion level
  1314. Revision 1.6 2002/12/06 17:49:44 peter
  1315. * prefer string-shortstring over other string-string conversions
  1316. Revision 1.5 2002/12/05 14:27:26 florian
  1317. * some variant <-> dyn. array stuff
  1318. Revision 1.4 2002/12/01 22:07:41 carl
  1319. * warning of portabilitiy problems with parasize / localsize
  1320. + some added documentation
  1321. Revision 1.3 2002/11/27 15:33:46 peter
  1322. * the never ending story of tp procvar hacks
  1323. Revision 1.2 2002/11/27 02:32:14 peter
  1324. * fix cp_procvar compare
  1325. Revision 1.1 2002/11/25 17:43:16 peter
  1326. * splitted defbase in defutil,symutil,defcmp
  1327. * merged isconvertable and is_equal into compare_defs(_ext)
  1328. * made operator search faster by walking the list only once
  1329. }