From 75b6ac8a1ba3340505453a5230b0f942afc15db5 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Tue, 15 Dec 2020 10:11:48 -0600 Subject: [PATCH] polyproc generation cleaned up; feels good --- include/onyxastnodes.h | 2 +- onyx | Bin 507076 -> 506340 bytes src/onyxchecker.c | 59 ++++++++++------------------------------- src/onyxsymres.c | 2 +- src/onyxutils.c | 13 ++++++++- 5 files changed, 28 insertions(+), 48 deletions(-) diff --git a/include/onyxastnodes.h b/include/onyxastnodes.h index d331f280..a4418ca0 100644 --- a/include/onyxastnodes.h +++ b/include/onyxastnodes.h @@ -842,7 +842,7 @@ AstTyped* ast_reduce(bh_allocator a, AstTyped* node); AstNode* ast_clone(bh_allocator a, void* n); void promote_numlit_to_larger(AstNumLit* num); b32 convert_numlit_to_type(AstNumLit* num, Type* type); -b32 type_check_or_auto_cast(AstTyped* node, Type* type); +b32 type_check_or_auto_cast(AstTyped** pnode, Type* type); Type* resolve_expression_type(AstTyped* node); typedef enum PolyProcLookupMethod { diff --git a/onyx b/onyx index 3a0f7f9d78c0da2657c356963e5bd9b4f7f15a39..fd08e0f5726971a76d92eeb8b81c24156bab6b2c 100755 GIT binary patch delta 38680 zcmZr(2V50L6K4k=qEZze#YPcDL~3ZFnaLKiX5ns$7$r$8$8Tlgj2V97ek;&q}C7{jcXTiIaxSZv~R@M83Mto z3%@{@)OP$6)ro1xjn;u4m)dEq)aukC^F^IG?Ral%qsQ3xUz59Q}+qB(m__ z554&;BG((#MAqv;jTL`&EfqPgA5SN8`wq$kH$}DRrjZ8@;17y5hek(uC7b5(E{~74 zF?wvzSC;&&$-1L4m-vORvoS*JCw#xn5|79qmBt8-Ypj*hcJO$9^oC8em}BW{!#b{>t7D!bEm?(YOw1dJY*eg6q!%N2VS$4)6lRh<;_-=y5-yV%z z$y!xo)CBQ&TEi>b@{@MWA+kNUw{PBRVL8RM8x&VZ>QT`L=U*zRsZI*-t>Ke=6#q^w zF2-nhMPI(o-srKnk|OWblrGcAL#y!%L|$4~ktZpk7W*`^bqN1tZ)|xrSdkBFeR)eG z*Y#9*7=^v~d!^y+Z!07J){OaE!&~uQ4zBJG?t#&(&ylN;P?Gy;Nck*>kMws=E z?{^CH*z!s-kI^L&9O%kBv8UCQY3>X0I5YPBntREBOo z%$E>3?!XX9@Y8BX5m^Yo)qx)-^3ZLn_64o>XsveePX3z6Ew3x`X^otyksICM+jEEj1mTG_uns9!BKjn-sZ^MxLUPk8b9piTrY_A}`QP z*rAcVe&_3m++T~4?Hc)-Mo!M=7l=G?hpK&EBmb+B{r2-uME?FqMed>LE<sv?vSl& ztN&V9Y|+S8`}k`jyB$}AnOf~r8hQIsUfyW*`0j!tucSFo{N-unHYa&oBG){n$a59d zq8Q~;(Xf?g_$(sN3Tz<>6SRhv)5v>I@pK}WIIn8QY2>;ZdHg2+fXH>ODROCz++HK+ zuIKiyMi0l=ikz&Gr)uP(A9xs%?Ru$k$uu%*WXH~Yv}+*DZp_ya*Uk(jmv=XMc<$52rAGdsk?qoWTOx;Op%tK!%Q~v07PF7fBJ%nzN_bn197<%- z1KC@7x)9z&d0~j=g<%@`hcy0x$gi~8SGC$pH1fJC+}^|JQL?J)zuz=+szy!-$O!YO zWN#hWf@~wQO`7rxO+NDPOcQnQ zn8xjEQQ&IiVnp=SSj5FMjfWB0Pe-n-BL}7N(L@f>k+r^+OyOyK9g!n-ZPe-n=Bfm-G=|nEj32&$)TkPNuh-|Y%^{?nq@vr&MaR;}rOZ}}Qn?pjdc<$g~ zME28>i<_&`HE0JPP2>wN-#T)8UF}Odcv~Xh(vdsp$hkZCEF$OW$encLH#>MbkqdO> zE;_PBI)6Z9oAfXJ9it;VrgQuH##U}Ra(5lsQ^ULb==u}@ zI&r;p;=jp-7JS>d+r}V?qlE&C;Q1d>o;EO>FH>>CkkZLTC)3w=`7PyNh2YG>*_b9q%5_>bvqR zLJM^0ULIVZ{M&^5yZeiO_w#;)IyZH+bJI{EH;XSNv>Bm(I^G}oQ9>sY8lppg;%^Dv zOlYJIJ^qHgmL#)1g1}N5q>< zyvaH=hdVVS{}P(2Lr?R@4NLPsNJ5qlb>QQO*Dr$nt3#c53h{P|phTfV&+*HIE+8~d zhhE?;l;StSF|jkTZfkBO9_o6)K7=H z@S}uIB{W2by7IS#rV<*dL$7eJF!DU1F*@`bj}D{E(SkCE4!yzW5^qQg^1Kec#di}r zl+ZXGdWSzEG?~z39eR&DH6qUwnyNz|@WzA|5Spb!bNM(z{UXWpI`lD5AvA{2TRQX! zzf5Qxp?Ny=DQDpn*@PD8&}TfD&^$tIGQLE19`8q}TTAk<4t>s-5*kUUpALP=j}khS z&=4K^n!hD9mC#5X`i6ToCjSx|qeI{EXhLmTQDp1TKlofiLkOL!Lp}KJ#uVADD6)0v z2mXk7lZiK3hyKN#nvj19P1T`)^Tvc05Spb!|K;PFP-bpTnOTQ^;wi)%)7sYKmWGNE zZa$3=#oP=&t2M27bd^BcQVH^#44zKp0v*{>N4D6@9}w9_JBJdXZP1Y&_j3C-w8GVq zt#xG2y*!M_emb&^jvPeixowOPvX?Jx6J#vkr?N$)$*zLDgnH8Dvx|2hey&Yp?{{-mjTxB=@%XzRTc`~^4?Ls97+;*9CJ7v@u7{WT*KZO zXQH}Tm-zm5C5y=ToV<$nxqqi;(E1)P-MMOs4X+exeJ>-jvlRo!yS#0eaJX=XCv_PM zJ?~^d*EIl9`TS8g5B_5}UvL)1X6!Ow+N%t2+})oom8C`9eOYH&Iz=USSt{PcAMQPq zHQV*@g%njxBDA+E-XPRl6!}iYrtxaDYE_RKCzKUG{zMW6c_y9Woc;-=Hq7V`@%9AbIDq0ao%kXt1_-%-Id`cy{l&@cwQbGYa5 zEZBRJM~^V_H^citlqmiU{eI?ABfG)V6FhZf70a_HtdU&>cm8Umo#iog<7%K#-FJe! zkMb|;)JTOqJ4NAaMK>+uEh9}41(EZ!gYZ&1bLO)~l;cUGtesDW3C`k?>?m;_pqrNQ zCGpaa)`1zfMtNJo<0Jgvac-8Uj#y*h9agh)ha=X+9&t*JtcY8Y@h2k_49hReMzo2) zk|okZ-pnHz@+B(MzjDC8%Hm$rLZNp}-j^}E6Z~H);Hh4uzkGqjDFC3AJ3Z6 z2Y%hl-DmEHYJ2(RnFAm$gV&iAXgfC0EO~IClx&^B;|MQbh&wBM@1Bf1vyLzru$w!c zH}c(cTEK!`yup2MUUu#ZxU-Y*o%;<$?c~ApvS3qs#*2C58LZ#I`z)9Om3Hu33)Vwy z8lM)M3U{~j-p7o*-oiwvwVj_?xEtpFz-KNx4nJ+nXcAYN!S|`WYy22E?9ETbcZP@G z^9qZ{zY-}ha2c(sl@@hWh|J)PK^x(H}(>u%E~0?Cb=Gm+>1rR~UollHm!4%FBo=K1X%J$hmyp zuKJKYhacXR40Y!43uhZ~+&$28?rdwk*wwN;FS} z`O|}kEpJV<#_VmD&ivp{8?1sSiZnRU$^~y9r73Urp@D-2teIYJm*A!?W1RARX3kWRZ~W0xc;03(0MrDmU9*64CAv- z4F~68{Q0R~ux}`DdHRs;>qq8FPacU%Rs)AvTks9LT#Fg0S$VaF@K$HKz{|mW+pm%p3baRg7xo$E?yYN#thg){1o6(8ZWqA8rCh+RU@89ZXyY8yF z;i(TfWq#VPBgS+l3Fi zi|}vf47gX9LDNo@owHzN$BaMk+ffSWz^xwE35Xah7OKays?sW4Osfe7Z$eb+cs|H1 zuuc5!ypWE3@WWi#ADt1Idy&Df?K0dSPhjvSiZA(PC$x*=jh;-h%4*=yBCTdc zVYiG)FI{Qf-Hb1JRlZcG7+Ik(6oQ)Z!>@M0(x!aW>p`~9n~+pfL~=d_I7a(W3Vi#z z4qR^{hj+u@YQhg)__*I@LvR=V?zcAqKZZ;8RFmupQ^YR0AP{SufX-j5$qncBZ{uN5 zxRjLkHrzJvN8*s-{NP9FmRXG`Xv%=G6R-9z!}6yvYxF7!uHI1{zn1hkjC9UF;hF!B zoHPxK5Ad?T_kp=#eCF>@V0EaRo2UKpGlVtd;eTeqvIf-8-kZw4XV9!2FaIGL66*7D z9};0uTMh;O(70_zU_nVRHg03y04?2PwrtTJvP|0mU8%!I{yh#V)a4KV9tL~sWVHIn zmq9{pKJMRvklK>p{I@%tt;K78>qe)|^+1EHx#Be-<+vqd6{8mU8lnOG0c6 z-R8&B1E%~S`VTp6Oe8P&sXN5h=2lC;uVjI9LrHt10PJI6wJmJ|tg-Jb z=8W47EEuw@;sXNj4lH9G`r{gD-8esH`hRxQSwxg_|Lt??0A6u4R1 zO8CkaTu_Y7gw<8h(uM`Vjs_TP!=8rxTE*HTzq6W@?uDvEvWXT&Dv=x@L?x1?vLu`) z5=px%*seI61s5x4UM$YSEa9^+I@qyD*yoGg?AQgk?t@kASrusIgPrVI3m8`s*V?mC zs8JE`*|R3_+6O%y=zgaU_HkgXp}!BNIk2|i?Sub{>oIR^<4D)>-nd3wy}j|JxL)zX zhEA*{Eb_udPIO<_3vY_+Gf%8simvF1Q%X@cRQ1GPO0hk*jaE_vah7U@dK?xLJ$A zuxmwG=8pS4C>#RZ@UaJLTl}7@q$GXB-T}-FqstI&sVmMb!@dD$SNyvSIpDMrBg)cs zmJyT6QiDqw@!ztn9UOJRsB&yE)TVVoIl6!1jQ-`>DqF`TX0xo9NVB$&YfUfFq9gB6ZPDc*u(y!JN>}o9_2J zVvIN44|c>+S&vdSWk`T72e=hOV*qOenbz1ffE13j z#*G2&TXG67i20$Uf7+ku8%DXKi*>u&1QT3RCD-WrZX{R8|--OXjRl`(5U+aF$9th__g}3F{4a-{6EM>@3*7!SJRm z*7Ez`40trb+S7jTD`|DAusZHHeBYF;?)VB@H)A2JI9_N@cCBtkM(4c7o6X2*e2K*( z$mp@Jh0%MV`zzJ563wYkXTKCTOX1}U?B9YK@y!doO4pDQFQ^flR3m<~RE>C4*ogCl zs7CCRC37PxKF^#U$-EhOKF?g&lF|8`e?D$*#lqlu9zJQsezPr}N5-qY|1E6n&0L`1 z8NP2#S+2rUY}AHzffmmY+ptxz{VCRrVh!N+6C4{wdEVnGo`_-`Vt>VMZP_q7FvAmV z+0Rh(37XomIS~Cg)2=-$&TJ3&Fh|qg9x}|XJ;p~}S!w(n!)&ozGz+$ERmc*qSaKg` zrbn}844&uWA01eA*p`dF9m$%MT%6gFg?m1{Pj;JPH;B1V?kg7*_=-WGmP$?!@P0?O zti)>KGR3|mCUp7>%HylcmX2U~AGdd6{h;rCwC_yULl1CVXX=-acQK_iqvO1LcuHI^ z-p~B4Gke3J+8tqUean8g4S1vs4e#19Y#(gARoIF(!0zDMZe(Wot;`GE*h~gaH!-RQ z+X%02;@ci1tj-N|>q(uScoW<8r2A7hak97%zKJ`;{q&o7ttSP}z8hGj7xN2P@|!OO z=<%$BblR%|btECGsR6QN?qjd(II|Z^HZHnK9!W6Ve691t@vB(1H(PI8qOG|LEZWL0 z*l-13_h#oUk6t!l;vma%c()Im4}q7lZ(r6I%3j4|eObRU(=L%nQ*3)}^KOcbk)@nG z&#M^LkGYi`tQaf^mcbJ;_zH#TUn)#(UaBVCC~U&h7v?7HmnCx(-dxH|@5kCO=zkIa z?N6~ZSf~B!Ymwie5Up5jt^ht- z;@cL?SSLP;*3;UWIwx<(S!rV`L8;2d&cv*29M;rqW1pslHWpiaigYF_VR&&Uv-fMH zWF(V}WF_O(6SIte#1c-f9o{ziBBQL3;ibt49Y!)PpOJRNk&HMcV?m*eghCnfzsP{} z984O<#=AcIMeE$yI29#gk+|;^x(}zRYtd=M;WWmIox+^qtfuSx$Nz`^p)5Ru0P{LldMfWoLJ)rTo=8+}zg2;e~CrANe!2RlFch{qOl0 zABa9vH=Zy$>HZSY(N(E&2V_3f?7GSuM^L+Zn8Ez?8Q_@bRoD@{dZJ9SBirv$-spbB@h^Trq>D zv1OU~dKV6WkhlbcrL3+^RgW^zZWb%&2WFXaPqbBStPbp2CkV!VsrLLv0c=(pk_eJ416KPcGYGLQ*4mfSW*U{z#T))BCq-t ziZx2Hkx*+7PM^){HOb#CC8p`;5?`T3?92~RFJ#S;U2&XRIw?>XCvxeF0CQhH3ZQXk zEY9{yF>nK&=dh-ZAFC<4bZ=fxM&^(?Y#^OE?!@zRX|pOr-gnd9cMGzPPG zV1)%N8Ul9U_yt6Gn}$0Uuo&BmmCbs7t}OJxpfs!!%PKnjgy*Ta zH;#E(<)o5~-EPI)aII%CJ4jDm5zm^!uvCnQr&LiR6=%e=n(*;^+#S!Hn_)#VO}7-! z`JPgUcvZ7ye0G)!U*WT{f^BYgq$CK}-Sjp$>AbgW(x~szYcZ?lWG^^PbLiz;y4YD% ztb{=qXpt88Jx*RsLv5=MW-VrAOUL<0wh+l?Lw!5N2cIowBcbIs>}+E7oz6=Ib0h;r zfc-YyU}7~`L%eEY9gI`9$c`E+6R#GS8C$Tyx2zl3q~eNiSsVEAdwlXOt@nJt&zzRP z=wST)7EE2j0$6>#zJ&EN4&Eqb%#_JXld*9lwn=0=;pk>`EDn|Mek~}0)smQ_XP*?} zHpTkM(++W@v`FS9t=`fU?3Kh4A$L>e>m;_7fz3u-@g1862`T8rY0c)Jf)m9xX9M2k zY-wn%wL+ZXm3yHZR7l=afabmn@-E&@c&YF)Ny~M(Wf>a;->pa6(lFYnblydV zrRIxQ*CXRkk;+ys(zb8`%s(0#X>tj1!AdJ>Vd_MC@Re*}nY$>JZg!R)R*c!iX!o5n zo?FQ#xs*{9EyBd)zb)B-!41G2$E>2mrTr^0ZxstD87Hle$|b+@zVF@e^I29FT57~H zUx;{g0rSAEt64h4Bx9E~Y&P6Pyt#%QHCinrTM`UIF8hjp%p#*L^1_#4`dZe&X@a9P zQ0wtQj@p2E#nEXUdj;#3n6gggusGKv>H0lZEp|AwpwV95wY9`>_&2$P= zECGvcVSC^g6CT{c%9qMI{WZVkx0x@tu+reOE?%lh)t@`A&ymbZ^7;5ouT&ProL*Z= z=W8*LSKX93dmGzH2}bNn)!Z{c3X4io!|EeQf*PzglFOXy{+6U7gLP1xoVm(d;+*Z2 zcJt$K-*)C>H&BTYbK8Nq%wM-NfY5#Oh1G`97KJ7$Exi<=1xP!2S47L11^9L+O%ajl ztiJP|&(u@8N!7=-pTc%Yeo4~63P7`oMk_!8&=A{j-gbio@ zEUIqk4BVQf?+|=wbaw471 zC4#f1U9Gq1e~5X2+gpt90sc7l5G!qSTPzc4<-omieT(0lAPwB|1`iyfR6Xkr<{qNO zNxe7ddzg8H%NuNYn8k;l886x9i>08x9pe?CwPT>XE7FdK6I45Vj_BpW@uBq(hU6FQA8-s&RFi%<^Ej+;*iFb)6 zj>YpQ=VRU_-OG zCxuw~JluYgX3*xtu}2Q&c$;lsn>2VhnsQic=Xg5c_^ z)*05P{LsM$5es9t5TiL3HVaI|LLKaUmNj#=9!B@31V4GoN6WB?0$SScevG@$vMRPg zZ$5uk^UveMIQI=rw{j`5U?`S5$9}LLa_{r!7mwtd9+-QM))=J+;iq$~ic`oV(rB9F zDI886TV*JQoTt@R#z5?So<#@089+J{4AnLfm)Wj>frJUWvc*AwDI!k>y~&0=JU16} z&$C93;o@wdFsN$eD);<209#xj|DG4C;;-D%V<2w5z%D}lK{(|ii!om6M=BBwAt}UY zR%_cIf4#_RIX8b$wDz_BSnU#P@AUY-o|5;=KwNT(b#|KZHGF6Q{&9&#dihA046$>U zr6Nn51^uztW!9zM%RXd^^enkZ+uJ4IlZv$7Uo7v6grcEe=F7{>o`In+{(FVhvb@-r zQrT5nY(-vWcHrM1yI!RY_tSp3{VJPg{H7OaNiY( z^};RJ*d6ffBi3*sFzISxx7*ntpEK@XB?GKAie)x|PI4Ws}CXx5jPcSWpU*%M=K zuvX3=GsHGoz8py1E4EVGZ{q$NtQPF+jW2Jo-fRN4zDY;Z>oMsjs|rtg;-Q;tHhYJm zx7Zc7A02PAaNKd2HadO>m>ss+!EEV3W!!D%8n&6tlPQco-quc*wuyrrrOqufo&w8c zNWUhnZ%;g8At$1Z!gOj6Jbjxsgv0dIoIH>2SnLi(?;qW;+8tJ_aadR3fg-OY=C2@$ zx?Slo!9?M#j;u0BQT{fe&15)o6*t~tHJnUWbvESWHSC6ok610AgwaNA81De4rhVe-AO-(yw=lXKah@LdP#)pGaR2|67G z%UNStl1`gb`^?-&tO1`qki28ETbYC5ztRqJ zUVH5GE87o0wnNvaw9@#!Erva1-x)8ql2R@2Jy^3K4K1C>0i<1 zc^BJedOu_I!q25B49;UcJWIC}e6ey3C)+c2u})ezL6Z{6q27b5=>r^U{%|Q9f#59y;p?!I)GD})E87qCY zQI?9N)IXc!_!kt@<0En33v%2)&GFs~R@pgdk!YhB+|-HUv@tKcIl8`N0|r)&5bhAL z=-c##I$!h^BpPCZth9GILS(7EjVu+>-bc8$Fp-}=-Z?V<*T}gqJ@LUyR>q}av^52RU|B-r< z@~&de7Ij6ZlyHdMt-6dv&>P1jasE-qFHDYf6hbH{V&_X%;%Ef#J3=H3Y>J*G!Ohb< zmfEgMYKxnah2$NT)IK|4@KSKMktZ@Qn;7u3qh$x|{DC=QKPSs_meUCumk;Ie)f-ll z+7eINM02vq2-&*)s-m|kJD6`#aW{^~E*sn447$#VR&#M{kjryITS)B{Ih*Q^SS0 z*!Dy*zc(bfK%1R7=ZWx zpqC3mK4bYm=@A)SFZ{_SR2Ij}S$^asas2*e<{fj8^c1GYeh1}D-Z(#uw8g8_Ka;x1 zC`gcp)bo#0XE;U1Q&*U2ezXddG|^84;*s~Py5(P?2CVqXFpwX*Z-c!)(9`ynuMFOn zV+c0)Z3)W+;@k3$9JoMTSG`mzoVU#jK z=78q2NT+$SY$m8G2Pm`S<<^5Lh#iPBEw2$VsbP?8qXJO2Fh2H@GE7~h3!J4kx!m!j z_|1#NiGQ)$vrh@e!puP)$u0_H5g-}jWA}b3?xJFTG`+j2xs_y!kuCo<#R{s)soo`r zc{20%BR&O24#(%%ZivsEl|2W+Bc( zI)(qY(sG)xg-!V8BXjNOSExGj=p$;wa@B@2|{|}`p@cX!{e7HNs^}NSY&)coYFK$;<4%?J9ugXiZSV%`A3;)xoF1x zV=QvO6*6zCtduZT)g7wp$_ovSsn#)MOTsSf@Got(Yn2Dr**SS1>l-ZE(-h)Hu8EA# zB^m9hR+hMxGg7RySvF7*)Hso0lGh}JBG(k#m*AH1M@_LpD?Jq;i^w0%;_pg z)K}h0Fbtbced8lX9lf%r6IhtCGHH;SyQD_HFh1U};PRNp|INYb9UP6ur zlZ;MM?I&s4G$$s#qCK79DLLr4T!ra;IfX`A&p+x(dilddmr5d&oh0Xe-7hv&PuDNu z_*;gh`-qZtWGA>0QTUl6KUOKA8_^ZQ9@Q11E#|I}%`oN&JdX(H9?B1Gr)tSesIQNwF_b#QJYGK}nq4K&TpFJKM}{`prF zz+pl4FT*4s;|Hb zTXLOD#l9a|5Zi^}4E)^k?Xkw{pRQZNudN3Gg8pXE}pgg)Wn%_`*}Aa$nVHiaji0H`oQE zy%o4snm_St=9Go(QKBxur6uS|L|-eI4fTWY5ml^kdBWEf`v&PNE<`s23}XM{ zECcvD)=48?llhp+FHO$zY**$P1B?gfnWR$o-Iq;oTWoIwp<=aNB?y<>Kr40#b8R3H zmIR9DgyHNQMi&PUr^REwHsUSLC=O+by0SQA)jR7?CeZ<;7Nz3-9*Q2ZxY<9tNIk(> z=vFseTmqJ{PgtQOxO+Mk;jQ=;Z)+>;;{=}YBmiw~!4EweK}DY~RY+WdVe=@dMFq}x z0xMK;0P{fSA4{AZvB_ z^oAz$AZ(n*TjV>EQNAdJ{_FeL&Z|${zPi* z7x^!-5#gd+y7}V>dkA*57DmR$s=ZL`Sh0X2>Kn|khsM$h#st=lcG*$^i~nJyTJr`hQ)0bQlTI z?E>E5d`H*_AL*5B+9Z@JTZHUW5u=?TkR8W4PT&v8l`*gmRKwd&P_d@34=G77%pNKw zs&4HkutM)mqgBuw-fI$VOwI(%=y=jQpJ+M=NtOfwmqwd9n0+M6&nfcUWR`Mqo$5)gQN% zhC0@jMY$3_Dh;dIR-EY!?v*MJmaQx7nRA}{26mv|t`pK#Lb&7%bJ!J(b^-Sa-wgV? zUO@$Yy;&IVLh(MdBBr^Jck}SB3+>cqd!erpLaSw$CtjNHW%!8kxoV&krd<3^Pzzl= z6%&n68G6!t4Mu2XwSmmTwt4g{u6i?OgEd^CRJ8}?q&W4tg%D@Zi*x)++zK4$O5*%0 z;3`*$@d*-DY2*&j=^rVuLjCX1#SNDD%q}Y#{q&3n1y;z|7*D!EWp*83yMf7PTN%l} zvcIp0M%A!i1y;yE0@t`hb<50h23%@{(zw9Gx)fBXfPcEfz?P>yWc8Q*bkz-CRX5RE zIm?&gPi(J(x)-DTc9W2PWFG*rJJ}L{IEE=I4RAT;Er5sH3i*=Ru(`WHt zntxPah0Sk4?;7MU#GlJSs7O4AzLHrNUCXQafIdX%S)LLhy)=+o9;&gcc%wX}8Yd&k zqF0#Y>V(=I8!pxiGS!UfC3O}CbR8o$s{q^SJoZfmh=LKW*vJ#YD{OO?62z)V)tlH; z)>B<|7uR`0!;1Dx2`luJg}f^=kniFrPiO*DU9pK51b~MT$9lm4nB<#m5d6M0$BbWVc05 zWSMvzEMJ!K#FU!gR!tCk65-1N_z_iWFJ&f(H1TDvMn^B6iOkq~t-X*VdDJSnFR{rb zaKtXP{uNr)w5E&`U1-(yKd#zrkIyQBr&T8kEKKi82TBPK=wZh)C#+i;UK^e5NKb;{ zO=nqA1zUSNY~Tl-J%_~;NJ|!zT_0I0a(H(Kclkjr_ACA>F4^c&1v>bgFDd1n?WB`e z+?KGy-a3Sj0>Q;VQpd;RwkpukJ5<%_r>`?jV1;$CdLRT~D}S01JKN)Af2acf_L$-i zHDQti-k`7OV56;gzTk=Vs)BR5m&K_zJ!DXU-KwL`7_SmIyed?3-L{ZGwH^~OAWAuT z%}V0;RUy}9j}6sNFm&&rtN0q%1VD{uRmG`Z;Sek*?}~(Xfv9bYqCrBtc6o9ULLrw# zWjaC6$!l2xOI4$m^eTa2)nJdYWihGDBU+~{wpb?pCb*@F=Trw1RBwlNL9o_P@7@aL^36W z;06a;aoYyd+_a(?)((bl>?|e*!%%h%3xc6G*ji%s8c@N-ElLW}k4`^J98iOX_f<62 zfT;m>K!}V;GB1Pa^>5jv1jF1m=DI5IdIDCj30=VlFs>$jZB}0#EXe>2lBFU6SQRk0 zCWXQVh9zr3J7{EuJ!?TXu(HI=S`cp8#KM4o*Mc&o54ZYS&p;yh)rQHlt6KgiS4>e` z4zYw1y_QRs=Zapl_%CZ4$!h2_Ls==_s7r{*7GpBO@VTW>De}uLs!iU>OH^)OgU^oZSUtnHSyv&?hSqcT;6$ZI=E^V1*-LF`XiO(K7!(TJAD~aJJd}4OEt+ zz!b4TwBlc^RtEy*a?)5_Df<{Houhgn;uE&13qFoX(?y%iJEnQlRUDQ0gjg2>?DmQs zw(OT5rpnWIn^qsmNJ@d&H-+-%y?RgzY(Jt)2xLM3fAL}nRC1o)Lg>+ZB>6M8sYi?L z%Jsm>xxs(Poh8{1CQQZ2^`I_zf5x5lpb-TBgKz4Q;6;Dq5B1@2FitjGlORh)qNLy- zGELW!r~X0vhTw|38bGyR@4~un|F7=+B6SDIy74Zl1+t&+G!;$K`soR#H3WB-k0%>K z#pZwhYh@81aW8+9=r3*MJC2+rutbHu5gjs0!@kjBEw#EstniToxM5@{L|bnCV1=`t z!PP0hiBwv+o;ZgmLSeYk>4P+Bp`xnZjQW7h!oYKORZU>!tj?c=wW2G2u?ojfd%=eAp2xEWY{>Cuds>JVB7MR@= zjHNz>eeI{9-?3j4Xxw!a^<92t+Gd)&WuyR%I$(qV#BX4kIfe`14@$CTV3+`Y(E(H6 z<6ljnJcPVQ_okGR*3!p;O=-h1{7)Rx6uyHlf8sw)p(8kb!1m1`0;a!1q*qt$7rhZq zQ4gkiyu*{tpr-Xc`dOV9hcI|Dyg#x?zed*?-A$elS#y zX{%4aSy}K4ZH;)g1$+xJudrJr<^7b`m=p1ub#Jf9>zsMpl{28!ky*>+CbhFSte|Kg?FPM z*7)$L6tlUOPGy;AIGMiZHFi|A+Im{zQ>4jmyz%U>vfjCxx_ZT)iXbmfn^CZHC-=Um zpL3HzOD8h&l<_ZmyYFwj&<;E-PZqO4&--*pa}im4T81xphUMDBkdT8*ehJ(>1bdM4^N;C(=hSog+A~|3eewmcLC29N zfJ7ZoIS+ev0N2u^g{(n>kf6>eqMqWS4ixn3^U$RuH6=O^n~H1AJRH{%++bR7Gn~oVQ#Y=!??))3Ni(JzL!1l=D}uAH4gr-l<_pj70HZX#sqAG`6gRAlhoe;~R~z7~J_IEl3| zKdcuj;%63!j-ezK*aI)cK-nfqVk;u0EtDlq+R2vjXCh68cWURTCG&fag=oWl1?Jrs zxA74;u9>wIMYMwj-SpMb{o@d1zE$x=Y z;P4)Fm@z3vyk^@Jf@1JO4+t(^Tdi#Y2*vlQQ-Ee+S z=;&O&G8ysp1CbZ_yeIT=__30tsMW%(+ZfY}j$M~1u+Y(ww{b}?DC70J*r3QB&6lMj z@zL-Wp6LbEp~p@9rxz{a>0^jay`f+2ZoWDlrO2|v*F3_7<4lH1V(+Q>D4xcj$>7`> z8}$Vv9pAG)5JVe~8hxM{EbN3+`_K%8H*sel=pV=`O2I0IR1(WD)69eekKP%C$mhS_P>F8KNl zz3FwRA1QBg9slS@L%i&D^zRR2VbwKU)1U4qUc)Q>p-!oPuZTXBt9v=W*jtZO8g_3iWI{$o53#;n<(7%VVR%);73nC{(nuFym|E4dpQD8CZ$k)82Ck^m#uk zz|djTzT@X{{xGN-@ROHXOp1qOYB9Nr5T$jfEQyAQA6OZA4(|+umd4%EGJ3~AzHB4= zY1UaQd^3_hcW6Hxy2Ijgm^Pexd*C^IJRF8XiSyWI1SS6PGdOt!EqB(P!{iary={ln zvWd4u2gp{=ub^w?0zoAonH{uD+$R`5x>AxB&-Kmt3?(HGgS*l$AZ8>uvU@meBsHGw5bvcUd@HqGcLr*HUYvXCpH|wNgD?NeOUi_@s#!Z0Fu=j*wi<=0g*cn_s5&A>j z6NoWOknn^z#rWk19Enrx4%0ql$0e z6yj@gRPoiDD)^oqQGA`J5#Prnif`F8;u~;8@wrV0TLu>NX0~W$!*7Vscv$cag&Btw z%ja(di~CQC#b+k5RR2kd>OYf2EkBq^rnO{H|3}3_&nHVk`yUlc-xVpcP zqXMSRgL=?(zhe7q9yz$%ig|Qi7BZh?5GPund}5;7y?3C^xAf@tF?ReG zmIwU%siIgSWPL-6SCtO#5Tb_XE?F|CgBsh=IROHTm)c3QNe3E`ICrbHn`NHGP8^&7 zV?!Efk`@+9axawh@uQGwmeeejB#0wrIXz+YNP4j0upKKefllD$jWd_fDA?hJkCs4` zU0acoWWsLdB@;G#g3*ak4YqE)3uNtbn$g6s!Gr(23eV;5!JhjNfP_e{>Ol`VOYS=afPYdmO>(LBzKy_#=n9 zmNiqXuu(V5^2@tfPlIh6bZkeL5nG)N=(wCt=-$%n<@T1zFl4=s!*T^Q0PFP_zJlHd z=(-Lsu7G4XzgBT1B1|aOWG#6l@e{sXYweEVFTlV)qF*wsgb8a3xk}*g$uEOQ3NKmm=ily^vYQW@`cxg3_)qs^)e+_i7dsEu%zNe+td}qBHcdel#f`jYv z>>Bv&HytU~5)9p5%N|k-hW!E)saW1pM_J_i;k&gk1X{1e9_wI?-}Du-R@^InErI=~ z);j3n_hGr@4%Ktl{4e(woU|VLvfuE=dI*aN5|vEqF@l^eR=m_H>o2HZE4wD1wRw@T zBAz|vRXl4;brLQx?>SdFsY5&O<+xx241}MS2WlZ?OxQiI`e-$fWb#fjQsl61KV2Co}qm6XNQhOP)O;8T#Yhuq$ zbZ@;3!#9C**w6CR%COB|dZ9hpN_Ew{O@?I(3{l{&FY?`JS4_K>iT3#2Ca7Amh2m4Q zuw6ZQS7h6M4IgcSvQXUxKMU=d94l-F*NXP46NPA!mu*LDkGaQ%KKklO#oEYa*nKmt z?HVCY*$gfFEJzZbH#Eo-uG9_@vjrxX2GVkpR9;CE%@N;EeTh>KdC+EN`(P^-n%PW- zr&wVNgwmR**A{v@vOf_wY=N#-q7q3yg__)Af_y7<4d}i^%8>6|(ag2l9G@oj%HaHLE0fLK(-!n%XS@y4k7#WP zxbmw?y<^B^6+gQOQSmcOmdpvW&l0@yJ=Ch2q16~$SYv5njj>94+5N`Lrm@uFI zv3pre4S(B2IsDmC+?h%TgqLy5HVAe}G?DT2`;bqBe$DA;ao;wm;^<@}J)rfyrHvXs zCKFo!KzYXNTO9iXy{7O7+HMCw$A995oY=A24-}rmX4|1})q`|AUo_0?Jr=5HsKh3J z`EA1Q7URY3wD3BN@3uqrs$u`9-r-08r=H7VY?DTF_^QRYD2f}L>Q z>cRrrgC*|cqE>i_ZfpO2sSfLED&cSHz_=KU<@`ob)m`KhA#!3$^ge<_$g z7rSOaf3G@{M?_r zku_7i6yOzbb+J|RQe2FbH8f0g%tWxLP}zOabrnrrk`imNK}43clvOiQ^JrUnJua@> zrl&et**W|CpXWR7gzkF|{P_Il&pYqDb7dHq{WbMBFXi8#W_trK=&!uji@;@0pKA3x z!bIDB1Ldaxvp)h;PRZJ29p)CO#O=AZ z%eCLH_oBrzZ~i!0{UwKYe$&Zc&Tm=leBn_qRhpO|piYbVCAfFC_ESA;R=hml^K*@Q z9<2MFi}d8p-&M*z#HJHIlW~hYNwu!Ie)7jtt=q_Ly#8y3W_5Fa)w!?E)phVA$IXpJ zq`EmbXK<)$%#DRhf92gNAusqox>9Rs)@vAfFKg&~a}D1e^RD4b{grnObqiarL0;3X z{t%+fdH-r)x4^Nd64moi!_N4HyQk&JDSPay+9dtTb=e?wj9lEBWDm*hw)YoJ^22n2 zenFvJP%j@)pVYWIwekcS|B8txE1T8rt$bsntlq3veW_0I!REDU`^;+@Ca4vdSIp;| zRmm|od(My-Ezn6J<6f#>&pWecCOXALW1;)jx7mr zHeOIKqmJ6^8XkW58@0RC7QE8>ef?F7i*Fxi^t|grsf*U- zuKE}P_nC?0Uru}=69X-0RjsRI5R)sM_n4rSxl}W*O8mZZRDHe4wG)H znxclRCl8WG$&=*gF*{E_^b^yA$n14vt^+p>ZwT9bE^?a6z{P_hfzjl7@i zNk)(lk&$FH*`JJ)l>cKpm?EBhj7%g)lT*p($<<^fxs!ZvxF>j|ea{{KiK8>t%;*#1 zoZV~(ID<#o9sI}oHrdjo`ZnvOndaLZk!FT(b3>Y^e49R_Rg>x4Opzwrw<(q;$G54I zCfB$5w={XaO_wpM$@gu>Nb|C9lP}F{zRg?GtoCg_mu9VRbJtkaZ1imgOS9Ft$(E+l zw^=XEJHE{kX*|Bo4Qck8#uG8lj`EKw8fUI!5eX(2%*}dAo$pqNeDYa#GMAR%yqsc( zwL67t_`WRXT#9{fur=PSra8g+OvWN`$3)X-Ink+VESWkn(RnacjpgCIn`1A^SUGh? zqVs}`HR4k@$3Bs|VhQI4;RqH^C0`zn+}2CPn=s=-z+->G^m`n4{^^3{tf9ssvDr2z7I~dzPFXq-ktAV*1=F)G!LaUj% zX7AkpS>N5Mast$?e#g<~lq`sjkrQI|S9cP&%J@{-OqDY-Hvo_t5l>u%5QVHI#=A86V2via=G=c;aU2U7X3W> znilMbz7u(W^bGtBrUIX>keIj;qKB`dzq|Or~!T%kh860eKv77&npS^e6E@$VU2e z_!4=Q{tEtvJmtLzOfn}VNTobSXQ`i7C)wSc#58-SyJ(gLJTF zSiKxyFE_CIgI~R4N zS1dmr$kH3Dmo4jM0Pc&2;V5(ZEo&@AGy{{d+*8Psf%_R+`B?69WLbp=7+PDf+{MYV z8xJ(Jj^a4I|5bU8;@1p(iw9vl-Ryx!a3}123-5>VqZ}TOhu{f#C{D-jc#4G-!*C%U zj@RH3cq1N(EAeC4gCEEHaRUC>*li_JoMIpepU0!{S9mnOj>lmC46}#E;x>334#nef z4{f#o<*7tj`ZADWXbr-tcm$T8P-Pj5e`9E+;fZ(_o`mP%-{OU0IselrmNPIJzmA{4 z>#+BYwYTCa9KHij#Wi>u-jAQeN0sIHt?3k}8JK}D;+gnsJPZGb^#f(q1!kJF;AsxO z8>iz?Y^E%$duE0{ek+rKJ`7~x0eChZf}g<&I2$M9XYmtw4xWYQ;_OVf*_IrN`3(FX zFTwM0A$|^*;9R^O&&ONv0{k|99@n`k@+c1Ag}4d7fY0DX_&->lERp2~UTkQ!%Q7c$ z3GRi>epi>jD2k;F48||wM7#{A;+ODDyd2NN1vnqCz{R-G*ln$+C}N-juf)~(W!!*Y z!AEd0K8;_+7w~KNEBv~)+7CAq4{v$5Nj#$oz ztrTSpRN=LF4_=24;y>X}@Opd>{~2Gy8}Ltfqq4pnw0g#z;&KK$<4w3H-i)L18~9PY z1t;OHcp~10XX3wb{8lza1p^E4o45dP$ECOuZ^m!oTKqOXj(6ZIxXPS<%L>RgdtfI6 zZSXs|6Mh%>!hgk4xEc?_yYNW-9!|y{z5i7?g`$RmOuQTC;##}}@4-d54wvG+xE$Bx z?b!V{ifW1mT#w(!jd&kEhWFzy@CW#x_(OaRAHY8uyRCy1fzO(=pb@vlf5)Nt5bll- z#7JsMW_0HK#UysIx(=HeGLCc%}2DxB)j*I$?D(&s)OBS3A?{>>)0d8|v&{{{`_h B87lw) delta 39102 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 diff --git a/src/onyxchecker.c b/src/onyxchecker.c index 2a65f651..4df1e728 100644 --- a/src/onyxchecker.c +++ b/src/onyxchecker.c @@ -48,7 +48,7 @@ b32 check_return(AstReturn* retnode) { if (retnode->expr) { if (check_expression(&retnode->expr)) return 1; - if (!type_check_or_auto_cast(retnode->expr, semstate.expected_return_type)) { + if (!type_check_or_auto_cast(&retnode->expr, semstate.expected_return_type)) { onyx_report_error(retnode->expr->token->pos, "Expected to return a value of type '%s', returning value of type '%s'.", type_get_name(semstate.expected_return_type), @@ -238,10 +238,10 @@ static AstTyped* match_overloaded_function(AstCall* call, AstOverloadedFunction* fill_in_type((AstTyped *) arg); if ((*param_type)->kind == Type_Kind_VarArgs) { - if (!type_check_or_auto_cast(arg->value, (*param_type)->VarArgs.ptr_to_data->Pointer.elem)) + if (!type_check_or_auto_cast(&arg->value, (*param_type)->VarArgs.ptr_to_data->Pointer.elem)) goto no_match; } - else if (!type_check_or_auto_cast(arg->value, *param_type)) goto no_match; + else if (!type_check_or_auto_cast(&arg->value, *param_type)) goto no_match; param_type++; arg = (AstArgument *) arg->next; @@ -271,11 +271,6 @@ no_match: return NULL; } -typedef struct PolyArg { - AstArgument* arg; - u64 pos; -} PolyArg; - typedef enum ArgState { AS_Expecting_Exact, AS_Expecting_Typed_VA, @@ -296,17 +291,12 @@ b32 check_call(AstCall* call) { // 8. If callee is an intrinsic, turn call into an Intrinsic_Call node // 9. Check types of formal and actual params against each other, handling varargs - - if (check_expression(&call->callee)) return 1; AstFunction* callee = (AstFunction *) call->callee; bh_arr(AstArgument *) arg_arr = NULL; bh_arr_new(global_heap_allocator, arg_arr, call->arg_count); - bh_arr(PolyArg) poly_args = NULL; - bh_arr_new(global_heap_allocator, arg_arr, 1); - // NOTE: Check arguments AstArgument* actual = call->arguments; while (actual != NULL) { @@ -319,13 +309,6 @@ b32 check_call(AstCall* call) { return 1; } - if (actual->value->kind == Ast_Kind_Polymorphic_Proc) { - bh_arr_push(poly_args, ((PolyArg) { - .arg = actual, - .pos = bh_arr_length(arg_arr), - })); - } - bh_arr_push(arg_arr, actual); actual = (AstArgument *) actual->next; } @@ -359,18 +342,6 @@ b32 check_call(AstCall* call) { return 1; } - bh_arr_each(PolyArg, pa, poly_args) { - pa->arg->value = (AstTyped *) polymorphic_proc_lookup( - (AstPolyProc *) pa->arg->value, - PPLM_By_Function_Type, - callee->type->Function.params[pa->pos], - pa->arg->token->pos); - - if (pa->arg->value == NULL) return 1; - - pa->arg->value->flags |= Ast_Flag_Function_Used; - } - if (callee->kind == Ast_Kind_Function) { if (bh_arr_length(arg_arr) < bh_arr_length(callee->params)) { while (bh_arr_length(arg_arr) < bh_arr_length(callee->params) @@ -437,7 +408,7 @@ b32 check_call(AstCall* call) { } if (arg_pos >= bh_arr_length(arg_arr)) goto type_checking_done; - if (!type_check_or_auto_cast(arg_arr[arg_pos]->value, formal_params[arg_pos])) { + if (!type_check_or_auto_cast(&arg_arr[arg_pos]->value, formal_params[arg_pos])) { onyx_report_error(arg_arr[arg_pos]->token->pos, "The function '%b' expects a value of type '%s' for %d%s parameter, got '%s'.", callee->token->text, callee->token->length, @@ -456,7 +427,7 @@ b32 check_call(AstCall* call) { call->va_kind = VA_Kind_Typed; if (arg_pos >= bh_arr_length(arg_arr)) goto type_checking_done; - if (!type_check_or_auto_cast(arg_arr[arg_pos]->value, variadic_type)) { + if (!type_check_or_auto_cast(&arg_arr[arg_pos]->value, variadic_type)) { onyx_report_error(arg_arr[arg_pos]->token->pos, "The function '%b' expects a value of type '%s' for the variadic parameter, '%b', got '%s'.", callee->token->text, callee->token->length, @@ -500,8 +471,6 @@ type_checking_done: callee->flags |= Ast_Flag_Function_Used; call->arg_arr = arg_arr; - bh_arr_free(poly_args); - return 0; } @@ -571,7 +540,7 @@ b32 check_binop_assignment(AstBinaryOp* binop, b32 assignment_is_ok) { if (check_binaryop(&binop_node, 0)) return 1; } - if (!type_check_or_auto_cast(binop->right, binop->left->type)) { + if (!type_check_or_auto_cast(&binop->right, binop->left->type)) { onyx_report_error(binop->token->pos, "Cannot assign value of type '%s' to a '%s'.", type_get_name(binop->right->type), @@ -628,8 +597,8 @@ b32 check_binaryop_compare(AstBinaryOp** pbinop) { onyx_report_error(binop->token->pos, "Cannot have auto cast on both sides of binary operator."); return 1; } - else if (type_check_or_auto_cast(binop->left, rtype)); - else if (type_check_or_auto_cast(binop->right, ltype)); + else if (type_check_or_auto_cast(&binop->left, rtype)); + else if (type_check_or_auto_cast(&binop->right, ltype)); else { onyx_report_error(binop->token->pos, "Cannot compare '%s' to '%s'.", @@ -785,8 +754,8 @@ b32 check_binaryop(AstBinaryOp** pbinop, b32 assignment_is_ok) { onyx_report_error(binop->token->pos, "Cannot have auto cast on both sides of binary operator."); return 1; } - else if (type_check_or_auto_cast(binop->left, binop->right->type)); - else if (type_check_or_auto_cast(binop->right, binop->left->type)); + else if (type_check_or_auto_cast(&binop->left, binop->right->type)); + else if (type_check_or_auto_cast(&binop->right, binop->left->type)); else { onyx_report_error(binop->token->pos, "Mismatched types for binary operation. left: '%s', right: '%s'.", @@ -924,7 +893,7 @@ b32 check_struct_literal(AstStructLiteral* sl) { type_lookup_member_by_idx(sl->type, i, &smem); Type* formal = smem.type; - if (!type_check_or_auto_cast((*actual), formal)) { + if (!type_check_or_auto_cast(actual, formal)) { onyx_report_error(sl->token->pos, "Mismatched types for %d%s member named '%s', expected '%s', got '%s'.", i + 1, bh_num_suffix(i + 1), @@ -1104,13 +1073,13 @@ b32 check_range_literal(AstBinaryOp** prange) { StructMember smem; type_lookup_member(expected_range_type, "low", &smem); - if (!type_check_or_auto_cast(range->left, smem.type)) { + if (!type_check_or_auto_cast(&range->left, smem.type)) { onyx_report_error(range->token->pos, "Expected left side of range to be a 32-bit integer."); return 1; } type_lookup_member(expected_range_type, "high", &smem); - if (!type_check_or_auto_cast(range->right, smem.type)) { + if (!type_check_or_auto_cast(&range->right, smem.type)) { onyx_report_error(range->token->pos, "Expected right side of range to be a 32-bit integer."); return 1; } @@ -1456,7 +1425,7 @@ b32 check_memres(AstMemRes* memres) { if (memres->type != NULL) { Type* memres_type = memres->type; - if (!type_check_or_auto_cast(memres->initial_value, memres_type)) { + if (!type_check_or_auto_cast(&memres->initial_value, memres_type)) { onyx_report_error(memres->token->pos, "Cannot assign value of type '%s' to a '%s'.", type_get_name(memres_type), diff --git a/src/onyxsymres.c b/src/onyxsymres.c index a17c23da..832e3de5 100644 --- a/src/onyxsymres.c +++ b/src/onyxsymres.c @@ -609,7 +609,7 @@ void symres_function(AstFunction* func) { param->local->type = type_build_from_ast(semstate.node_allocator, param->local->type_node); if (param->default_value != NULL) { - if (!type_check_or_auto_cast(param->default_value, param->local->type)) { + if (!type_check_or_auto_cast(¶m->default_value, param->local->type)) { onyx_report_error(param->local->token->pos, "Expected default value of type '%s', was of type '%s'.", type_get_name(param->local->type), diff --git a/src/onyxutils.c b/src/onyxutils.c index eaeeb212..b49fb4f2 100644 --- a/src/onyxutils.c +++ b/src/onyxutils.c @@ -611,6 +611,8 @@ no_errors: .package = NULL, }); + func->flags |= Ast_Flag_Function_Used; + return func; } @@ -807,10 +809,19 @@ b32 convert_numlit_to_type(AstNumLit* num, Type* type) { } // NOTE: Returns 0 if it was not possible to make the types compatible. -b32 type_check_or_auto_cast(AstTyped* node, Type* type) { +b32 type_check_or_auto_cast(AstTyped** pnode, Type* type) { + AstTyped* node = *pnode; assert(type != NULL); assert(node != NULL); + if (node->kind == Ast_Kind_Polymorphic_Proc) { + AstFunction* func = polymorphic_proc_lookup((AstPolyProc *) node, PPLM_By_Function_Type, type, node->token->pos); + if (func == NULL) return 0; + + *pnode = (AstTyped *) func; + return 1; + } + if (types_are_compatible(node->type, type)) return 1; if (node_is_auto_cast((AstNode *) node)) { // If the node is an auto cast, we convert it to a cast node which will reports errors if -- 2.25.1