Update linux-x86 Go 1.18 prebuilts from ab/8319976 am: 1047e6df42 am: 451911222b am: e636a02221

Original change: https://android-review.googlesource.com/c/platform/prebuilts/go/linux-x86/+/2032726

Change-Id: Ibd2895690df8ec89bd9c427f47b9b9e5ccf7b3c6
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index e2e102f..48567ee 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -120,6 +120,7 @@
 Alex Myasoedov <msoedov@gmail.com>
 Alex Opie <amtopie@gmail.com>
 Alex Plugaru <alex@plugaru.org> <alexandru.plugaru@gmail.com>
+Alex Schade <39062967+aschade92@users.noreply.github.com>
 Alex Schroeder <alex@gnu.org>
 Alex Sergeyev <abc@alexsergeyev.com>
 Alex Tokarev <aleksator@gmail.com>
@@ -135,6 +136,7 @@
 Alexander Kucherenko <alxkchr@gmail.com>
 Alexander Larsson <alexander.larsson@gmail.com>
 Alexander Lourier <aml@rulezz.ru>
+Alexander Melentyev <alexander@melentyev.org>
 Alexander Menzhinsky <amenzhinsky@gmail.com>
 Alexander Morozov <lk4d4math@gmail.com>
 Alexander Neumann <alexander@bumpern.de>
@@ -145,6 +147,7 @@
 Alexander Rakoczy <alex@golang.org>
 Alexander Reece <awreece@gmail.com>
 Alexander Surma <surma@surmair.de>
+Alexander Yastrebov <yastrebov.alex@gmail.com>
 Alexander Zhavnerchik <alex.vizor@gmail.com>
 Alexander Zillion <alex@alexzillion.com>
 Alexander Zolotov <goldifit@gmail.com>
@@ -179,6 +182,7 @@
 Alwin Doss <alwindoss84@gmail.com>
 Aman Gupta <aman@tmm1.net>
 Amarjeet Anand <amarjeetanandsingh@gmail.com>
+Amelia Downs <adowns@vmware.com>
 Amir Mohammad Saied <amir@gluegadget.com>
 Amit Kumar <mittalmailbox@gmail.com>
 Amr Mohammed <merodiro@gmail.com>
@@ -191,6 +195,7 @@
 Anders Pearson <anders@columbia.edu>
 Anderson Queiroz <contato@andersonq.eti.br>
 André Carvalho <asantostc@gmail.com>
+Andre Marianiello <andremarianiello@users.noreply.github.com>
 André Martins <aanm90@gmail.com>
 Andre Nathan <andrenth@gmail.com>
 Andrea Nodari <andrea.nodari91@gmail.com>
@@ -221,6 +226,7 @@
 Andrew Harding <andrew@spacemonkey.com>
 Andrew Jackura <ajackura@google.com>
 Andrew Kemm <andrewkemm@gmail.com>
+Andrew LeFevre <capnspacehook@gmail.com>
 Andrew Louis <alouis@digitalocean.com>
 Andrew Lutomirski <andy@luto.us>
 Andrew Medvedev <andrew.y.medvedev@gmail.com>
@@ -234,6 +240,7 @@
 Andrew Stribblehill <ads@wompom.org>
 Andrew Szeto <andrew@jabagawee.com>
 Andrew Todd <andrew.todd@wework.com>
+Andrew Wansink <wansink@uber.com>
 Andrew Werner <andrew@upthere.com> <awerner32@gmail.com>
 Andrew Wilkins <axwalk@gmail.com>
 Andrew Williams <williams.andrew@gmail.com>
@@ -283,6 +290,7 @@
 Antonio Garcia <garcia.olais@gmail.com>
 Antonio Huete Jimenez <tuxillo@quantumachine.net>
 Antonio Murdaca <runcom@redhat.com>
+Antonio Ojea <antonio.ojea.garcia@gmail.com>
 Antonio Troina <thoeni@gmail.com>
 Anze Kolar <me@akolar.com>
 Aofei Sheng <aofei@aofeisheng.com>
@@ -290,6 +298,7 @@
 Aram Hăvărneanu <aram@mgk.ro>
 Araragi Hokuto <kanseihonbucho@protonmail.com>
 Arash Bina <arash@arash.io>
+Archana Ravindar <aravind5@in.ibm.com>
 Arda Güçlü <ardaguclu@gmail.com>
 Areski Belaid <areski@gmail.com>
 Ariel Mashraki <ariel@mashraki.co.il>
@@ -299,6 +308,7 @@
 Arne Hormann <arnehormann@gmail.com>
 Arnout Engelen <arnout@bzzt.net>
 Aron Nopanen <aron.nopanen@gmail.com>
+Arran Walker <arran.walker@fiveturns.org>
 Artem Alekseev <artem.alekseev@intel.com>
 Artem Khvastunov <artem.khvastunov@jetbrains.com>
 Artem Kolin <artemkaxboy@gmail.com>
@@ -337,6 +347,7 @@
 Balazs Lecz <leczb@google.com>
 Baokun Lee <nototon@gmail.com> <bk@golangcn.org>
 Barnaby Keene <accounts@southcla.ws>
+Bartłomiej Klimczak <bartlomiej.klimczak88@gmail.com>
 Bartosz Grzybowski <melkorm@gmail.com>
 Bartosz Oler <brtsz@google.com>
 Bassam Ojeil <bojeil@google.com>
@@ -368,6 +379,7 @@
 Benoit Sigoure <tsunanet@gmail.com>
 Berengar Lehr <Berengar.Lehr@gmx.de>
 Berkant Ipek <41230766+0xbkt@users.noreply.github.com>
+Beth Brown <ecbrown@google.com>
 Bharath Kumar Uppala <uppala.bharath@gmail.com>
 Bharath Thiruveedula <tbharath91@gmail.com>
 Bhavin Gandhi <bhavin7392@gmail.com>
@@ -430,6 +442,7 @@
 Brian Slesinsky <skybrian@google.com>
 Brian Smith <ohohvi@gmail.com>
 Brian Starke <brian.starke@gmail.com>
+Bruce Huang <helbingxxx@gmail.com>
 Bryan Alexander <Kozical@msn.com>
 Bryan Boreham <bjboreham@gmail.com>
 Bryan C. Mills <bcmills@google.com>
@@ -482,17 +495,21 @@
 Charles L. Dorian <cldorian@gmail.com>
 Charles Lee <zombie.fml@gmail.com>
 Charles Weill <weill@google.com>
+Charlie Getzen <charlie@bolt.com>
 Charlie Moog <moogcharlie@gmail.com>
 Charlotte Brandhorst-Satzkorn <catzkorn@gmail.com>
 Chauncy Cullitan <chauncyc@google.com>
 Chen Zhidong <njutczd@gmail.com>
 Chen Zhihan <energiehund@gmail.com>
+Cheng Wang <wangchengiscool@gmail.com>
 Cherry Mui <cherryyz@google.com>
 Chew Choon Keat <choonkeat@gmail.com>
+Chia-Chi Hsu <wuchi5457@gmail.com>
 Chiawen Chen <golopot@gmail.com>
 Chirag Sukhala <cchirag77@gmail.com>
 Cholerae Hu <choleraehyq@gmail.com>
 Chotepud Teo <AlexRouSg@users.noreply.github.com>
+Chressie Himpel <chressie@google.com>
 Chris Ball <chris@printf.net>
 Chris Biscardi <chris@christopherbiscardi.com>
 Chris Broadfoot <cbro@golang.org>
@@ -570,6 +587,7 @@
 Curtis La Graff <curtis@lagraff.me>
 Cyrill Schumacher <cyrill@schumacher.fm>
 Dai Jie <gzdaijie@gmail.com>
+Dai Wentao <dwt136@gmail.com>
 Daisuke Fujita <dtanshi45@gmail.com>
 Daisuke Suzuki <daisuzu@gmail.com>
 Daker Fernandes Pinheiro <daker.fernandes.pinheiro@intel.com>
@@ -603,6 +621,7 @@
 Daniel Lidén <daniel.liden.87@gmail.com>
 Daniel Lublin <daniel@lublin.se>
 Daniel Mangum <georgedanielmangum@gmail.com>
+Daniel Marshall <daniel.marshall2@ibm.com>
 Daniel Martí <mvdan@mvdan.cc>
 Daniel McCarney <cpu@letsencrypt.org>
 Daniel Morsing <daniel.morsing@gmail.com>
@@ -727,6 +746,7 @@
 Dmitry Neverov <dmitry.neverov@gmail.com>
 Dmitry Savintsev <dsavints@gmail.com>
 Dmitry Yakunin <nonamezeil@gmail.com>
+Dmytro Shynkevych <dm.shynk@gmail.com>
 Doga Fincan <doga@icloud.com>
 Domas Tamašauskas <puerdomus@gmail.com>
 Domen Ipavec <domen@ipavec.net>
@@ -751,6 +771,7 @@
 Dustin Long <dustmop@gmail.com>
 Dustin Sallings <dsallings@gmail.com>
 Dustin Shields-Cloues <dcloues@gmail.com>
+Dustin Spicuzza <dustin.spicuzza@gmail.com>
 Dvir Volk <dvir@everything.me> <dvirsky@gmail.com>
 Dylan Waits <dylan@waits.io>
 Ed Schouten <ed@nuxi.nl>
@@ -810,9 +831,11 @@
 Ernest Chiang <ernest_chiang@htc.com>
 Erwin Oegema <blablaechthema@hotmail.com>
 Esko Luontola <esko.luontola@gmail.com>
+Ethan Anderson <eanderson@atlassian.com>
 Ethan Burns <eaburns@google.com>
 Ethan Hur <ethan0311@gmail.com>
 Ethan Miller <eamiller@us.ibm.com>
+Ethan Reesor <ethan.reesor@gmail.com>
 Euan Kemp <euank@euank.com>
 Eugene Formanenko <mo4islona@gmail.com>
 Eugene Kalinin <e.v.kalinin@gmail.com>
@@ -831,8 +854,10 @@
 Ewan Chou <coocood@gmail.com>
 Ewan Valentine <ewan.valentine89@gmail.com>
 Eyal Posener <posener@gmail.com>
+F. Talha Altınel <talhaaltinel@hotmail.com>
 Fabian Wickborn <fabian@wickborn.net>
 Fabian Zaremba <fabian@youremail.eu>
+Fabio Falzoi <fabio.falzoi84@gmail.com>
 Fabrizio Milo <mistobaan@gmail.com>
 Faiyaz Ahmed <ahmedf@vmware.com>
 Fan Hongjian <fan.howard@gmail.com>
@@ -861,21 +886,25 @@
 Florian Forster <octo@google.com>
 Florian Uekermann <florian@uekermann-online.de> <f1@uekermann-online.de>
 Florian Weimer <fw@deneb.enyo.de>
+Florin Papa <fpapa@google.com>
 Florin Patan <florinpatan@gmail.com>
 Folke Behrens <folke@google.com>
 Ford Hurley <ford.hurley@gmail.com>
+Forest Johnson <forest.n.johnson@gmail.com>
 Francesc Campoy <campoy@golang.org>
 Francesco Guardiani <francescoguard@gmail.com>
 Francesco Renzi <rentziass@gmail.com>
 Francisco Claude <fclaude@recoded.cl>
 Francisco Rojas <francisco.rojas.gallegos@gmail.com>
 Francisco Souza <franciscossouza@gmail.com>
+Frank Chiarulli Jr <frank@frankchiarulli.com>
 Frank Schroeder <frank.schroeder@gmail.com>
 Frank Somers <fsomers@arista.com>
 Frederic Guillot <frederic.guillot@gmail.com>
 Frederick Kelly Mayle III <frederickmayle@gmail.com>
 Frederik Ring <frederik.ring@gmail.com>
 Frederik Zipp <fzipp@gmx.de>
+Frediano Ziglio <freddy77@gmail.com>
 Fredrik Enestad <fredrik.enestad@soundtrackyourbrand.com>
 Fredrik Forsmo <fredrik.forsmo@gmail.com>
 Fredrik Wallgren <fredrik.wallgren@gmail.com>
@@ -914,6 +943,7 @@
 Georg Reinke <guelfey@gmail.com>
 George Gkirtsou <ggirtsou@gmail.com>
 George Hartzell <hartzell@alerce.com>
+George Looshch <looshch@loosh.ch>
 George Shammas <george@shamm.as> <georgyo@gmail.com>
 George Tsilias <tsiliasg@gmail.com>
 Gerasimos (Makis) Maropoulos <kataras2006@hotmail.com>
@@ -954,19 +984,27 @@
 GitHub User @frennkie (6499251) <mail@rhab.de>
 GitHub User @geedchin (11672310) <geedchin@gmail.com>
 GitHub User @GrigoriyMikhalkin (3637857) <grigoriymikhalkin@gmail.com>
+GitHub User @Gusted (25481501) <williamzijl7@hotmail.com>
 GitHub User @hengwu0 (41297446) <41297446+hengwu0@users.noreply.github.com>
 GitHub User @hitzhangjie (3725760) <hit.zhangjie@gmail.com>
+GitHub User @hkhere (33268704) <33268704+hkhere@users.noreply.github.com>
+GitHub User @hopehook (7326168) <hopehook.com@gmail.com>
 GitHub User @hqpko (13887251) <whaibin01@hotmail.com>
+GitHub User @Illirgway (5428603) <illirgway@gmail.com>
 GitHub User @itchyny (375258) <itchyny@hatena.ne.jp>
 GitHub User @jinmiaoluo (39730824) <jinmiaoluo@icloud.com>
 GitHub User @jopbrown (6345470) <msshane2008@gmail.com>
 GitHub User @kazyshr (30496953) <kazyshr0301@gmail.com>
 GitHub User @kc1212 (1093806) <kc1212@users.noreply.github.com>
 GitHub User @komisan19 (18901496) <komiyama6219@gmail.com>
+GitHub User @korzhao (64203902) <korzhao95@gmail.com>
 GitHub User @Kropekk (13366453) <kamilkropiewnicki@gmail.com>
+GitHub User @lgbgbl (65756378) <lgbgbl@qq.com>
 GitHub User @lhl2617 (33488131) <l.h.lee2617@gmail.com>
 GitHub User @linguohua (3434367) <lghchinaidea@gmail.com>
+GitHub User @lloydchang (1329685) <lloydchang@gmail.com>
 GitHub User @LotusFenn (13775899) <fenn.lotus@gmail.com>
+GitHub User @luochuanhang (96416201) <chuanhangluo@gmail.com>
 GitHub User @ly303550688 (11519839) <yang.liu636@gmail.com>
 GitHub User @madiganz (18340029) <zacharywmadigan@gmail.com>
 GitHub User @maltalex (10195391) <code@bit48.net>
@@ -976,6 +1014,7 @@
 GitHub User @mkishere (224617) <224617+mkishere@users.noreply.github.com>
 GitHub User @nu50218 (40682920) <nu_ll@icloud.com>
 GitHub User @OlgaVlPetrova (44112727) <OVPpetrova@gmail.com>
+GitHub User @pierwill (19642016) <pierwill@users.noreply.github.com>
 GitHub User @pityonline (438222) <pityonline@gmail.com>
 GitHub User @po3rin (29445112) <abctail30@gmail.com>
 GitHub User @pokutuna (57545) <popopopopokutuna@gmail.com>
@@ -983,13 +1022,18 @@
 GitHub User @pytimer (17105586) <lixin20101023@gmail.com>
 GitHub User @qcrao (7698088) <qcrao91@gmail.com>
 GitHub User @ramenjuniti (32011829) <ramenjuniti@gmail.com>
+GitHub User @renthraysk (30576707) <renthraysk@gmail.com>
+GitHub User @roudkerk (52280478) <roudkerk@google.com>
 GitHub User @saitarunreddy (21041941) <saitarunreddypalla@gmail.com>
 GitHub User @SataQiu (9354727) <shidaqiu2018@gmail.com>
+GitHub User @seifchen (23326132) <chenxuefeng1207@gmail.com>
 GitHub User @shogo-ma (9860598) <Choroma194@gmail.com>
 GitHub User @sivchari (55221074) <shibuuuu5@gmail.com>
 GitHub User @skanehira (7888591) <sho19921005@gmail.com>
 GitHub User @soolaugust (10558124) <soolaugust@gmail.com>
 GitHub User @surechen (7249331) <surechen17@gmail.com>
+GitHub User @syumai (6882878) <syumai@gmail.com>
+GitHub User @tangxi666 (48145175) <tx1275044634@gmail.com>
 GitHub User @tatsumack (4510569) <tatsu.mack@gmail.com>
 GitHub User @tell-k (26263) <ffk2005@gmail.com>
 GitHub User @tennashi (10219626) <tennashio@gmail.com>
@@ -999,6 +1043,7 @@
 GitHub User @uropek (39370426) <uropek@gmail.com>
 GitHub User @utkarsh-extc (53217283) <utkarsh.extc@gmail.com>
 GitHub User @witchard (4994659) <witchard@hotmail.co.uk>
+GitHub User @wmdngngng (22067700) <wangmingdong@gmail.com>
 GitHub User @wolf1996 (5901874) <ksgiv37@gmail.com>
 GitHub User @yah01 (12216890) <kagaminehuan@gmail.com>
 GitHub User @yuanhh (1298735) <yuan415030@gmail.com>
@@ -1029,12 +1074,14 @@
 Guilherme Goncalves <guilhermeaugustosg@gmail.com>
 Guilherme Rezende <guilhermebr@gmail.com>
 Guilherme Souza <32180229+gqgs@users.noreply.github.com>
+Guillaume Blaquiere <guillaume.blaquiere@gmail.com>
 Guillaume J. Charmes <guillaume@charmes.net>
 Guillaume Sottas <guillaumesottas@gmail.com>
 Günther Noack <gnoack@google.com>
 Guobiao Mei <meiguobiao@gmail.com>
 Guodong Li <guodongli@google.com>
 Guoliang Wang <iamwgliang@gmail.com>
+Guoqi Chen <chenguoqi@loongson.cn>
 Gustav Paul <gustav.paul@gmail.com>
 Gustav Westling <gustav@westling.xyz>
 Gustavo Franco <gustavorfranco@gmail.com>
@@ -1050,6 +1097,8 @@
 Hanjun Kim <hallazzang@gmail.com>
 Hanlin He <hanling.he@gmail.com>
 Hanlin Shi <shihanlin9@gmail.com>
+Hans Nielsen <hans@stackallocated.com>
+Hao Mou <mouhao.mu@gmail.com>
 Haoran Luo <haoran.luo@chaitin.com>
 Haosdent Huang <haosdent@gmail.com>
 Harald Nordgren <haraldnordgren@gmail.com>
@@ -1126,6 +1175,7 @@
 Ikko Ashimine <eltociear@gmail.com>
 Illya Yalovyy <yalovoy@gmail.com>
 Ilya Chukov <56119080+Elias506@users.noreply.github.com>
+Ilya Mateyko <me@astrophena.name>
 Ilya Sinelnikov <sidhmangh@gmail.com>
 Ilya Tocar <ilya.tocar@intel.com>
 INADA Naoki <songofacandy@gmail.com>
@@ -1157,6 +1207,7 @@
 Jaap Aarts <jaap.aarts1@gmail.com>
 Jack Britton <jackxbritton@gmail.com>
 Jack Lindamood <jlindamo@justin.tv>
+Jack You <jamesyou@google.com>
 Jacob Baskin <jbaskin@google.com>
 Jacob Blain Christen <dweomer5@gmail.com>
 Jacob H. Haven <jacob@cloudflare.com>
@@ -1165,6 +1216,7 @@
 Jaden Teng <long.asyn@gmail.com>
 Jae Kwon <jae@tendermint.com>
 Jake B <doogie1012@gmail.com>
+Jake Ciolek <jakub@ciolek.dev>
 Jakob Borg <jakob@nym.se>
 Jakob Weisblat <jakobw@mit.edu>
 Jakub Čajka <jcajka@redhat.com>
@@ -1183,6 +1235,7 @@
 James Fennell <jpfennell@google.com>
 James Fysh <james.fysh@gmail.com>
 James Gray <james@james4k.com>
+James Harris <mailjamesharris@gmail.com>
 James Hartig <fastest963@gmail.com>
 James Kasten <jdkasten@google.com>
 James Lawrence <jljatone@gmail.com>
@@ -1246,6 +1299,7 @@
 Jean-André Santoni <jean.andre.santoni@gmail.com>
 Jean-François Bustarret <jf@bustarret.com>
 Jean-Francois Cantin <jfcantin@gmail.com>
+Jean-Hadrien Chabran <jh@chabran.fr>
 Jean-Marc Eurin <jmeurin@google.com>
 Jean-Nicolas Moal <jn.moal@gmail.com>
 Jed Denlea <jed@fastly.com>
@@ -1260,6 +1314,7 @@
 Jeff R. Allen <jra@nella.org> <jeff.allen@gmail.com>
 Jeff Sickel <jas@corpus-callosum.com>
 Jeff Wendling <jeff@spacemonkey.com>
+Jeff Wentworth <j.wentworth@gmail.com>
 Jeff Widman <jeff@jeffwidman.com>
 Jeffrey H <jeffreyh192@gmail.com>
 Jelte Fennema <github-tech@jeltef.nl>
@@ -1282,6 +1337,7 @@
 Jia Zhan <jzhan@uber.com>
 Jiacai Liu <jiacai2050@gmail.com>
 Jiahao Lu <lujjjh@gmail.com>
+Jiahua Wang <wjh180909@gmail.com>
 Jianing Yu <jnyu@google.com>
 Jianqiao Li <jianqiaoli@google.com>
 Jiayu Yi <yijiayu@gmail.com>
@@ -1298,10 +1354,12 @@
 Jingguo Yao <yaojingguo@gmail.com>
 Jingnan Si <jingnan.si@gmail.com>
 Jinkun Zhang <franksnolf@gmail.com>
+Jinwen Wo <wojinwen@huawei.com>
 Jiong Du <londevil@gmail.com>
 Jirka Daněk <dnk@mail.muni.cz>
 Jiulong Wang <jiulongw@gmail.com>
 Joakim Sernbrant <serbaut@gmail.com>
+Jochen Weber <jochen.weber80@gmail.com>
 Joe Bowbeer <joe.bowbeer@gmail.com>
 Joe Cortopassi <joe@joecortopassi.com>
 Joe Farrell <joe2farrell@gmail.com>
@@ -1324,6 +1382,7 @@
 Johan Jansson <johan.jansson@iki.fi>
 Johan Knutzen <johan@senri.se>
 Johan Sageryd <j@1616.se>
+Johannes Altmanninger <aclopte@gmail.com>
 Johannes Huning <johannes.huning@gmail.com>
 John Asmuth <jasmuth@gmail.com>
 John Bampton <jbampton@gmail.com>
@@ -1338,10 +1397,12 @@
 John Jago <johnjago@protonmail.com>
 John Jeffery <jjeffery@sp.com.au>
 John Jenkins <twodopeshaggy@gmail.com>
+John Kelly <jkelly@squarespace.com>
 John Leidegren <john.leidegren@gmail.com>
 John McCabe <john@johnmccabe.net>
 John Moore <johnkenneth.moore@gmail.com>
 John Newlin <jnewlin@google.com>
+John Olheiser <john.olheiser@gmail.com>
 John Papandriopoulos <jpap.code@gmail.com>
 John Potocny <johnp@vividcortex.com>
 John R. Lenton <jlenton@gmail.com>
@@ -1382,6 +1443,7 @@
 Jordi Martin <jordimartin@gmail.com>
 Jorge Araya <jorgejavieran@yahoo.com.mx>
 Jorge L. Fatta <jorge.fatta@auth0.com>
+Jorge Troncoso <jatron@google.com>
 Jos Visser <josv@google.com>
 Josa Gesell <josa@gesell.me>
 Jose Luis Vázquez González <josvazg@gmail.com>
@@ -1508,6 +1570,7 @@
 Kezhu Wang <kezhuw@gmail.com>
 Khosrow Moossavi <khos2ow@gmail.com>
 Kieran Colford <kieran@kcolford.com>
+Kieran Gorman <kieran.j.gorman@gmail.com>
 Kim Shrier <kshrier@racktopsystems.com>
 Kim Yongbin <kybinz@gmail.com>
 Kir Kolyshkin <kolyshkin@gmail.com>
@@ -1577,6 +1640,7 @@
 Lev Shamardin <shamardin@gmail.com>
 Lewin Bormann <lewin.bormann@gmail.com>
 Lewis Waddicor <nemesismk2@gmail.com>
+Li-Yu Yu <aaronyu@google.com>
 Liam Haworth <liam@haworth.id.au>
 Lily Chung <lilithkchung@gmail.com>
 Lingchao Xin <douglarek@gmail.com>
@@ -1657,7 +1721,9 @@
 Mark Bucciarelli <mkbucc@gmail.com>
 Mark Dain <mark@markdain.net>
 Mark Glines <mark@glines.org>
+Mark Hansen <markhansen@google.com>
 Mark Harrison <marhar@google.com>
+Mark Jeffery <dandare100@gmail.com>
 Mark Percival <m@mdp.im>
 Mark Pulford <mark@kyne.com.au>
 Mark Rushakoff <mark.rushakoff@gmail.com>
@@ -1686,7 +1752,7 @@
 Martin Kreichgauer <martinkr@google.com>
 Martin Kunc <martinkunc@users.noreply.github.com>
 Martin Lindhe <martin.j.lindhe@gmail.com>
-Martin Möhrmann <moehrmann@google.com> <martisch@uos.de>
+Martin Möhrmann <martin@golang.org> <moehrmann@google.com> <martisch@uos.de>
 Martin Neubauer <m.ne@gmx.net>
 Martin Olsen <github.com@martinolsen.net>
 Martin Olsson <martin@minimum.se>
@@ -1741,6 +1807,7 @@
 Matthew Holt <Matthew.Holt+git@gmail.com>
 Matthew Horsnell <matthew.horsnell@gmail.com>
 Matthew Waters <mwwaters@gmail.com>
+Matthias Dötsch <matze@mdoetsch.de>
 Matthias Frei <matthias.frei@inf.ethz.ch>
 Matthieu Hauglustaine <matt.hauglustaine@gmail.com>
 Matthieu Olivier <olivier.matthieu@gmail.com>
@@ -1814,6 +1881,7 @@
 Michal Cierniak <cierniak@google.com>
 Michał Derkacz <ziutek@lnet.pl>
 Michal Franc <lam.michal.franc@gmail.com>
+Michal Hruby <michal@axiom.co>
 Michał Łowicki <mlowicki@gmail.com>
 Michal Pristas <michal.pristas@gmail.com>
 Michal Rostecki <mrostecki@suse.de>
@@ -1844,6 +1912,7 @@
 Mike Strosaker <strosake@us.ibm.com>
 Mike Tsao <mike@sowbug.com>
 Mike Wiacek <mjwiacek@google.com>
+Mikhail Faraponov <11322032+moredure@users.noreply.github.com>
 Mikhail Fesenko <proggga@gmail.com>
 Mikhail Gusarov <dottedmag@dottedmag.net>
 Mikhail Panchenko <m@mihasya.com>
@@ -1870,6 +1939,7 @@
 Moriyoshi Koizumi <mozo@mozo.jp>
 Morten Siebuhr <sbhr@sbhr.dk>
 Môshe van der Sterre <moshevds@gmail.com>
+Mostafa Solati <mostafa.solati@gmail.com>
 Mostyn Bramley-Moore <mostyn@antipode.se>
 Mrunal Patel <mrunalp@gmail.com>
 Muhammad Falak R Wani <falakreyaz@gmail.com>
@@ -1927,6 +1997,7 @@
 Nick Patavalis <nick.patavalis@gmail.com>
 Nick Petroni <npetroni@cs.umd.edu>
 Nick Robinson <nrobinson13@gmail.com>
+Nick Sherron <nsherron90@gmail.com>
 Nick Smolin <nick27surgut@gmail.com>
 Nicolas BRULEZ <n.brulez@gmail.com>
 Nicolas Kaiser <nikai@nikai.net>
@@ -1956,6 +2027,7 @@
 Noble Johnson <noblepoly@gmail.com>
 Nodir Turakulov <nodir@google.com>
 Noel Georgi <git@frezbo.com>
+Nooras Saba <saba@golang.org>
 Norberto Lopes <nlopes.ml@gmail.com>
 Norman B. Lancaster <qbradq@gmail.com>
 Nuno Cruces <ncruces@users.noreply.github.com>
@@ -1973,6 +2045,7 @@
 Oliver Tonnhofer <olt@bogosoft.com>
 Olivier Antoine <olivier.antoine@gmail.com>
 Olivier Duperray <duperray.olivier@gmail.com>
+Olivier Mengué <olivier.mengue@gmail.com>
 Olivier Poitrey <rs@dailymotion.com>
 Olivier Saingre <osaingre@gmail.com>
 Olivier Wulveryck <olivier.wulveryck@gmail.com>
@@ -1982,6 +2055,7 @@
 Ori Rawlings <orirawlings@gmail.com>
 Oryan Moshe <iamoryanmoshe@gmail.com>
 Osamu TONOMORI <osamingo@gmail.com>
+Oscar Söderlund <oscar.soderlund@einride.tech>
 Özgür Kesim <oec-go@kesim.org>
 Pablo Caderno <kaderno@gmail.com>
 Pablo Lalloni <plalloni@gmail.com>
@@ -2014,6 +2088,7 @@
 Patrick Riley <pfr@google.com>
 Patrick Smith <pat42smith@gmail.com>
 Patrik Lundin <patrik@sigterm.se>
+Patrik Nyblom <pnyb@google.com>
 Paul A Querna <paul.querna@gmail.com>
 Paul Borman <borman@google.com>
 Paul Boyd <boyd.paul2@gmail.com>
@@ -2042,6 +2117,7 @@
 Paulo Casaretto <pcasaretto@gmail.com>
 Paulo Flabiano Smorigo <pfsmorigo@linux.vnet.ibm.com>
 Paulo Gomes <paulo.gomes.uk@gmail.com>
+Pavel Kositsyn <kositsyn.pa@phystech.edu>
 Pavel Paulau <pavel.paulau@gmail.com>
 Pavel Watson <watsonpavel@gmail.com>
 Pavel Zinovkin <pavel.zinovkin@gmail.com>
@@ -2049,6 +2125,7 @@
 Pawel Knap <pawelknap88@gmail.com>
 Pawel Szczur <filemon@google.com>
 Paweł Szulik <pawel.szulik@intel.com>
+Pedro Lopez Mareque <pedro.lopez.mareque@gmail.com>
 Pei Xian Chee <luciolas1991@gmail.com>
 Pei-Ming Wu <p408865@gmail.com>
 Pen Tree <appletree2479@outlook.com>
@@ -2164,6 +2241,7 @@
 Ricardo Padilha <ricardospadilha@gmail.com>
 Ricardo Pchevuzinske Katz <ricardo.katz@serpro.gov.br>
 Ricardo Seriani <ricardo.seriani@gmail.com>
+Rich Hong <hong.rich@gmail.com>
 Richard Barnes <rlb@ipv.sx>
 Richard Crowley <r@rcrowley.org>
 Richard Dingwall <rdingwall@gmail.com>
@@ -2179,6 +2257,7 @@
 Rick Sayre <whorfin@gmail.com>
 Rijnard van Tonder <rvantonder@gmail.com>
 Riku Voipio <riku.voipio@linaro.org>
+Riley Avron <ra.git@posteo.net>
 Risto Jaakko Saarelma <rsaarelm@gmail.com>
 Rob Earhart <earhart@google.com>
 Rob Findley <rfindley@google.com>
@@ -2186,8 +2265,10 @@
 Rob Phoenix <rob@robphoenix.com>
 Rob Pike <r@golang.org>
 Robert Ayrapetyan <robert.ayrapetyan@gmail.com>
+Robert Burke <rebo@google.com>
 Robert Daniel Kortschak <dan.kortschak@adelaide.edu.au> <dan@kortschak.io>
 Robert Dinu <r@varp.se>
+Robert Engels <rengels@ix.netcom.com>
 Robert Figueiredo <robfig@gmail.com>
 Robert Griesemer <gri@golang.org>
 Robert Hencke <robert.hencke@gmail.com>
@@ -2212,6 +2293,7 @@
 Rohan Challa <rohan@golang.org>
 Rohan Verma <rohanverma2004@gmail.com>
 Rohith Ravi <entombedvirus@gmail.com>
+Roi Martin <jroi.martin@gmail.com>
 Roland Illig <roland.illig@gmx.de>
 Roland Shoemaker <rolandshoemaker@gmail.com>
 Romain Baugue <romain.baugue@elwinar.com>
@@ -2242,6 +2324,7 @@
 Ryan Dahl <ry@tinyclouds.org>
 Ryan Hitchman <hitchmanr@gmail.com>
 Ryan Kohler <ryankohler@google.com>
+Ryan Leung <rleungx@gmail.com>
 Ryan Lower <rpjlower@gmail.com>
 Ryan Roden-Corrent <ryan@rcorre.net>
 Ryan Seys <ryan@ryanseys.com>
@@ -2275,6 +2358,7 @@
 Samuel Kelemen <SCKelemen@users.noreply.github.com>
 Samuel Tan <samueltan@google.com>
 Samuele Pedroni <pedronis@lucediurna.net>
+San Ye <xyesan@gmail.com>
 Sander van Harmelen <sander@vanharmelen.nl>
 Sanjay Menakuru <balasanjay@gmail.com>
 Santhosh Kumar Tekuri <santhosh.tekuri@gmail.com>
@@ -2339,6 +2423,7 @@
 Shahar Kohanim <skohanim@gmail.com>
 Shailesh Suryawanshi <ss.shailesh28@gmail.com>
 Shamil Garatuev <garatuev@gmail.com>
+Shamim Akhtar <shamim.rhce@gmail.com>
 Shane Hansen <shanemhansen@gmail.com>
 Shang Jian Ding <sding3@ncsu.edu>
 Shaozhen Ding <dsz0111@gmail.com>
@@ -2375,6 +2460,7 @@
 Simon Ferquel <simon.ferquel@docker.com>
 Simon Frei <freisim93@gmail.com>
 Simon Jefford <simon.jefford@gmail.com>
+Simon Law <sfllaw@sfllaw.ca>
 Simon Rawet <simon@rawet.se>
 Simon Rozman <simon@rozman.si>
 Simon Ser <contact@emersion.fr>
@@ -2440,6 +2526,7 @@
 Sukrit Handa <sukrit.handa@utoronto.ca>
 Sunny <me@darkowlzz.space>
 Suriyaa Sundararuban <suriyaasundararuban@gmail.com>
+Suvaditya Sur <suvaditya.sur@gmail.com>
 Suyash <dextrous93@gmail.com>
 Suzy Mueller <suzmue@golang.org>
 Sven Almgren <sven@tras.se>
@@ -2502,6 +2589,7 @@
 Thomas Wanielista <tomwans@gmail.com>
 Thorben Krueger <thorben.krueger@gmail.com>
 Thordur Bjornsson <thorduri@secnorth.net>
+Tiago Peczenyj <tpeczenyj@weborama.com>
 Tiago Queiroz <contato@tiago.eti.br>
 Tianji Wu <the729@gmail.com>
 Tianon Gravi <admwiggin@gmail.com>
@@ -2636,6 +2724,7 @@
 Vojtech Bocek <vbocek@gmail.com>
 Volker Dobler <dr.volker.dobler@gmail.com>
 Volodymyr Paprotski <vpaprots@ca.ibm.com>
+Vyacheslav Pachkov <slava.pach@gmail.com>
 W. Trevor King <wking@tremily.us>
 Wade Simmons <wade@wades.im>
 Wagner Riffel <wgrriffel@gmail.com>
@@ -2653,6 +2742,7 @@
 Wei Xiao <wei.xiao@arm.com>
 Wei Xikai <xykwei@gmail.com>
 Weichao Tang <tevic.tt@gmail.com>
+Weilu Jia <optix2000@gmail.com>
 Weixie Cui <cuiweixie@gmail.com> <523516579@qq.com>
 Wembley G. Leach, Jr <wembley.gl@gmail.com>
 Wenlei (Frank) He <wlhe@google.com>
@@ -2722,9 +2812,11 @@
 Yuji Yaginuma <yuuji.yaginuma@gmail.com>
 Yuki Ito <mrno110y@gmail.com>
 Yuki OKUSHI <huyuumi.dev@gmail.com>
+Yuki Osaki <yuki.osaki7@gmail.com>
 Yuki Yugui Sonoda <yugui@google.com>
 Yukihiro Nishinaka <6elpinal@gmail.com>
 YunQiang Su <syq@debian.org>
+Yuntao Wang <ytcoode@gmail.com>
 Yury Smolsky <yury@smolsky.by>
 Yusuke Kagiwada <block.rxckin.beats@gmail.com>
 Yuusei Kuwana <kuwana@kumama.org>
@@ -2736,7 +2828,9 @@
 Zach Hoffman <zrhoffman@apache.org>
 Zach Jones <zachj1@gmail.com>
 Zachary Amsden <zach@thundertoken.com>
+Zachary Burkett <zburkett@splitcubestudios.com>
 Zachary Gershman <zgershman@pivotal.io>
+Zaiyang Li <zaiyangli777@gmail.com>
 Zak <zrjknill@gmail.com>
 Zakatell Kanda <hi@zkanda.io>
 Zellyn Hunter <zellyn@squareup.com> <zellyn@gmail.com>
@@ -2745,6 +2839,7 @@
 Zheng Dayu <davidzheng23@gmail.com>
 Zheng Xu <zheng.xu@arm.com>
 Zhengyu He <hzy@google.com>
+Zhi Zheng <zhi.zheng052@gmail.com>
 Zhongpeng Lin <zplin@uber.com>
 Zhongtao Chen <chenzhongtao@126.com>
 Zhongwei Yao <zhongwei.yao@arm.com>
diff --git a/VERSION b/VERSION
index d4dd524..54ba52e 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-go1.18rc1
\ No newline at end of file
+go1.18
\ No newline at end of file
diff --git a/bin/go b/bin/go
index 6fa409f..e286e0e 100755
--- a/bin/go
+++ b/bin/go
Binary files differ
diff --git a/bin/gofmt b/bin/gofmt
index 6f53765..f5992f3 100755
--- a/bin/gofmt
+++ b/bin/gofmt
Binary files differ
diff --git a/doc/go1.18.html b/doc/go1.18.html
index c75bfe9..b320579 100644
--- a/doc/go1.18.html
+++ b/doc/go1.18.html
@@ -84,7 +84,7 @@
   <li>
     The new
     <a href="/ref/spec#Predeclared_identifiers">predeclared identifier</a>
-    <code>comparable</code> is an interface the denotes the set of all types which can be
+    <code>comparable</code> is an interface that denotes the set of all types which can be
     compared using <code>==</code> or <code>!=</code>. It may only be used as (or embedded in)
     a type constraint.
   </li>
@@ -135,9 +135,19 @@
       the predeclared functions <code>real</code>, <code>imag</code>, and <code>complex</code>.
       We hope to remove this restriction in Go 1.19.
     </li>
+    <li><!-- https://golang.org/issue/51183 -->
+      The Go compiler currently only supports calling a method <code>m</code> on a value
+      <code>x</code> of type parameter type <code>P</code> if <code>m</code> is explicitly
+      declared by <code>P</code>'s constraint interface.
+      Similarly, method values <code>x.m</code> and method expressions
+      <code>P.m</code> also are only supported if <code>m</code> is explicitly
+      declared by <code>P</code>, even though <code>m</code> might be in the method set
+      of <code>P</code> by virtue of the fact that all types in <code>P</code> implement
+      <code>m</code>. We hope to remove this restriction in Go 1.19.
+    </li>
     <li><!-- https://golang.org/issue/49030 -->
       Embedding a type parameter, or a pointer to a type parameter, as
-      an unnamed field in a struct type is not permitted. Similarly
+      an unnamed field in a struct type is not permitted. Similarly,
       embedding a type parameter in an interface type is not permitted.
       Whether these will ever be permitted is unclear at present.
     </li>
@@ -182,7 +192,7 @@
 
 <p><!-- CL 349595 -->
   Go 1.18 introduces the new <code>GOAMD64</code> environment variable, which selects at compile time
-  a mininum target version of the AMD64 architecture. Allowed values are <code>v1</code>,
+  a minimum target version of the AMD64 architecture. Allowed values are <code>v1</code>,
   <code>v2</code>, <code>v3</code>, or <code>v4</code>. Each higher level requires,
   and takes advantage of, additional processor features. A detailed
   description can be found
@@ -199,6 +209,12 @@
   now supports the <code>c-archive</code> and <code>c-shared</code> build modes.
 </p>
 
+<h3 id="linux">Linux</h3>
+
+<p><!-- golang.org/issue/45964 -->
+  Go 1.18 requires Linux kernel version 2.6.32 or later.
+</p>
+
 <h3 id="windows">Windows</h3>
 
 <p><!-- https://golang.org/issue/49759 -->
@@ -250,6 +266,8 @@
 
 <h3 id="go-command">Go command</h3>
 
+<h4 id="go-get"><code>go</code> <code>get</code></h4>
+
 <p><!-- golang.org/issue/43684 -->
   <code>go</code> <code>get</code> no longer builds or installs packages in
   module-aware mode. <code>go</code> <code>get</code> is now dedicated to
@@ -269,9 +287,25 @@
   and installs packages, as before.
 </p>
 
+<h4 id="go-mod-updates">Automatic <code>go.mod</code> and <code>go.sum</code> updates</h4>
+
+<p><!-- https://go.dev/issue/45551 -->
+  The <code>go</code> <code>mod</code> <code>graph</code>,
+  <code>go</code> <code>mod</code> <code>vendor</code>,
+  <code>go</code> <code>mod</code> <code>verify</code>, and
+  <code>go</code> <code>mod</code> <code>why</code> subcommands
+  no longer automatically update the <code>go.mod</code> and
+  <code>go.sum</code> files.
+  (Those files can be updated explicitly using <code>go</code> <code>get</code>,
+  <code>go</code> <code>mod</code> <code>tidy</code>, or
+  <code>go</code> <code>mod</code> <code>download</code>.)
+</p>
+
+<h4 id="go-version"><code>go</code> <code>version</code></h4>
+
 <p><!-- golang.org/issue/37475 -->
   The <code>go</code> command now embeds version control information in
-  binaries including the currently checked-out revision, commit time, and a
+  binaries. It includes the currently checked-out revision, commit time, and a
   flag indicating whether edited or untracked files are present. Version
   control information is embedded if the <code>go</code> command is invoked in
   a directory within a Git, Mercurial, Fossil, or Bazaar repository, and the
@@ -281,7 +315,7 @@
 </p>
 
 <p><!-- golang.org/issue/37475 -->
-  Additionally, the <code>go</code> command embeds information about the build
+  Additionally, the <code>go</code> command embeds information about the build,
   including build and tool tags (set with <code>-tags</code>), compiler,
   assembler, and linker flags (like <code>-gcflags</code>), whether cgo was
   enabled, and if it was, the values of the cgo environment variables
@@ -303,6 +337,8 @@
   <code>debug/buildinfo</code> package from <code>go</code> 1.18+.
 </p>
 
+<h4 id="go-mod-download"><code>go</code> <code>mod</code> <code>download</code></h4>
+
 <p><!-- https://golang.org/issue/44435 -->
   If the main module's <code>go.mod</code> file
   specifies <a href="/ref/mod#go-mod-file-go"><code>go</code> <code>1.17</code></a>
@@ -316,6 +352,8 @@
   <code>go</code> <code>mod</code> <code>download</code> <code>all</code>.
 </p>
 
+<h4 id="go-mod-vendor"><code>go</code> <code>mod</code> <code>vendor</code></h4>
+
 <p><!-- https://golang.org/issue/47327 -->
   The <code>go</code> <code>mod</code> <code>vendor</code> subcommand now
   supports a <code>-o</code> flag to set the output directory.
@@ -325,12 +363,7 @@
   third-party tools that need to collect package source code.)
 </p>
 
-<p><!-- CL 298612 -->
-  The <code>go</code> <code>build</code> command and related commands
-  now support an <code>-asan</code> flag that enables interoperation
-  with C (or C++) code compiled with the address sanitizer (C compiler
-  option <code>-fsanitize=address</code>).
-</p>
+<h4 id="go-mod-tidy"><code>go</code> <code>mod</code> <code>tidy</code></h4>
 
 <p><!-- https://golang.org/issue/47738, CL 344572 -->
   The <code>go</code> <code>mod</code> <code>tidy</code> command now retains
@@ -342,6 +375,8 @@
   module's <code>go.mod</code> file.
 </p>
 
+<h4 id="go-work"><code>go</code> <code>work</code></h4>
+
 <p><!-- https://golang.org/issue/45713 -->
   The <code>go</code> command now supports a "Workspace" mode. If a
   <code>go.work</code> file is found in the working directory or a
@@ -355,6 +390,17 @@
   documentation.
 </p>
 
+<h4 id="go-build-asan"><code>go</code> <code>build</code> <code>-asan</code></h4>
+
+<p><!-- CL 298612 -->
+  The <code>go</code> <code>build</code> command and related commands
+  now support an <code>-asan</code> flag that enables interoperation
+  with C (or C++) code compiled with the address sanitizer (C compiler
+  option <code>-fsanitize=address</code>).
+</p>
+
+<h4 id="go-test"><code>go</code> <code>test</code></h4>
+
 <p><!-- CL 251441 -->
   The <code>go</code> command now supports additional command line
   options for the new <a href="#fuzzing">fuzzing support described
@@ -376,11 +422,28 @@
   </ul>
 </p>
 
+<h4 id="go-build-lines"><code>//go:build</code> lines</h4>
+
 <p><!-- CL 240611 -->
-  TODO: <a href="https://golang.org/cl/240611">https://golang.org/cl/240611</a>: 240611: cmd/fix: add buildtag fix
+Go 1.17 introduced <code>//go:build</code> lines as a more readable way to write build constraints,
+instead of <code>//</code> <code>+build</code> lines.
+As of Go 1.17, <code>gofmt</code> adds <code>//go:build</code> lines
+to match existing <code>+build</code> lines and keeps them in sync,
+while <code>go</code> <code>vet</code> diagnoses when they are out of sync.
 </p>
 
-<h3 id="gofmt"><code>gofmt</code></h3>
+<p>Since the release of Go 1.18 marks the end of support for Go 1.16,
+all supported versions of Go now understand <code>//go:build</code> lines.
+In Go 1.18, <code>go</code> <code>fix</code> now removes the now-obsolete
+<code>//</code> <code>+build</code> lines in modules declaring
+<code>go</code> <code>1.17</code> or later in their <code>go.mod</code> files.
+</p>
+
+<p>
+For more information, see <a href="https://go.dev/design/draft-gobuild">https://go.dev/design/draft-gobuild</a>.
+</p>
+
+<h3 id="gofmt">Gofmt</h3>
 
 <p><!-- https://golang.org/issue/43566 -->
   <code>gofmt</code> now reads and formats input files concurrently, with a
@@ -388,7 +451,7 @@
   multiple CPUs, <code>gofmt</code> should now be significantly faster.
 </p>
 
-<h3 id="vet"><code>vet</code></h3>
+<h3 id="vet">Vet</h3>
 
 <h4 id="vet-generics">Updates for Generics</h4>
 
@@ -476,7 +539,7 @@
 </p>
 
 <p><!-- CL 298611 -->
-  The new compiler <code>-asan</code> option supports the
+  The new <code>-asan</code> compiler option supports the
   new <code>go</code> command <code>-asan</code> option.
 </p>
 
@@ -506,14 +569,21 @@
 </p>
 
 <p><!-- CL 298610 -->
-  The new linker <code>-asan</code> option supports the
+  The new <code>-asan</code> linker option supports the
   new <code>go</code> command <code>-asan</code> option.
 </p>
 
-<h2 id="build">Build</h2>
+<h2 id="bootstrap">Bootstrap</h2>
 
 <p><!-- CL 369914, CL 370274 -->
-  TODO: <a href="https://golang.org/cl/369914">https://golang.org/cl/369914</a>: for default bootstrap, use Go 1.17 if present, falling back to Go 1.4
+When building a Go release from source and <code>GOROOT_BOOTSTRAP</code>
+is not set, previous versions of Go looked for a Go 1.4 or later bootstrap toolchain
+in the directory <code>$HOME/go1.4</code> (<code>%HOMEDRIVE%%HOMEPATH%\go1.4</code> on Windows).
+Go now looks first for <code>$HOME/go1.17</code> or <code>$HOME/sdk/go1.17</code>
+before falling back to <code>$HOME/go1.4</code>.
+We intend for Go 1.19 to require Go 1.17 or later for bootstrap,
+and this change should make the transition smoother.
+For more details, see <a href="https://go.dev/issue/44505">go.dev/issue/44505</a>.
 </p>
 
 <h2 id="library">Core library</h2>
@@ -640,8 +710,8 @@
     </p>
 
     <p><!-- CL 345570 -->
-      The methods <a href="/pkg/bufio#Reader.Reset"><code>Reader.Reset</code></a> and
-      <a href="/pkg/bufio#Writer.Reset"><code>Writer.Reset</code></a>
+      The <a href="/pkg/bufio#Reader.Reset"><code>Reader.Reset</code></a> and
+      <a href="/pkg/bufio#Writer.Reset"><code>Writer.Reset</code></a> methods
       now use the default buffer size when called on objects with a
       <code>nil</code> buffer.
     </p>
@@ -1003,7 +1073,7 @@
 <dl id="os/user"><dt><a href="/pkg/os/user/">os/user</a></dt>
   <dd>
     <p><!-- CL 330753 -->
-      <a href="/pkg/os/user#User.GroupIds"><code>User.GroupIds</code></a>.
+      <a href="/pkg/os/user#User.GroupIds"><code>User.GroupIds</code></a>
       now uses a Go native implementation when cgo is not available.
     </p>
   </dd>
@@ -1016,7 +1086,7 @@
       <a href="/pkg/reflect/#Value.SetIterKey"><code>Value.SetIterKey</code></a>
       and <a href="/pkg/reflect/#Value.SetIterValue"><code>Value.SetIterValue</code></a>
       methods set a Value using a map iterator as the source. They are equivalent to
-      <code>Value.Set(iter.Key())</code> and <code>Value.Set(iter.Value())</code> but
+      <code>Value.Set(iter.Key())</code> and <code>Value.Set(iter.Value())</code>, but
       do fewer allocations.
     </p>
 
@@ -1101,6 +1171,16 @@
   </dd>
 </dl><!-- runtime/debug -->
 
+<dl id="runtime/pprof"><dt><a href="/pkg/runtime/pprof/">runtime/pprof</a></dt>
+  <dd>
+    <p><!-- CL 324129 -->
+      The CPU profiler now uses per-thread timers on Linux. This increases the
+      maximum CPU usage that a profile can observe, and reduces some forms of
+      bias.
+    </p>
+  </dd>
+</dl><!-- runtime/pprof -->
+
 <dl id="strconv"><dt><a href="/pkg/strconv/">strconv</a></dt>
   <dd>
     <p><!-- CL 343877 -->
@@ -1170,7 +1250,7 @@
     </p>
 
     <p><!-- CL 355570 -->
-      <a href="/pkg/syscall/?GOOS=freebsd#SysProcAttr.Pdeathsig"><code>SysProcAttr.Pdeathsig</code></a>.
+      <a href="/pkg/syscall/?GOOS=freebsd#SysProcAttr.Pdeathsig"><code>SysProcAttr.Pdeathsig</code></a>
       is now supported in FreeBSD.
     </p>
   </dd>
@@ -1179,7 +1259,7 @@
 <dl id="syscall/js"><dt><a href="/pkg/syscall/js/">syscall/js</a></dt>
   <dd>
     <p><!-- CL 356430 -->
-      <code>Wrapper</code> interface has been removed.
+      The <code>Wrapper</code> interface has been removed.
     </p>
   </dd>
 </dl><!-- syscall/js -->
@@ -1251,7 +1331,7 @@
 <dl id="unicode/utf8"><dt><a href="/pkg/unicode/utf8/">unicode/utf8</a></dt>
   <dd>
     <p><!-- CL 345571 -->
-      The <a href="/pkg/unicode/utf8/#AppendRune"><code>AppendRune</code></a> function appends the UTF-8 new
+      The new <a href="/pkg/unicode/utf8/#AppendRune"><code>AppendRune</code></a> function appends the UTF-8
       encoding of a <code>rune</code> to a <code>[]byte</code>.
     </p>
   </dd>
diff --git a/doc/go_spec.html b/doc/go_spec.html
index bf8b5ed..ad12fcf 100644
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1,26 +1,16 @@
 <!--{
-	"Title": "The Go Programming Language Specification - Go 1.18 Draft",
-	"Subtitle": "Version of Feb 14, 2022",
+	"Title": "The Go Programming Language Specification",
+	"Subtitle": "Version of March 10, 2022",
 	"Path": "/ref/spec"
 }-->
 
-<h2>Earlier version</h2>
-
-<p>
-For the pre-Go1.18 specification without generics support see
-<a href="/doc/go1.17_spec.html">The Go Programming Language Specification</a>.
-</p>
-
-<!-- TODO(gri) remove this before the final release -->
-<p><b>
-[For reviewers: Sections where we know of missing prose are marked like this. The markers will be removed before the release.]
-</b></p>
-
 <h2 id="Introduction">Introduction</h2>
 
 <p>
-This is a reference manual for the Go programming language. For
-more information and other documents, see <a href="/">golang.org</a>.
+This is the reference manual for the Go programming language.
+The pre-Go1.18 version, without generics, can be found
+<a href="/doc/go1.17_spec.html">here</a>.
+For more information and other documents, see <a href="/">golang.org</a>.
 </p>
 
 <p>
@@ -766,7 +756,7 @@
 <code>new</code> call or composite literal, or the type of
 an element of a structured variable.
 Variables of interface type also have a distinct <i>dynamic type</i>,
-which is the concrete type of the value assigned to the variable at run time
+which is the (non-interface) type of the value assigned to the variable at run time
 (unless the value is the predeclared identifier <code>nil</code>,
 which has no type).
 The dynamic type may vary during execution but values stored in interface
@@ -812,7 +802,7 @@
 <p>
 The language <a href="#Predeclared_identifiers">predeclares</a> certain type names.
 Others are introduced with <a href="#Type_declarations">type declarations</a>
-or <a href="#Type_parameter_lists">type parameter lists</a>.
+or <a href="#Type_parameter_declarations">type parameter lists</a>.
 <i>Composite types</i>&mdash;array, struct, pointer, function,
 interface, slice, map, and channel types&mdash;may be constructed using
 type literals.
@@ -987,7 +977,7 @@
 </p>
 
 <p>
-A new, initialized slice value for a given element type <code>T</code> is
+A new, initialized slice value for a given element type <code>T</code> may be
 made using the built-in function
 <a href="#Making_slices_maps_and_channels"><code>make</code></a>,
 which takes a slice type
@@ -1422,7 +1412,7 @@
 	~int
 }
 
-// An interface representing all types with underlying type int which implement the String method.
+// An interface representing all types with underlying type int that implement the String method.
 interface {
 	~int
 	String() string
@@ -1455,32 +1445,32 @@
 </p>
 
 <pre>
-// The Floats interface represents all floating-point types
+// The Float interface represents all floating-point types
 // (including any named types whose underlying types are
 // either float32 or float64).
-type Floats interface {
+type Float interface {
 	~float32 | ~float64
 }
 </pre>
 
 <p>
-In a union, a term cannot be a type parameter, and the type sets of all
+In a union, a term cannot be a <a href="#Type_parameter_declarations">type parameter</a>, and the type sets of all
 non-interface terms must be pairwise disjoint (the pairwise intersection of the type sets must be empty).
 Given a type parameter <code>P</code>:
 </p>
 
 <pre>
 interface {
-	P                 // illegal: the term P is a type parameter
-	int | P           // illegal: the term P is a type parameter
-	~int | MyInt      // illegal: the type sets for ~int and MyInt are not disjoint (~int includes MyInt)
-	float32 | Floats  // overlapping type sets but Floats is an interface
+	P                // illegal: P is a type parameter
+	int | P          // illegal: P is a type parameter
+	~int | MyInt     // illegal: the type sets for ~int and MyInt are not disjoint (~int includes MyInt)
+	float32 | Float  // overlapping type sets but Float is an interface
 }
 </pre>
 
 <p>
 Implementation restriction:
-A union with more than one term cannot contain the
+A union (with more than one term) cannot contain the
 <a href="#Predeclared_identifiers">predeclared identifier</a> <code>comparable</code>
 or interfaces that specify methods, or embed <code>comparable</code> or interfaces
 that specify methods.
@@ -1494,12 +1484,12 @@
 </p>
 
 <pre>
-var x Floats                     // illegal: Floats is not a basic interface
+var x Float                     // illegal: Float is not a basic interface
 
-var x interface{} = Floats(nil)  // illegal
+var x interface{} = Float(nil)  // illegal
 
 type Floatish struct {
-	f Floats                 // illegal
+	f Float                 // illegal
 }
 </pre>
 
@@ -1545,7 +1535,7 @@
 </ul>
 
 <p>
-A value <code>x</code> of type <code>T</code> implements an interface if <code>T</code>
+A value of type <code>T</code> implements an interface if <code>T</code>
 implements the interface.
 </p>
 
@@ -1701,10 +1691,9 @@
 is one of the predeclared boolean, numeric, or string types, or a type literal,
 the corresponding underlying type is <code>T</code> itself.
 Otherwise, <code>T</code>'s underlying type is the underlying type of the
-type to which <code>T</code> refers in its <a href="#Type_declarations">type
-declaration</a>. The underlying type of a type parameter is the
-underlying type of its <a href="#Type_constraints">type constraint</a>, which
-is always an interface.
+type to which <code>T</code> refers in its declaration.
+For a type parameter that is the underlying type of its
+<a href="#Type_constraints">type constraint</a>, which is always an interface.
 </p>
 
 <pre>
@@ -1755,7 +1744,7 @@
 </ol>
 
 <p>
-All other interfaces don't have a core type.
+No other interfaces have a core type.
 </p>
 
 <p>
@@ -1775,7 +1764,7 @@
 
 <p>
 By definition, a core type is never a <a href="#Type_definitions">defined type</a>,
-<a href="#Type_parameter_lists">type parameter</a>, or
+<a href="#Type_parameter_declarations">type parameter</a>, or
 <a href="#Interface_types">interface type</a>.
 </p>
 
@@ -1795,7 +1784,7 @@
 </pre>
 
 <p>
-Examples of interfaces whithout core types:
+Examples of interfaces without core types:
 </p>
 
 <pre>
@@ -1805,70 +1794,6 @@
 interface{ &lt;-chan int | chan&lt;- int }      // directional channels have different directions
 </pre>
 
-<h3 id="Specific_types">Specific types</h3>
-
-<p><b>
-[The definition of specific types is not quite correct yet.]
-</b></p>
-
-<p>
-An interface specification that contains <a href="#Interface_types">type elements</a>
-defines a (possibly empty) set of <i>specific types</i>.
-Loosely speaking, these are the types <code>T</code> that appear in the
-interface definition in terms of the form <code>T</code>, <code>~T</code>,
-or in unions of such terms.
-</p>
-
-<p>
-More precisely, for a given interface, the set of specific types corresponds to
-the set 𝑅 of representative types of the interface, if 𝑅 is non-empty and finite.
-Otherwise, if 𝑅 is empty or infinite, the interface has <i>no specific types</i>.
-</p>
-
-<p>
-For a given interface, type element or type term, the set 𝑅 of representative types is defined as follows:
-</p>
-
-<ul>
-	<li>For an interface with no type elements, 𝑅 is the (infinite) set of all types.
-	</li>
-
-	<li>For an interface with type elements,
-		𝑅 is the intersection of the representative types of its type elements.
-	</li>
-
-	<li>For a non-interface type term <code>T</code> or a term of the form <code>~T</code>,
-		𝑅 is the set consisting of the type <code>T</code>.
-	</li>
-
-	<li>For a <i>union</i> of terms
-		<code>t<sub>1</sub>|t<sub>2</sub>|…|t<sub>n</sub></code>,
-		𝑅 is the union of the representative types of the terms.
-	</li>
-</ul>
-
-<p>
-An interface may have specific types even if its <a href="#Interface_types">type set</a>
-is empty.
-</p>
-
-<p>
-Examples of interfaces with their specific types:
-</p>
-
-<pre>
-interface{}                    // no specific types
-interface{ int }               // int
-interface{ ~string }           // string
-interface{ int|~string }       // int, string
-interface{ Celsius|Kelvin }    // Celsius, Kelvin
-interface{ float64|any }       // no specific types (union is all types)
-interface{ int; m() }          // int (but type set is empty because int has no method m)
-interface{ ~int; m() }         // int (but type set is infinite because many integer types have a method m)
-interface{ int; any }          // int
-interface{ int; string }       // no specific types (intersection is empty)
-</pre>
-
 <h3 id="Type_identity">Type identity</h3>
 
 <p>
@@ -1973,21 +1898,21 @@
 <h3 id="Assignability">Assignability</h3>
 
 <p>
-A value <code>x</code> is <i>assignable</i> to a <a href="#Variables">variable</a> of type <code>T</code>
+A value <code>x</code> of type <code>V</code> is <i>assignable</i> to a <a href="#Variables">variable</a> of type <code>T</code>
 ("<code>x</code> is assignable to <code>T</code>") if one of the following conditions applies:
 </p>
 
 <ul>
 <li>
-<code>x</code>'s type is identical to <code>T</code>.
+<code>V</code> and <code>T</code> are identical.
 </li>
 <li>
-<code>x</code>'s type <code>V</code> and <code>T</code> have identical
+<code>V</code> and <code>T</code> have identical
 <a href="#Underlying_types">underlying types</a> and at least one of <code>V</code>
 or <code>T</code> is not a <a href="#Types">named type</a>.
 </li>
 <li>
-<code>x</code>'s type <code>V</code> and <code>T</code> are channel types with
+<code>V</code> and <code>T</code> are channel types with
 identical element types, <code>V</code> is a bidirectional channel,
 and at least one of <code>V</code> or <code>T</code> is not a <a href="#Types">named type</a>.
 </li>
@@ -2008,25 +1933,24 @@
 </ul>
 
 <p>
-Additionally, if <code>x's</code> type <code>V</code> or <code>T</code> are type parameters
-with <a href="#Specific_types">specific types</a>, <code>x</code>
+Additionally, if <code>x</code>'s type <code>V</code> or <code>T</code> are type parameters, <code>x</code>
 is assignable to a variable of type <code>T</code> if one of the following conditions applies:
 </p>
 
 <ul>
 <li>
 <code>x</code> is the predeclared identifier <code>nil</code>, <code>T</code> is
-a type parameter, and <code>x</code> is assignable to each specific type of
-<code>T</code>.
+a type parameter, and <code>x</code> is assignable to each type in
+<code>T</code>'s type set.
 </li>
 <li>
 <code>V</code> is not a <a href="#Types">named type</a>, <code>T</code> is
-a type parameter, and <code>x</code> is assignable to each specific type of
-<code>T</code>.
+a type parameter, and <code>x</code> is assignable to each type in
+<code>T</code>'s type set.
 </li>
 <li>
 <code>V</code> is a type parameter and <code>T</code> is not a named type,
-and values of each specific type of <code>V</code> are assignable
+and values of each type in <code>V</code>'s type set are assignable
 to <code>T</code>.
 </li>
 </ul>
@@ -2036,7 +1960,7 @@
 <p>
 A <a href="#Constants">constant</a> <code>x</code> is <i>representable</i>
 by a value of type <code>T</code>,
-where <code>T</code> is not a <a href="#Type_parameter_lists">type parameter</a>,
+where <code>T</code> is not a <a href="#Type_parameter_declarations">type parameter</a>,
 if one of the following conditions applies:
 </p>
 
@@ -2061,9 +1985,9 @@
 </ul>
 
 <p>
-If <code>T</code> is a type parameter with <a href="#Specific_types">specific types</a>,
+If <code>T</code> is a type parameter,
 <code>x</code> is representable by a value of type <code>T</code> if <code>x</code> is representable
-by a value of each specific type of <code>T</code>.
+by a value of each type in <code>T</code>'s type set.
 </p>
 
 <pre>
@@ -2176,6 +2100,7 @@
 A <i>declaration</i> binds a non-<a href="#Blank_identifier">blank</a> identifier to a
 <a href="#Constant_declarations">constant</a>,
 <a href="#Type_declarations">type</a>,
+<a href="#Type_parameter_declarations">type parameter</a>,
 <a href="#Variable_declarations">variable</a>,
 <a href="#Function_declarations">function</a>,
 <a href="#Labeled_statements">label</a>, or
@@ -2220,13 +2145,13 @@
 	<li>The scope of an identifier denoting a method receiver, function parameter,
 	    or result variable is the function body.</li>
 
-	<li>The scope of an identifier denoting a type parameter of a generic function
+	<li>The scope of an identifier denoting a type parameter of a function
 	    or declared by a method receiver is the function body and all parameter lists of the
 	    function.
 	</li>
 
-	<li>The scope of an identifier denoting a type parameter of a generic type
-	    begins after the name of the generic type and ends at the end
+	<li>The scope of an identifier denoting a type parameter of a type
+	    begins after the name of the type and ends at the end
 	    of the TypeSpec.</li>
 
 	<li>The scope of a constant or variable identifier declared
@@ -2512,7 +2437,7 @@
 
 type TreeNode struct {
 	left, right *TreeNode
-	value *Comparable
+	value any
 }
 
 type Block interface {
@@ -2573,7 +2498,7 @@
 </pre>
 
 <p>
-If the type definition specifies <a href="#Type_parameter_lists">type parameters</a>,
+If the type definition specifies <a href="#Type_parameter_declarations">type parameters</a>,
 the type name denotes a <i>generic type</i>.
 Generic types must be <a href="#Instantiations">instantiated</a> when they
 are used.
@@ -2584,15 +2509,10 @@
 	next  *List[T]
 	value T
 }
-
-type Tree[T constraints.Ordered] struct {
-	left, right *Tree[T]
-	value       T
-}
 </pre>
 
 <p>
-The given type cannot be a type parameter in a type definition.
+In a type definition the given type cannot be a type parameter.
 </p>
 
 <pre>
@@ -2604,8 +2524,8 @@
 </pre>
 
 <p>
-A generic type may also have methods associated with it. In this case,
-the method receivers must declare the same number of type parameters as
+A generic type may also have <a href="#Method_declarations">methods</a> associated with it.
+In this case, the method receivers must declare the same number of type parameters as
 present in the generic type definition.
 </p>
 
@@ -2614,7 +2534,7 @@
 func (l *List[T]) Len() int  { … }
 </pre>
 
-<h3 id="Type_parameter_lists">Type parameter lists</h3>
+<h3 id="Type_parameter_declarations">Type parameter declarations</h3>
 
 <p>
 A type parameter list declares the <i>type parameters</i> of a generic function or type declaration.
@@ -2653,22 +2573,22 @@
 
 <p>
 A parsing ambiguity arises when the type parameter list for a generic type
-declares a single type parameter with a type constraint of the form <code>*C</code>
-or <code>(C)</code> where <code>C</code> is not a (possibly parenthesized)
-<a href="#Types">type literal</a>:
+declares a single type parameter <code>P</code> with a constraint <code>C</code>
+such that the text <code>P C</code> forms a valid expression:
 </p>
 
 <pre>
 type T[P *C] …
 type T[P (C)] …
+type T[P *C|Q] …
+…
 </pre>
 
 <p>
-In these rare cases, the type parameter declaration is indistinguishable from
-the expressions <code>P*C</code> or <code>P(C)</code> and the type declaration
-is parsed as an array type declaration.
-To resolve the ambiguity, embed the constraint in an interface or use a trailing
-comma:
+In these rare cases, the type parameter list is indistinguishable from an
+expression and the type declaration is parsed as an array type declaration.
+To resolve the ambiguity, embed the constraint in an
+<a href="#Interface_types">interface</a> or use a trailing comma:
 </p>
 
 <pre>
@@ -2682,6 +2602,11 @@
 with a generic type.
 </p>
 
+<!--
+This section needs to explain if and what kind of cycles are permitted
+using type parameters in a type parameter list.
+-->
+
 <h4 id="Type_constraints">Type constraints</h4>
 
 <p>
@@ -2701,10 +2626,10 @@
 </p>
 
 <pre>
-[T *P]                             // = [T interface{*P}]
-[T ~int]                           // = [T interface{~int}]
-[T int|string]                     // = [T interface{int|string}]
-type Constraint ~int               // illegal: ~int is not inside a type parameter list
+[T []P]                      // = [T interface{[]P}]
+[T ~int]                     // = [T interface{~int}]
+[T int|string]               // = [T interface{int|string}]
+type Constraint ~int         // illegal: ~int is not inside a type parameter list
 </pre>
 
 <!--
@@ -2716,7 +2641,7 @@
 <p>
 The <a href="#Predeclared_identifiers">predeclared</a>
 <a href="#Interface_types">interface type</a> <code>comparable</code>
-denotes the set of all concrete (non-interface) types that are
+denotes the set of all non-interface types that are
 <a href="#Comparison_operators">comparable</a>. Specifically,
 a type <code>T</code> implements <code>comparable</code> if:
 </p>
@@ -2897,14 +2822,14 @@
 </pre>
 
 <p>
-If the function declaration specifies <a href="#Type_parameter_lists">type parameters</a>,
+If the function declaration specifies <a href="#Type_parameter_declarations">type parameters</a>,
 the function name denotes a <i>generic function</i>.
-Generic functions must be <a href="#Instantiations">instantiated</a> when they
-are used.
+A generic function must be <a href="#Instantiations">instantiated</a> before it can be
+called or used as a value.
 </p>
 
 <pre>
-func min[T constraints.Ordered](x, y T) T {
+func min[T ~int|~float64](x, y T) T {
 	if x &lt; y {
 		return x
 	}
@@ -2963,7 +2888,7 @@
 </p>
 
 <p>
-Given defined type <code>Point</code>, the declarations
+Given defined type <code>Point</code> the declarations
 </p>
 
 <pre>
@@ -2987,13 +2912,10 @@
 If the receiver base type is a <a href="#Type_declarations">generic type</a>, the
 receiver specification must declare corresponding type parameters for the method
 to use. This makes the receiver type parameters available to the method.
-</p>
-
-<p>
 Syntactically, this type parameter declaration looks like an
-<a href="#Instantiations">instantiation</a> of the receiver base type, except that
-the type arguments are the type parameters being declared, one for each type parameter
-of the receiver base type.
+<a href="#Instantiations">instantiation</a> of the receiver base type: the type
+arguments must be identifiers denoting the type parameters being declared, one
+for each type parameter of the receiver base type.
 The type parameter names do not need to match their corresponding parameter names in the
 receiver base type definition, and all non-blank parameter names must be unique in the
 receiver parameter section and the method signature.
@@ -3007,8 +2929,8 @@
 	b B
 }
 
-func (p Pair[A, B]) Swap() Pair[B, A]  { return Pair[B, A]{p.b, p.a} }
-func (p Pair[First, _]) First() First  { return p.a }
+func (p Pair[A, B]) Swap() Pair[B, A]  { … }  // receiver declares A, B
+func (p Pair[First, _]) First() First  { … }  // receiver declares First, corresponds to A in Pair
 </pre>
 
 <h2 id="Expressions">Expressions</h2>
@@ -3048,6 +2970,14 @@
 operand only on the left-hand side of an <a href="#Assignments">assignment</a>.
 </p>
 
+<p>
+Implementation restriction: A compiler need not report an error if an operand's
+type is a <a href="#Type_parameter_declarations">type parameter</a> with an empty
+<a href="#Interface_types">type set</a>. Functions with such type parameters
+cannot be <a href="#Instantiations">instantiated</a>; any attempt will lead
+to an error at the instantiation site.
+</p>
+
 <h3 id="Qualified_identifiers">Qualified identifiers</h3>
 
 <p>
@@ -3354,10 +3284,6 @@
 
 <h3 id="Selectors">Selectors</h3>
 
-<p><b>
-[This section is missing rules for x.f where x's type is a type parameter and f is a field.]
-</b></p>
-
 <p>
 For a <a href="#Primary_expressions">primary expression</a> <code>x</code>
 that is not a <a href="#Package_clause">package name</a>, the
@@ -3758,7 +3684,7 @@
 </p>
 
 <p>
-If <code>a</code> is not a map:
+If <code>a</code> is neither a map nor a type parameter:
 </p>
 <ul>
 	<li>the index <code>x</code> must be an untyped constant or its
@@ -3827,23 +3753,22 @@
 </ul>
 
 <p>
-For <code>a</code> of <a href="#Type_parameter_lists">type parameter type</a> <code>P</code>:
+For <code>a</code> of <a href="#Type_parameter_declarations">type parameter type</a> <code>P</code>:
 </p>
 <ul>
-	<li><code>P</code> must have <a href="#Specific_types">specific types</a>.</li>
 	<li>The index expression <code>a[x]</code> must be valid for values
-	    of all specific types of <code>P</code>.</li>
-	<li>The element types of all specific types of <code>P</code> must be identical.
+	    of all types in <code>P</code>'s type set.</li>
+	<li>The element types of all types in <code>P</code>'s type set must be identical.
 	    In this context, the element type of a string type is <code>byte</code>.</li>
-	<li>If there is a map type among the specific types of <code>P</code>,
-	    all specific types must be map types, and the respective key types
+	<li>If there is a map type in the type set of <code>P</code>,
+	    all types in that type set must be map types, and the respective key types
 	    must be all identical.</li>
 	<li><code>a[x]</code> is the array, slice, or string element at index <code>x</code>,
 	    or the map element with key <code>x</code> of the type argument
 	    that <code>P</code> is instantiated with, and the type of <code>a[x]</code> is
 	    the type of the (identical) element types.</li>
-	<li><code>a[x]</code> may not be assigned to if the specific types of <code>P</code>
-	    include string types.
+	<li><code>a[x]</code> may not be assigned to if <code>P</code>'s type set
+	    includes string types.
 </ul>
 
 <p>
@@ -4021,7 +3946,7 @@
 
 <p>
 For an expression <code>x</code> of <a href="#Interface_types">interface type</a>,
-but not a <a href="#Type_parameter_lists">type parameter</a>, and a type <code>T</code>,
+but not a <a href="#Type_parameter_declarations">type parameter</a>, and a type <code>T</code>,
 the primary expression
 </p>
 
@@ -4236,7 +4161,7 @@
 <p>
 A generic function or type is <i>instantiated</i> by substituting <i>type arguments</i>
 for the type parameters.
-Instantiation proceeds in two phases:
+Instantiation proceeds in two steps:
 </p>
 
 <ol>
@@ -4249,7 +4174,7 @@
 
 <li>
 After substitution, each type argument must <a href="#Interface_types">implement</a>
-the <a href="#Type_parameter_lists">constraint</a> (instantiated, if necessary)
+the <a href="#Type_parameter_declarations">constraint</a> (instantiated, if necessary)
 of the corresponding type parameter. Otherwise instantiation fails.
 </li>
 </ol>
@@ -4262,55 +4187,57 @@
 <pre>
 type parameter list    type arguments    after substitution
 
-[P any]                int               [int any]
-[S ~[]E, E any]        []int, int        [[]int ~[]int, int any]
-[P io.Writer]          string            [string io.Writer]         // illegal: string doesn't implement io.Writer
+[P any]                int               int implements any
+[S ~[]E, E any]        []int, int        []int implements ~[]int, int implements any
+[P io.Writer]          string            illegal: string doesn't implement io.Writer
 </pre>
 
 <p>
-Type arguments may be provided explicitly, or they may be partially or completely
-<a href="#Type_inference">inferred</a>.
-A partially provided type argument list cannot be empty; there must be at least the
-first argument.
-</p>
-
-<pre>
-type T[P1 ~int, P2 ~[]P1] struct{ … }
-
-T[]            // illegal: at least the first type argument must be present, even if it could be inferred
-T[int]         // argument for P1 explicitly provided, argument for P2 inferred
-T[int, []int]  // both arguments explicitly provided
-</pre>
-
-<p>
-A partial type argument list specifies a prefix of the full list of type arguments, leaving
-the remaining arguments to be inferred. Loosely speaking, type arguments may be omitted from
-"right to left".
-</p>
-
-<p>
-Generic types, and generic functions that are not <a href="#Calls">called</a>,
-require a type argument list for instantiation; if the list is partial, all
+For a generic function, type arguments may be provided explicitly, or they
+may be partially or completely <a href="#Type_inference">inferred</a>.
+A generic function that is is <i>not</i> <a href="#Calls">called</a> requires a
+type argument list for instantiation; if the list is partial, all
 remaining type arguments must be inferrable.
-Calls to generic functions may provide a (possibly partial) type
+A generic function that is called may provide a (possibly partial) type
 argument list, or may omit it entirely if the omitted type arguments are
 inferrable from the ordinary (non-type) function arguments.
 </p>
 
 <pre>
-func min[T constraints.Ordered](x, y T) T { … }
+func min[T ~int|~float64](x, y T) T { … }
 
-f := min                   // illegal: min must be instantiated when used without being called
+f := min                   // illegal: min must be instantiated with type arguments when used without being called
 minInt := min[int]         // minInt has type func(x, y int) int
 a := minInt(2, 3)          // a has value 2 of type int
 b := min[float64](2.0, 3)  // b has value 2.0 of type float64
 c := min(b, -1)            // c has value -1.0 of type float64
 </pre>
 
+<p>
+A partial type argument list cannot be empty; at least the first argument must be present.
+The list is a prefix of the full list of type arguments, leaving the remaining arguments
+to be inferred. Loosely speaking, type arguments may be omitted from "right to left".
+</p>
+
+<pre>
+func apply[S ~[]E, E any](s S, f(E) E) S { … }
+
+f0 := apply[]                  // illegal: type argument list cannot be empty
+f1 := apply[[]int]             // type argument for S explicitly provided, type argument for E inferred
+f2 := apply[[]string, string]  // both type arguments explicitly provided
+
+var bytes []byte
+r := apply(bytes, func(byte) byte { … })  // both type arguments inferred from the function arguments
+</pre>
+
+<p>
+For a generic type, all type arguments must always be provided explicitly.
+</p>
+
 <h3 id="Type_inference">Type inference</h3>
 
 <p>
-Missing type arguments may be <i>inferred</i> by a series of steps, described below.
+Missing function type arguments may be <i>inferred</i> by a series of steps, described below.
 Each step attempts to use known information to infer additional type arguments.
 Type inference stops as soon as all type arguments are known.
 After type inference is complete, it is still necessary to substitute all type arguments
@@ -4326,7 +4253,7 @@
 
 <ul>
 <li>
-	a <a href="#Type_parameter_lists">type parameter list</a>
+	a <a href="#Type_parameter_declarations">type parameter list</a>
 </li>
 <li>
 	a substitution map <i>M</i> initialized with the known type arguments, if any
@@ -4491,9 +4418,8 @@
 </p>
 
 <p>
-Function argument type inference can be used when the function has ordinary parameters
-whose types are defined using the function's type parameters. Inference happens in two
-separate phases; each phase operates on a specific list of (parameter, argument) pairs:
+Inference happens in two separate phases; each phase operates on a specific list of
+(parameter, argument) pairs:
 </p>
 
 <ol>
@@ -4550,7 +4476,7 @@
 </p>
 
 <pre>
-func min[T constraints.Ordered](x, y T) T
+func min[T ~int|~float64](x, y T) T
 
 var x int
 min(x, 2.0)    // T is int, inferred from typed argument x; 2.0 is assignable to int
@@ -4841,9 +4767,8 @@
 </pre>
 
 <p>
-Excluding shifts, if the operand type is a <a href="#Type_parameter_lists">type parameter</a>,
-it must have <a href="#Specific_types">specific types</a>, and the operator must
-apply to each specific type.
+If the operand type is a <a href="#Type_parameter_declarations">type parameter</a>,
+the operator must apply to each type in that type set.
 The operands are represented as values of the type argument that the type parameter
 is <a href="#Instantiations">instantiated</a> with, and the operation is computed
 with the precision of that type argument. For example, given the function:
@@ -4866,11 +4791,6 @@
 respectively, depending on the type argument for <code>F</code>.
 </p>
 
-<p>
-For shifts, the <a href="#Core_types">core type</a> of both operands must be
-an integer.
-</p>
-
 <h4 id="Integer_operators">Integer operators</h4>
 
 <p>
@@ -5296,7 +5216,7 @@
 </p>
 
 <p>
-Converting a constant to a type that is not a <a href="#Type_parameter_lists">type parameter</a>
+Converting a constant to a type that is not a <a href="#Type_parameter_declarations">type parameter</a>
 yields a typed constant.
 </p>
 
@@ -5351,7 +5271,7 @@
 	<li>
 	ignoring struct tags (see below),
 	<code>x</code>'s type and <code>T</code> are not
-	<a href="#Type_parameter_lists">type parameters</a> but have
+	<a href="#Type_parameter_declarations">type parameters</a> but have
 	<a href="#Type_identity">identical</a> <a href="#Types">underlying types</a>.
 	</li>
 	<li>
@@ -5383,23 +5303,23 @@
 
 <p>
 Additionally, if <code>T</code> or <code>x</code>'s type <code>V</code> are type
-parameters with <a href="#Specific_types">specific types</a>, <code>x</code>
+parameters, <code>x</code>
 can also be converted to type <code>T</code> if one of the following conditions applies:
 </p>
 
 <ul>
 <li>
 Both <code>V</code> and <code>T</code> are type parameters and a value of each
-specific type of <code>V</code> can be converted to each specific type
-of <code>T</code>.
+type in <code>V</code>'s type set can be converted to each type in <code>T</code>'s
+type set.
 </li>
 <li>
 Only <code>V</code> is a type parameter and a value of each
-specific type of <code>V</code> can be converted to <code>T</code>.
+type in <code>V</code>'s type set can be converted to <code>T</code>.
 </li>
 <li>
 Only <code>T</code> is a type parameter and <code>x</code> can be converted to each
-specific type of <code>T</code>.
+type in <code>T</code>'s type set.
 </li>
 </ul>
 
@@ -6270,7 +6190,7 @@
 Cases then match actual types <code>T</code> against the dynamic type of the
 expression <code>x</code>. As with type assertions, <code>x</code> must be of
 <a href="#Interface_types">interface type</a>, but not a
-<a href="#Type_parameter_lists">type parameter</a>, and each non-interface type
+<a href="#Type_parameter_declarations">type parameter</a>, and each non-interface type
 <code>T</code> listed in a case must implement the type of <code>x</code>.
 The types listed in the cases of a type switch must all be
 <a href="#Type_identity">different</a>.
@@ -6352,7 +6272,7 @@
 </pre>
 
 <p>
-A <a href="#Type_parameter_lists">type parameter</a> or a <a href="#Type_declarations">generic type</a>
+A <a href="#Type_parameter_declarations">type parameter</a> or a <a href="#Type_declarations">generic type</a>
 may be used as a type in a case. If upon <a href="#Instantiations">instantiation</a> that type turns
 out to duplicate another entry in the switch, the first matching case is chosen.
 </p>
@@ -7093,10 +7013,9 @@
 </pre>
 
 <p>
-If the argument type is a <a href="#Type_parameter_lists">type parameter</a> <code>P</code>,
-<code>P</code> must have <a href="#Specific_types">specific types</a>, and
+If the argument type is a <a href="#Type_parameter_declarations">type parameter</a> <code>P</code>,
 the call <code>len(e)</code> (or <code>cap(e)</code> respectively) must be valid for
-each specific type of <code>P</code>.
+each type in <code>P</code>'s type set.
 The result is the length (or capacity, respectively) of the argument whose type
 corresponds to the type argument with which <code>P</code> was
 <a href="#Instantiations">instantiated</a>.
@@ -7197,8 +7116,9 @@
 
 
 <p>
-Each of the size arguments <code>n</code> and <code>m</code> must be of <a href="#Numeric_types">integer type</a>
-or an untyped <a href="#Constants">constant</a>.
+Each of the size arguments <code>n</code> and <code>m</code> must be of <a href="#Numeric_types">integer type</a>,
+have a <a href="#Interface_types">type set</a> containing only integer types,
+or be an untyped <a href="#Constants">constant</a>.
 A constant size argument must be non-negative and <a href="#Representability">representable</a>
 by a value of type <code>int</code>; if it is an untyped constant it is given type <code>int</code>.
 If both <code>n</code> and <code>m</code> are provided and are constant, then
@@ -7235,9 +7155,9 @@
 <p>
 The <a href="#Function_types">variadic</a> function <code>append</code>
 appends zero or more values <code>x</code> to a slice <code>s</code>
-and returns the resulting slice.
+and returns the resulting slice of the same type as <code>s</code>.
 The <a href="#Core_types">core type</a> of <code>s</code> must be a slice
-of the form <code>[]E</code>.
+of type <code>[]E</code>.
 The values <code>x</code> are passed to a parameter of type <code>...E</code>
 and the respective <a href="#Passing_arguments_to_..._parameters">parameter
 passing rules</a> apply.
@@ -7247,7 +7167,7 @@
 </p>
 
 <pre class="grammar">
-append(s S, x ...E) S  // E is the element type of the core type of S
+append(s S, x ...E) S  // core type of S is []E
 </pre>
 
 <p>
@@ -7317,9 +7237,8 @@
 </pre>
 
 <p>
-If the type of <code>m</code> is a <a href="#Type_parameter_lists">type parameter</a>,
-it must have <a href="#Specific_types">specific types</a>, all specific types
-must be maps, and they must all have identical key types.
+If the type of <code>m</code> is a <a href="#Type_parameter_declarations">type parameter</a>,
+all types in that type set must be maps, and they must all have identical key types.
 </p>
 
 <p>
@@ -7330,10 +7249,6 @@
 
 <h3 id="Complex_numbers">Manipulating complex numbers</h3>
 
-<p><b>
-[We don't support generic arguments for these built-ins for Go 1.18.]
-</b></p>
-
 <p>
 Three functions assemble and disassemble complex numbers.
 The built-in function <code>complex</code> constructs a complex
@@ -7396,6 +7311,10 @@
 _ = imag(3 &lt;&lt; s)                   // illegal: 3 assumes complex type, cannot shift
 </pre>
 
+<p>
+Arguments of type parameter type are not permitted.
+</p>
+
 <h3 id="Handling_panics">Handling panics</h3>
 
 <p> Two built-in functions, <code>panic</code> and <code>recover</code>,
@@ -7414,7 +7333,7 @@
 terminates the execution of <code>F</code>.
 Any functions <a href="#Defer_statements">deferred</a> by <code>F</code>
 are then executed as usual.
-Next, any deferred functions run by <code>F's</code> caller are run,
+Next, any deferred functions run by <code>F</code>'s caller are run,
 and so on up to any deferred by the top-level function in the executing goroutine.
 At that point, the program is terminated and the error
 condition is reported, including the value of the argument to <code>panic</code>.
@@ -8004,11 +7923,17 @@
 func Slice(ptr *ArbitraryType, len IntegerType) []ArbitraryType
 </pre>
 
+<!--
+These conversions also apply to type parameters with suitable core types.
+Determine if we can simply use core type insted of underlying type here,
+of if the general conversion rules take care of this.
+-->
+
 <p>
 A <code>Pointer</code> is a <a href="#Pointer_types">pointer type</a> but a <code>Pointer</code>
 value may not be <a href="#Address_operators">dereferenced</a>.
-Any pointer or value of <a href="#Types">underlying type</a> <code>uintptr</code> can be converted to
-a type of underlying type <code>Pointer</code> and vice versa.
+Any pointer or value of <a href="#Types">underlying type</a> <code>uintptr</code> can be
+<a href="#Conversions">converted</a> to a type of underlying type <code>Pointer</code> and vice versa.
 The effect of converting between <code>Pointer</code> and <code>uintptr</code> is implementation-defined.
 </p>
 
@@ -8055,7 +7980,8 @@
 
 <p>
 A (variable of) type <code>T</code> has <i>variable size</i> if <code>T</code>
-is a type parameter, or if it is an array or struct type containing elements
+is a <a href="#Type_parameter_declarations">type parameter</a>, or if it is an
+array or struct type containing elements
 or fields of variable size. Otherwise the size is <i>constant</i>.
 Calls to <code>Alignof</code>, <code>Offsetof</code>, and <code>Sizeof</code>
 are compile-time <a href="#Constant_expressions">constant expressions</a> of
diff --git a/misc/cgo/testsanitizers/asan_test.go b/misc/cgo/testsanitizers/asan_test.go
index 1b70bce..22dcf23 100644
--- a/misc/cgo/testsanitizers/asan_test.go
+++ b/misc/cgo/testsanitizers/asan_test.go
@@ -63,7 +63,7 @@
 					// sanitizer library needs a
 					// symbolizer program and can't find it.
 					const noSymbolizer = "external symbolizer"
-					// Check if -asan option can correctly print where the error occured.
+					// Check if -asan option can correctly print where the error occurred.
 					if tc.errorLocation != "" &&
 						!strings.Contains(out, tc.errorLocation) &&
 						!strings.Contains(out, noSymbolizer) &&
diff --git a/pkg/linux_amd64/archive/tar.a b/pkg/linux_amd64/archive/tar.a
index 123cb82..79344af 100644
--- a/pkg/linux_amd64/archive/tar.a
+++ b/pkg/linux_amd64/archive/tar.a
Binary files differ
diff --git a/pkg/linux_amd64/archive/zip.a b/pkg/linux_amd64/archive/zip.a
index bc734a4..18d312f 100644
--- a/pkg/linux_amd64/archive/zip.a
+++ b/pkg/linux_amd64/archive/zip.a
Binary files differ
diff --git a/pkg/linux_amd64/bufio.a b/pkg/linux_amd64/bufio.a
index 20bc1cf..c0b1550 100644
--- a/pkg/linux_amd64/bufio.a
+++ b/pkg/linux_amd64/bufio.a
Binary files differ
diff --git a/pkg/linux_amd64/bytes.a b/pkg/linux_amd64/bytes.a
index faab170..db4e6c6 100644
--- a/pkg/linux_amd64/bytes.a
+++ b/pkg/linux_amd64/bytes.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/asm/internal/arch.a b/pkg/linux_amd64/cmd/asm/internal/arch.a
index 24f3bba..f61c7fc 100644
--- a/pkg/linux_amd64/cmd/asm/internal/arch.a
+++ b/pkg/linux_amd64/cmd/asm/internal/arch.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/asm/internal/asm.a b/pkg/linux_amd64/cmd/asm/internal/asm.a
index eb2dfb9..0ae26ee 100644
--- a/pkg/linux_amd64/cmd/asm/internal/asm.a
+++ b/pkg/linux_amd64/cmd/asm/internal/asm.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/asm/internal/flags.a b/pkg/linux_amd64/cmd/asm/internal/flags.a
index 0458d3d..6b32a30 100644
--- a/pkg/linux_amd64/cmd/asm/internal/flags.a
+++ b/pkg/linux_amd64/cmd/asm/internal/flags.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/asm/internal/lex.a b/pkg/linux_amd64/cmd/asm/internal/lex.a
index b1b7e0e..fdb7a40 100644
--- a/pkg/linux_amd64/cmd/asm/internal/lex.a
+++ b/pkg/linux_amd64/cmd/asm/internal/lex.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/abi.a b/pkg/linux_amd64/cmd/compile/internal/abi.a
index 99c1307..ebd5008 100644
--- a/pkg/linux_amd64/cmd/compile/internal/abi.a
+++ b/pkg/linux_amd64/cmd/compile/internal/abi.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/amd64.a b/pkg/linux_amd64/cmd/compile/internal/amd64.a
index edf511a..22290e0 100644
--- a/pkg/linux_amd64/cmd/compile/internal/amd64.a
+++ b/pkg/linux_amd64/cmd/compile/internal/amd64.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/arm.a b/pkg/linux_amd64/cmd/compile/internal/arm.a
index 4fab7a7..b488021 100644
--- a/pkg/linux_amd64/cmd/compile/internal/arm.a
+++ b/pkg/linux_amd64/cmd/compile/internal/arm.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/arm64.a b/pkg/linux_amd64/cmd/compile/internal/arm64.a
index 30a0f8a..e3dc7bd 100644
--- a/pkg/linux_amd64/cmd/compile/internal/arm64.a
+++ b/pkg/linux_amd64/cmd/compile/internal/arm64.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/base.a b/pkg/linux_amd64/cmd/compile/internal/base.a
index ae77e53..06dcdd9 100644
--- a/pkg/linux_amd64/cmd/compile/internal/base.a
+++ b/pkg/linux_amd64/cmd/compile/internal/base.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/bitvec.a b/pkg/linux_amd64/cmd/compile/internal/bitvec.a
index 1b7bc87..e0a51c7 100644
--- a/pkg/linux_amd64/cmd/compile/internal/bitvec.a
+++ b/pkg/linux_amd64/cmd/compile/internal/bitvec.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/deadcode.a b/pkg/linux_amd64/cmd/compile/internal/deadcode.a
index 8a768b2..f2dd31d 100644
--- a/pkg/linux_amd64/cmd/compile/internal/deadcode.a
+++ b/pkg/linux_amd64/cmd/compile/internal/deadcode.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/devirtualize.a b/pkg/linux_amd64/cmd/compile/internal/devirtualize.a
index b7907d0..ae621db 100644
--- a/pkg/linux_amd64/cmd/compile/internal/devirtualize.a
+++ b/pkg/linux_amd64/cmd/compile/internal/devirtualize.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/dwarfgen.a b/pkg/linux_amd64/cmd/compile/internal/dwarfgen.a
index 6cee3e3..c13f565 100644
--- a/pkg/linux_amd64/cmd/compile/internal/dwarfgen.a
+++ b/pkg/linux_amd64/cmd/compile/internal/dwarfgen.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/escape.a b/pkg/linux_amd64/cmd/compile/internal/escape.a
index 5ef9fc7..26c8934 100644
--- a/pkg/linux_amd64/cmd/compile/internal/escape.a
+++ b/pkg/linux_amd64/cmd/compile/internal/escape.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/gc.a b/pkg/linux_amd64/cmd/compile/internal/gc.a
index fc25e5d..f7de97e 100644
--- a/pkg/linux_amd64/cmd/compile/internal/gc.a
+++ b/pkg/linux_amd64/cmd/compile/internal/gc.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/importer.a b/pkg/linux_amd64/cmd/compile/internal/importer.a
index e7a2aed..a1831fc 100644
--- a/pkg/linux_amd64/cmd/compile/internal/importer.a
+++ b/pkg/linux_amd64/cmd/compile/internal/importer.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/inline.a b/pkg/linux_amd64/cmd/compile/internal/inline.a
index 60da9e2..aa77c96 100644
--- a/pkg/linux_amd64/cmd/compile/internal/inline.a
+++ b/pkg/linux_amd64/cmd/compile/internal/inline.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/ir.a b/pkg/linux_amd64/cmd/compile/internal/ir.a
index 9230e8a..2611ebb 100644
--- a/pkg/linux_amd64/cmd/compile/internal/ir.a
+++ b/pkg/linux_amd64/cmd/compile/internal/ir.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/liveness.a b/pkg/linux_amd64/cmd/compile/internal/liveness.a
index 60460fa..c7ddf0d 100644
--- a/pkg/linux_amd64/cmd/compile/internal/liveness.a
+++ b/pkg/linux_amd64/cmd/compile/internal/liveness.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/logopt.a b/pkg/linux_amd64/cmd/compile/internal/logopt.a
index 84dd93f..7aa7c74 100644
--- a/pkg/linux_amd64/cmd/compile/internal/logopt.a
+++ b/pkg/linux_amd64/cmd/compile/internal/logopt.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/mips.a b/pkg/linux_amd64/cmd/compile/internal/mips.a
index a2da816..6040473 100644
--- a/pkg/linux_amd64/cmd/compile/internal/mips.a
+++ b/pkg/linux_amd64/cmd/compile/internal/mips.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/mips64.a b/pkg/linux_amd64/cmd/compile/internal/mips64.a
index 4d8ff33..8073759 100644
--- a/pkg/linux_amd64/cmd/compile/internal/mips64.a
+++ b/pkg/linux_amd64/cmd/compile/internal/mips64.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/noder.a b/pkg/linux_amd64/cmd/compile/internal/noder.a
index 9a89755..02ce0a5 100644
--- a/pkg/linux_amd64/cmd/compile/internal/noder.a
+++ b/pkg/linux_amd64/cmd/compile/internal/noder.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/objw.a b/pkg/linux_amd64/cmd/compile/internal/objw.a
index 8af0856..9fd01a2 100644
--- a/pkg/linux_amd64/cmd/compile/internal/objw.a
+++ b/pkg/linux_amd64/cmd/compile/internal/objw.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/pkginit.a b/pkg/linux_amd64/cmd/compile/internal/pkginit.a
index 07afa10..b6c90e4 100644
--- a/pkg/linux_amd64/cmd/compile/internal/pkginit.a
+++ b/pkg/linux_amd64/cmd/compile/internal/pkginit.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/ppc64.a b/pkg/linux_amd64/cmd/compile/internal/ppc64.a
index 65e3c3c..ea88ce6 100644
--- a/pkg/linux_amd64/cmd/compile/internal/ppc64.a
+++ b/pkg/linux_amd64/cmd/compile/internal/ppc64.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/reflectdata.a b/pkg/linux_amd64/cmd/compile/internal/reflectdata.a
index a410196..02428af 100644
--- a/pkg/linux_amd64/cmd/compile/internal/reflectdata.a
+++ b/pkg/linux_amd64/cmd/compile/internal/reflectdata.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/riscv64.a b/pkg/linux_amd64/cmd/compile/internal/riscv64.a
index 2a0bd5b..d1e6596 100644
--- a/pkg/linux_amd64/cmd/compile/internal/riscv64.a
+++ b/pkg/linux_amd64/cmd/compile/internal/riscv64.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/s390x.a b/pkg/linux_amd64/cmd/compile/internal/s390x.a
index 6556994..c844b7f 100644
--- a/pkg/linux_amd64/cmd/compile/internal/s390x.a
+++ b/pkg/linux_amd64/cmd/compile/internal/s390x.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/ssa.a b/pkg/linux_amd64/cmd/compile/internal/ssa.a
index 57b929d..326baff 100644
--- a/pkg/linux_amd64/cmd/compile/internal/ssa.a
+++ b/pkg/linux_amd64/cmd/compile/internal/ssa.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/ssagen.a b/pkg/linux_amd64/cmd/compile/internal/ssagen.a
index 8a31275..5725d50 100644
--- a/pkg/linux_amd64/cmd/compile/internal/ssagen.a
+++ b/pkg/linux_amd64/cmd/compile/internal/ssagen.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/staticdata.a b/pkg/linux_amd64/cmd/compile/internal/staticdata.a
index c30926b..f7e806e 100644
--- a/pkg/linux_amd64/cmd/compile/internal/staticdata.a
+++ b/pkg/linux_amd64/cmd/compile/internal/staticdata.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/staticinit.a b/pkg/linux_amd64/cmd/compile/internal/staticinit.a
index 2e8c5ca..6d9a016 100644
--- a/pkg/linux_amd64/cmd/compile/internal/staticinit.a
+++ b/pkg/linux_amd64/cmd/compile/internal/staticinit.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/syntax.a b/pkg/linux_amd64/cmd/compile/internal/syntax.a
index ff771bb..84ecc4d 100644
--- a/pkg/linux_amd64/cmd/compile/internal/syntax.a
+++ b/pkg/linux_amd64/cmd/compile/internal/syntax.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/test.a b/pkg/linux_amd64/cmd/compile/internal/test.a
index 5edb3da..997b0df 100644
--- a/pkg/linux_amd64/cmd/compile/internal/test.a
+++ b/pkg/linux_amd64/cmd/compile/internal/test.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/typebits.a b/pkg/linux_amd64/cmd/compile/internal/typebits.a
index 1828377..d2d6eb2 100644
--- a/pkg/linux_amd64/cmd/compile/internal/typebits.a
+++ b/pkg/linux_amd64/cmd/compile/internal/typebits.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/typecheck.a b/pkg/linux_amd64/cmd/compile/internal/typecheck.a
index b589bd5..b6feb97 100644
--- a/pkg/linux_amd64/cmd/compile/internal/typecheck.a
+++ b/pkg/linux_amd64/cmd/compile/internal/typecheck.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/types.a b/pkg/linux_amd64/cmd/compile/internal/types.a
index d487948..98170e1 100644
--- a/pkg/linux_amd64/cmd/compile/internal/types.a
+++ b/pkg/linux_amd64/cmd/compile/internal/types.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/types2.a b/pkg/linux_amd64/cmd/compile/internal/types2.a
index 80093ab..663ebaf 100644
--- a/pkg/linux_amd64/cmd/compile/internal/types2.a
+++ b/pkg/linux_amd64/cmd/compile/internal/types2.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/walk.a b/pkg/linux_amd64/cmd/compile/internal/walk.a
index fd14266..0b23d2a 100644
--- a/pkg/linux_amd64/cmd/compile/internal/walk.a
+++ b/pkg/linux_amd64/cmd/compile/internal/walk.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/wasm.a b/pkg/linux_amd64/cmd/compile/internal/wasm.a
index f19f888..8f86c0b 100644
--- a/pkg/linux_amd64/cmd/compile/internal/wasm.a
+++ b/pkg/linux_amd64/cmd/compile/internal/wasm.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/compile/internal/x86.a b/pkg/linux_amd64/cmd/compile/internal/x86.a
index 6a12089..f92142b 100644
--- a/pkg/linux_amd64/cmd/compile/internal/x86.a
+++ b/pkg/linux_amd64/cmd/compile/internal/x86.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/auth.a b/pkg/linux_amd64/cmd/go/internal/auth.a
index 5cc2497..41f479b 100644
--- a/pkg/linux_amd64/cmd/go/internal/auth.a
+++ b/pkg/linux_amd64/cmd/go/internal/auth.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/base.a b/pkg/linux_amd64/cmd/go/internal/base.a
index a61d4cd..dfe8da4 100644
--- a/pkg/linux_amd64/cmd/go/internal/base.a
+++ b/pkg/linux_amd64/cmd/go/internal/base.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/bug.a b/pkg/linux_amd64/cmd/go/internal/bug.a
index 27cee09..79537ef 100644
--- a/pkg/linux_amd64/cmd/go/internal/bug.a
+++ b/pkg/linux_amd64/cmd/go/internal/bug.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/cache.a b/pkg/linux_amd64/cmd/go/internal/cache.a
index d920085..f9e09da 100644
--- a/pkg/linux_amd64/cmd/go/internal/cache.a
+++ b/pkg/linux_amd64/cmd/go/internal/cache.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/cfg.a b/pkg/linux_amd64/cmd/go/internal/cfg.a
index 63c6a66..2d664aa 100644
--- a/pkg/linux_amd64/cmd/go/internal/cfg.a
+++ b/pkg/linux_amd64/cmd/go/internal/cfg.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/clean.a b/pkg/linux_amd64/cmd/go/internal/clean.a
index 49a4787..666ca92 100644
--- a/pkg/linux_amd64/cmd/go/internal/clean.a
+++ b/pkg/linux_amd64/cmd/go/internal/clean.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/cmdflag.a b/pkg/linux_amd64/cmd/go/internal/cmdflag.a
index 82dff4a..f39e6c0 100644
--- a/pkg/linux_amd64/cmd/go/internal/cmdflag.a
+++ b/pkg/linux_amd64/cmd/go/internal/cmdflag.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/doc.a b/pkg/linux_amd64/cmd/go/internal/doc.a
index 1fe0de4..a6040f0 100644
--- a/pkg/linux_amd64/cmd/go/internal/doc.a
+++ b/pkg/linux_amd64/cmd/go/internal/doc.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/envcmd.a b/pkg/linux_amd64/cmd/go/internal/envcmd.a
index 0b5db6f..e8d59ef 100644
--- a/pkg/linux_amd64/cmd/go/internal/envcmd.a
+++ b/pkg/linux_amd64/cmd/go/internal/envcmd.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/fix.a b/pkg/linux_amd64/cmd/go/internal/fix.a
index 6e13664..2e9b751 100644
--- a/pkg/linux_amd64/cmd/go/internal/fix.a
+++ b/pkg/linux_amd64/cmd/go/internal/fix.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/fmtcmd.a b/pkg/linux_amd64/cmd/go/internal/fmtcmd.a
index ba21d9d..680612f 100644
--- a/pkg/linux_amd64/cmd/go/internal/fmtcmd.a
+++ b/pkg/linux_amd64/cmd/go/internal/fmtcmd.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/fsys.a b/pkg/linux_amd64/cmd/go/internal/fsys.a
index 29b4b58..8eeebca 100644
--- a/pkg/linux_amd64/cmd/go/internal/fsys.a
+++ b/pkg/linux_amd64/cmd/go/internal/fsys.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/generate.a b/pkg/linux_amd64/cmd/go/internal/generate.a
index 21b61bb..0c64210 100644
--- a/pkg/linux_amd64/cmd/go/internal/generate.a
+++ b/pkg/linux_amd64/cmd/go/internal/generate.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/get.a b/pkg/linux_amd64/cmd/go/internal/get.a
index 3f1ccbc..a514a34 100644
--- a/pkg/linux_amd64/cmd/go/internal/get.a
+++ b/pkg/linux_amd64/cmd/go/internal/get.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/help.a b/pkg/linux_amd64/cmd/go/internal/help.a
index 3b0fc92..c6bd88f 100644
--- a/pkg/linux_amd64/cmd/go/internal/help.a
+++ b/pkg/linux_amd64/cmd/go/internal/help.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/imports.a b/pkg/linux_amd64/cmd/go/internal/imports.a
index f72ee0d..11d6200 100644
--- a/pkg/linux_amd64/cmd/go/internal/imports.a
+++ b/pkg/linux_amd64/cmd/go/internal/imports.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/list.a b/pkg/linux_amd64/cmd/go/internal/list.a
index 517f443..a159c63 100644
--- a/pkg/linux_amd64/cmd/go/internal/list.a
+++ b/pkg/linux_amd64/cmd/go/internal/list.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/load.a b/pkg/linux_amd64/cmd/go/internal/load.a
index db58bb0..2face97 100644
--- a/pkg/linux_amd64/cmd/go/internal/load.a
+++ b/pkg/linux_amd64/cmd/go/internal/load.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/lockedfile.a b/pkg/linux_amd64/cmd/go/internal/lockedfile.a
index 486824f..b765f73 100644
--- a/pkg/linux_amd64/cmd/go/internal/lockedfile.a
+++ b/pkg/linux_amd64/cmd/go/internal/lockedfile.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/lockedfile/internal/filelock.a b/pkg/linux_amd64/cmd/go/internal/lockedfile/internal/filelock.a
index cd3ec68..56f5974 100644
--- a/pkg/linux_amd64/cmd/go/internal/lockedfile/internal/filelock.a
+++ b/pkg/linux_amd64/cmd/go/internal/lockedfile/internal/filelock.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/modcmd.a b/pkg/linux_amd64/cmd/go/internal/modcmd.a
index cfabe3f..78476aa 100644
--- a/pkg/linux_amd64/cmd/go/internal/modcmd.a
+++ b/pkg/linux_amd64/cmd/go/internal/modcmd.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/modconv.a b/pkg/linux_amd64/cmd/go/internal/modconv.a
index 41e6c64..33d7934 100644
--- a/pkg/linux_amd64/cmd/go/internal/modconv.a
+++ b/pkg/linux_amd64/cmd/go/internal/modconv.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/modfetch.a b/pkg/linux_amd64/cmd/go/internal/modfetch.a
index 68d2c10..2e0b8bf 100644
--- a/pkg/linux_amd64/cmd/go/internal/modfetch.a
+++ b/pkg/linux_amd64/cmd/go/internal/modfetch.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/modfetch/codehost.a b/pkg/linux_amd64/cmd/go/internal/modfetch/codehost.a
index 56bdafe..99acc00 100644
--- a/pkg/linux_amd64/cmd/go/internal/modfetch/codehost.a
+++ b/pkg/linux_amd64/cmd/go/internal/modfetch/codehost.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/modget.a b/pkg/linux_amd64/cmd/go/internal/modget.a
index 8658f1e..6c9049c 100644
--- a/pkg/linux_amd64/cmd/go/internal/modget.a
+++ b/pkg/linux_amd64/cmd/go/internal/modget.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/modinfo.a b/pkg/linux_amd64/cmd/go/internal/modinfo.a
index dfff24f..7f93ea4 100644
--- a/pkg/linux_amd64/cmd/go/internal/modinfo.a
+++ b/pkg/linux_amd64/cmd/go/internal/modinfo.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/modload.a b/pkg/linux_amd64/cmd/go/internal/modload.a
index e51a849..7262edb 100644
--- a/pkg/linux_amd64/cmd/go/internal/modload.a
+++ b/pkg/linux_amd64/cmd/go/internal/modload.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/mvs.a b/pkg/linux_amd64/cmd/go/internal/mvs.a
index efb30ea..873ea46 100644
--- a/pkg/linux_amd64/cmd/go/internal/mvs.a
+++ b/pkg/linux_amd64/cmd/go/internal/mvs.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/par.a b/pkg/linux_amd64/cmd/go/internal/par.a
index 558a757..c459083 100644
--- a/pkg/linux_amd64/cmd/go/internal/par.a
+++ b/pkg/linux_amd64/cmd/go/internal/par.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/robustio.a b/pkg/linux_amd64/cmd/go/internal/robustio.a
index 84a2485..546379c 100644
--- a/pkg/linux_amd64/cmd/go/internal/robustio.a
+++ b/pkg/linux_amd64/cmd/go/internal/robustio.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/run.a b/pkg/linux_amd64/cmd/go/internal/run.a
index f5baa27..eb79d4f 100644
--- a/pkg/linux_amd64/cmd/go/internal/run.a
+++ b/pkg/linux_amd64/cmd/go/internal/run.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/search.a b/pkg/linux_amd64/cmd/go/internal/search.a
index e2e7f0c..5fcd9df 100644
--- a/pkg/linux_amd64/cmd/go/internal/search.a
+++ b/pkg/linux_amd64/cmd/go/internal/search.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/str.a b/pkg/linux_amd64/cmd/go/internal/str.a
index c6ccda8..80c6981 100644
--- a/pkg/linux_amd64/cmd/go/internal/str.a
+++ b/pkg/linux_amd64/cmd/go/internal/str.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/test.a b/pkg/linux_amd64/cmd/go/internal/test.a
index c58b7c1..9e4712f 100644
--- a/pkg/linux_amd64/cmd/go/internal/test.a
+++ b/pkg/linux_amd64/cmd/go/internal/test.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/test/internal/genflags.a b/pkg/linux_amd64/cmd/go/internal/test/internal/genflags.a
index 0cb38a6..f9c9484 100644
--- a/pkg/linux_amd64/cmd/go/internal/test/internal/genflags.a
+++ b/pkg/linux_amd64/cmd/go/internal/test/internal/genflags.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/tool.a b/pkg/linux_amd64/cmd/go/internal/tool.a
index bad9788..40826e6 100644
--- a/pkg/linux_amd64/cmd/go/internal/tool.a
+++ b/pkg/linux_amd64/cmd/go/internal/tool.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/trace.a b/pkg/linux_amd64/cmd/go/internal/trace.a
index 65e7904..ab43887 100644
--- a/pkg/linux_amd64/cmd/go/internal/trace.a
+++ b/pkg/linux_amd64/cmd/go/internal/trace.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/vcs.a b/pkg/linux_amd64/cmd/go/internal/vcs.a
index 64c2c1d..e6bb5b8 100644
--- a/pkg/linux_amd64/cmd/go/internal/vcs.a
+++ b/pkg/linux_amd64/cmd/go/internal/vcs.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/version.a b/pkg/linux_amd64/cmd/go/internal/version.a
index f58546f..d8b2c7d 100644
--- a/pkg/linux_amd64/cmd/go/internal/version.a
+++ b/pkg/linux_amd64/cmd/go/internal/version.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/vet.a b/pkg/linux_amd64/cmd/go/internal/vet.a
index 2184f6a..153ccb6 100644
--- a/pkg/linux_amd64/cmd/go/internal/vet.a
+++ b/pkg/linux_amd64/cmd/go/internal/vet.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/web.a b/pkg/linux_amd64/cmd/go/internal/web.a
index 1414325..d13f680 100644
--- a/pkg/linux_amd64/cmd/go/internal/web.a
+++ b/pkg/linux_amd64/cmd/go/internal/web.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/work.a b/pkg/linux_amd64/cmd/go/internal/work.a
index 3a3255a..0fc4dbe 100644
--- a/pkg/linux_amd64/cmd/go/internal/work.a
+++ b/pkg/linux_amd64/cmd/go/internal/work.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/go/internal/workcmd.a b/pkg/linux_amd64/cmd/go/internal/workcmd.a
index eca63d5..9377149 100644
--- a/pkg/linux_amd64/cmd/go/internal/workcmd.a
+++ b/pkg/linux_amd64/cmd/go/internal/workcmd.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/archive.a b/pkg/linux_amd64/cmd/internal/archive.a
index 090f1f4..88ac643 100644
--- a/pkg/linux_amd64/cmd/internal/archive.a
+++ b/pkg/linux_amd64/cmd/internal/archive.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/bio.a b/pkg/linux_amd64/cmd/internal/bio.a
index 08c0217..82ea7c3 100644
--- a/pkg/linux_amd64/cmd/internal/bio.a
+++ b/pkg/linux_amd64/cmd/internal/bio.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/browser.a b/pkg/linux_amd64/cmd/internal/browser.a
index 1b95e36..c52b4de 100644
--- a/pkg/linux_amd64/cmd/internal/browser.a
+++ b/pkg/linux_amd64/cmd/internal/browser.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/buildid.a b/pkg/linux_amd64/cmd/internal/buildid.a
index 14c1be5..1399a3a 100644
--- a/pkg/linux_amd64/cmd/internal/buildid.a
+++ b/pkg/linux_amd64/cmd/internal/buildid.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/codesign.a b/pkg/linux_amd64/cmd/internal/codesign.a
index 98cf09c..a097cd8 100644
--- a/pkg/linux_amd64/cmd/internal/codesign.a
+++ b/pkg/linux_amd64/cmd/internal/codesign.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/diff.a b/pkg/linux_amd64/cmd/internal/diff.a
index b5bf57e..a94c6dc 100644
--- a/pkg/linux_amd64/cmd/internal/diff.a
+++ b/pkg/linux_amd64/cmd/internal/diff.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/dwarf.a b/pkg/linux_amd64/cmd/internal/dwarf.a
index 6b01c7b..921a1b1 100644
--- a/pkg/linux_amd64/cmd/internal/dwarf.a
+++ b/pkg/linux_amd64/cmd/internal/dwarf.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/edit.a b/pkg/linux_amd64/cmd/internal/edit.a
index e67e296..43d8b0b 100644
--- a/pkg/linux_amd64/cmd/internal/edit.a
+++ b/pkg/linux_amd64/cmd/internal/edit.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/gcprog.a b/pkg/linux_amd64/cmd/internal/gcprog.a
index 961a341..1c7be56 100644
--- a/pkg/linux_amd64/cmd/internal/gcprog.a
+++ b/pkg/linux_amd64/cmd/internal/gcprog.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/goobj.a b/pkg/linux_amd64/cmd/internal/goobj.a
index e16ffe9..0df7f24 100644
--- a/pkg/linux_amd64/cmd/internal/goobj.a
+++ b/pkg/linux_amd64/cmd/internal/goobj.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/obj.a b/pkg/linux_amd64/cmd/internal/obj.a
index fe499e4..a9f6eb4 100644
--- a/pkg/linux_amd64/cmd/internal/obj.a
+++ b/pkg/linux_amd64/cmd/internal/obj.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/obj/arm.a b/pkg/linux_amd64/cmd/internal/obj/arm.a
index 99b2ddb..6d6de6e 100644
--- a/pkg/linux_amd64/cmd/internal/obj/arm.a
+++ b/pkg/linux_amd64/cmd/internal/obj/arm.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/obj/arm64.a b/pkg/linux_amd64/cmd/internal/obj/arm64.a
index 6978ed8..364a597 100644
--- a/pkg/linux_amd64/cmd/internal/obj/arm64.a
+++ b/pkg/linux_amd64/cmd/internal/obj/arm64.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/obj/mips.a b/pkg/linux_amd64/cmd/internal/obj/mips.a
index 3d97deb..183dab0 100644
--- a/pkg/linux_amd64/cmd/internal/obj/mips.a
+++ b/pkg/linux_amd64/cmd/internal/obj/mips.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/obj/ppc64.a b/pkg/linux_amd64/cmd/internal/obj/ppc64.a
index 1e2b950..6ac035d 100644
--- a/pkg/linux_amd64/cmd/internal/obj/ppc64.a
+++ b/pkg/linux_amd64/cmd/internal/obj/ppc64.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/obj/riscv.a b/pkg/linux_amd64/cmd/internal/obj/riscv.a
index c749738..8235a54 100644
--- a/pkg/linux_amd64/cmd/internal/obj/riscv.a
+++ b/pkg/linux_amd64/cmd/internal/obj/riscv.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/obj/s390x.a b/pkg/linux_amd64/cmd/internal/obj/s390x.a
index 50badfb..15baba3 100644
--- a/pkg/linux_amd64/cmd/internal/obj/s390x.a
+++ b/pkg/linux_amd64/cmd/internal/obj/s390x.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/obj/wasm.a b/pkg/linux_amd64/cmd/internal/obj/wasm.a
index 005517b..c26af25 100644
--- a/pkg/linux_amd64/cmd/internal/obj/wasm.a
+++ b/pkg/linux_amd64/cmd/internal/obj/wasm.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/obj/x86.a b/pkg/linux_amd64/cmd/internal/obj/x86.a
index f82a95e..04047ee 100644
--- a/pkg/linux_amd64/cmd/internal/obj/x86.a
+++ b/pkg/linux_amd64/cmd/internal/obj/x86.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/objabi.a b/pkg/linux_amd64/cmd/internal/objabi.a
index fb79d47..89e7fa6 100644
--- a/pkg/linux_amd64/cmd/internal/objabi.a
+++ b/pkg/linux_amd64/cmd/internal/objabi.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/objfile.a b/pkg/linux_amd64/cmd/internal/objfile.a
index d141017..1c6960d 100644
--- a/pkg/linux_amd64/cmd/internal/objfile.a
+++ b/pkg/linux_amd64/cmd/internal/objfile.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/pkgpath.a b/pkg/linux_amd64/cmd/internal/pkgpath.a
index 11efb40..e558b2c 100644
--- a/pkg/linux_amd64/cmd/internal/pkgpath.a
+++ b/pkg/linux_amd64/cmd/internal/pkgpath.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/quoted.a b/pkg/linux_amd64/cmd/internal/quoted.a
index cf2bfbf..7c5c8c4 100644
--- a/pkg/linux_amd64/cmd/internal/quoted.a
+++ b/pkg/linux_amd64/cmd/internal/quoted.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/src.a b/pkg/linux_amd64/cmd/internal/src.a
index 233ca12..97d639b 100644
--- a/pkg/linux_amd64/cmd/internal/src.a
+++ b/pkg/linux_amd64/cmd/internal/src.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/sys.a b/pkg/linux_amd64/cmd/internal/sys.a
index 513c007..5f1d063 100644
--- a/pkg/linux_amd64/cmd/internal/sys.a
+++ b/pkg/linux_amd64/cmd/internal/sys.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/test2json.a b/pkg/linux_amd64/cmd/internal/test2json.a
index 750a307..0df8f54 100644
--- a/pkg/linux_amd64/cmd/internal/test2json.a
+++ b/pkg/linux_amd64/cmd/internal/test2json.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/internal/traceviewer.a b/pkg/linux_amd64/cmd/internal/traceviewer.a
index b7968cd..b1c6198 100644
--- a/pkg/linux_amd64/cmd/internal/traceviewer.a
+++ b/pkg/linux_amd64/cmd/internal/traceviewer.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/amd64.a b/pkg/linux_amd64/cmd/link/internal/amd64.a
index beae922..a79c370 100644
--- a/pkg/linux_amd64/cmd/link/internal/amd64.a
+++ b/pkg/linux_amd64/cmd/link/internal/amd64.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/arm.a b/pkg/linux_amd64/cmd/link/internal/arm.a
index 329c217..f179679 100644
--- a/pkg/linux_amd64/cmd/link/internal/arm.a
+++ b/pkg/linux_amd64/cmd/link/internal/arm.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/arm64.a b/pkg/linux_amd64/cmd/link/internal/arm64.a
index ec836b5..b0913bd 100644
--- a/pkg/linux_amd64/cmd/link/internal/arm64.a
+++ b/pkg/linux_amd64/cmd/link/internal/arm64.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/benchmark.a b/pkg/linux_amd64/cmd/link/internal/benchmark.a
index 397ce02..5e48fd2 100644
--- a/pkg/linux_amd64/cmd/link/internal/benchmark.a
+++ b/pkg/linux_amd64/cmd/link/internal/benchmark.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/dwtest.a b/pkg/linux_amd64/cmd/link/internal/dwtest.a
index 0b6bb5a..63fb5c5 100644
--- a/pkg/linux_amd64/cmd/link/internal/dwtest.a
+++ b/pkg/linux_amd64/cmd/link/internal/dwtest.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/ld.a b/pkg/linux_amd64/cmd/link/internal/ld.a
index e9808ef..267a202 100644
--- a/pkg/linux_amd64/cmd/link/internal/ld.a
+++ b/pkg/linux_amd64/cmd/link/internal/ld.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/loadelf.a b/pkg/linux_amd64/cmd/link/internal/loadelf.a
index e200122..c2060b0 100644
--- a/pkg/linux_amd64/cmd/link/internal/loadelf.a
+++ b/pkg/linux_amd64/cmd/link/internal/loadelf.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/loader.a b/pkg/linux_amd64/cmd/link/internal/loader.a
index 9852222..112cd73 100644
--- a/pkg/linux_amd64/cmd/link/internal/loader.a
+++ b/pkg/linux_amd64/cmd/link/internal/loader.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/loadmacho.a b/pkg/linux_amd64/cmd/link/internal/loadmacho.a
index bd3d5a0..e6a1e4d 100644
--- a/pkg/linux_amd64/cmd/link/internal/loadmacho.a
+++ b/pkg/linux_amd64/cmd/link/internal/loadmacho.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/loadpe.a b/pkg/linux_amd64/cmd/link/internal/loadpe.a
index 6b94596..4f74bc1 100644
--- a/pkg/linux_amd64/cmd/link/internal/loadpe.a
+++ b/pkg/linux_amd64/cmd/link/internal/loadpe.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/loadxcoff.a b/pkg/linux_amd64/cmd/link/internal/loadxcoff.a
index 2291782..81fe599 100644
--- a/pkg/linux_amd64/cmd/link/internal/loadxcoff.a
+++ b/pkg/linux_amd64/cmd/link/internal/loadxcoff.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/mips.a b/pkg/linux_amd64/cmd/link/internal/mips.a
index 69e6583..b98b106 100644
--- a/pkg/linux_amd64/cmd/link/internal/mips.a
+++ b/pkg/linux_amd64/cmd/link/internal/mips.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/mips64.a b/pkg/linux_amd64/cmd/link/internal/mips64.a
index b385ee3..e137f59 100644
--- a/pkg/linux_amd64/cmd/link/internal/mips64.a
+++ b/pkg/linux_amd64/cmd/link/internal/mips64.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/ppc64.a b/pkg/linux_amd64/cmd/link/internal/ppc64.a
index c498e11..58b3989 100644
--- a/pkg/linux_amd64/cmd/link/internal/ppc64.a
+++ b/pkg/linux_amd64/cmd/link/internal/ppc64.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/riscv64.a b/pkg/linux_amd64/cmd/link/internal/riscv64.a
index 4c40923..7d720e7 100644
--- a/pkg/linux_amd64/cmd/link/internal/riscv64.a
+++ b/pkg/linux_amd64/cmd/link/internal/riscv64.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/s390x.a b/pkg/linux_amd64/cmd/link/internal/s390x.a
index a0941e8..347d03e 100644
--- a/pkg/linux_amd64/cmd/link/internal/s390x.a
+++ b/pkg/linux_amd64/cmd/link/internal/s390x.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/sym.a b/pkg/linux_amd64/cmd/link/internal/sym.a
index 0e0afce..ad5e8eb 100644
--- a/pkg/linux_amd64/cmd/link/internal/sym.a
+++ b/pkg/linux_amd64/cmd/link/internal/sym.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/wasm.a b/pkg/linux_amd64/cmd/link/internal/wasm.a
index 3458b30..3f983e6 100644
--- a/pkg/linux_amd64/cmd/link/internal/wasm.a
+++ b/pkg/linux_amd64/cmd/link/internal/wasm.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/link/internal/x86.a b/pkg/linux_amd64/cmd/link/internal/x86.a
index 6c33c8e..d256746 100644
--- a/pkg/linux_amd64/cmd/link/internal/x86.a
+++ b/pkg/linux_amd64/cmd/link/internal/x86.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/driver.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/driver.a
index 387ddc7..5f79773 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/driver.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/driver.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/binutils.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/binutils.a
index 6d37874..06ab2f0 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/binutils.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/binutils.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/driver.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/driver.a
index 2da6f0e..7778e64 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/driver.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/driver.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/elfexec.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/elfexec.a
index 8a6820c..943fe81 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/elfexec.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/elfexec.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/graph.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/graph.a
index 3884044..aba0ea1 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/graph.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/graph.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/measurement.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/measurement.a
index f64511e..9709c70 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/measurement.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/measurement.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/plugin.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/plugin.a
index 78bb318..f047b99 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/plugin.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/plugin.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/report.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/report.a
index a542b02..16e492c 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/report.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/report.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/symbolizer.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/symbolizer.a
index 1d9e202..e2da4c9 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/symbolizer.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/symbolizer.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/symbolz.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/symbolz.a
index 193742f..d3b5b6f 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/symbolz.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/symbolz.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/transport.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/transport.a
index 95a1a6e..c3e4233 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/transport.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/internal/transport.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/profile.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/profile.a
index c43395a..f318af4 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/profile.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/profile.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/third_party/d3.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/third_party/d3.a
index 524a508..b9847d7 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/third_party/d3.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/third_party/d3.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/third_party/d3flamegraph.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/third_party/d3flamegraph.a
index eb1c70b..b56cb24 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/third_party/d3flamegraph.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/third_party/d3flamegraph.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/third_party/svgpan.a b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/third_party/svgpan.a
index e59fa19..f8b450c 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/third_party/svgpan.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/google/pprof/third_party/svgpan.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/github.com/ianlancetaylor/demangle.a b/pkg/linux_amd64/cmd/vendor/github.com/ianlancetaylor/demangle.a
index b02cb76..ca33151 100644
--- a/pkg/linux_amd64/cmd/vendor/github.com/ianlancetaylor/demangle.a
+++ b/pkg/linux_amd64/cmd/vendor/github.com/ianlancetaylor/demangle.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/arm/armasm.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/arm/armasm.a
index 7f3b259..298a313 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/arm/armasm.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/arm/armasm.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/arm64/arm64asm.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/arm64/arm64asm.a
index 8b869fb..f307893 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/arm64/arm64asm.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/arm64/arm64asm.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm.a
index 7f1205b..347d08b 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/x86/x86asm.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/x86/x86asm.a
index 7cb6b32..0175eb9 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/x86/x86asm.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/arch/x86/x86asm.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/crypto/ed25519.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/crypto/ed25519.a
index d504261..d125d2f 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/crypto/ed25519.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/crypto/ed25519.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/crypto/ed25519/internal/edwards25519.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/crypto/ed25519/internal/edwards25519.a
index b961645..4976f64 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/crypto/ed25519/internal/edwards25519.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/crypto/ed25519/internal/edwards25519.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/internal/lazyregexp.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/internal/lazyregexp.a
index b247e12..4371c29 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/internal/lazyregexp.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/internal/lazyregexp.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/modfile.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/modfile.a
index aea0cd0..b28a6c7 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/modfile.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/modfile.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/module.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/module.a
index f5d3733..c937348 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/module.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/module.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/semver.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/semver.a
index 86fe5c7..854fe4b 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/semver.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/semver.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb.a
index 5edb8fb..9bef4d7 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb/dirhash.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb/dirhash.a
index 09b001d..6642b5d 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb/dirhash.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb/dirhash.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb/note.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb/note.a
index 07e6ea0..df358d5 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb/note.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb/note.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb/tlog.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb/tlog.a
index f7ecdb3..827bf00 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb/tlog.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/sumdb/tlog.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/zip.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/zip.a
index 597db36..b810b9b 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/zip.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/mod/zip.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/sync/semaphore.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/sync/semaphore.a
index 8b026c1..4812279 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/sync/semaphore.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/sync/semaphore.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/sys/internal/unsafeheader.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/sys/internal/unsafeheader.a
index cdee2c0..137de4c 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/sys/internal/unsafeheader.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/sys/internal/unsafeheader.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/sys/unix.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/sys/unix.a
index 3cd6e08..69c7145 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/sys/unix.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/sys/unix.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/term.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/term.a
index 867f4f4..1d39ef9 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/term.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/term.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/cover.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/cover.a
index 56f8253..969f2e8 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/cover.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/cover.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis.a
index d8ccaf1..f854e10 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags.a
index cd4f746..1f2d2c1 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/internal/facts.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/internal/facts.a
index fa18480..98c07db 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/internal/facts.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/internal/facts.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl.a
index d3ed9b7..89f9d9e 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/assign.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/assign.a
index c5080eb..801519b 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/assign.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/assign.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/atomic.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/atomic.a
index 197f5b9..c7fdfad 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/atomic.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/atomic.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/bools.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/bools.a
index 585efeb..cccdb3b 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/bools.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/bools.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/buildtag.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/buildtag.a
index 3b9a263..2a6b26f 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/buildtag.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/buildtag.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall.a
index 035a08a..cef6e70 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/composite.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/composite.a
index d6835a3..f526023 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/composite.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/composite.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/copylock.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/copylock.a
index 9dd697a..11125b3 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/copylock.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/copylock.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/ctrlflow.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/ctrlflow.a
index b7cec9f..267a3dd 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/ctrlflow.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/ctrlflow.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/errorsas.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/errorsas.a
index e07a079..bdf30d5 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/errorsas.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/errorsas.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/framepointer.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/framepointer.a
index eecde32..741c0b6 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/framepointer.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/framepointer.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/httpresponse.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/httpresponse.a
index 636fcf9..eddaf74 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/httpresponse.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/httpresponse.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert.a
index 7513037..feda148 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/ifaceassert.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/inspect.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/inspect.a
index 570e940..fd62f3c 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/inspect.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/inspect.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/internal/analysisutil.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/internal/analysisutil.a
index efcc4c6..7205819 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/internal/analysisutil.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/internal/analysisutil.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure.a
index 08aeb7a..f72b2bd 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel.a
index 41018cb..913385d 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/nilfunc.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/nilfunc.a
index 4c03ec8..99a5f65 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/nilfunc.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/nilfunc.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf.a
index 0215572..51c76cb 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/shift.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/shift.a
index aa3650e..8be0b07 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/shift.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/shift.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/sigchanyzer.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/sigchanyzer.a
index e4febdf..4b20058 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/sigchanyzer.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/sigchanyzer.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods.a
index 928f991..4b78fad 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/stringintconv.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/stringintconv.a
index 10103b9..3396f18 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/stringintconv.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/stringintconv.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/structtag.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/structtag.a
index 357b0eb..981bc70 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/structtag.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/structtag.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/testinggoroutine.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/testinggoroutine.a
index 42c776e..12814f7 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/testinggoroutine.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/testinggoroutine.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests.a
index 8d1f2af..b708be9 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unmarshal.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unmarshal.a
index f9fb1d8..226f5dc 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unmarshal.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unmarshal.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unreachable.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unreachable.a
index c65574a..4e8700c 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unreachable.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unreachable.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unsafeptr.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unsafeptr.a
index e1342f1..8cbb09b 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unsafeptr.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unsafeptr.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unusedresult.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unusedresult.a
index 283bde2..091e3ae 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unusedresult.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/passes/unusedresult.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker.a
index 534cef4..f70872b 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/ast/astutil.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/ast/astutil.a
index def424f..7e1675d 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/ast/astutil.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/ast/astutil.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/ast/inspector.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/ast/inspector.a
index 351b19f..0c1fdc7 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/ast/inspector.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/ast/inspector.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/cfg.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/cfg.a
index 270bd28..3e0e96e 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/cfg.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/cfg.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/types/objectpath.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/types/objectpath.a
index 5130780..4b6f1d9 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/types/objectpath.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/types/objectpath.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/types/typeutil.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/types/typeutil.a
index 810dca1..580c313 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/types/typeutil.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/go/types/typeutil.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/internal/analysisinternal.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/internal/analysisinternal.a
index 4094679..bb0b72a 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/internal/analysisinternal.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/internal/analysisinternal.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/internal/lsp/fuzzy.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/internal/lsp/fuzzy.a
index 1e3414a..0b0e04c 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/internal/lsp/fuzzy.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/internal/lsp/fuzzy.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/internal/typeparams.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/internal/typeparams.a
index a0334fd..c0dcf59 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/internal/typeparams.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/internal/typeparams.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/txtar.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/txtar.a
index 7d353b2..44c45fd 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/txtar.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/tools/txtar.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/xerrors.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/xerrors.a
index d93352a..1cbf875 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/xerrors.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/xerrors.a
Binary files differ
diff --git a/pkg/linux_amd64/cmd/vendor/golang.org/x/xerrors/internal.a b/pkg/linux_amd64/cmd/vendor/golang.org/x/xerrors/internal.a
index b5f8d83..c5144e0 100644
--- a/pkg/linux_amd64/cmd/vendor/golang.org/x/xerrors/internal.a
+++ b/pkg/linux_amd64/cmd/vendor/golang.org/x/xerrors/internal.a
Binary files differ
diff --git a/pkg/linux_amd64/compress/bzip2.a b/pkg/linux_amd64/compress/bzip2.a
index 27c5ebe..c15c095 100644
--- a/pkg/linux_amd64/compress/bzip2.a
+++ b/pkg/linux_amd64/compress/bzip2.a
Binary files differ
diff --git a/pkg/linux_amd64/compress/flate.a b/pkg/linux_amd64/compress/flate.a
index 296d608..ae19abf 100644
--- a/pkg/linux_amd64/compress/flate.a
+++ b/pkg/linux_amd64/compress/flate.a
Binary files differ
diff --git a/pkg/linux_amd64/compress/gzip.a b/pkg/linux_amd64/compress/gzip.a
index 3574c58..2b4b31d 100644
--- a/pkg/linux_amd64/compress/gzip.a
+++ b/pkg/linux_amd64/compress/gzip.a
Binary files differ
diff --git a/pkg/linux_amd64/compress/lzw.a b/pkg/linux_amd64/compress/lzw.a
index c8af140..28e1fd2 100644
--- a/pkg/linux_amd64/compress/lzw.a
+++ b/pkg/linux_amd64/compress/lzw.a
Binary files differ
diff --git a/pkg/linux_amd64/compress/zlib.a b/pkg/linux_amd64/compress/zlib.a
index eb1181c..7e7ce45 100644
--- a/pkg/linux_amd64/compress/zlib.a
+++ b/pkg/linux_amd64/compress/zlib.a
Binary files differ
diff --git a/pkg/linux_amd64/container/heap.a b/pkg/linux_amd64/container/heap.a
index 71ab5c1..d0e9ea9 100644
--- a/pkg/linux_amd64/container/heap.a
+++ b/pkg/linux_amd64/container/heap.a
Binary files differ
diff --git a/pkg/linux_amd64/container/list.a b/pkg/linux_amd64/container/list.a
index 9b55c9b..be8e38e 100644
--- a/pkg/linux_amd64/container/list.a
+++ b/pkg/linux_amd64/container/list.a
Binary files differ
diff --git a/pkg/linux_amd64/container/ring.a b/pkg/linux_amd64/container/ring.a
index a46effc..a5ab90f 100644
--- a/pkg/linux_amd64/container/ring.a
+++ b/pkg/linux_amd64/container/ring.a
Binary files differ
diff --git a/pkg/linux_amd64/context.a b/pkg/linux_amd64/context.a
index 915e0fd..5e95602 100644
--- a/pkg/linux_amd64/context.a
+++ b/pkg/linux_amd64/context.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto.a b/pkg/linux_amd64/crypto.a
index 7abe132..43234ec 100644
--- a/pkg/linux_amd64/crypto.a
+++ b/pkg/linux_amd64/crypto.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/aes.a b/pkg/linux_amd64/crypto/aes.a
index c210c26..41a7802 100644
--- a/pkg/linux_amd64/crypto/aes.a
+++ b/pkg/linux_amd64/crypto/aes.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/cipher.a b/pkg/linux_amd64/crypto/cipher.a
index 0c8ba68..b0aae44 100644
--- a/pkg/linux_amd64/crypto/cipher.a
+++ b/pkg/linux_amd64/crypto/cipher.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/des.a b/pkg/linux_amd64/crypto/des.a
index f050838..0feb04a 100644
--- a/pkg/linux_amd64/crypto/des.a
+++ b/pkg/linux_amd64/crypto/des.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/dsa.a b/pkg/linux_amd64/crypto/dsa.a
index c36912b..b27cb6c 100644
--- a/pkg/linux_amd64/crypto/dsa.a
+++ b/pkg/linux_amd64/crypto/dsa.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/ecdsa.a b/pkg/linux_amd64/crypto/ecdsa.a
index 447c80f..db6a76f 100644
--- a/pkg/linux_amd64/crypto/ecdsa.a
+++ b/pkg/linux_amd64/crypto/ecdsa.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/ed25519.a b/pkg/linux_amd64/crypto/ed25519.a
index 14feb4f..dfa0b18 100644
--- a/pkg/linux_amd64/crypto/ed25519.a
+++ b/pkg/linux_amd64/crypto/ed25519.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/ed25519/internal/edwards25519.a b/pkg/linux_amd64/crypto/ed25519/internal/edwards25519.a
index c57278a..20ba8fe 100644
--- a/pkg/linux_amd64/crypto/ed25519/internal/edwards25519.a
+++ b/pkg/linux_amd64/crypto/ed25519/internal/edwards25519.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/ed25519/internal/edwards25519/field.a b/pkg/linux_amd64/crypto/ed25519/internal/edwards25519/field.a
index b4d8bb0..7095bd1 100644
--- a/pkg/linux_amd64/crypto/ed25519/internal/edwards25519/field.a
+++ b/pkg/linux_amd64/crypto/ed25519/internal/edwards25519/field.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/elliptic.a b/pkg/linux_amd64/crypto/elliptic.a
index 93cb3f3..96d187c 100644
--- a/pkg/linux_amd64/crypto/elliptic.a
+++ b/pkg/linux_amd64/crypto/elliptic.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/elliptic/internal/fiat.a b/pkg/linux_amd64/crypto/elliptic/internal/fiat.a
index 19607d3..bcc34ac 100644
--- a/pkg/linux_amd64/crypto/elliptic/internal/fiat.a
+++ b/pkg/linux_amd64/crypto/elliptic/internal/fiat.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/elliptic/internal/nistec.a b/pkg/linux_amd64/crypto/elliptic/internal/nistec.a
index 37f4abf..12bf58e 100644
--- a/pkg/linux_amd64/crypto/elliptic/internal/nistec.a
+++ b/pkg/linux_amd64/crypto/elliptic/internal/nistec.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/hmac.a b/pkg/linux_amd64/crypto/hmac.a
index 93c819f..9fff00a 100644
--- a/pkg/linux_amd64/crypto/hmac.a
+++ b/pkg/linux_amd64/crypto/hmac.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/internal/randutil.a b/pkg/linux_amd64/crypto/internal/randutil.a
index ef94751..e3435c9 100644
--- a/pkg/linux_amd64/crypto/internal/randutil.a
+++ b/pkg/linux_amd64/crypto/internal/randutil.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/internal/subtle.a b/pkg/linux_amd64/crypto/internal/subtle.a
index f616441..b1edc11 100644
--- a/pkg/linux_amd64/crypto/internal/subtle.a
+++ b/pkg/linux_amd64/crypto/internal/subtle.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/md5.a b/pkg/linux_amd64/crypto/md5.a
index 9ae012f..a0b3655 100644
--- a/pkg/linux_amd64/crypto/md5.a
+++ b/pkg/linux_amd64/crypto/md5.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/rand.a b/pkg/linux_amd64/crypto/rand.a
index d0d138f..248b232 100644
--- a/pkg/linux_amd64/crypto/rand.a
+++ b/pkg/linux_amd64/crypto/rand.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/rc4.a b/pkg/linux_amd64/crypto/rc4.a
index c5478f2..8989727 100644
--- a/pkg/linux_amd64/crypto/rc4.a
+++ b/pkg/linux_amd64/crypto/rc4.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/rsa.a b/pkg/linux_amd64/crypto/rsa.a
index 61dde86..41ef627 100644
--- a/pkg/linux_amd64/crypto/rsa.a
+++ b/pkg/linux_amd64/crypto/rsa.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/sha1.a b/pkg/linux_amd64/crypto/sha1.a
index c48527f..e0fd9f4 100644
--- a/pkg/linux_amd64/crypto/sha1.a
+++ b/pkg/linux_amd64/crypto/sha1.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/sha256.a b/pkg/linux_amd64/crypto/sha256.a
index bf5b966..e341aaa 100644
--- a/pkg/linux_amd64/crypto/sha256.a
+++ b/pkg/linux_amd64/crypto/sha256.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/sha512.a b/pkg/linux_amd64/crypto/sha512.a
index 2a125c1..de277e0 100644
--- a/pkg/linux_amd64/crypto/sha512.a
+++ b/pkg/linux_amd64/crypto/sha512.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/subtle.a b/pkg/linux_amd64/crypto/subtle.a
index cac9924..8aab382 100644
--- a/pkg/linux_amd64/crypto/subtle.a
+++ b/pkg/linux_amd64/crypto/subtle.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/tls.a b/pkg/linux_amd64/crypto/tls.a
index 7fc7785..576e1b4 100644
--- a/pkg/linux_amd64/crypto/tls.a
+++ b/pkg/linux_amd64/crypto/tls.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/x509.a b/pkg/linux_amd64/crypto/x509.a
index 69a15ef..082ff67 100644
--- a/pkg/linux_amd64/crypto/x509.a
+++ b/pkg/linux_amd64/crypto/x509.a
Binary files differ
diff --git a/pkg/linux_amd64/crypto/x509/pkix.a b/pkg/linux_amd64/crypto/x509/pkix.a
index 9cdb247..c6b4a69 100644
--- a/pkg/linux_amd64/crypto/x509/pkix.a
+++ b/pkg/linux_amd64/crypto/x509/pkix.a
Binary files differ
diff --git a/pkg/linux_amd64/database/sql.a b/pkg/linux_amd64/database/sql.a
index 7600037..5870adb 100644
--- a/pkg/linux_amd64/database/sql.a
+++ b/pkg/linux_amd64/database/sql.a
Binary files differ
diff --git a/pkg/linux_amd64/database/sql/driver.a b/pkg/linux_amd64/database/sql/driver.a
index e64ab4f..5de5c1b 100644
--- a/pkg/linux_amd64/database/sql/driver.a
+++ b/pkg/linux_amd64/database/sql/driver.a
Binary files differ
diff --git a/pkg/linux_amd64/debug/buildinfo.a b/pkg/linux_amd64/debug/buildinfo.a
index 021fd1f..acfa6d7 100644
--- a/pkg/linux_amd64/debug/buildinfo.a
+++ b/pkg/linux_amd64/debug/buildinfo.a
Binary files differ
diff --git a/pkg/linux_amd64/debug/dwarf.a b/pkg/linux_amd64/debug/dwarf.a
index bd9019d..d503057 100644
--- a/pkg/linux_amd64/debug/dwarf.a
+++ b/pkg/linux_amd64/debug/dwarf.a
Binary files differ
diff --git a/pkg/linux_amd64/debug/elf.a b/pkg/linux_amd64/debug/elf.a
index 54208c5..4080431 100644
--- a/pkg/linux_amd64/debug/elf.a
+++ b/pkg/linux_amd64/debug/elf.a
Binary files differ
diff --git a/pkg/linux_amd64/debug/gosym.a b/pkg/linux_amd64/debug/gosym.a
index 5d70665..39b9542 100644
--- a/pkg/linux_amd64/debug/gosym.a
+++ b/pkg/linux_amd64/debug/gosym.a
Binary files differ
diff --git a/pkg/linux_amd64/debug/macho.a b/pkg/linux_amd64/debug/macho.a
index 4ed0813..ec0db95 100644
--- a/pkg/linux_amd64/debug/macho.a
+++ b/pkg/linux_amd64/debug/macho.a
Binary files differ
diff --git a/pkg/linux_amd64/debug/pe.a b/pkg/linux_amd64/debug/pe.a
index d948925..a0688ff 100644
--- a/pkg/linux_amd64/debug/pe.a
+++ b/pkg/linux_amd64/debug/pe.a
Binary files differ
diff --git a/pkg/linux_amd64/debug/plan9obj.a b/pkg/linux_amd64/debug/plan9obj.a
index c7f17cd..0b5c566 100644
--- a/pkg/linux_amd64/debug/plan9obj.a
+++ b/pkg/linux_amd64/debug/plan9obj.a
Binary files differ
diff --git a/pkg/linux_amd64/embed.a b/pkg/linux_amd64/embed.a
index d642891..a6ac888 100644
--- a/pkg/linux_amd64/embed.a
+++ b/pkg/linux_amd64/embed.a
Binary files differ
diff --git a/pkg/linux_amd64/encoding.a b/pkg/linux_amd64/encoding.a
index d7b0cad..91852fc 100644
--- a/pkg/linux_amd64/encoding.a
+++ b/pkg/linux_amd64/encoding.a
Binary files differ
diff --git a/pkg/linux_amd64/encoding/ascii85.a b/pkg/linux_amd64/encoding/ascii85.a
index 9005696..1a3846b 100644
--- a/pkg/linux_amd64/encoding/ascii85.a
+++ b/pkg/linux_amd64/encoding/ascii85.a
Binary files differ
diff --git a/pkg/linux_amd64/encoding/asn1.a b/pkg/linux_amd64/encoding/asn1.a
index 8ffbe1d..353fa4e 100644
--- a/pkg/linux_amd64/encoding/asn1.a
+++ b/pkg/linux_amd64/encoding/asn1.a
Binary files differ
diff --git a/pkg/linux_amd64/encoding/base32.a b/pkg/linux_amd64/encoding/base32.a
index 2d51ca7..99f94f1 100644
--- a/pkg/linux_amd64/encoding/base32.a
+++ b/pkg/linux_amd64/encoding/base32.a
Binary files differ
diff --git a/pkg/linux_amd64/encoding/base64.a b/pkg/linux_amd64/encoding/base64.a
index 0d7916d..dcf5173 100644
--- a/pkg/linux_amd64/encoding/base64.a
+++ b/pkg/linux_amd64/encoding/base64.a
Binary files differ
diff --git a/pkg/linux_amd64/encoding/binary.a b/pkg/linux_amd64/encoding/binary.a
index 77b91ff..d93c7f6 100644
--- a/pkg/linux_amd64/encoding/binary.a
+++ b/pkg/linux_amd64/encoding/binary.a
Binary files differ
diff --git a/pkg/linux_amd64/encoding/csv.a b/pkg/linux_amd64/encoding/csv.a
index 6920011..9eebc16 100644
--- a/pkg/linux_amd64/encoding/csv.a
+++ b/pkg/linux_amd64/encoding/csv.a
Binary files differ
diff --git a/pkg/linux_amd64/encoding/gob.a b/pkg/linux_amd64/encoding/gob.a
index 3d440bd..25e86ab 100644
--- a/pkg/linux_amd64/encoding/gob.a
+++ b/pkg/linux_amd64/encoding/gob.a
Binary files differ
diff --git a/pkg/linux_amd64/encoding/hex.a b/pkg/linux_amd64/encoding/hex.a
index 9abc354..790ed9f 100644
--- a/pkg/linux_amd64/encoding/hex.a
+++ b/pkg/linux_amd64/encoding/hex.a
Binary files differ
diff --git a/pkg/linux_amd64/encoding/json.a b/pkg/linux_amd64/encoding/json.a
index 115935b..879074a 100644
--- a/pkg/linux_amd64/encoding/json.a
+++ b/pkg/linux_amd64/encoding/json.a
Binary files differ
diff --git a/pkg/linux_amd64/encoding/pem.a b/pkg/linux_amd64/encoding/pem.a
index 213543c..b4ee3b1 100644
--- a/pkg/linux_amd64/encoding/pem.a
+++ b/pkg/linux_amd64/encoding/pem.a
Binary files differ
diff --git a/pkg/linux_amd64/encoding/xml.a b/pkg/linux_amd64/encoding/xml.a
index 1b42741..1169427 100644
--- a/pkg/linux_amd64/encoding/xml.a
+++ b/pkg/linux_amd64/encoding/xml.a
Binary files differ
diff --git a/pkg/linux_amd64/errors.a b/pkg/linux_amd64/errors.a
index 9e24219..b63cb5c 100644
--- a/pkg/linux_amd64/errors.a
+++ b/pkg/linux_amd64/errors.a
Binary files differ
diff --git a/pkg/linux_amd64/expvar.a b/pkg/linux_amd64/expvar.a
index 9a07dba..c6a5b13 100644
--- a/pkg/linux_amd64/expvar.a
+++ b/pkg/linux_amd64/expvar.a
Binary files differ
diff --git a/pkg/linux_amd64/flag.a b/pkg/linux_amd64/flag.a
index 82241bf..36f12d3 100644
--- a/pkg/linux_amd64/flag.a
+++ b/pkg/linux_amd64/flag.a
Binary files differ
diff --git a/pkg/linux_amd64/fmt.a b/pkg/linux_amd64/fmt.a
index ccd1a13..00b5e44 100644
--- a/pkg/linux_amd64/fmt.a
+++ b/pkg/linux_amd64/fmt.a
Binary files differ
diff --git a/pkg/linux_amd64/go/ast.a b/pkg/linux_amd64/go/ast.a
index 7244440..645fad8 100644
--- a/pkg/linux_amd64/go/ast.a
+++ b/pkg/linux_amd64/go/ast.a
Binary files differ
diff --git a/pkg/linux_amd64/go/build.a b/pkg/linux_amd64/go/build.a
index 6b841f4..3214585 100644
--- a/pkg/linux_amd64/go/build.a
+++ b/pkg/linux_amd64/go/build.a
Binary files differ
diff --git a/pkg/linux_amd64/go/build/constraint.a b/pkg/linux_amd64/go/build/constraint.a
index 8fec4b0..0baf2a2 100644
--- a/pkg/linux_amd64/go/build/constraint.a
+++ b/pkg/linux_amd64/go/build/constraint.a
Binary files differ
diff --git a/pkg/linux_amd64/go/constant.a b/pkg/linux_amd64/go/constant.a
index c56f2c8..1d7d257 100644
--- a/pkg/linux_amd64/go/constant.a
+++ b/pkg/linux_amd64/go/constant.a
Binary files differ
diff --git a/pkg/linux_amd64/go/doc.a b/pkg/linux_amd64/go/doc.a
index 59d12d2..6523be6 100644
--- a/pkg/linux_amd64/go/doc.a
+++ b/pkg/linux_amd64/go/doc.a
Binary files differ
diff --git a/pkg/linux_amd64/go/format.a b/pkg/linux_amd64/go/format.a
index 0c2bff6..40a8f21 100644
--- a/pkg/linux_amd64/go/format.a
+++ b/pkg/linux_amd64/go/format.a
Binary files differ
diff --git a/pkg/linux_amd64/go/importer.a b/pkg/linux_amd64/go/importer.a
index 9989ad8..7aef619 100644
--- a/pkg/linux_amd64/go/importer.a
+++ b/pkg/linux_amd64/go/importer.a
Binary files differ
diff --git a/pkg/linux_amd64/go/internal/gccgoimporter.a b/pkg/linux_amd64/go/internal/gccgoimporter.a
index 70deb21..bc9ca70 100644
--- a/pkg/linux_amd64/go/internal/gccgoimporter.a
+++ b/pkg/linux_amd64/go/internal/gccgoimporter.a
Binary files differ
diff --git a/pkg/linux_amd64/go/internal/gcimporter.a b/pkg/linux_amd64/go/internal/gcimporter.a
index 0add855..608015e 100644
--- a/pkg/linux_amd64/go/internal/gcimporter.a
+++ b/pkg/linux_amd64/go/internal/gcimporter.a
Binary files differ
diff --git a/pkg/linux_amd64/go/internal/srcimporter.a b/pkg/linux_amd64/go/internal/srcimporter.a
index df4a9d5..4e9a1a5 100644
--- a/pkg/linux_amd64/go/internal/srcimporter.a
+++ b/pkg/linux_amd64/go/internal/srcimporter.a
Binary files differ
diff --git a/pkg/linux_amd64/go/internal/typeparams.a b/pkg/linux_amd64/go/internal/typeparams.a
index d07cbbd..f2321f1 100644
--- a/pkg/linux_amd64/go/internal/typeparams.a
+++ b/pkg/linux_amd64/go/internal/typeparams.a
Binary files differ
diff --git a/pkg/linux_amd64/go/parser.a b/pkg/linux_amd64/go/parser.a
index 411f08d..ade7d8a 100644
--- a/pkg/linux_amd64/go/parser.a
+++ b/pkg/linux_amd64/go/parser.a
Binary files differ
diff --git a/pkg/linux_amd64/go/printer.a b/pkg/linux_amd64/go/printer.a
index 5b8ef3d..d0a3067 100644
--- a/pkg/linux_amd64/go/printer.a
+++ b/pkg/linux_amd64/go/printer.a
Binary files differ
diff --git a/pkg/linux_amd64/go/scanner.a b/pkg/linux_amd64/go/scanner.a
index 6ffabff..7fd6877 100644
--- a/pkg/linux_amd64/go/scanner.a
+++ b/pkg/linux_amd64/go/scanner.a
Binary files differ
diff --git a/pkg/linux_amd64/go/token.a b/pkg/linux_amd64/go/token.a
index 67a66a3..6a9579e 100644
--- a/pkg/linux_amd64/go/token.a
+++ b/pkg/linux_amd64/go/token.a
Binary files differ
diff --git a/pkg/linux_amd64/go/types.a b/pkg/linux_amd64/go/types.a
index 07779f3..f62faf4 100644
--- a/pkg/linux_amd64/go/types.a
+++ b/pkg/linux_amd64/go/types.a
Binary files differ
diff --git a/pkg/linux_amd64/hash.a b/pkg/linux_amd64/hash.a
index ba288ea..4801575 100644
--- a/pkg/linux_amd64/hash.a
+++ b/pkg/linux_amd64/hash.a
Binary files differ
diff --git a/pkg/linux_amd64/hash/adler32.a b/pkg/linux_amd64/hash/adler32.a
index 413b803..c584b7a 100644
--- a/pkg/linux_amd64/hash/adler32.a
+++ b/pkg/linux_amd64/hash/adler32.a
Binary files differ
diff --git a/pkg/linux_amd64/hash/crc32.a b/pkg/linux_amd64/hash/crc32.a
index 9d41370..1641898 100644
--- a/pkg/linux_amd64/hash/crc32.a
+++ b/pkg/linux_amd64/hash/crc32.a
Binary files differ
diff --git a/pkg/linux_amd64/hash/crc64.a b/pkg/linux_amd64/hash/crc64.a
index 2e3c328..eb8ebf7 100644
--- a/pkg/linux_amd64/hash/crc64.a
+++ b/pkg/linux_amd64/hash/crc64.a
Binary files differ
diff --git a/pkg/linux_amd64/hash/fnv.a b/pkg/linux_amd64/hash/fnv.a
index feee693..7b9762e 100644
--- a/pkg/linux_amd64/hash/fnv.a
+++ b/pkg/linux_amd64/hash/fnv.a
Binary files differ
diff --git a/pkg/linux_amd64/hash/maphash.a b/pkg/linux_amd64/hash/maphash.a
index bc8d16b..946895c 100644
--- a/pkg/linux_amd64/hash/maphash.a
+++ b/pkg/linux_amd64/hash/maphash.a
Binary files differ
diff --git a/pkg/linux_amd64/html.a b/pkg/linux_amd64/html.a
index 8172578..141412c 100644
--- a/pkg/linux_amd64/html.a
+++ b/pkg/linux_amd64/html.a
Binary files differ
diff --git a/pkg/linux_amd64/html/template.a b/pkg/linux_amd64/html/template.a
index 5f7d1d0..4005f2d 100644
--- a/pkg/linux_amd64/html/template.a
+++ b/pkg/linux_amd64/html/template.a
Binary files differ
diff --git a/pkg/linux_amd64/image.a b/pkg/linux_amd64/image.a
index 32639d3..abe44a9 100644
--- a/pkg/linux_amd64/image.a
+++ b/pkg/linux_amd64/image.a
Binary files differ
diff --git a/pkg/linux_amd64/image/color.a b/pkg/linux_amd64/image/color.a
index b0ac4ec..e21bbe1 100644
--- a/pkg/linux_amd64/image/color.a
+++ b/pkg/linux_amd64/image/color.a
Binary files differ
diff --git a/pkg/linux_amd64/image/color/palette.a b/pkg/linux_amd64/image/color/palette.a
index 97834be..88b88ff 100644
--- a/pkg/linux_amd64/image/color/palette.a
+++ b/pkg/linux_amd64/image/color/palette.a
Binary files differ
diff --git a/pkg/linux_amd64/image/draw.a b/pkg/linux_amd64/image/draw.a
index 3fc9ecb..51a7832 100644
--- a/pkg/linux_amd64/image/draw.a
+++ b/pkg/linux_amd64/image/draw.a
Binary files differ
diff --git a/pkg/linux_amd64/image/gif.a b/pkg/linux_amd64/image/gif.a
index e1a7f8d..0e64601 100644
--- a/pkg/linux_amd64/image/gif.a
+++ b/pkg/linux_amd64/image/gif.a
Binary files differ
diff --git a/pkg/linux_amd64/image/internal/imageutil.a b/pkg/linux_amd64/image/internal/imageutil.a
index b33149e..e03b3f9 100644
--- a/pkg/linux_amd64/image/internal/imageutil.a
+++ b/pkg/linux_amd64/image/internal/imageutil.a
Binary files differ
diff --git a/pkg/linux_amd64/image/jpeg.a b/pkg/linux_amd64/image/jpeg.a
index f986870..c0e2d77 100644
--- a/pkg/linux_amd64/image/jpeg.a
+++ b/pkg/linux_amd64/image/jpeg.a
Binary files differ
diff --git a/pkg/linux_amd64/image/png.a b/pkg/linux_amd64/image/png.a
index 8184a52..ee99d0e 100644
--- a/pkg/linux_amd64/image/png.a
+++ b/pkg/linux_amd64/image/png.a
Binary files differ
diff --git a/pkg/linux_amd64/index/suffixarray.a b/pkg/linux_amd64/index/suffixarray.a
index 8d9b3e5..4c9e559 100644
--- a/pkg/linux_amd64/index/suffixarray.a
+++ b/pkg/linux_amd64/index/suffixarray.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/abi.a b/pkg/linux_amd64/internal/abi.a
index 9dd369e..d59bb3f 100644
--- a/pkg/linux_amd64/internal/abi.a
+++ b/pkg/linux_amd64/internal/abi.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/buildcfg.a b/pkg/linux_amd64/internal/buildcfg.a
index 47a7a3f..88241e1 100644
--- a/pkg/linux_amd64/internal/buildcfg.a
+++ b/pkg/linux_amd64/internal/buildcfg.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/bytealg.a b/pkg/linux_amd64/internal/bytealg.a
index 4010c7a..2a68417 100644
--- a/pkg/linux_amd64/internal/bytealg.a
+++ b/pkg/linux_amd64/internal/bytealg.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/cfg.a b/pkg/linux_amd64/internal/cfg.a
index 124ee16..1416119 100644
--- a/pkg/linux_amd64/internal/cfg.a
+++ b/pkg/linux_amd64/internal/cfg.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/cpu.a b/pkg/linux_amd64/internal/cpu.a
index 309cbc5..9b57040 100644
--- a/pkg/linux_amd64/internal/cpu.a
+++ b/pkg/linux_amd64/internal/cpu.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/execabs.a b/pkg/linux_amd64/internal/execabs.a
index f8b5562..e098b4e 100644
--- a/pkg/linux_amd64/internal/execabs.a
+++ b/pkg/linux_amd64/internal/execabs.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/fmtsort.a b/pkg/linux_amd64/internal/fmtsort.a
index a3281cf..b0b6fb3 100644
--- a/pkg/linux_amd64/internal/fmtsort.a
+++ b/pkg/linux_amd64/internal/fmtsort.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/fuzz.a b/pkg/linux_amd64/internal/fuzz.a
index 0f07755..3aee493 100644
--- a/pkg/linux_amd64/internal/fuzz.a
+++ b/pkg/linux_amd64/internal/fuzz.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/goarch.a b/pkg/linux_amd64/internal/goarch.a
index 99381d2..0cd3f68 100644
--- a/pkg/linux_amd64/internal/goarch.a
+++ b/pkg/linux_amd64/internal/goarch.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/godebug.a b/pkg/linux_amd64/internal/godebug.a
index 60d47a2..e5e4b5b 100644
--- a/pkg/linux_amd64/internal/godebug.a
+++ b/pkg/linux_amd64/internal/godebug.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/goexperiment.a b/pkg/linux_amd64/internal/goexperiment.a
index 1c98540..c414c1c 100644
--- a/pkg/linux_amd64/internal/goexperiment.a
+++ b/pkg/linux_amd64/internal/goexperiment.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/goos.a b/pkg/linux_amd64/internal/goos.a
index ceae585..be1b55c 100644
--- a/pkg/linux_amd64/internal/goos.a
+++ b/pkg/linux_amd64/internal/goos.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/goroot.a b/pkg/linux_amd64/internal/goroot.a
index c0cdd4b..3859571 100644
--- a/pkg/linux_amd64/internal/goroot.a
+++ b/pkg/linux_amd64/internal/goroot.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/goversion.a b/pkg/linux_amd64/internal/goversion.a
index d97d431..41bd10b 100644
--- a/pkg/linux_amd64/internal/goversion.a
+++ b/pkg/linux_amd64/internal/goversion.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/intern.a b/pkg/linux_amd64/internal/intern.a
index c42496a..2bdc358 100644
--- a/pkg/linux_amd64/internal/intern.a
+++ b/pkg/linux_amd64/internal/intern.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/itoa.a b/pkg/linux_amd64/internal/itoa.a
index ee955a9..1bb9a1a 100644
--- a/pkg/linux_amd64/internal/itoa.a
+++ b/pkg/linux_amd64/internal/itoa.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/lazyregexp.a b/pkg/linux_amd64/internal/lazyregexp.a
index de3ca0c..7bae78e 100644
--- a/pkg/linux_amd64/internal/lazyregexp.a
+++ b/pkg/linux_amd64/internal/lazyregexp.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/lazytemplate.a b/pkg/linux_amd64/internal/lazytemplate.a
index b7b2520..f870f3d 100644
--- a/pkg/linux_amd64/internal/lazytemplate.a
+++ b/pkg/linux_amd64/internal/lazytemplate.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/nettrace.a b/pkg/linux_amd64/internal/nettrace.a
index 9c84728..4bcf0e9 100644
--- a/pkg/linux_amd64/internal/nettrace.a
+++ b/pkg/linux_amd64/internal/nettrace.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/obscuretestdata.a b/pkg/linux_amd64/internal/obscuretestdata.a
index fddfb39..325024f 100644
--- a/pkg/linux_amd64/internal/obscuretestdata.a
+++ b/pkg/linux_amd64/internal/obscuretestdata.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/oserror.a b/pkg/linux_amd64/internal/oserror.a
index daa0b9a..69985d3 100644
--- a/pkg/linux_amd64/internal/oserror.a
+++ b/pkg/linux_amd64/internal/oserror.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/poll.a b/pkg/linux_amd64/internal/poll.a
index 7538878..7b0f69d 100644
--- a/pkg/linux_amd64/internal/poll.a
+++ b/pkg/linux_amd64/internal/poll.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/profile.a b/pkg/linux_amd64/internal/profile.a
index 4825e3b..45760e4 100644
--- a/pkg/linux_amd64/internal/profile.a
+++ b/pkg/linux_amd64/internal/profile.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/race.a b/pkg/linux_amd64/internal/race.a
index b5090e5..8b0c11a 100644
--- a/pkg/linux_amd64/internal/race.a
+++ b/pkg/linux_amd64/internal/race.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/reflectlite.a b/pkg/linux_amd64/internal/reflectlite.a
index 658de0b..9a7500c 100644
--- a/pkg/linux_amd64/internal/reflectlite.a
+++ b/pkg/linux_amd64/internal/reflectlite.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/singleflight.a b/pkg/linux_amd64/internal/singleflight.a
index 6b255bc..6529782 100644
--- a/pkg/linux_amd64/internal/singleflight.a
+++ b/pkg/linux_amd64/internal/singleflight.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/syscall/execenv.a b/pkg/linux_amd64/internal/syscall/execenv.a
index 9099514..7416594 100644
--- a/pkg/linux_amd64/internal/syscall/execenv.a
+++ b/pkg/linux_amd64/internal/syscall/execenv.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/syscall/unix.a b/pkg/linux_amd64/internal/syscall/unix.a
index 80c1b80..a4026c8 100644
--- a/pkg/linux_amd64/internal/syscall/unix.a
+++ b/pkg/linux_amd64/internal/syscall/unix.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/sysinfo.a b/pkg/linux_amd64/internal/sysinfo.a
index 6755c9d..4cd6e83 100644
--- a/pkg/linux_amd64/internal/sysinfo.a
+++ b/pkg/linux_amd64/internal/sysinfo.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/testenv.a b/pkg/linux_amd64/internal/testenv.a
index 8b7c842..bd5a00d 100644
--- a/pkg/linux_amd64/internal/testenv.a
+++ b/pkg/linux_amd64/internal/testenv.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/testlog.a b/pkg/linux_amd64/internal/testlog.a
index 1836507..8a7a13a 100644
--- a/pkg/linux_amd64/internal/testlog.a
+++ b/pkg/linux_amd64/internal/testlog.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/trace.a b/pkg/linux_amd64/internal/trace.a
index 0da2871..f55fe7b 100644
--- a/pkg/linux_amd64/internal/trace.a
+++ b/pkg/linux_amd64/internal/trace.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/unsafeheader.a b/pkg/linux_amd64/internal/unsafeheader.a
index cc9b4fc..6b1a91e 100644
--- a/pkg/linux_amd64/internal/unsafeheader.a
+++ b/pkg/linux_amd64/internal/unsafeheader.a
Binary files differ
diff --git a/pkg/linux_amd64/internal/xcoff.a b/pkg/linux_amd64/internal/xcoff.a
index ca38c9f..8132cc2 100644
--- a/pkg/linux_amd64/internal/xcoff.a
+++ b/pkg/linux_amd64/internal/xcoff.a
Binary files differ
diff --git a/pkg/linux_amd64/io.a b/pkg/linux_amd64/io.a
index 3fd2af3..d7777c3 100644
--- a/pkg/linux_amd64/io.a
+++ b/pkg/linux_amd64/io.a
Binary files differ
diff --git a/pkg/linux_amd64/io/fs.a b/pkg/linux_amd64/io/fs.a
index 326721e..42ccc60 100644
--- a/pkg/linux_amd64/io/fs.a
+++ b/pkg/linux_amd64/io/fs.a
Binary files differ
diff --git a/pkg/linux_amd64/io/ioutil.a b/pkg/linux_amd64/io/ioutil.a
index 3d24159..95b3fff 100644
--- a/pkg/linux_amd64/io/ioutil.a
+++ b/pkg/linux_amd64/io/ioutil.a
Binary files differ
diff --git a/pkg/linux_amd64/log.a b/pkg/linux_amd64/log.a
index 9d502f5..bfdedae 100644
--- a/pkg/linux_amd64/log.a
+++ b/pkg/linux_amd64/log.a
Binary files differ
diff --git a/pkg/linux_amd64/log/syslog.a b/pkg/linux_amd64/log/syslog.a
index bbc2a91..0aed351 100644
--- a/pkg/linux_amd64/log/syslog.a
+++ b/pkg/linux_amd64/log/syslog.a
Binary files differ
diff --git a/pkg/linux_amd64/math.a b/pkg/linux_amd64/math.a
index 1194c65..0411565 100644
--- a/pkg/linux_amd64/math.a
+++ b/pkg/linux_amd64/math.a
Binary files differ
diff --git a/pkg/linux_amd64/math/big.a b/pkg/linux_amd64/math/big.a
index 408afb8..04dd8cc 100644
--- a/pkg/linux_amd64/math/big.a
+++ b/pkg/linux_amd64/math/big.a
Binary files differ
diff --git a/pkg/linux_amd64/math/bits.a b/pkg/linux_amd64/math/bits.a
index ec27169..ff28038 100644
--- a/pkg/linux_amd64/math/bits.a
+++ b/pkg/linux_amd64/math/bits.a
Binary files differ
diff --git a/pkg/linux_amd64/math/cmplx.a b/pkg/linux_amd64/math/cmplx.a
index a598487..3acae9e 100644
--- a/pkg/linux_amd64/math/cmplx.a
+++ b/pkg/linux_amd64/math/cmplx.a
Binary files differ
diff --git a/pkg/linux_amd64/math/rand.a b/pkg/linux_amd64/math/rand.a
index 386daf7..e020dfe 100644
--- a/pkg/linux_amd64/math/rand.a
+++ b/pkg/linux_amd64/math/rand.a
Binary files differ
diff --git a/pkg/linux_amd64/mime.a b/pkg/linux_amd64/mime.a
index 5b4eed7..702cf80 100644
--- a/pkg/linux_amd64/mime.a
+++ b/pkg/linux_amd64/mime.a
Binary files differ
diff --git a/pkg/linux_amd64/mime/multipart.a b/pkg/linux_amd64/mime/multipart.a
index dec68f4..c38b101 100644
--- a/pkg/linux_amd64/mime/multipart.a
+++ b/pkg/linux_amd64/mime/multipart.a
Binary files differ
diff --git a/pkg/linux_amd64/mime/quotedprintable.a b/pkg/linux_amd64/mime/quotedprintable.a
index 9a1a908..99ab769 100644
--- a/pkg/linux_amd64/mime/quotedprintable.a
+++ b/pkg/linux_amd64/mime/quotedprintable.a
Binary files differ
diff --git a/pkg/linux_amd64/net.a b/pkg/linux_amd64/net.a
index b900e45..54ad745 100644
--- a/pkg/linux_amd64/net.a
+++ b/pkg/linux_amd64/net.a
Binary files differ
diff --git a/pkg/linux_amd64/net/http.a b/pkg/linux_amd64/net/http.a
index 17039da..1ea6078 100644
--- a/pkg/linux_amd64/net/http.a
+++ b/pkg/linux_amd64/net/http.a
Binary files differ
diff --git a/pkg/linux_amd64/net/http/cgi.a b/pkg/linux_amd64/net/http/cgi.a
index 47182ee..db1273e 100644
--- a/pkg/linux_amd64/net/http/cgi.a
+++ b/pkg/linux_amd64/net/http/cgi.a
Binary files differ
diff --git a/pkg/linux_amd64/net/http/cookiejar.a b/pkg/linux_amd64/net/http/cookiejar.a
index f39a8b8..7721b93 100644
--- a/pkg/linux_amd64/net/http/cookiejar.a
+++ b/pkg/linux_amd64/net/http/cookiejar.a
Binary files differ
diff --git a/pkg/linux_amd64/net/http/fcgi.a b/pkg/linux_amd64/net/http/fcgi.a
index 8adc5df..6b7569e 100644
--- a/pkg/linux_amd64/net/http/fcgi.a
+++ b/pkg/linux_amd64/net/http/fcgi.a
Binary files differ
diff --git a/pkg/linux_amd64/net/http/httptest.a b/pkg/linux_amd64/net/http/httptest.a
index 65ba773..22a5a78 100644
--- a/pkg/linux_amd64/net/http/httptest.a
+++ b/pkg/linux_amd64/net/http/httptest.a
Binary files differ
diff --git a/pkg/linux_amd64/net/http/httptrace.a b/pkg/linux_amd64/net/http/httptrace.a
index 36c0236..5f16e08 100644
--- a/pkg/linux_amd64/net/http/httptrace.a
+++ b/pkg/linux_amd64/net/http/httptrace.a
Binary files differ
diff --git a/pkg/linux_amd64/net/http/httputil.a b/pkg/linux_amd64/net/http/httputil.a
index 1ab3efc..6db3f11 100644
--- a/pkg/linux_amd64/net/http/httputil.a
+++ b/pkg/linux_amd64/net/http/httputil.a
Binary files differ
diff --git a/pkg/linux_amd64/net/http/internal.a b/pkg/linux_amd64/net/http/internal.a
index 0c999ee..3b4d151 100644
--- a/pkg/linux_amd64/net/http/internal.a
+++ b/pkg/linux_amd64/net/http/internal.a
Binary files differ
diff --git a/pkg/linux_amd64/net/http/internal/ascii.a b/pkg/linux_amd64/net/http/internal/ascii.a
index c23f48c..f822084 100644
--- a/pkg/linux_amd64/net/http/internal/ascii.a
+++ b/pkg/linux_amd64/net/http/internal/ascii.a
Binary files differ
diff --git a/pkg/linux_amd64/net/http/internal/testcert.a b/pkg/linux_amd64/net/http/internal/testcert.a
index a3ab55b..a4e27c3 100644
--- a/pkg/linux_amd64/net/http/internal/testcert.a
+++ b/pkg/linux_amd64/net/http/internal/testcert.a
Binary files differ
diff --git a/pkg/linux_amd64/net/http/pprof.a b/pkg/linux_amd64/net/http/pprof.a
index 09780fa..f20c313 100644
--- a/pkg/linux_amd64/net/http/pprof.a
+++ b/pkg/linux_amd64/net/http/pprof.a
Binary files differ
diff --git a/pkg/linux_amd64/net/internal/socktest.a b/pkg/linux_amd64/net/internal/socktest.a
index b655667..b9a0e33 100644
--- a/pkg/linux_amd64/net/internal/socktest.a
+++ b/pkg/linux_amd64/net/internal/socktest.a
Binary files differ
diff --git a/pkg/linux_amd64/net/mail.a b/pkg/linux_amd64/net/mail.a
index 6aff7c1..d5097f1 100644
--- a/pkg/linux_amd64/net/mail.a
+++ b/pkg/linux_amd64/net/mail.a
Binary files differ
diff --git a/pkg/linux_amd64/net/netip.a b/pkg/linux_amd64/net/netip.a
index 7b59318..8882744 100644
--- a/pkg/linux_amd64/net/netip.a
+++ b/pkg/linux_amd64/net/netip.a
Binary files differ
diff --git a/pkg/linux_amd64/net/rpc.a b/pkg/linux_amd64/net/rpc.a
index 412a75a..b487c5d 100644
--- a/pkg/linux_amd64/net/rpc.a
+++ b/pkg/linux_amd64/net/rpc.a
Binary files differ
diff --git a/pkg/linux_amd64/net/rpc/jsonrpc.a b/pkg/linux_amd64/net/rpc/jsonrpc.a
index a0a0fd0..263951a 100644
--- a/pkg/linux_amd64/net/rpc/jsonrpc.a
+++ b/pkg/linux_amd64/net/rpc/jsonrpc.a
Binary files differ
diff --git a/pkg/linux_amd64/net/smtp.a b/pkg/linux_amd64/net/smtp.a
index 7a0971f..7f34606 100644
--- a/pkg/linux_amd64/net/smtp.a
+++ b/pkg/linux_amd64/net/smtp.a
Binary files differ
diff --git a/pkg/linux_amd64/net/textproto.a b/pkg/linux_amd64/net/textproto.a
index 461c16d..c472709 100644
--- a/pkg/linux_amd64/net/textproto.a
+++ b/pkg/linux_amd64/net/textproto.a
Binary files differ
diff --git a/pkg/linux_amd64/net/url.a b/pkg/linux_amd64/net/url.a
index e618da8..992c4f4 100644
--- a/pkg/linux_amd64/net/url.a
+++ b/pkg/linux_amd64/net/url.a
Binary files differ
diff --git a/pkg/linux_amd64/os.a b/pkg/linux_amd64/os.a
index c2a061b..4418d2a 100644
--- a/pkg/linux_amd64/os.a
+++ b/pkg/linux_amd64/os.a
Binary files differ
diff --git a/pkg/linux_amd64/os/exec.a b/pkg/linux_amd64/os/exec.a
index 8a5eb7d..a772096 100644
--- a/pkg/linux_amd64/os/exec.a
+++ b/pkg/linux_amd64/os/exec.a
Binary files differ
diff --git a/pkg/linux_amd64/os/exec/internal/fdtest.a b/pkg/linux_amd64/os/exec/internal/fdtest.a
index c4490e3..096db5e 100644
--- a/pkg/linux_amd64/os/exec/internal/fdtest.a
+++ b/pkg/linux_amd64/os/exec/internal/fdtest.a
Binary files differ
diff --git a/pkg/linux_amd64/os/signal.a b/pkg/linux_amd64/os/signal.a
index 536afd9..3b820a6 100644
--- a/pkg/linux_amd64/os/signal.a
+++ b/pkg/linux_amd64/os/signal.a
Binary files differ
diff --git a/pkg/linux_amd64/os/signal/internal/pty.a b/pkg/linux_amd64/os/signal/internal/pty.a
index 518fd9d..1c78216 100644
--- a/pkg/linux_amd64/os/signal/internal/pty.a
+++ b/pkg/linux_amd64/os/signal/internal/pty.a
Binary files differ
diff --git a/pkg/linux_amd64/os/user.a b/pkg/linux_amd64/os/user.a
index b177651..cd0f67e 100644
--- a/pkg/linux_amd64/os/user.a
+++ b/pkg/linux_amd64/os/user.a
Binary files differ
diff --git a/pkg/linux_amd64/path.a b/pkg/linux_amd64/path.a
index 9025bfa..71ac5cd 100644
--- a/pkg/linux_amd64/path.a
+++ b/pkg/linux_amd64/path.a
Binary files differ
diff --git a/pkg/linux_amd64/path/filepath.a b/pkg/linux_amd64/path/filepath.a
index 1e2d092..a908435 100644
--- a/pkg/linux_amd64/path/filepath.a
+++ b/pkg/linux_amd64/path/filepath.a
Binary files differ
diff --git a/pkg/linux_amd64/plugin.a b/pkg/linux_amd64/plugin.a
index a569a4a..dcccbdd 100644
--- a/pkg/linux_amd64/plugin.a
+++ b/pkg/linux_amd64/plugin.a
Binary files differ
diff --git a/pkg/linux_amd64/reflect.a b/pkg/linux_amd64/reflect.a
index d35942b..b5b092c 100644
--- a/pkg/linux_amd64/reflect.a
+++ b/pkg/linux_amd64/reflect.a
Binary files differ
diff --git a/pkg/linux_amd64/reflect/internal/example1.a b/pkg/linux_amd64/reflect/internal/example1.a
index 6294ae6..7e825f9 100644
--- a/pkg/linux_amd64/reflect/internal/example1.a
+++ b/pkg/linux_amd64/reflect/internal/example1.a
Binary files differ
diff --git a/pkg/linux_amd64/reflect/internal/example2.a b/pkg/linux_amd64/reflect/internal/example2.a
index b516391..49f1ac5 100644
--- a/pkg/linux_amd64/reflect/internal/example2.a
+++ b/pkg/linux_amd64/reflect/internal/example2.a
Binary files differ
diff --git a/pkg/linux_amd64/regexp.a b/pkg/linux_amd64/regexp.a
index 7d6450c..b609d27 100644
--- a/pkg/linux_amd64/regexp.a
+++ b/pkg/linux_amd64/regexp.a
Binary files differ
diff --git a/pkg/linux_amd64/regexp/syntax.a b/pkg/linux_amd64/regexp/syntax.a
index ce8e395..eb6940c 100644
--- a/pkg/linux_amd64/regexp/syntax.a
+++ b/pkg/linux_amd64/regexp/syntax.a
Binary files differ
diff --git a/pkg/linux_amd64/runtime.a b/pkg/linux_amd64/runtime.a
index 56200a3..8c8c312 100644
--- a/pkg/linux_amd64/runtime.a
+++ b/pkg/linux_amd64/runtime.a
Binary files differ
diff --git a/pkg/linux_amd64/runtime/cgo.a b/pkg/linux_amd64/runtime/cgo.a
index 01aff85..0c35127 100644
--- a/pkg/linux_amd64/runtime/cgo.a
+++ b/pkg/linux_amd64/runtime/cgo.a
Binary files differ
diff --git a/pkg/linux_amd64/runtime/debug.a b/pkg/linux_amd64/runtime/debug.a
index 033e5d5..136761b 100644
--- a/pkg/linux_amd64/runtime/debug.a
+++ b/pkg/linux_amd64/runtime/debug.a
Binary files differ
diff --git a/pkg/linux_amd64/runtime/internal/atomic.a b/pkg/linux_amd64/runtime/internal/atomic.a
index c697f3f..df50508 100644
--- a/pkg/linux_amd64/runtime/internal/atomic.a
+++ b/pkg/linux_amd64/runtime/internal/atomic.a
Binary files differ
diff --git a/pkg/linux_amd64/runtime/internal/math.a b/pkg/linux_amd64/runtime/internal/math.a
index bd65cc8..ad31b99 100644
--- a/pkg/linux_amd64/runtime/internal/math.a
+++ b/pkg/linux_amd64/runtime/internal/math.a
Binary files differ
diff --git a/pkg/linux_amd64/runtime/internal/sys.a b/pkg/linux_amd64/runtime/internal/sys.a
index f0ecb41..f37fc1d 100644
--- a/pkg/linux_amd64/runtime/internal/sys.a
+++ b/pkg/linux_amd64/runtime/internal/sys.a
Binary files differ
diff --git a/pkg/linux_amd64/runtime/internal/syscall.a b/pkg/linux_amd64/runtime/internal/syscall.a
index 3a52b92..ffc4bd8 100644
--- a/pkg/linux_amd64/runtime/internal/syscall.a
+++ b/pkg/linux_amd64/runtime/internal/syscall.a
Binary files differ
diff --git a/pkg/linux_amd64/runtime/metrics.a b/pkg/linux_amd64/runtime/metrics.a
index e79e72d..a943a66 100644
--- a/pkg/linux_amd64/runtime/metrics.a
+++ b/pkg/linux_amd64/runtime/metrics.a
Binary files differ
diff --git a/pkg/linux_amd64/runtime/pprof.a b/pkg/linux_amd64/runtime/pprof.a
index 473f9fc..831f71a 100644
--- a/pkg/linux_amd64/runtime/pprof.a
+++ b/pkg/linux_amd64/runtime/pprof.a
Binary files differ
diff --git a/pkg/linux_amd64/runtime/race.a b/pkg/linux_amd64/runtime/race.a
index 67e515f..5963996 100644
--- a/pkg/linux_amd64/runtime/race.a
+++ b/pkg/linux_amd64/runtime/race.a
Binary files differ
diff --git a/pkg/linux_amd64/runtime/trace.a b/pkg/linux_amd64/runtime/trace.a
index cbf5513..b022149 100644
--- a/pkg/linux_amd64/runtime/trace.a
+++ b/pkg/linux_amd64/runtime/trace.a
Binary files differ
diff --git a/pkg/linux_amd64/sort.a b/pkg/linux_amd64/sort.a
index be24807..8d24e89 100644
--- a/pkg/linux_amd64/sort.a
+++ b/pkg/linux_amd64/sort.a
Binary files differ
diff --git a/pkg/linux_amd64/strconv.a b/pkg/linux_amd64/strconv.a
index 159656e..4ba15bb 100644
--- a/pkg/linux_amd64/strconv.a
+++ b/pkg/linux_amd64/strconv.a
Binary files differ
diff --git a/pkg/linux_amd64/strings.a b/pkg/linux_amd64/strings.a
index c3e4e8d..1f8752b 100644
--- a/pkg/linux_amd64/strings.a
+++ b/pkg/linux_amd64/strings.a
Binary files differ
diff --git a/pkg/linux_amd64/sync.a b/pkg/linux_amd64/sync.a
index d90c576..28a17b3 100644
--- a/pkg/linux_amd64/sync.a
+++ b/pkg/linux_amd64/sync.a
Binary files differ
diff --git a/pkg/linux_amd64/sync/atomic.a b/pkg/linux_amd64/sync/atomic.a
index b2ac40c..303ccf0 100644
--- a/pkg/linux_amd64/sync/atomic.a
+++ b/pkg/linux_amd64/sync/atomic.a
Binary files differ
diff --git a/pkg/linux_amd64/syscall.a b/pkg/linux_amd64/syscall.a
index 80c0cf0..3b5a44b 100644
--- a/pkg/linux_amd64/syscall.a
+++ b/pkg/linux_amd64/syscall.a
Binary files differ
diff --git a/pkg/linux_amd64/testing.a b/pkg/linux_amd64/testing.a
index a7aad18..a1ccc1d 100644
--- a/pkg/linux_amd64/testing.a
+++ b/pkg/linux_amd64/testing.a
Binary files differ
diff --git a/pkg/linux_amd64/testing/fstest.a b/pkg/linux_amd64/testing/fstest.a
index 4c6cde4..73e7119 100644
--- a/pkg/linux_amd64/testing/fstest.a
+++ b/pkg/linux_amd64/testing/fstest.a
Binary files differ
diff --git a/pkg/linux_amd64/testing/internal/testdeps.a b/pkg/linux_amd64/testing/internal/testdeps.a
index 8265f3f..cc5dbc3 100644
--- a/pkg/linux_amd64/testing/internal/testdeps.a
+++ b/pkg/linux_amd64/testing/internal/testdeps.a
Binary files differ
diff --git a/pkg/linux_amd64/testing/iotest.a b/pkg/linux_amd64/testing/iotest.a
index 966df48..ab43f70 100644
--- a/pkg/linux_amd64/testing/iotest.a
+++ b/pkg/linux_amd64/testing/iotest.a
Binary files differ
diff --git a/pkg/linux_amd64/testing/quick.a b/pkg/linux_amd64/testing/quick.a
index c6f1574..ed2a504 100644
--- a/pkg/linux_amd64/testing/quick.a
+++ b/pkg/linux_amd64/testing/quick.a
Binary files differ
diff --git a/pkg/linux_amd64/text/scanner.a b/pkg/linux_amd64/text/scanner.a
index 6a5cb38..84be55f 100644
--- a/pkg/linux_amd64/text/scanner.a
+++ b/pkg/linux_amd64/text/scanner.a
Binary files differ
diff --git a/pkg/linux_amd64/text/tabwriter.a b/pkg/linux_amd64/text/tabwriter.a
index b7c434d..7c67c49 100644
--- a/pkg/linux_amd64/text/tabwriter.a
+++ b/pkg/linux_amd64/text/tabwriter.a
Binary files differ
diff --git a/pkg/linux_amd64/text/template.a b/pkg/linux_amd64/text/template.a
index cd60581..51413b3 100644
--- a/pkg/linux_amd64/text/template.a
+++ b/pkg/linux_amd64/text/template.a
Binary files differ
diff --git a/pkg/linux_amd64/text/template/parse.a b/pkg/linux_amd64/text/template/parse.a
index 7c772b1..3cc339f 100644
--- a/pkg/linux_amd64/text/template/parse.a
+++ b/pkg/linux_amd64/text/template/parse.a
Binary files differ
diff --git a/pkg/linux_amd64/time.a b/pkg/linux_amd64/time.a
index 59e3bbd..4cd4728 100644
--- a/pkg/linux_amd64/time.a
+++ b/pkg/linux_amd64/time.a
Binary files differ
diff --git a/pkg/linux_amd64/time/tzdata.a b/pkg/linux_amd64/time/tzdata.a
index 16b105d..1fe40bd 100644
--- a/pkg/linux_amd64/time/tzdata.a
+++ b/pkg/linux_amd64/time/tzdata.a
Binary files differ
diff --git a/pkg/linux_amd64/unicode.a b/pkg/linux_amd64/unicode.a
index 01709ac..2fad19f 100644
--- a/pkg/linux_amd64/unicode.a
+++ b/pkg/linux_amd64/unicode.a
Binary files differ
diff --git a/pkg/linux_amd64/unicode/utf16.a b/pkg/linux_amd64/unicode/utf16.a
index 58ec384..8abb23d 100644
--- a/pkg/linux_amd64/unicode/utf16.a
+++ b/pkg/linux_amd64/unicode/utf16.a
Binary files differ
diff --git a/pkg/linux_amd64/unicode/utf8.a b/pkg/linux_amd64/unicode/utf8.a
index 4842645..4d9bd6a 100644
--- a/pkg/linux_amd64/unicode/utf8.a
+++ b/pkg/linux_amd64/unicode/utf8.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/crypto/chacha20.a b/pkg/linux_amd64/vendor/golang.org/x/crypto/chacha20.a
index 3bf326a..2079190 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/crypto/chacha20.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/crypto/chacha20.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/crypto/chacha20poly1305.a b/pkg/linux_amd64/vendor/golang.org/x/crypto/chacha20poly1305.a
index ebbc5e0..208b5ac 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/crypto/chacha20poly1305.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/crypto/chacha20poly1305.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/crypto/cryptobyte.a b/pkg/linux_amd64/vendor/golang.org/x/crypto/cryptobyte.a
index 978801f..a23c7f3 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/crypto/cryptobyte.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/crypto/cryptobyte.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/crypto/cryptobyte/asn1.a b/pkg/linux_amd64/vendor/golang.org/x/crypto/cryptobyte/asn1.a
index 8899907..bd48e8a 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/crypto/cryptobyte/asn1.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/crypto/cryptobyte/asn1.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/crypto/curve25519.a b/pkg/linux_amd64/vendor/golang.org/x/crypto/curve25519.a
index b0d4b38..7d480eb 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/crypto/curve25519.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/crypto/curve25519.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/crypto/curve25519/internal/field.a b/pkg/linux_amd64/vendor/golang.org/x/crypto/curve25519/internal/field.a
index 0876e33..21571c0 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/crypto/curve25519/internal/field.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/crypto/curve25519/internal/field.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/crypto/hkdf.a b/pkg/linux_amd64/vendor/golang.org/x/crypto/hkdf.a
index 7829612..2173a31 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/crypto/hkdf.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/crypto/hkdf.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/crypto/internal/poly1305.a b/pkg/linux_amd64/vendor/golang.org/x/crypto/internal/poly1305.a
index fcdf9f3..755a855 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/crypto/internal/poly1305.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/crypto/internal/poly1305.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/crypto/internal/subtle.a b/pkg/linux_amd64/vendor/golang.org/x/crypto/internal/subtle.a
index c4942c1..9e8543d 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/crypto/internal/subtle.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/crypto/internal/subtle.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/net/dns/dnsmessage.a b/pkg/linux_amd64/vendor/golang.org/x/net/dns/dnsmessage.a
index 90f5b6c..97d843f 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/net/dns/dnsmessage.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/net/dns/dnsmessage.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/net/http/httpguts.a b/pkg/linux_amd64/vendor/golang.org/x/net/http/httpguts.a
index a52ca93..a872862 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/net/http/httpguts.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/net/http/httpguts.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/net/http/httpproxy.a b/pkg/linux_amd64/vendor/golang.org/x/net/http/httpproxy.a
index 14ef45b..7242707 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/net/http/httpproxy.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/net/http/httpproxy.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/net/http2/hpack.a b/pkg/linux_amd64/vendor/golang.org/x/net/http2/hpack.a
index 5213e3c..2731283 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/net/http2/hpack.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/net/http2/hpack.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/net/idna.a b/pkg/linux_amd64/vendor/golang.org/x/net/idna.a
index 433cb73..27808de 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/net/idna.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/net/idna.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/net/nettest.a b/pkg/linux_amd64/vendor/golang.org/x/net/nettest.a
index 945f174..ebb486c 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/net/nettest.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/net/nettest.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/sys/cpu.a b/pkg/linux_amd64/vendor/golang.org/x/sys/cpu.a
index 7557add..9278757 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/sys/cpu.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/sys/cpu.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/text/secure/bidirule.a b/pkg/linux_amd64/vendor/golang.org/x/text/secure/bidirule.a
index c49fafa..89ac187 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/text/secure/bidirule.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/text/secure/bidirule.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/text/transform.a b/pkg/linux_amd64/vendor/golang.org/x/text/transform.a
index c6079f9..2be34e7 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/text/transform.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/text/transform.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/text/unicode/bidi.a b/pkg/linux_amd64/vendor/golang.org/x/text/unicode/bidi.a
index 4586bfa..ff31ad1 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/text/unicode/bidi.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/text/unicode/bidi.a
Binary files differ
diff --git a/pkg/linux_amd64/vendor/golang.org/x/text/unicode/norm.a b/pkg/linux_amd64/vendor/golang.org/x/text/unicode/norm.a
index d0d6f73..b40be09 100644
--- a/pkg/linux_amd64/vendor/golang.org/x/text/unicode/norm.a
+++ b/pkg/linux_amd64/vendor/golang.org/x/text/unicode/norm.a
Binary files differ
diff --git a/pkg/linux_amd64_race/archive/tar.a b/pkg/linux_amd64_race/archive/tar.a
index def8e2a..dc63077 100644
--- a/pkg/linux_amd64_race/archive/tar.a
+++ b/pkg/linux_amd64_race/archive/tar.a
Binary files differ
diff --git a/pkg/linux_amd64_race/archive/zip.a b/pkg/linux_amd64_race/archive/zip.a
index fb949de..44d1151 100644
--- a/pkg/linux_amd64_race/archive/zip.a
+++ b/pkg/linux_amd64_race/archive/zip.a
Binary files differ
diff --git a/pkg/linux_amd64_race/bufio.a b/pkg/linux_amd64_race/bufio.a
index ebb6969..7663aa3 100644
--- a/pkg/linux_amd64_race/bufio.a
+++ b/pkg/linux_amd64_race/bufio.a
Binary files differ
diff --git a/pkg/linux_amd64_race/bytes.a b/pkg/linux_amd64_race/bytes.a
index cae48dc..17a4674 100644
--- a/pkg/linux_amd64_race/bytes.a
+++ b/pkg/linux_amd64_race/bytes.a
Binary files differ
diff --git a/pkg/linux_amd64_race/compress/bzip2.a b/pkg/linux_amd64_race/compress/bzip2.a
index 17d513d..d773dd2 100644
--- a/pkg/linux_amd64_race/compress/bzip2.a
+++ b/pkg/linux_amd64_race/compress/bzip2.a
Binary files differ
diff --git a/pkg/linux_amd64_race/compress/flate.a b/pkg/linux_amd64_race/compress/flate.a
index 98ee263..b9c5492 100644
--- a/pkg/linux_amd64_race/compress/flate.a
+++ b/pkg/linux_amd64_race/compress/flate.a
Binary files differ
diff --git a/pkg/linux_amd64_race/compress/gzip.a b/pkg/linux_amd64_race/compress/gzip.a
index 4e50bdc..4be5e97 100644
--- a/pkg/linux_amd64_race/compress/gzip.a
+++ b/pkg/linux_amd64_race/compress/gzip.a
Binary files differ
diff --git a/pkg/linux_amd64_race/compress/lzw.a b/pkg/linux_amd64_race/compress/lzw.a
index 9a3e0c2..d119701 100644
--- a/pkg/linux_amd64_race/compress/lzw.a
+++ b/pkg/linux_amd64_race/compress/lzw.a
Binary files differ
diff --git a/pkg/linux_amd64_race/compress/zlib.a b/pkg/linux_amd64_race/compress/zlib.a
index 80f1d13..a7f7aaf 100644
--- a/pkg/linux_amd64_race/compress/zlib.a
+++ b/pkg/linux_amd64_race/compress/zlib.a
Binary files differ
diff --git a/pkg/linux_amd64_race/container/heap.a b/pkg/linux_amd64_race/container/heap.a
index 1e0cc93..178a7e1 100644
--- a/pkg/linux_amd64_race/container/heap.a
+++ b/pkg/linux_amd64_race/container/heap.a
Binary files differ
diff --git a/pkg/linux_amd64_race/container/list.a b/pkg/linux_amd64_race/container/list.a
index ea1bcf1..c793378 100644
--- a/pkg/linux_amd64_race/container/list.a
+++ b/pkg/linux_amd64_race/container/list.a
Binary files differ
diff --git a/pkg/linux_amd64_race/container/ring.a b/pkg/linux_amd64_race/container/ring.a
index a7dd362..aafae90 100644
--- a/pkg/linux_amd64_race/container/ring.a
+++ b/pkg/linux_amd64_race/container/ring.a
Binary files differ
diff --git a/pkg/linux_amd64_race/context.a b/pkg/linux_amd64_race/context.a
index ff7f675..a321445 100644
--- a/pkg/linux_amd64_race/context.a
+++ b/pkg/linux_amd64_race/context.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto.a b/pkg/linux_amd64_race/crypto.a
index d5681a4..b0e7581 100644
--- a/pkg/linux_amd64_race/crypto.a
+++ b/pkg/linux_amd64_race/crypto.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/aes.a b/pkg/linux_amd64_race/crypto/aes.a
index 8bc2663..9f2ed6a 100644
--- a/pkg/linux_amd64_race/crypto/aes.a
+++ b/pkg/linux_amd64_race/crypto/aes.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/cipher.a b/pkg/linux_amd64_race/crypto/cipher.a
index d5bebb3..7fc8ae1 100644
--- a/pkg/linux_amd64_race/crypto/cipher.a
+++ b/pkg/linux_amd64_race/crypto/cipher.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/des.a b/pkg/linux_amd64_race/crypto/des.a
index c940487..4a9f9b8 100644
--- a/pkg/linux_amd64_race/crypto/des.a
+++ b/pkg/linux_amd64_race/crypto/des.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/dsa.a b/pkg/linux_amd64_race/crypto/dsa.a
index 8df7f83..b994757 100644
--- a/pkg/linux_amd64_race/crypto/dsa.a
+++ b/pkg/linux_amd64_race/crypto/dsa.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/ecdsa.a b/pkg/linux_amd64_race/crypto/ecdsa.a
index a9a3681..1c7eaf3 100644
--- a/pkg/linux_amd64_race/crypto/ecdsa.a
+++ b/pkg/linux_amd64_race/crypto/ecdsa.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/ed25519.a b/pkg/linux_amd64_race/crypto/ed25519.a
index 9e5cb1b..abbc34c 100644
--- a/pkg/linux_amd64_race/crypto/ed25519.a
+++ b/pkg/linux_amd64_race/crypto/ed25519.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/ed25519/internal/edwards25519.a b/pkg/linux_amd64_race/crypto/ed25519/internal/edwards25519.a
index d70eff8..e07a47c 100644
--- a/pkg/linux_amd64_race/crypto/ed25519/internal/edwards25519.a
+++ b/pkg/linux_amd64_race/crypto/ed25519/internal/edwards25519.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/ed25519/internal/edwards25519/field.a b/pkg/linux_amd64_race/crypto/ed25519/internal/edwards25519/field.a
index e3b9256..bd6ec9e 100644
--- a/pkg/linux_amd64_race/crypto/ed25519/internal/edwards25519/field.a
+++ b/pkg/linux_amd64_race/crypto/ed25519/internal/edwards25519/field.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/elliptic.a b/pkg/linux_amd64_race/crypto/elliptic.a
index f17a68d..0e63f0a 100644
--- a/pkg/linux_amd64_race/crypto/elliptic.a
+++ b/pkg/linux_amd64_race/crypto/elliptic.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/elliptic/internal/fiat.a b/pkg/linux_amd64_race/crypto/elliptic/internal/fiat.a
index 2b2f223..20008c3 100644
--- a/pkg/linux_amd64_race/crypto/elliptic/internal/fiat.a
+++ b/pkg/linux_amd64_race/crypto/elliptic/internal/fiat.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/elliptic/internal/nistec.a b/pkg/linux_amd64_race/crypto/elliptic/internal/nistec.a
index 98c6e1b..0218eae 100644
--- a/pkg/linux_amd64_race/crypto/elliptic/internal/nistec.a
+++ b/pkg/linux_amd64_race/crypto/elliptic/internal/nistec.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/hmac.a b/pkg/linux_amd64_race/crypto/hmac.a
index a1b5f9a..9ee8548 100644
--- a/pkg/linux_amd64_race/crypto/hmac.a
+++ b/pkg/linux_amd64_race/crypto/hmac.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/internal/randutil.a b/pkg/linux_amd64_race/crypto/internal/randutil.a
index 55e4a50..07c17eb 100644
--- a/pkg/linux_amd64_race/crypto/internal/randutil.a
+++ b/pkg/linux_amd64_race/crypto/internal/randutil.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/internal/subtle.a b/pkg/linux_amd64_race/crypto/internal/subtle.a
index 6cb21e5..a021080 100644
--- a/pkg/linux_amd64_race/crypto/internal/subtle.a
+++ b/pkg/linux_amd64_race/crypto/internal/subtle.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/md5.a b/pkg/linux_amd64_race/crypto/md5.a
index 0653af3..19f11d8 100644
--- a/pkg/linux_amd64_race/crypto/md5.a
+++ b/pkg/linux_amd64_race/crypto/md5.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/rand.a b/pkg/linux_amd64_race/crypto/rand.a
index 69ce258..6b9f391 100644
--- a/pkg/linux_amd64_race/crypto/rand.a
+++ b/pkg/linux_amd64_race/crypto/rand.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/rc4.a b/pkg/linux_amd64_race/crypto/rc4.a
index efe79e3..a99acec 100644
--- a/pkg/linux_amd64_race/crypto/rc4.a
+++ b/pkg/linux_amd64_race/crypto/rc4.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/rsa.a b/pkg/linux_amd64_race/crypto/rsa.a
index 20e844d..089dfe2 100644
--- a/pkg/linux_amd64_race/crypto/rsa.a
+++ b/pkg/linux_amd64_race/crypto/rsa.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/sha1.a b/pkg/linux_amd64_race/crypto/sha1.a
index c1422d7..bdd78d0 100644
--- a/pkg/linux_amd64_race/crypto/sha1.a
+++ b/pkg/linux_amd64_race/crypto/sha1.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/sha256.a b/pkg/linux_amd64_race/crypto/sha256.a
index 6fdc72d..08c9abb 100644
--- a/pkg/linux_amd64_race/crypto/sha256.a
+++ b/pkg/linux_amd64_race/crypto/sha256.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/sha512.a b/pkg/linux_amd64_race/crypto/sha512.a
index c443f04..36baa3a 100644
--- a/pkg/linux_amd64_race/crypto/sha512.a
+++ b/pkg/linux_amd64_race/crypto/sha512.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/subtle.a b/pkg/linux_amd64_race/crypto/subtle.a
index 2e2a598..be3dc99 100644
--- a/pkg/linux_amd64_race/crypto/subtle.a
+++ b/pkg/linux_amd64_race/crypto/subtle.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/tls.a b/pkg/linux_amd64_race/crypto/tls.a
index c53a821..3300444 100644
--- a/pkg/linux_amd64_race/crypto/tls.a
+++ b/pkg/linux_amd64_race/crypto/tls.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/x509.a b/pkg/linux_amd64_race/crypto/x509.a
index fc403a8..0f30c0b 100644
--- a/pkg/linux_amd64_race/crypto/x509.a
+++ b/pkg/linux_amd64_race/crypto/x509.a
Binary files differ
diff --git a/pkg/linux_amd64_race/crypto/x509/pkix.a b/pkg/linux_amd64_race/crypto/x509/pkix.a
index d5a3542..98a645a 100644
--- a/pkg/linux_amd64_race/crypto/x509/pkix.a
+++ b/pkg/linux_amd64_race/crypto/x509/pkix.a
Binary files differ
diff --git a/pkg/linux_amd64_race/database/sql.a b/pkg/linux_amd64_race/database/sql.a
index 6e9c20c..53e6180 100644
--- a/pkg/linux_amd64_race/database/sql.a
+++ b/pkg/linux_amd64_race/database/sql.a
Binary files differ
diff --git a/pkg/linux_amd64_race/database/sql/driver.a b/pkg/linux_amd64_race/database/sql/driver.a
index 30ec17e..130cd82 100644
--- a/pkg/linux_amd64_race/database/sql/driver.a
+++ b/pkg/linux_amd64_race/database/sql/driver.a
Binary files differ
diff --git a/pkg/linux_amd64_race/debug/buildinfo.a b/pkg/linux_amd64_race/debug/buildinfo.a
index 02b345f..a0d3e70 100644
--- a/pkg/linux_amd64_race/debug/buildinfo.a
+++ b/pkg/linux_amd64_race/debug/buildinfo.a
Binary files differ
diff --git a/pkg/linux_amd64_race/debug/dwarf.a b/pkg/linux_amd64_race/debug/dwarf.a
index 8439ef1..05a9876 100644
--- a/pkg/linux_amd64_race/debug/dwarf.a
+++ b/pkg/linux_amd64_race/debug/dwarf.a
Binary files differ
diff --git a/pkg/linux_amd64_race/debug/elf.a b/pkg/linux_amd64_race/debug/elf.a
index 8d8ffbe..3cafe55 100644
--- a/pkg/linux_amd64_race/debug/elf.a
+++ b/pkg/linux_amd64_race/debug/elf.a
Binary files differ
diff --git a/pkg/linux_amd64_race/debug/gosym.a b/pkg/linux_amd64_race/debug/gosym.a
index 7ebe092..57d3951 100644
--- a/pkg/linux_amd64_race/debug/gosym.a
+++ b/pkg/linux_amd64_race/debug/gosym.a
Binary files differ
diff --git a/pkg/linux_amd64_race/debug/macho.a b/pkg/linux_amd64_race/debug/macho.a
index f072230..9fde81a 100644
--- a/pkg/linux_amd64_race/debug/macho.a
+++ b/pkg/linux_amd64_race/debug/macho.a
Binary files differ
diff --git a/pkg/linux_amd64_race/debug/pe.a b/pkg/linux_amd64_race/debug/pe.a
index 4f37deb..46a33f9 100644
--- a/pkg/linux_amd64_race/debug/pe.a
+++ b/pkg/linux_amd64_race/debug/pe.a
Binary files differ
diff --git a/pkg/linux_amd64_race/debug/plan9obj.a b/pkg/linux_amd64_race/debug/plan9obj.a
index a61d7da..36e4399 100644
--- a/pkg/linux_amd64_race/debug/plan9obj.a
+++ b/pkg/linux_amd64_race/debug/plan9obj.a
Binary files differ
diff --git a/pkg/linux_amd64_race/embed.a b/pkg/linux_amd64_race/embed.a
index 54414d3..b653e27 100644
--- a/pkg/linux_amd64_race/embed.a
+++ b/pkg/linux_amd64_race/embed.a
Binary files differ
diff --git a/pkg/linux_amd64_race/encoding.a b/pkg/linux_amd64_race/encoding.a
index 42da4dc..860ff34 100644
--- a/pkg/linux_amd64_race/encoding.a
+++ b/pkg/linux_amd64_race/encoding.a
Binary files differ
diff --git a/pkg/linux_amd64_race/encoding/ascii85.a b/pkg/linux_amd64_race/encoding/ascii85.a
index f192fe4..8b19cd5 100644
--- a/pkg/linux_amd64_race/encoding/ascii85.a
+++ b/pkg/linux_amd64_race/encoding/ascii85.a
Binary files differ
diff --git a/pkg/linux_amd64_race/encoding/asn1.a b/pkg/linux_amd64_race/encoding/asn1.a
index 84693d3..cb8e7e8 100644
--- a/pkg/linux_amd64_race/encoding/asn1.a
+++ b/pkg/linux_amd64_race/encoding/asn1.a
Binary files differ
diff --git a/pkg/linux_amd64_race/encoding/base32.a b/pkg/linux_amd64_race/encoding/base32.a
index d0f5104..d46949e 100644
--- a/pkg/linux_amd64_race/encoding/base32.a
+++ b/pkg/linux_amd64_race/encoding/base32.a
Binary files differ
diff --git a/pkg/linux_amd64_race/encoding/base64.a b/pkg/linux_amd64_race/encoding/base64.a
index 635adc4..9bb8187 100644
--- a/pkg/linux_amd64_race/encoding/base64.a
+++ b/pkg/linux_amd64_race/encoding/base64.a
Binary files differ
diff --git a/pkg/linux_amd64_race/encoding/binary.a b/pkg/linux_amd64_race/encoding/binary.a
index 5876bf0..e854490 100644
--- a/pkg/linux_amd64_race/encoding/binary.a
+++ b/pkg/linux_amd64_race/encoding/binary.a
Binary files differ
diff --git a/pkg/linux_amd64_race/encoding/csv.a b/pkg/linux_amd64_race/encoding/csv.a
index 8eb30e4..a3d317a 100644
--- a/pkg/linux_amd64_race/encoding/csv.a
+++ b/pkg/linux_amd64_race/encoding/csv.a
Binary files differ
diff --git a/pkg/linux_amd64_race/encoding/gob.a b/pkg/linux_amd64_race/encoding/gob.a
index db79294..e34c1d4 100644
--- a/pkg/linux_amd64_race/encoding/gob.a
+++ b/pkg/linux_amd64_race/encoding/gob.a
Binary files differ
diff --git a/pkg/linux_amd64_race/encoding/hex.a b/pkg/linux_amd64_race/encoding/hex.a
index 62a729d..d6221f2 100644
--- a/pkg/linux_amd64_race/encoding/hex.a
+++ b/pkg/linux_amd64_race/encoding/hex.a
Binary files differ
diff --git a/pkg/linux_amd64_race/encoding/json.a b/pkg/linux_amd64_race/encoding/json.a
index 2e9b392..98104f4 100644
--- a/pkg/linux_amd64_race/encoding/json.a
+++ b/pkg/linux_amd64_race/encoding/json.a
Binary files differ
diff --git a/pkg/linux_amd64_race/encoding/pem.a b/pkg/linux_amd64_race/encoding/pem.a
index 0a70eeb..ea29265 100644
--- a/pkg/linux_amd64_race/encoding/pem.a
+++ b/pkg/linux_amd64_race/encoding/pem.a
Binary files differ
diff --git a/pkg/linux_amd64_race/encoding/xml.a b/pkg/linux_amd64_race/encoding/xml.a
index 93895d1..be031d5 100644
--- a/pkg/linux_amd64_race/encoding/xml.a
+++ b/pkg/linux_amd64_race/encoding/xml.a
Binary files differ
diff --git a/pkg/linux_amd64_race/errors.a b/pkg/linux_amd64_race/errors.a
index 0b2c0e1..ff97306 100644
--- a/pkg/linux_amd64_race/errors.a
+++ b/pkg/linux_amd64_race/errors.a
Binary files differ
diff --git a/pkg/linux_amd64_race/expvar.a b/pkg/linux_amd64_race/expvar.a
index a6d6714..152bb9b 100644
--- a/pkg/linux_amd64_race/expvar.a
+++ b/pkg/linux_amd64_race/expvar.a
Binary files differ
diff --git a/pkg/linux_amd64_race/flag.a b/pkg/linux_amd64_race/flag.a
index bf60e2a..69881ad 100644
--- a/pkg/linux_amd64_race/flag.a
+++ b/pkg/linux_amd64_race/flag.a
Binary files differ
diff --git a/pkg/linux_amd64_race/fmt.a b/pkg/linux_amd64_race/fmt.a
index 684b979..8a96627 100644
--- a/pkg/linux_amd64_race/fmt.a
+++ b/pkg/linux_amd64_race/fmt.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/ast.a b/pkg/linux_amd64_race/go/ast.a
index 1909242..579594d 100644
--- a/pkg/linux_amd64_race/go/ast.a
+++ b/pkg/linux_amd64_race/go/ast.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/build.a b/pkg/linux_amd64_race/go/build.a
index 764d595..7683e74 100644
--- a/pkg/linux_amd64_race/go/build.a
+++ b/pkg/linux_amd64_race/go/build.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/build/constraint.a b/pkg/linux_amd64_race/go/build/constraint.a
index b62935a..420ac01 100644
--- a/pkg/linux_amd64_race/go/build/constraint.a
+++ b/pkg/linux_amd64_race/go/build/constraint.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/constant.a b/pkg/linux_amd64_race/go/constant.a
index c4d7d9c..35d32d8 100644
--- a/pkg/linux_amd64_race/go/constant.a
+++ b/pkg/linux_amd64_race/go/constant.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/doc.a b/pkg/linux_amd64_race/go/doc.a
index cded842..e9ecb10 100644
--- a/pkg/linux_amd64_race/go/doc.a
+++ b/pkg/linux_amd64_race/go/doc.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/format.a b/pkg/linux_amd64_race/go/format.a
index 8c1a297..3b324ea 100644
--- a/pkg/linux_amd64_race/go/format.a
+++ b/pkg/linux_amd64_race/go/format.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/importer.a b/pkg/linux_amd64_race/go/importer.a
index d6c2a94..4ff2be6 100644
--- a/pkg/linux_amd64_race/go/importer.a
+++ b/pkg/linux_amd64_race/go/importer.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/internal/gccgoimporter.a b/pkg/linux_amd64_race/go/internal/gccgoimporter.a
index 0ba37b8..376c364 100644
--- a/pkg/linux_amd64_race/go/internal/gccgoimporter.a
+++ b/pkg/linux_amd64_race/go/internal/gccgoimporter.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/internal/gcimporter.a b/pkg/linux_amd64_race/go/internal/gcimporter.a
index 857ebdc..40800db 100644
--- a/pkg/linux_amd64_race/go/internal/gcimporter.a
+++ b/pkg/linux_amd64_race/go/internal/gcimporter.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/internal/srcimporter.a b/pkg/linux_amd64_race/go/internal/srcimporter.a
index c8ae8cb..1621419 100644
--- a/pkg/linux_amd64_race/go/internal/srcimporter.a
+++ b/pkg/linux_amd64_race/go/internal/srcimporter.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/internal/typeparams.a b/pkg/linux_amd64_race/go/internal/typeparams.a
index c16a84d..5623dff 100644
--- a/pkg/linux_amd64_race/go/internal/typeparams.a
+++ b/pkg/linux_amd64_race/go/internal/typeparams.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/parser.a b/pkg/linux_amd64_race/go/parser.a
index 0f70f3c..da00f0e 100644
--- a/pkg/linux_amd64_race/go/parser.a
+++ b/pkg/linux_amd64_race/go/parser.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/printer.a b/pkg/linux_amd64_race/go/printer.a
index 17a3778..86c247f 100644
--- a/pkg/linux_amd64_race/go/printer.a
+++ b/pkg/linux_amd64_race/go/printer.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/scanner.a b/pkg/linux_amd64_race/go/scanner.a
index 000ddcb..db26800 100644
--- a/pkg/linux_amd64_race/go/scanner.a
+++ b/pkg/linux_amd64_race/go/scanner.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/token.a b/pkg/linux_amd64_race/go/token.a
index dbdda0c..3cf26e7 100644
--- a/pkg/linux_amd64_race/go/token.a
+++ b/pkg/linux_amd64_race/go/token.a
Binary files differ
diff --git a/pkg/linux_amd64_race/go/types.a b/pkg/linux_amd64_race/go/types.a
index 315fca2..cae31ca 100644
--- a/pkg/linux_amd64_race/go/types.a
+++ b/pkg/linux_amd64_race/go/types.a
Binary files differ
diff --git a/pkg/linux_amd64_race/hash.a b/pkg/linux_amd64_race/hash.a
index 976e373..f1e5ba2 100644
--- a/pkg/linux_amd64_race/hash.a
+++ b/pkg/linux_amd64_race/hash.a
Binary files differ
diff --git a/pkg/linux_amd64_race/hash/adler32.a b/pkg/linux_amd64_race/hash/adler32.a
index b9e1f17..2e2e16e 100644
--- a/pkg/linux_amd64_race/hash/adler32.a
+++ b/pkg/linux_amd64_race/hash/adler32.a
Binary files differ
diff --git a/pkg/linux_amd64_race/hash/crc32.a b/pkg/linux_amd64_race/hash/crc32.a
index c5709c3..b1f8f09 100644
--- a/pkg/linux_amd64_race/hash/crc32.a
+++ b/pkg/linux_amd64_race/hash/crc32.a
Binary files differ
diff --git a/pkg/linux_amd64_race/hash/crc64.a b/pkg/linux_amd64_race/hash/crc64.a
index 83ff221..920060d 100644
--- a/pkg/linux_amd64_race/hash/crc64.a
+++ b/pkg/linux_amd64_race/hash/crc64.a
Binary files differ
diff --git a/pkg/linux_amd64_race/hash/fnv.a b/pkg/linux_amd64_race/hash/fnv.a
index 4a38375..6ab4552 100644
--- a/pkg/linux_amd64_race/hash/fnv.a
+++ b/pkg/linux_amd64_race/hash/fnv.a
Binary files differ
diff --git a/pkg/linux_amd64_race/hash/maphash.a b/pkg/linux_amd64_race/hash/maphash.a
index 38e78fd..6b223f6 100644
--- a/pkg/linux_amd64_race/hash/maphash.a
+++ b/pkg/linux_amd64_race/hash/maphash.a
Binary files differ
diff --git a/pkg/linux_amd64_race/html.a b/pkg/linux_amd64_race/html.a
index 3b9c8a6..ac46a04 100644
--- a/pkg/linux_amd64_race/html.a
+++ b/pkg/linux_amd64_race/html.a
Binary files differ
diff --git a/pkg/linux_amd64_race/html/template.a b/pkg/linux_amd64_race/html/template.a
index e301404..b0eb106 100644
--- a/pkg/linux_amd64_race/html/template.a
+++ b/pkg/linux_amd64_race/html/template.a
Binary files differ
diff --git a/pkg/linux_amd64_race/image.a b/pkg/linux_amd64_race/image.a
index 4b8bbf1..b1bfbd1 100644
--- a/pkg/linux_amd64_race/image.a
+++ b/pkg/linux_amd64_race/image.a
Binary files differ
diff --git a/pkg/linux_amd64_race/image/color.a b/pkg/linux_amd64_race/image/color.a
index b23e3e2..55b5e67 100644
--- a/pkg/linux_amd64_race/image/color.a
+++ b/pkg/linux_amd64_race/image/color.a
Binary files differ
diff --git a/pkg/linux_amd64_race/image/color/palette.a b/pkg/linux_amd64_race/image/color/palette.a
index 0ab32da..408241c 100644
--- a/pkg/linux_amd64_race/image/color/palette.a
+++ b/pkg/linux_amd64_race/image/color/palette.a
Binary files differ
diff --git a/pkg/linux_amd64_race/image/draw.a b/pkg/linux_amd64_race/image/draw.a
index 79abd51..653f27e 100644
--- a/pkg/linux_amd64_race/image/draw.a
+++ b/pkg/linux_amd64_race/image/draw.a
Binary files differ
diff --git a/pkg/linux_amd64_race/image/gif.a b/pkg/linux_amd64_race/image/gif.a
index 9bce75c..83461a6 100644
--- a/pkg/linux_amd64_race/image/gif.a
+++ b/pkg/linux_amd64_race/image/gif.a
Binary files differ
diff --git a/pkg/linux_amd64_race/image/internal/imageutil.a b/pkg/linux_amd64_race/image/internal/imageutil.a
index c30248d..ae1bde8 100644
--- a/pkg/linux_amd64_race/image/internal/imageutil.a
+++ b/pkg/linux_amd64_race/image/internal/imageutil.a
Binary files differ
diff --git a/pkg/linux_amd64_race/image/jpeg.a b/pkg/linux_amd64_race/image/jpeg.a
index 1ace7e8..fafffd4 100644
--- a/pkg/linux_amd64_race/image/jpeg.a
+++ b/pkg/linux_amd64_race/image/jpeg.a
Binary files differ
diff --git a/pkg/linux_amd64_race/image/png.a b/pkg/linux_amd64_race/image/png.a
index 1190e4c..32c6bbc 100644
--- a/pkg/linux_amd64_race/image/png.a
+++ b/pkg/linux_amd64_race/image/png.a
Binary files differ
diff --git a/pkg/linux_amd64_race/index/suffixarray.a b/pkg/linux_amd64_race/index/suffixarray.a
index f641068..75209ae 100644
--- a/pkg/linux_amd64_race/index/suffixarray.a
+++ b/pkg/linux_amd64_race/index/suffixarray.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/abi.a b/pkg/linux_amd64_race/internal/abi.a
index 733c00a..bbd4217 100644
--- a/pkg/linux_amd64_race/internal/abi.a
+++ b/pkg/linux_amd64_race/internal/abi.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/buildcfg.a b/pkg/linux_amd64_race/internal/buildcfg.a
index 1cdbd87..5795b76 100644
--- a/pkg/linux_amd64_race/internal/buildcfg.a
+++ b/pkg/linux_amd64_race/internal/buildcfg.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/bytealg.a b/pkg/linux_amd64_race/internal/bytealg.a
index 622b7f3..4467af3 100644
--- a/pkg/linux_amd64_race/internal/bytealg.a
+++ b/pkg/linux_amd64_race/internal/bytealg.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/cfg.a b/pkg/linux_amd64_race/internal/cfg.a
index b7bf6b6..2c2eca3 100644
--- a/pkg/linux_amd64_race/internal/cfg.a
+++ b/pkg/linux_amd64_race/internal/cfg.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/cpu.a b/pkg/linux_amd64_race/internal/cpu.a
index d5ba8b6..8d48f18 100644
--- a/pkg/linux_amd64_race/internal/cpu.a
+++ b/pkg/linux_amd64_race/internal/cpu.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/execabs.a b/pkg/linux_amd64_race/internal/execabs.a
index 72e3227..839cc41 100644
--- a/pkg/linux_amd64_race/internal/execabs.a
+++ b/pkg/linux_amd64_race/internal/execabs.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/fmtsort.a b/pkg/linux_amd64_race/internal/fmtsort.a
index 57c1c5b..5033142 100644
--- a/pkg/linux_amd64_race/internal/fmtsort.a
+++ b/pkg/linux_amd64_race/internal/fmtsort.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/fuzz.a b/pkg/linux_amd64_race/internal/fuzz.a
index 499e0f7..1aa7e68 100644
--- a/pkg/linux_amd64_race/internal/fuzz.a
+++ b/pkg/linux_amd64_race/internal/fuzz.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/goarch.a b/pkg/linux_amd64_race/internal/goarch.a
index b64d1ea..60e1323 100644
--- a/pkg/linux_amd64_race/internal/goarch.a
+++ b/pkg/linux_amd64_race/internal/goarch.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/godebug.a b/pkg/linux_amd64_race/internal/godebug.a
index 809cc01..cdd3419 100644
--- a/pkg/linux_amd64_race/internal/godebug.a
+++ b/pkg/linux_amd64_race/internal/godebug.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/goexperiment.a b/pkg/linux_amd64_race/internal/goexperiment.a
index 0ed492c..2d8e988 100644
--- a/pkg/linux_amd64_race/internal/goexperiment.a
+++ b/pkg/linux_amd64_race/internal/goexperiment.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/goos.a b/pkg/linux_amd64_race/internal/goos.a
index b4dec9c..a84cce5 100644
--- a/pkg/linux_amd64_race/internal/goos.a
+++ b/pkg/linux_amd64_race/internal/goos.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/goroot.a b/pkg/linux_amd64_race/internal/goroot.a
index 63c0f09..47f35ba 100644
--- a/pkg/linux_amd64_race/internal/goroot.a
+++ b/pkg/linux_amd64_race/internal/goroot.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/goversion.a b/pkg/linux_amd64_race/internal/goversion.a
index 061f76e..2279850 100644
--- a/pkg/linux_amd64_race/internal/goversion.a
+++ b/pkg/linux_amd64_race/internal/goversion.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/intern.a b/pkg/linux_amd64_race/internal/intern.a
index 191497e..21ee8b9 100644
--- a/pkg/linux_amd64_race/internal/intern.a
+++ b/pkg/linux_amd64_race/internal/intern.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/itoa.a b/pkg/linux_amd64_race/internal/itoa.a
index eed8077..a3bcdcf 100644
--- a/pkg/linux_amd64_race/internal/itoa.a
+++ b/pkg/linux_amd64_race/internal/itoa.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/lazyregexp.a b/pkg/linux_amd64_race/internal/lazyregexp.a
index 03897ae..55ff416 100644
--- a/pkg/linux_amd64_race/internal/lazyregexp.a
+++ b/pkg/linux_amd64_race/internal/lazyregexp.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/lazytemplate.a b/pkg/linux_amd64_race/internal/lazytemplate.a
index d926ec8..64bb954 100644
--- a/pkg/linux_amd64_race/internal/lazytemplate.a
+++ b/pkg/linux_amd64_race/internal/lazytemplate.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/nettrace.a b/pkg/linux_amd64_race/internal/nettrace.a
index b41e9c4..74aa0ea 100644
--- a/pkg/linux_amd64_race/internal/nettrace.a
+++ b/pkg/linux_amd64_race/internal/nettrace.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/obscuretestdata.a b/pkg/linux_amd64_race/internal/obscuretestdata.a
index 3cf20bc..031a7d0 100644
--- a/pkg/linux_amd64_race/internal/obscuretestdata.a
+++ b/pkg/linux_amd64_race/internal/obscuretestdata.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/oserror.a b/pkg/linux_amd64_race/internal/oserror.a
index 6749147..a303b57 100644
--- a/pkg/linux_amd64_race/internal/oserror.a
+++ b/pkg/linux_amd64_race/internal/oserror.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/poll.a b/pkg/linux_amd64_race/internal/poll.a
index 518222a..0521166 100644
--- a/pkg/linux_amd64_race/internal/poll.a
+++ b/pkg/linux_amd64_race/internal/poll.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/profile.a b/pkg/linux_amd64_race/internal/profile.a
index 77d057e..bb048b4 100644
--- a/pkg/linux_amd64_race/internal/profile.a
+++ b/pkg/linux_amd64_race/internal/profile.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/race.a b/pkg/linux_amd64_race/internal/race.a
index f6db16a..16f4b20 100644
--- a/pkg/linux_amd64_race/internal/race.a
+++ b/pkg/linux_amd64_race/internal/race.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/reflectlite.a b/pkg/linux_amd64_race/internal/reflectlite.a
index f0005cd..e0d54f0 100644
--- a/pkg/linux_amd64_race/internal/reflectlite.a
+++ b/pkg/linux_amd64_race/internal/reflectlite.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/singleflight.a b/pkg/linux_amd64_race/internal/singleflight.a
index e061a8d..69cbb47 100644
--- a/pkg/linux_amd64_race/internal/singleflight.a
+++ b/pkg/linux_amd64_race/internal/singleflight.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/syscall/execenv.a b/pkg/linux_amd64_race/internal/syscall/execenv.a
index 10b3b0a..f1b16b2 100644
--- a/pkg/linux_amd64_race/internal/syscall/execenv.a
+++ b/pkg/linux_amd64_race/internal/syscall/execenv.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/syscall/unix.a b/pkg/linux_amd64_race/internal/syscall/unix.a
index 9333049..36ab438 100644
--- a/pkg/linux_amd64_race/internal/syscall/unix.a
+++ b/pkg/linux_amd64_race/internal/syscall/unix.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/sysinfo.a b/pkg/linux_amd64_race/internal/sysinfo.a
index 01c73a2..c221f67 100644
--- a/pkg/linux_amd64_race/internal/sysinfo.a
+++ b/pkg/linux_amd64_race/internal/sysinfo.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/testenv.a b/pkg/linux_amd64_race/internal/testenv.a
index c65ff26..9135562 100644
--- a/pkg/linux_amd64_race/internal/testenv.a
+++ b/pkg/linux_amd64_race/internal/testenv.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/testlog.a b/pkg/linux_amd64_race/internal/testlog.a
index ea63214..b7a42c6 100644
--- a/pkg/linux_amd64_race/internal/testlog.a
+++ b/pkg/linux_amd64_race/internal/testlog.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/trace.a b/pkg/linux_amd64_race/internal/trace.a
index 1a7cd74..a38c0e3 100644
--- a/pkg/linux_amd64_race/internal/trace.a
+++ b/pkg/linux_amd64_race/internal/trace.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/unsafeheader.a b/pkg/linux_amd64_race/internal/unsafeheader.a
index faf4a08..9f6562a 100644
--- a/pkg/linux_amd64_race/internal/unsafeheader.a
+++ b/pkg/linux_amd64_race/internal/unsafeheader.a
Binary files differ
diff --git a/pkg/linux_amd64_race/internal/xcoff.a b/pkg/linux_amd64_race/internal/xcoff.a
index 9892064..6229f6f 100644
--- a/pkg/linux_amd64_race/internal/xcoff.a
+++ b/pkg/linux_amd64_race/internal/xcoff.a
Binary files differ
diff --git a/pkg/linux_amd64_race/io.a b/pkg/linux_amd64_race/io.a
index 68e1e54..8d01b8a 100644
--- a/pkg/linux_amd64_race/io.a
+++ b/pkg/linux_amd64_race/io.a
Binary files differ
diff --git a/pkg/linux_amd64_race/io/fs.a b/pkg/linux_amd64_race/io/fs.a
index 8033523..1cd97df 100644
--- a/pkg/linux_amd64_race/io/fs.a
+++ b/pkg/linux_amd64_race/io/fs.a
Binary files differ
diff --git a/pkg/linux_amd64_race/io/ioutil.a b/pkg/linux_amd64_race/io/ioutil.a
index 2735209..8d2923a 100644
--- a/pkg/linux_amd64_race/io/ioutil.a
+++ b/pkg/linux_amd64_race/io/ioutil.a
Binary files differ
diff --git a/pkg/linux_amd64_race/log.a b/pkg/linux_amd64_race/log.a
index 152cfd0..a9fe496 100644
--- a/pkg/linux_amd64_race/log.a
+++ b/pkg/linux_amd64_race/log.a
Binary files differ
diff --git a/pkg/linux_amd64_race/log/syslog.a b/pkg/linux_amd64_race/log/syslog.a
index 5d5d979..f25189b 100644
--- a/pkg/linux_amd64_race/log/syslog.a
+++ b/pkg/linux_amd64_race/log/syslog.a
Binary files differ
diff --git a/pkg/linux_amd64_race/math.a b/pkg/linux_amd64_race/math.a
index cbb93de..e5de3b8 100644
--- a/pkg/linux_amd64_race/math.a
+++ b/pkg/linux_amd64_race/math.a
Binary files differ
diff --git a/pkg/linux_amd64_race/math/big.a b/pkg/linux_amd64_race/math/big.a
index e1094ea..7659273 100644
--- a/pkg/linux_amd64_race/math/big.a
+++ b/pkg/linux_amd64_race/math/big.a
Binary files differ
diff --git a/pkg/linux_amd64_race/math/bits.a b/pkg/linux_amd64_race/math/bits.a
index e8a34e0..23680d8 100644
--- a/pkg/linux_amd64_race/math/bits.a
+++ b/pkg/linux_amd64_race/math/bits.a
Binary files differ
diff --git a/pkg/linux_amd64_race/math/cmplx.a b/pkg/linux_amd64_race/math/cmplx.a
index f391566..e34acdc 100644
--- a/pkg/linux_amd64_race/math/cmplx.a
+++ b/pkg/linux_amd64_race/math/cmplx.a
Binary files differ
diff --git a/pkg/linux_amd64_race/math/rand.a b/pkg/linux_amd64_race/math/rand.a
index 0d83ac4..c53f475 100644
--- a/pkg/linux_amd64_race/math/rand.a
+++ b/pkg/linux_amd64_race/math/rand.a
Binary files differ
diff --git a/pkg/linux_amd64_race/mime.a b/pkg/linux_amd64_race/mime.a
index 99590aa..8715488 100644
--- a/pkg/linux_amd64_race/mime.a
+++ b/pkg/linux_amd64_race/mime.a
Binary files differ
diff --git a/pkg/linux_amd64_race/mime/multipart.a b/pkg/linux_amd64_race/mime/multipart.a
index c63a538..46285bd 100644
--- a/pkg/linux_amd64_race/mime/multipart.a
+++ b/pkg/linux_amd64_race/mime/multipart.a
Binary files differ
diff --git a/pkg/linux_amd64_race/mime/quotedprintable.a b/pkg/linux_amd64_race/mime/quotedprintable.a
index e29a861..6b0370d 100644
--- a/pkg/linux_amd64_race/mime/quotedprintable.a
+++ b/pkg/linux_amd64_race/mime/quotedprintable.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net.a b/pkg/linux_amd64_race/net.a
index 6385af0..a9a028b 100644
--- a/pkg/linux_amd64_race/net.a
+++ b/pkg/linux_amd64_race/net.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/http.a b/pkg/linux_amd64_race/net/http.a
index fb83249..41dff23 100644
--- a/pkg/linux_amd64_race/net/http.a
+++ b/pkg/linux_amd64_race/net/http.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/http/cgi.a b/pkg/linux_amd64_race/net/http/cgi.a
index ac414cc..7dbbf60 100644
--- a/pkg/linux_amd64_race/net/http/cgi.a
+++ b/pkg/linux_amd64_race/net/http/cgi.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/http/cookiejar.a b/pkg/linux_amd64_race/net/http/cookiejar.a
index 0aeea1d..c75d878 100644
--- a/pkg/linux_amd64_race/net/http/cookiejar.a
+++ b/pkg/linux_amd64_race/net/http/cookiejar.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/http/fcgi.a b/pkg/linux_amd64_race/net/http/fcgi.a
index 186021b..29aee3f 100644
--- a/pkg/linux_amd64_race/net/http/fcgi.a
+++ b/pkg/linux_amd64_race/net/http/fcgi.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/http/httptest.a b/pkg/linux_amd64_race/net/http/httptest.a
index 9fc2da1..34745c3 100644
--- a/pkg/linux_amd64_race/net/http/httptest.a
+++ b/pkg/linux_amd64_race/net/http/httptest.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/http/httptrace.a b/pkg/linux_amd64_race/net/http/httptrace.a
index 489fd41..ee6db98 100644
--- a/pkg/linux_amd64_race/net/http/httptrace.a
+++ b/pkg/linux_amd64_race/net/http/httptrace.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/http/httputil.a b/pkg/linux_amd64_race/net/http/httputil.a
index cfe1435..ea08caa 100644
--- a/pkg/linux_amd64_race/net/http/httputil.a
+++ b/pkg/linux_amd64_race/net/http/httputil.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/http/internal.a b/pkg/linux_amd64_race/net/http/internal.a
index 9b941ac..4160c1a 100644
--- a/pkg/linux_amd64_race/net/http/internal.a
+++ b/pkg/linux_amd64_race/net/http/internal.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/http/internal/ascii.a b/pkg/linux_amd64_race/net/http/internal/ascii.a
index 1b65358..d6dcad4 100644
--- a/pkg/linux_amd64_race/net/http/internal/ascii.a
+++ b/pkg/linux_amd64_race/net/http/internal/ascii.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/http/internal/testcert.a b/pkg/linux_amd64_race/net/http/internal/testcert.a
index 7b6cf30..875d40e 100644
--- a/pkg/linux_amd64_race/net/http/internal/testcert.a
+++ b/pkg/linux_amd64_race/net/http/internal/testcert.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/http/pprof.a b/pkg/linux_amd64_race/net/http/pprof.a
index 0934e2f..1ceb721 100644
--- a/pkg/linux_amd64_race/net/http/pprof.a
+++ b/pkg/linux_amd64_race/net/http/pprof.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/internal/socktest.a b/pkg/linux_amd64_race/net/internal/socktest.a
index b5f7157..cd925d4 100644
--- a/pkg/linux_amd64_race/net/internal/socktest.a
+++ b/pkg/linux_amd64_race/net/internal/socktest.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/mail.a b/pkg/linux_amd64_race/net/mail.a
index 8f4f4c3..495ea12 100644
--- a/pkg/linux_amd64_race/net/mail.a
+++ b/pkg/linux_amd64_race/net/mail.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/netip.a b/pkg/linux_amd64_race/net/netip.a
index e89db99..628b680 100644
--- a/pkg/linux_amd64_race/net/netip.a
+++ b/pkg/linux_amd64_race/net/netip.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/rpc.a b/pkg/linux_amd64_race/net/rpc.a
index d764ad4..3d3878e 100644
--- a/pkg/linux_amd64_race/net/rpc.a
+++ b/pkg/linux_amd64_race/net/rpc.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/rpc/jsonrpc.a b/pkg/linux_amd64_race/net/rpc/jsonrpc.a
index 5170775..970a07e 100644
--- a/pkg/linux_amd64_race/net/rpc/jsonrpc.a
+++ b/pkg/linux_amd64_race/net/rpc/jsonrpc.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/smtp.a b/pkg/linux_amd64_race/net/smtp.a
index 2422037..ff54b9f 100644
--- a/pkg/linux_amd64_race/net/smtp.a
+++ b/pkg/linux_amd64_race/net/smtp.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/textproto.a b/pkg/linux_amd64_race/net/textproto.a
index dc8337b..6a5debd 100644
--- a/pkg/linux_amd64_race/net/textproto.a
+++ b/pkg/linux_amd64_race/net/textproto.a
Binary files differ
diff --git a/pkg/linux_amd64_race/net/url.a b/pkg/linux_amd64_race/net/url.a
index b82f611..248f85e 100644
--- a/pkg/linux_amd64_race/net/url.a
+++ b/pkg/linux_amd64_race/net/url.a
Binary files differ
diff --git a/pkg/linux_amd64_race/os.a b/pkg/linux_amd64_race/os.a
index 84d5bbd..191fa87 100644
--- a/pkg/linux_amd64_race/os.a
+++ b/pkg/linux_amd64_race/os.a
Binary files differ
diff --git a/pkg/linux_amd64_race/os/exec.a b/pkg/linux_amd64_race/os/exec.a
index 55962f8..bb843e4 100644
--- a/pkg/linux_amd64_race/os/exec.a
+++ b/pkg/linux_amd64_race/os/exec.a
Binary files differ
diff --git a/pkg/linux_amd64_race/os/exec/internal/fdtest.a b/pkg/linux_amd64_race/os/exec/internal/fdtest.a
index d015fb4..a3190ba 100644
--- a/pkg/linux_amd64_race/os/exec/internal/fdtest.a
+++ b/pkg/linux_amd64_race/os/exec/internal/fdtest.a
Binary files differ
diff --git a/pkg/linux_amd64_race/os/signal.a b/pkg/linux_amd64_race/os/signal.a
index bfc3aaa..dfc4069 100644
--- a/pkg/linux_amd64_race/os/signal.a
+++ b/pkg/linux_amd64_race/os/signal.a
Binary files differ
diff --git a/pkg/linux_amd64_race/os/signal/internal/pty.a b/pkg/linux_amd64_race/os/signal/internal/pty.a
index 3f16b43..6c8eb6a 100644
--- a/pkg/linux_amd64_race/os/signal/internal/pty.a
+++ b/pkg/linux_amd64_race/os/signal/internal/pty.a
Binary files differ
diff --git a/pkg/linux_amd64_race/os/user.a b/pkg/linux_amd64_race/os/user.a
index 3535220..3d2f1d7 100644
--- a/pkg/linux_amd64_race/os/user.a
+++ b/pkg/linux_amd64_race/os/user.a
Binary files differ
diff --git a/pkg/linux_amd64_race/path.a b/pkg/linux_amd64_race/path.a
index 95588b4..984537f 100644
--- a/pkg/linux_amd64_race/path.a
+++ b/pkg/linux_amd64_race/path.a
Binary files differ
diff --git a/pkg/linux_amd64_race/path/filepath.a b/pkg/linux_amd64_race/path/filepath.a
index 7da1e68..0b09f2c 100644
--- a/pkg/linux_amd64_race/path/filepath.a
+++ b/pkg/linux_amd64_race/path/filepath.a
Binary files differ
diff --git a/pkg/linux_amd64_race/plugin.a b/pkg/linux_amd64_race/plugin.a
index 439f358..a2d163f 100644
--- a/pkg/linux_amd64_race/plugin.a
+++ b/pkg/linux_amd64_race/plugin.a
Binary files differ
diff --git a/pkg/linux_amd64_race/reflect.a b/pkg/linux_amd64_race/reflect.a
index 1628871..a2eb9dd 100644
--- a/pkg/linux_amd64_race/reflect.a
+++ b/pkg/linux_amd64_race/reflect.a
Binary files differ
diff --git a/pkg/linux_amd64_race/reflect/internal/example1.a b/pkg/linux_amd64_race/reflect/internal/example1.a
index b2e3c4e..81cc54b 100644
--- a/pkg/linux_amd64_race/reflect/internal/example1.a
+++ b/pkg/linux_amd64_race/reflect/internal/example1.a
Binary files differ
diff --git a/pkg/linux_amd64_race/reflect/internal/example2.a b/pkg/linux_amd64_race/reflect/internal/example2.a
index 079600d..88659c9 100644
--- a/pkg/linux_amd64_race/reflect/internal/example2.a
+++ b/pkg/linux_amd64_race/reflect/internal/example2.a
Binary files differ
diff --git a/pkg/linux_amd64_race/regexp.a b/pkg/linux_amd64_race/regexp.a
index 4af0118..2d1c9b3 100644
--- a/pkg/linux_amd64_race/regexp.a
+++ b/pkg/linux_amd64_race/regexp.a
Binary files differ
diff --git a/pkg/linux_amd64_race/regexp/syntax.a b/pkg/linux_amd64_race/regexp/syntax.a
index 1f6ffe4..87b78db 100644
--- a/pkg/linux_amd64_race/regexp/syntax.a
+++ b/pkg/linux_amd64_race/regexp/syntax.a
Binary files differ
diff --git a/pkg/linux_amd64_race/runtime.a b/pkg/linux_amd64_race/runtime.a
index 07114a0..d68b8fd 100644
--- a/pkg/linux_amd64_race/runtime.a
+++ b/pkg/linux_amd64_race/runtime.a
Binary files differ
diff --git a/pkg/linux_amd64_race/runtime/cgo.a b/pkg/linux_amd64_race/runtime/cgo.a
index 7960197..4976f30 100644
--- a/pkg/linux_amd64_race/runtime/cgo.a
+++ b/pkg/linux_amd64_race/runtime/cgo.a
Binary files differ
diff --git a/pkg/linux_amd64_race/runtime/debug.a b/pkg/linux_amd64_race/runtime/debug.a
index 9b9082f..c45773f 100644
--- a/pkg/linux_amd64_race/runtime/debug.a
+++ b/pkg/linux_amd64_race/runtime/debug.a
Binary files differ
diff --git a/pkg/linux_amd64_race/runtime/internal/atomic.a b/pkg/linux_amd64_race/runtime/internal/atomic.a
index c04dc37..e649b4f 100644
--- a/pkg/linux_amd64_race/runtime/internal/atomic.a
+++ b/pkg/linux_amd64_race/runtime/internal/atomic.a
Binary files differ
diff --git a/pkg/linux_amd64_race/runtime/internal/math.a b/pkg/linux_amd64_race/runtime/internal/math.a
index c178669..aa2dc9e 100644
--- a/pkg/linux_amd64_race/runtime/internal/math.a
+++ b/pkg/linux_amd64_race/runtime/internal/math.a
Binary files differ
diff --git a/pkg/linux_amd64_race/runtime/internal/sys.a b/pkg/linux_amd64_race/runtime/internal/sys.a
index a4687d7..8c9f0e8 100644
--- a/pkg/linux_amd64_race/runtime/internal/sys.a
+++ b/pkg/linux_amd64_race/runtime/internal/sys.a
Binary files differ
diff --git a/pkg/linux_amd64_race/runtime/internal/syscall.a b/pkg/linux_amd64_race/runtime/internal/syscall.a
index 0911bb6..86020a5 100644
--- a/pkg/linux_amd64_race/runtime/internal/syscall.a
+++ b/pkg/linux_amd64_race/runtime/internal/syscall.a
Binary files differ
diff --git a/pkg/linux_amd64_race/runtime/metrics.a b/pkg/linux_amd64_race/runtime/metrics.a
index f4d0782..2058b66 100644
--- a/pkg/linux_amd64_race/runtime/metrics.a
+++ b/pkg/linux_amd64_race/runtime/metrics.a
Binary files differ
diff --git a/pkg/linux_amd64_race/runtime/pprof.a b/pkg/linux_amd64_race/runtime/pprof.a
index f70cf6d..3bfcbe3 100644
--- a/pkg/linux_amd64_race/runtime/pprof.a
+++ b/pkg/linux_amd64_race/runtime/pprof.a
Binary files differ
diff --git a/pkg/linux_amd64_race/runtime/race.a b/pkg/linux_amd64_race/runtime/race.a
index 960fe64..3a6af52 100644
--- a/pkg/linux_amd64_race/runtime/race.a
+++ b/pkg/linux_amd64_race/runtime/race.a
Binary files differ
diff --git a/pkg/linux_amd64_race/runtime/trace.a b/pkg/linux_amd64_race/runtime/trace.a
index e202794..379ee16 100644
--- a/pkg/linux_amd64_race/runtime/trace.a
+++ b/pkg/linux_amd64_race/runtime/trace.a
Binary files differ
diff --git a/pkg/linux_amd64_race/sort.a b/pkg/linux_amd64_race/sort.a
index 9ab205e..c0e22e9 100644
--- a/pkg/linux_amd64_race/sort.a
+++ b/pkg/linux_amd64_race/sort.a
Binary files differ
diff --git a/pkg/linux_amd64_race/strconv.a b/pkg/linux_amd64_race/strconv.a
index a467907..aa57923 100644
--- a/pkg/linux_amd64_race/strconv.a
+++ b/pkg/linux_amd64_race/strconv.a
Binary files differ
diff --git a/pkg/linux_amd64_race/strings.a b/pkg/linux_amd64_race/strings.a
index 3356999..b71255b 100644
--- a/pkg/linux_amd64_race/strings.a
+++ b/pkg/linux_amd64_race/strings.a
Binary files differ
diff --git a/pkg/linux_amd64_race/sync.a b/pkg/linux_amd64_race/sync.a
index f29ceb0..5ea8a36 100644
--- a/pkg/linux_amd64_race/sync.a
+++ b/pkg/linux_amd64_race/sync.a
Binary files differ
diff --git a/pkg/linux_amd64_race/sync/atomic.a b/pkg/linux_amd64_race/sync/atomic.a
index db2d045..bfd0037 100644
--- a/pkg/linux_amd64_race/sync/atomic.a
+++ b/pkg/linux_amd64_race/sync/atomic.a
Binary files differ
diff --git a/pkg/linux_amd64_race/syscall.a b/pkg/linux_amd64_race/syscall.a
index 29e59d1..dd8494b 100644
--- a/pkg/linux_amd64_race/syscall.a
+++ b/pkg/linux_amd64_race/syscall.a
Binary files differ
diff --git a/pkg/linux_amd64_race/testing.a b/pkg/linux_amd64_race/testing.a
index e0d9e6e..36fe03b 100644
--- a/pkg/linux_amd64_race/testing.a
+++ b/pkg/linux_amd64_race/testing.a
Binary files differ
diff --git a/pkg/linux_amd64_race/testing/fstest.a b/pkg/linux_amd64_race/testing/fstest.a
index fb6e02a..eca0ea1 100644
--- a/pkg/linux_amd64_race/testing/fstest.a
+++ b/pkg/linux_amd64_race/testing/fstest.a
Binary files differ
diff --git a/pkg/linux_amd64_race/testing/internal/testdeps.a b/pkg/linux_amd64_race/testing/internal/testdeps.a
index 69ee500..4b70bf0 100644
--- a/pkg/linux_amd64_race/testing/internal/testdeps.a
+++ b/pkg/linux_amd64_race/testing/internal/testdeps.a
Binary files differ
diff --git a/pkg/linux_amd64_race/testing/iotest.a b/pkg/linux_amd64_race/testing/iotest.a
index a7f39c1..367fe36 100644
--- a/pkg/linux_amd64_race/testing/iotest.a
+++ b/pkg/linux_amd64_race/testing/iotest.a
Binary files differ
diff --git a/pkg/linux_amd64_race/testing/quick.a b/pkg/linux_amd64_race/testing/quick.a
index a7cfd6e..7f6fcb4 100644
--- a/pkg/linux_amd64_race/testing/quick.a
+++ b/pkg/linux_amd64_race/testing/quick.a
Binary files differ
diff --git a/pkg/linux_amd64_race/text/scanner.a b/pkg/linux_amd64_race/text/scanner.a
index ef463d3..12c1295 100644
--- a/pkg/linux_amd64_race/text/scanner.a
+++ b/pkg/linux_amd64_race/text/scanner.a
Binary files differ
diff --git a/pkg/linux_amd64_race/text/tabwriter.a b/pkg/linux_amd64_race/text/tabwriter.a
index 70fb10c..d6f0084 100644
--- a/pkg/linux_amd64_race/text/tabwriter.a
+++ b/pkg/linux_amd64_race/text/tabwriter.a
Binary files differ
diff --git a/pkg/linux_amd64_race/text/template.a b/pkg/linux_amd64_race/text/template.a
index a2c47a3..75d8988 100644
--- a/pkg/linux_amd64_race/text/template.a
+++ b/pkg/linux_amd64_race/text/template.a
Binary files differ
diff --git a/pkg/linux_amd64_race/text/template/parse.a b/pkg/linux_amd64_race/text/template/parse.a
index a34699e..8f9b9a2 100644
--- a/pkg/linux_amd64_race/text/template/parse.a
+++ b/pkg/linux_amd64_race/text/template/parse.a
Binary files differ
diff --git a/pkg/linux_amd64_race/time.a b/pkg/linux_amd64_race/time.a
index 70dcccf..8b27b33 100644
--- a/pkg/linux_amd64_race/time.a
+++ b/pkg/linux_amd64_race/time.a
Binary files differ
diff --git a/pkg/linux_amd64_race/time/tzdata.a b/pkg/linux_amd64_race/time/tzdata.a
index 581a02d..e6850a9 100644
--- a/pkg/linux_amd64_race/time/tzdata.a
+++ b/pkg/linux_amd64_race/time/tzdata.a
Binary files differ
diff --git a/pkg/linux_amd64_race/unicode.a b/pkg/linux_amd64_race/unicode.a
index f6f0d67..f653d2b 100644
--- a/pkg/linux_amd64_race/unicode.a
+++ b/pkg/linux_amd64_race/unicode.a
Binary files differ
diff --git a/pkg/linux_amd64_race/unicode/utf16.a b/pkg/linux_amd64_race/unicode/utf16.a
index 5211543..5bf9034 100644
--- a/pkg/linux_amd64_race/unicode/utf16.a
+++ b/pkg/linux_amd64_race/unicode/utf16.a
Binary files differ
diff --git a/pkg/linux_amd64_race/unicode/utf8.a b/pkg/linux_amd64_race/unicode/utf8.a
index df9f3ab..df5393c 100644
--- a/pkg/linux_amd64_race/unicode/utf8.a
+++ b/pkg/linux_amd64_race/unicode/utf8.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/chacha20.a b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/chacha20.a
index 4bdb114..c7f4dd5 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/chacha20.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/chacha20.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/chacha20poly1305.a b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/chacha20poly1305.a
index d1dfc68..178e872 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/chacha20poly1305.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/chacha20poly1305.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/cryptobyte.a b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/cryptobyte.a
index 6e68e8d..b7eb766 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/cryptobyte.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/cryptobyte.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/cryptobyte/asn1.a b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/cryptobyte/asn1.a
index 74f5631..be77d57 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/cryptobyte/asn1.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/cryptobyte/asn1.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/curve25519.a b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/curve25519.a
index 58068aa..720bba5 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/curve25519.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/curve25519.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/curve25519/internal/field.a b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/curve25519/internal/field.a
index 30f2216..efcce9d 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/curve25519/internal/field.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/curve25519/internal/field.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/hkdf.a b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/hkdf.a
index 6ed8bd1..d64b7c2 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/hkdf.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/hkdf.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/internal/poly1305.a b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/internal/poly1305.a
index b461de6..0af1f26 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/internal/poly1305.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/internal/poly1305.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/internal/subtle.a b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/internal/subtle.a
index 207b9c3..f1c2e7c 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/crypto/internal/subtle.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/crypto/internal/subtle.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/net/dns/dnsmessage.a b/pkg/linux_amd64_race/vendor/golang.org/x/net/dns/dnsmessage.a
index 3c07f45..1e72414 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/net/dns/dnsmessage.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/net/dns/dnsmessage.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/net/http/httpguts.a b/pkg/linux_amd64_race/vendor/golang.org/x/net/http/httpguts.a
index 5497021..0e2d94a 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/net/http/httpguts.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/net/http/httpguts.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/net/http/httpproxy.a b/pkg/linux_amd64_race/vendor/golang.org/x/net/http/httpproxy.a
index eee5413..f351935 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/net/http/httpproxy.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/net/http/httpproxy.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/net/http2/hpack.a b/pkg/linux_amd64_race/vendor/golang.org/x/net/http2/hpack.a
index dc36ad9..5e9a4da 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/net/http2/hpack.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/net/http2/hpack.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/net/idna.a b/pkg/linux_amd64_race/vendor/golang.org/x/net/idna.a
index d4d7644..9d480e2 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/net/idna.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/net/idna.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/net/nettest.a b/pkg/linux_amd64_race/vendor/golang.org/x/net/nettest.a
index 6529a5f..d0547d3 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/net/nettest.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/net/nettest.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/sys/cpu.a b/pkg/linux_amd64_race/vendor/golang.org/x/sys/cpu.a
index e8a3d10..b2b1bb8 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/sys/cpu.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/sys/cpu.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/text/secure/bidirule.a b/pkg/linux_amd64_race/vendor/golang.org/x/text/secure/bidirule.a
index 9472cc3..a800c71 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/text/secure/bidirule.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/text/secure/bidirule.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/text/transform.a b/pkg/linux_amd64_race/vendor/golang.org/x/text/transform.a
index 1c26080..082e759 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/text/transform.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/text/transform.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/text/unicode/bidi.a b/pkg/linux_amd64_race/vendor/golang.org/x/text/unicode/bidi.a
index 3781075..719c2b6 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/text/unicode/bidi.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/text/unicode/bidi.a
Binary files differ
diff --git a/pkg/linux_amd64_race/vendor/golang.org/x/text/unicode/norm.a b/pkg/linux_amd64_race/vendor/golang.org/x/text/unicode/norm.a
index b4add30..7aefdee 100644
--- a/pkg/linux_amd64_race/vendor/golang.org/x/text/unicode/norm.a
+++ b/pkg/linux_amd64_race/vendor/golang.org/x/text/unicode/norm.a
Binary files differ
diff --git a/pkg/tool/linux_amd64/addr2line b/pkg/tool/linux_amd64/addr2line
index 8d24853..992c2b9 100755
--- a/pkg/tool/linux_amd64/addr2line
+++ b/pkg/tool/linux_amd64/addr2line
Binary files differ
diff --git a/pkg/tool/linux_amd64/api b/pkg/tool/linux_amd64/api
index fd05f7a..44ee111 100755
--- a/pkg/tool/linux_amd64/api
+++ b/pkg/tool/linux_amd64/api
Binary files differ
diff --git a/pkg/tool/linux_amd64/asm b/pkg/tool/linux_amd64/asm
index ca74e8e..fdb66d7 100755
--- a/pkg/tool/linux_amd64/asm
+++ b/pkg/tool/linux_amd64/asm
Binary files differ
diff --git a/pkg/tool/linux_amd64/buildid b/pkg/tool/linux_amd64/buildid
index 0c1b2cc..a8f831e 100755
--- a/pkg/tool/linux_amd64/buildid
+++ b/pkg/tool/linux_amd64/buildid
Binary files differ
diff --git a/pkg/tool/linux_amd64/cgo b/pkg/tool/linux_amd64/cgo
index bb56e0d..e1576b4 100755
--- a/pkg/tool/linux_amd64/cgo
+++ b/pkg/tool/linux_amd64/cgo
Binary files differ
diff --git a/pkg/tool/linux_amd64/compile b/pkg/tool/linux_amd64/compile
index 67b889b..3e4321b 100755
--- a/pkg/tool/linux_amd64/compile
+++ b/pkg/tool/linux_amd64/compile
Binary files differ
diff --git a/pkg/tool/linux_amd64/cover b/pkg/tool/linux_amd64/cover
index a0441e8..6870106 100755
--- a/pkg/tool/linux_amd64/cover
+++ b/pkg/tool/linux_amd64/cover
Binary files differ
diff --git a/pkg/tool/linux_amd64/dist b/pkg/tool/linux_amd64/dist
index 4a6e34d..84c49b5 100755
--- a/pkg/tool/linux_amd64/dist
+++ b/pkg/tool/linux_amd64/dist
Binary files differ
diff --git a/pkg/tool/linux_amd64/doc b/pkg/tool/linux_amd64/doc
index edbbfd2..ed0cd53 100755
--- a/pkg/tool/linux_amd64/doc
+++ b/pkg/tool/linux_amd64/doc
Binary files differ
diff --git a/pkg/tool/linux_amd64/fix b/pkg/tool/linux_amd64/fix
index f7a3ccb..2b10b5c 100755
--- a/pkg/tool/linux_amd64/fix
+++ b/pkg/tool/linux_amd64/fix
Binary files differ
diff --git a/pkg/tool/linux_amd64/link b/pkg/tool/linux_amd64/link
index 853c533..2cfbcba 100755
--- a/pkg/tool/linux_amd64/link
+++ b/pkg/tool/linux_amd64/link
Binary files differ
diff --git a/pkg/tool/linux_amd64/nm b/pkg/tool/linux_amd64/nm
index 09296c1..23e28ae 100755
--- a/pkg/tool/linux_amd64/nm
+++ b/pkg/tool/linux_amd64/nm
Binary files differ
diff --git a/pkg/tool/linux_amd64/objdump b/pkg/tool/linux_amd64/objdump
index ced7a08..bdb72d4 100755
--- a/pkg/tool/linux_amd64/objdump
+++ b/pkg/tool/linux_amd64/objdump
Binary files differ
diff --git a/pkg/tool/linux_amd64/pack b/pkg/tool/linux_amd64/pack
index c1f5bb3..68f2a94 100755
--- a/pkg/tool/linux_amd64/pack
+++ b/pkg/tool/linux_amd64/pack
Binary files differ
diff --git a/pkg/tool/linux_amd64/pprof b/pkg/tool/linux_amd64/pprof
index 06a3a58..f6ee3d6 100755
--- a/pkg/tool/linux_amd64/pprof
+++ b/pkg/tool/linux_amd64/pprof
Binary files differ
diff --git a/pkg/tool/linux_amd64/test2json b/pkg/tool/linux_amd64/test2json
index 0b779d2..1d274cd 100755
--- a/pkg/tool/linux_amd64/test2json
+++ b/pkg/tool/linux_amd64/test2json
Binary files differ
diff --git a/pkg/tool/linux_amd64/trace b/pkg/tool/linux_amd64/trace
index b0d6578..a0d709d 100755
--- a/pkg/tool/linux_amd64/trace
+++ b/pkg/tool/linux_amd64/trace
Binary files differ
diff --git a/pkg/tool/linux_amd64/vet b/pkg/tool/linux_amd64/vet
index 350b5c9..cab88dd 100755
--- a/pkg/tool/linux_amd64/vet
+++ b/pkg/tool/linux_amd64/vet
Binary files differ
diff --git a/src/cmd/compile/internal/escape/escape.go b/src/cmd/compile/internal/escape/escape.go
index c2145bd..bc6f7c9 100644
--- a/src/cmd/compile/internal/escape/escape.go
+++ b/src/cmd/compile/internal/escape/escape.go
@@ -10,6 +10,7 @@
 	"cmd/compile/internal/base"
 	"cmd/compile/internal/ir"
 	"cmd/compile/internal/logopt"
+	"cmd/compile/internal/typecheck"
 	"cmd/compile/internal/types"
 )
 
@@ -243,6 +244,9 @@
 		n.SetByval(!loc.addrtaken && !loc.reassigned && n.Type().Size() <= 128)
 		if !n.Byval() {
 			n.SetAddrtaken(true)
+			if n.Sym().Name == typecheck.LocalDictName {
+				base.FatalfAt(n.Pos(), "dictionary variable not captured by value")
+			}
 		}
 
 		if base.Flag.LowerM > 1 {
diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go
index 5353435..74e4c0a 100644
--- a/src/cmd/compile/internal/gc/obj.go
+++ b/src/cmd/compile/internal/gc/obj.go
@@ -217,6 +217,10 @@
 		if ir.ConstOverflow(v, t) {
 			return
 		}
+	} else {
+		// If the type of the constant is an instantiated generic, we need to emit
+		// that type so the linker knows about it. See issue 51245.
+		_ = reflectdata.TypeLinksym(t)
 	}
 	base.Ctxt.DwarfIntConst(base.Ctxt.Pkgpath, n.Sym().Name, types.TypeSymName(t), ir.IntVal(t, v))
 }
diff --git a/src/cmd/compile/internal/importer/iimport.go b/src/cmd/compile/internal/importer/iimport.go
index a827987..bed4fbb 100644
--- a/src/cmd/compile/internal/importer/iimport.go
+++ b/src/cmd/compile/internal/importer/iimport.go
@@ -180,6 +180,14 @@
 		p.doDecl(localpkg, name)
 	}
 
+	// SetConstraint can't be called if the constraint type is not yet complete.
+	// When type params are created in the 'P' case of (*importReader).obj(),
+	// the associated constraint type may not be complete due to recursion.
+	// Therefore, we defer calling SetConstraint there, and call it here instead
+	// after all types are complete.
+	for _, d := range p.later {
+		d.t.SetConstraint(d.constraint)
+	}
 	// record all referenced packages as imports
 	list := append(([]*types2.Package)(nil), pkgList[1:]...)
 	sort.Sort(byPath(list))
@@ -191,6 +199,11 @@
 	return localpkg, nil
 }
 
+type setConstraintArgs struct {
+	t          *types2.TypeParam
+	constraint types2.Type
+}
+
 type iimporter struct {
 	exportVersion int64
 	ipath         string
@@ -206,6 +219,9 @@
 	tparamIndex map[ident]*types2.TypeParam
 
 	interfaceList []*types2.Interface
+
+	// Arguments for calls to SetConstraint that are deferred due to recursive types
+	later []setConstraintArgs
 }
 
 func (p *iimporter) doDecl(pkg *types2.Package, name string) {
@@ -401,7 +417,11 @@
 			}
 			iface.MarkImplicit()
 		}
-		t.SetConstraint(constraint)
+		// The constraint type may not be complete, if we
+		// are in the middle of a type recursion involving type
+		// constraints. So, we defer SetConstraint until we have
+		// completely set up all types in ImportData.
+		r.p.later = append(r.p.later, setConstraintArgs{t: t, constraint: constraint})
 
 	case 'V':
 		typ := r.typ()
diff --git a/src/cmd/compile/internal/ir/stmt.go b/src/cmd/compile/internal/ir/stmt.go
index e7d0d87..80bd205 100644
--- a/src/cmd/compile/internal/ir/stmt.go
+++ b/src/cmd/compile/internal/ir/stmt.go
@@ -362,7 +362,7 @@
 	return n
 }
 
-// A SwitchStmt is a switch statement: switch Init; Expr { Cases }.
+// A SwitchStmt is a switch statement: switch Init; Tag { Cases }.
 type SwitchStmt struct {
 	miniStmt
 	Tag      Node
diff --git a/src/cmd/compile/internal/noder/expr.go b/src/cmd/compile/internal/noder/expr.go
index a4e1445..4b5ae70 100644
--- a/src/cmd/compile/internal/noder/expr.go
+++ b/src/cmd/compile/internal/noder/expr.go
@@ -114,7 +114,7 @@
 
 	case *syntax.CallExpr:
 		fun := g.expr(expr.Fun)
-		return Call(pos, g.typ(typ), fun, g.exprs(expr.ArgList), expr.HasDots)
+		return g.callExpr(pos, g.typ(typ), fun, g.exprs(expr.ArgList), expr.HasDots)
 
 	case *syntax.IndexExpr:
 		args := unpackListExpr(expr.Index)
@@ -206,6 +206,53 @@
 	return newt
 }
 
+// callExpr creates a call expression (which might be a type conversion, built-in
+// call, or a regular call) and does standard transforms, unless we are in a generic
+// function.
+func (g *irgen) callExpr(pos src.XPos, typ *types.Type, fun ir.Node, args []ir.Node, dots bool) ir.Node {
+	n := ir.NewCallExpr(pos, ir.OCALL, fun, args)
+	n.IsDDD = dots
+	typed(typ, n)
+
+	if fun.Op() == ir.OTYPE {
+		// Actually a type conversion, not a function call.
+		if !g.delayTransform() {
+			return transformConvCall(n)
+		}
+		return n
+	}
+
+	if fun, ok := fun.(*ir.Name); ok && fun.BuiltinOp != 0 {
+		if !g.delayTransform() {
+			return transformBuiltin(n)
+		}
+		return n
+	}
+
+	// Add information, now that we know that fun is actually being called.
+	switch fun := fun.(type) {
+	case *ir.SelectorExpr:
+		if fun.Op() == ir.OMETHVALUE {
+			op := ir.ODOTMETH
+			if fun.X.Type().IsInterface() {
+				op = ir.ODOTINTER
+			}
+			fun.SetOp(op)
+			// Set the type to include the receiver, since that's what
+			// later parts of the compiler expect
+			fun.SetType(fun.Selection.Type)
+		}
+	}
+
+	// A function instantiation (even if fully concrete) shouldn't be
+	// transformed yet, because we need to add the dictionary during the
+	// transformation.
+	if fun.Op() != ir.OFUNCINST && !g.delayTransform() {
+		transformCall(n)
+	}
+	return n
+}
+
 // selectorExpr resolves the choice of ODOT, ODOTPTR, OMETHVALUE (eventually
 // ODOTMETH & ODOTINTER), and OMETHEXPR and deals with embedded fields here rather
 // than in typecheck.go.
diff --git a/src/cmd/compile/internal/noder/helpers.go b/src/cmd/compile/internal/noder/helpers.go
index 5524673..33acd60 100644
--- a/src/cmd/compile/internal/noder/helpers.go
+++ b/src/cmd/compile/internal/noder/helpers.go
@@ -98,95 +98,6 @@
 	}
 }
 
-func Call(pos src.XPos, typ *types.Type, fun ir.Node, args []ir.Node, dots bool) ir.Node {
-	n := ir.NewCallExpr(pos, ir.OCALL, fun, args)
-	n.IsDDD = dots
-
-	if fun.Op() == ir.OTYPE {
-		// Actually a type conversion, not a function call.
-		if !fun.Type().IsInterface() &&
-			(fun.Type().HasTParam() || args[0].Type().HasTParam()) {
-			// For type params, we can transform if fun.Type() is known
-			// to be an interface (in which case a CONVIFACE node will be
-			// inserted). Otherwise, don't typecheck until we actually
-			// know the type.
-			return typed(typ, n)
-		}
-		typed(typ, n)
-		return transformConvCall(n)
-	}
-
-	if fun, ok := fun.(*ir.Name); ok && fun.BuiltinOp != 0 {
-		// For most Builtin ops, we delay doing transformBuiltin if any of the
-		// args have type params, for a variety of reasons:
-		//
-		// OMAKE: transformMake can't choose specific ops OMAKESLICE, etc.
-		//    until arg type is known
-		// OREAL/OIMAG: transformRealImag can't determine type float32/float64
-		//    until arg type known
-		// OAPPEND: transformAppend requires that the arg is a slice
-		// ODELETE: transformDelete requires that the arg is a map
-		// OALIGNOF, OSIZEOF: can be eval'ed to a constant until types known.
-		switch fun.BuiltinOp {
-		case ir.OMAKE, ir.OREAL, ir.OIMAG, ir.OAPPEND, ir.ODELETE, ir.OALIGNOF, ir.OOFFSETOF, ir.OSIZEOF:
-			hasTParam := false
-			for _, arg := range args {
-				if fun.BuiltinOp == ir.OOFFSETOF {
-					// It's the type of left operand of the
-					// selection that matters, not the type of
-					// the field itself (which is irrelevant for
-					// offsetof).
-					arg = arg.(*ir.SelectorExpr).X
-				}
-				if arg.Type().HasTParam() {
-					hasTParam = true
-					break
-				}
-			}
-			if hasTParam {
-				return typed(typ, n)
-			}
-		}
-
-		typed(typ, n)
-		return transformBuiltin(n)
-	}
-
-	// Add information, now that we know that fun is actually being called.
-	switch fun := fun.(type) {
-	case *ir.SelectorExpr:
-		if fun.Op() == ir.OMETHVALUE {
-			op := ir.ODOTMETH
-			if fun.X.Type().IsInterface() {
-				op = ir.ODOTINTER
-			}
-			fun.SetOp(op)
-			// Set the type to include the receiver, since that's what
-			// later parts of the compiler expect
-			fun.SetType(fun.Selection.Type)
-		}
-	}
-
-	if fun.Type().HasTParam() || fun.Op() == ir.OXDOT || fun.Op() == ir.OFUNCINST {
-		// If the fun arg is or has a type param, we can't do all the
-		// transformations, since we may not have needed properties yet
-		// (e.g. number of return values, etc). The same applies if a fun
-		// which is an XDOT could not be transformed yet because of a generic
-		// type in the X of the selector expression.
-		//
-		// A function instantiation (even if fully concrete) shouldn't be
-		// transformed yet, because we need to add the dictionary during the
-		// transformation.
-		return typed(typ, n)
-	}
-
-	// If no type params, do the normal call transformations. This
-	// will convert OCALL to OCALLFUNC.
-	typed(typ, n)
-	transformCall(n)
-	return n
-}
-
 func Compare(pos src.XPos, typ *types.Type, op ir.Op, x, y ir.Node) *ir.BinaryExpr {
 	n := ir.NewBinaryExpr(pos, op, x, y)
 	typed(typ, n)
diff --git a/src/cmd/compile/internal/noder/stencil.go b/src/cmd/compile/internal/noder/stencil.go
index 50b6c0e..cd586ca 100644
--- a/src/cmd/compile/internal/noder/stencil.go
+++ b/src/cmd/compile/internal/noder/stencil.go
@@ -410,7 +410,8 @@
 	fn, formalParams, formalResults := startClosure(pos, outer, typ)
 
 	// This is the dictionary we want to use.
-	// It may be a constant, or it may be a dictionary acquired from the outer function's dictionary.
+	// It may be a constant, it may be the outer functions's dictionary, or it may be
+	// a subdictionary acquired from the outer function's dictionary.
 	// For the latter, dictVar is a variable in the outer function's scope, set to the subdictionary
 	// read from the outer function's dictionary.
 	var dictVar *ir.Name
@@ -640,6 +641,11 @@
 		// over any pointer)
 		recvType := nameNode.Type().Recv().Type
 		recvType = deref(recvType)
+		if recvType.IsFullyInstantiated() {
+			// Get the type of the base generic type, so we get
+			// its original typeparams.
+			recvType = recvType.OrigSym().Def.(*ir.Name).Type()
+		}
 		tparams = recvType.RParams()
 	} else {
 		fields := nameNode.Type().TParams().Fields().Slice()
@@ -656,11 +662,9 @@
 	s1 := make([]*types.Type, len(shapes))
 	for i, t := range shapes {
 		var tparam *types.Type
-		if tparams[i].Kind() == types.TTYPEPARAM {
-			// Shapes are grouped differently for structural types, so we
-			// pass the type param to Shapify(), so we can distinguish.
-			tparam = tparams[i]
-		}
+		// Shapes are grouped differently for structural types, so we
+		// pass the type param to Shapify(), so we can distinguish.
+		tparam = tparams[i]
 		if !t.IsShape() {
 			s1[i] = typecheck.Shapify(t, i, tparam)
 		} else {
@@ -1055,8 +1059,6 @@
 				// Transform the conversion, now that we know the
 				// type argument.
 				m = transformConvCall(call)
-				// CONVIFACE transformation was already done in noder2
-				assert(m.Op() != ir.OCONVIFACE)
 
 			case ir.OMETHVALUE, ir.OMETHEXPR:
 				// Redo the transformation of OXDOT, now that we
@@ -1076,14 +1078,7 @@
 			case ir.ONAME:
 				name := call.X.Name()
 				if name.BuiltinOp != ir.OXXX {
-					switch name.BuiltinOp {
-					case ir.OMAKE, ir.OREAL, ir.OIMAG, ir.OAPPEND, ir.ODELETE, ir.OALIGNOF, ir.OOFFSETOF, ir.OSIZEOF:
-						// Transform these builtins now that we
-						// know the type of the args.
-						m = transformBuiltin(call)
-					default:
-						base.FatalfAt(call.Pos(), "Unexpected builtin op")
-					}
+					m = transformBuiltin(call)
 				} else {
 					// This is the case of a function value that was a
 					// type parameter (implied to be a function via a
@@ -1154,6 +1149,7 @@
 			newfn.Dcl = append(newfn.Dcl, ldict)
 			as := ir.NewAssignStmt(x.Pos(), ldict, cdict)
 			as.SetTypecheck(1)
+			ldict.Defn = as
 			newfn.Body.Append(as)
 
 			// Create inst info for the instantiated closure. The dict
@@ -1183,6 +1179,26 @@
 			subst.g.newInsts = append(subst.g.newInsts, m.(*ir.ClosureExpr).Func)
 			m.(*ir.ClosureExpr).SetInit(subst.list(x.Init()))
 
+		case ir.OSWITCH:
+			m := m.(*ir.SwitchStmt)
+			if m.Tag != nil && m.Tag.Op() == ir.OTYPESW {
+				break // Nothing to do here for type switches.
+			}
+			if m.Tag != nil && !m.Tag.Type().IsInterface() && m.Tag.Type().HasShape() {
+				// To implement a switch on a value that is or has a type parameter, we first convert
+				// that thing we're switching on to an interface{}.
+				m.Tag = assignconvfn(m.Tag, types.Types[types.TINTER])
+			}
+			for _, c := range m.Cases {
+				for i, x := range c.List {
+					// If we have a case that is or has a type parameter, convert that case
+					// to an interface{}.
+					if !x.Type().IsInterface() && x.Type().HasShape() {
+						c.List[i] = assignconvfn(x, types.Types[types.TINTER])
+					}
+				}
+			}
+
 		}
 		return m
 	}
diff --git a/src/cmd/compile/internal/noder/transform.go b/src/cmd/compile/internal/noder/transform.go
index 5f1f411..db28e8d 100644
--- a/src/cmd/compile/internal/noder/transform.go
+++ b/src/cmd/compile/internal/noder/transform.go
@@ -242,7 +242,7 @@
 			aop, _ := typecheck.Assignop(rt, lt)
 			if aop != ir.OXXX {
 				types.CalcSize(rt)
-				if rt.HasTParam() || rt.IsInterface() == lt.IsInterface() || rt.Size() >= 1<<16 {
+				if rt.HasShape() || rt.IsInterface() == lt.IsInterface() || rt.Size() >= 1<<16 {
 					r = ir.NewConvExpr(base.Pos, aop, lt, r)
 					r.SetTypecheck(1)
 				}
diff --git a/src/cmd/compile/internal/reflectdata/reflect.go b/src/cmd/compile/internal/reflectdata/reflect.go
index 42ea7ba..a4ddb1a 100644
--- a/src/cmd/compile/internal/reflectdata/reflect.go
+++ b/src/cmd/compile/internal/reflectdata/reflect.go
@@ -1430,7 +1430,7 @@
 
 type typeAndStr struct {
 	t       *types.Type
-	short   string // "short" here means NameString
+	short   string // "short" here means TypeSymName
 	regular string
 }
 
diff --git a/src/cmd/compile/internal/typecheck/iexport.go b/src/cmd/compile/internal/typecheck/iexport.go
index ae3c41c..b7a251c 100644
--- a/src/cmd/compile/internal/typecheck/iexport.go
+++ b/src/cmd/compile/internal/typecheck/iexport.go
@@ -1851,7 +1851,10 @@
 		n := n.(*ir.ClosureExpr)
 		w.op(ir.OCLOSURE)
 		w.pos(n.Pos())
+		old := w.currPkg
+		w.setPkg(n.Type().Pkg(), true)
 		w.signature(n.Type())
+		w.setPkg(old, true)
 
 		// Write out id for the Outer of each conditional variable. The
 		// conditional variable itself for this closure will be re-created
diff --git a/src/cmd/compile/internal/typecheck/iimport.go b/src/cmd/compile/internal/typecheck/iimport.go
index bc34d39..28a5060 100644
--- a/src/cmd/compile/internal/typecheck/iimport.go
+++ b/src/cmd/compile/internal/typecheck/iimport.go
@@ -354,15 +354,18 @@
 		// declaration before recursing.
 		n := importtype(pos, sym)
 		t := n.Type()
+
+		// Because of recursion, we need to defer width calculations and
+		// instantiations on intermediate types until the top-level type is
+		// fully constructed. Note that we can have recursion via type
+		// constraints.
+		types.DeferCheckSize()
+		deferDoInst()
 		if tag == 'U' {
 			rparams := r.typeList()
 			t.SetRParams(rparams)
 		}
 
-		// We also need to defer width calculations until
-		// after the underlying type has been assigned.
-		types.DeferCheckSize()
-		deferDoInst()
 		underlying := r.typ()
 		t.SetUnderlying(underlying)
 
@@ -1371,7 +1374,9 @@
 	case ir.OCLOSURE:
 		//println("Importing CLOSURE")
 		pos := r.pos()
+		r.setPkg()
 		typ := r.signature(nil, nil)
+		r.setPkg()
 
 		// All the remaining code below is similar to (*noder).funcLit(), but
 		// with Dcls and ClosureVars lists already set up
diff --git a/src/cmd/compile/internal/typecheck/subr.go b/src/cmd/compile/internal/typecheck/subr.go
index 9892471..5147ebb 100644
--- a/src/cmd/compile/internal/typecheck/subr.go
+++ b/src/cmd/compile/internal/typecheck/subr.go
@@ -1424,6 +1424,68 @@
 	return sym.Name[0:strings.Index(sym.Name, "[")]
 }
 
+// getShapes appends the list of the shape types that are used within type t to
+// listp. The type traversal is simplified for two reasons: (1) we can always stop a
+// type traversal when t.HasShape() is false; and (2) shape types can't appear inside
+// a named type, except for the type args of a generic type. So, the traversal will
+// always stop before we have to deal with recursive types.
+func getShapes(t *types.Type, listp *[]*types.Type) {
+	if !t.HasShape() {
+		return
+	}
+	if t.IsShape() {
+		*listp = append(*listp, t)
+		return
+	}
+
+	if t.Sym() != nil {
+		// A named type can't have shapes in it, except for type args of a
+		// generic type. We will have to deal with this differently once we
+		// alloc local types in generic functions (#47631).
+		for _, rparam := range t.RParams() {
+			getShapes(rparam, listp)
+		}
+		return
+	}
+
+	switch t.Kind() {
+	case types.TARRAY, types.TPTR, types.TSLICE, types.TCHAN:
+		getShapes(t.Elem(), listp)
+
+	case types.TSTRUCT:
+		for _, f := range t.FieldSlice() {
+			getShapes(f.Type, listp)
+		}
+
+	case types.TFUNC:
+		for _, f := range t.Recvs().FieldSlice() {
+			getShapes(f.Type, listp)
+		}
+		for _, f := range t.Params().FieldSlice() {
+			getShapes(f.Type, listp)
+		}
+		for _, f := range t.Results().FieldSlice() {
+			getShapes(f.Type, listp)
+		}
+		for _, f := range t.TParams().FieldSlice() {
+			getShapes(f.Type, listp)
+		}
+
+	case types.TINTER:
+		for _, f := range t.Methods().Slice() {
+			getShapes(f.Type, listp)
+		}
+
+	case types.TMAP:
+		getShapes(t.Key(), listp)
+		getShapes(t.Elem(), listp)
+
+	default:
+		panic(fmt.Sprintf("Bad type in getShapes: %v", t.Kind()))
+	}
+
+}
+
 // Shapify takes a concrete type and a type param index, and returns a GCshape type that can
 // be used in place of the input type and still generate identical code.
 // No methods are added - all methods calls directly on a shape should
@@ -1432,9 +1494,9 @@
 // For now, we only consider two types to have the same shape, if they have exactly
 // the same underlying type or they are both pointer types.
 //
-//  tparam is the associated typeparam. If there is a structural type for
-//  the associated type param (not common), then a pointer type t is mapped to its
-//  underlying type, rather than being merged with other pointers.
+//  tparam is the associated typeparam - it must be TTYPEPARAM type. If there is a
+//  structural type for the associated type param (not common), then a pointer type t
+//  is mapped to its underlying type, rather than being merged with other pointers.
 //
 //  Shape types are also distinguished by the index of the type in a type param/arg
 //  list. We need to do this so we can distinguish and substitute properly for two
@@ -1442,6 +1504,30 @@
 //  instantiation.
 func Shapify(t *types.Type, index int, tparam *types.Type) *types.Type {
 	assert(!t.IsShape())
+	if t.HasShape() {
+		// We are sometimes dealing with types from a shape instantiation
+		// that were constructed from existing shape types, so t may
+		// sometimes have shape types inside it. In that case, we find all
+		// those shape types with getShapes() and replace them with their
+		// underlying type.
+		//
+		// If we don't do this, we may create extra unneeded shape types that
+		// have these other shape types embedded in them. This may lead to
+		// generating extra shape instantiations, and a mismatch between the
+		// instantiations that we used in generating dictionaries and the
+		// instantations that are actually called. (#51303).
+		list := []*types.Type{}
+		getShapes(t, &list)
+		list2 := make([]*types.Type, len(list))
+		for i, shape := range list {
+			list2[i] = shape.Underlying()
+		}
+		ts := Tsubster{
+			Tparams: list,
+			Targs:   list2,
+		}
+		t = ts.Typ(t)
+	}
 	// Map all types with the same underlying type to the same shape.
 	u := t.Underlying()
 
diff --git a/src/cmd/compile/internal/types/fmt.go b/src/cmd/compile/internal/types/fmt.go
index e1b3955..c7d0623 100644
--- a/src/cmd/compile/internal/types/fmt.go
+++ b/src/cmd/compile/internal/types/fmt.go
@@ -72,6 +72,7 @@
 	fmtDebug
 	fmtTypeID
 	fmtTypeIDName
+	fmtTypeIDHash
 )
 
 // Sym
@@ -144,10 +145,21 @@
 	if q := pkgqual(s.Pkg, verb, mode); q != "" {
 		b.WriteString(q)
 		b.WriteByte('.')
-		if mode == fmtTypeIDName {
+		switch mode {
+		case fmtTypeIDName:
 			// If name is a generic instantiation, it might have local package placeholders
 			// in it. Replace those placeholders with the package name. See issue 49547.
 			name = strings.Replace(name, LocalPkg.Prefix, q, -1)
+		case fmtTypeIDHash:
+			// If name is a generic instantiation, don't hash the instantiating types.
+			// This isn't great, but it is safe. If we hash the instantiating types, then
+			// we need to make sure they have just the package name. At this point, they
+			// either have "", or the whole package path, and it is hard to reconcile
+			// the two without depending on -p (which we might do someday).
+			// See issue 51250.
+			if i := strings.Index(name, "["); i >= 0 {
+				name = name[:i]
+			}
 		}
 	}
 	b.WriteString(name)
@@ -173,7 +185,7 @@
 		case fmtDebug:
 			return pkg.Name
 
-		case fmtTypeIDName:
+		case fmtTypeIDName, fmtTypeIDHash:
 			// dcommontype, typehash
 			return pkg.Name
 
@@ -331,7 +343,7 @@
 	if t == AnyType || t == ByteType || t == RuneType {
 		// in %-T mode collapse predeclared aliases with their originals.
 		switch mode {
-		case fmtTypeIDName, fmtTypeID:
+		case fmtTypeIDName, fmtTypeIDHash, fmtTypeID:
 			t = Types[t.Kind()]
 		default:
 			sconv2(b, t.Sym(), 'S', mode)
@@ -422,7 +434,7 @@
 	case TPTR:
 		b.WriteByte('*')
 		switch mode {
-		case fmtTypeID, fmtTypeIDName:
+		case fmtTypeID, fmtTypeIDName, fmtTypeIDHash:
 			if verb == 'S' {
 				tconv2(b, t.Elem(), 'S', mode, visited)
 				return
@@ -484,7 +496,7 @@
 			case IsExported(f.Sym.Name):
 				sconv2(b, f.Sym, 'S', mode)
 			default:
-				if mode != fmtTypeIDName {
+				if mode != fmtTypeIDName && mode != fmtTypeIDHash {
 					mode = fmtTypeID
 				}
 				sconv2(b, f.Sym, 'v', mode)
@@ -554,7 +566,7 @@
 			b.WriteByte(byte(open))
 			fieldVerb := 'v'
 			switch mode {
-			case fmtTypeID, fmtTypeIDName, fmtGo:
+			case fmtTypeID, fmtTypeIDName, fmtTypeIDHash, fmtGo:
 				// no argument names on function signature, and no "noescape"/"nosplit" tags
 				fieldVerb = 'S'
 			}
@@ -657,7 +669,7 @@
 
 				// Compute tsym, the symbol that would normally be used as
 				// the field name when embedding f.Type.
-				// TODO(mdempsky): Check for other occurences of this logic
+				// TODO(mdempsky): Check for other occurrences of this logic
 				// and deduplicate.
 				typ := f.Type
 				if typ.IsPtr() {
@@ -688,7 +700,7 @@
 				if name == ".F" {
 					name = "F" // Hack for toolstash -cmp.
 				}
-				if !IsExported(name) && mode != fmtTypeIDName {
+				if !IsExported(name) && mode != fmtTypeIDName && mode != fmtTypeIDHash {
 					name = sconv(s, 0, mode) // qualify non-exported names (used on structs, not on funarg)
 				}
 			} else {
@@ -756,7 +768,7 @@
 
 // TypeHash computes a hash value for type t to use in type switch statements.
 func TypeHash(t *Type) uint32 {
-	p := t.NameString()
+	p := tconv(t, 0, fmtTypeIDHash)
 
 	// Using MD5 is overkill, but reduces accidental collisions.
 	h := md5.Sum([]byte(p))
diff --git a/src/cmd/compile/internal/types2/api.go b/src/cmd/compile/internal/types2/api.go
index 6230c58..d864c96 100644
--- a/src/cmd/compile/internal/types2/api.go
+++ b/src/cmd/compile/internal/types2/api.go
@@ -204,12 +204,12 @@
 	// qualified identifiers are collected in the Uses map.
 	Types map[syntax.Expr]TypeAndValue
 
-	// Instances maps identifiers denoting parameterized types or functions to
-	// their type arguments and instantiated type.
+	// Instances maps identifiers denoting generic types or functions to their
+	// type arguments and instantiated type.
 	//
 	// For example, Instances will map the identifier for 'T' in the type
 	// instantiation T[int, string] to the type arguments [int, string] and
-	// resulting instantiated *Named type. Given a parameterized function
+	// resulting instantiated *Named type. Given a generic function
 	// func F[A any](A), Instances will map the identifier for 'F' in the call
 	// expression F(int(1)) to the inferred type arguments [int], and resulting
 	// instantiated *Signature.
@@ -421,8 +421,11 @@
 }
 
 // AssertableTo reports whether a value of type V can be asserted to have type T.
-// The behavior of AssertableTo is undefined if V is a generalized interface; i.e.,
-// an interface that may only be used as a type constraint in Go code.
+//
+// The behavior of AssertableTo is undefined in two cases:
+//  - if V is a generalized interface; i.e., an interface that may only be used
+//    as a type constraint in Go code
+//  - if T is an uninstantiated generic type
 func AssertableTo(V *Interface, T Type) bool {
 	// Checker.newAssertableTo suppresses errors for invalid types, so we need special
 	// handling here.
@@ -432,20 +435,31 @@
 	return (*Checker)(nil).newAssertableTo(V, T) == nil
 }
 
-// AssignableTo reports whether a value of type V is assignable to a variable of type T.
+// AssignableTo reports whether a value of type V is assignable to a variable
+// of type T.
+//
+// The behavior of AssignableTo is undefined if V or T is an uninstantiated
+// generic type.
 func AssignableTo(V, T Type) bool {
 	x := operand{mode: value, typ: V}
 	ok, _ := x.assignableTo(nil, T, nil) // check not needed for non-constant x
 	return ok
 }
 
-// ConvertibleTo reports whether a value of type V is convertible to a value of type T.
+// ConvertibleTo reports whether a value of type V is convertible to a value of
+// type T.
+//
+// The behavior of ConvertibleTo is undefined if V or T is an uninstantiated
+// generic type.
 func ConvertibleTo(V, T Type) bool {
 	x := operand{mode: value, typ: V}
 	return x.convertibleTo(nil, T, nil) // check not needed for non-constant x
 }
 
 // Implements reports whether type V implements interface T.
+//
+// The behavior of Implements is undefined if V is an uninstantiated generic
+// type.
 func Implements(V Type, T *Interface) bool {
 	if T.Empty() {
 		// All types (even Typ[Invalid]) implement the empty interface.
diff --git a/src/cmd/compile/internal/types2/api_test.go b/src/cmd/compile/internal/types2/api_test.go
index 46b184f..5bb5517 100644
--- a/src/cmd/compile/internal/types2/api_test.go
+++ b/src/cmd/compile/internal/types2/api_test.go
@@ -12,6 +12,7 @@
 	"internal/testenv"
 	"reflect"
 	"regexp"
+	"sort"
 	"strings"
 	"testing"
 
@@ -403,69 +404,61 @@
 }
 
 func TestInstanceInfo(t *testing.T) {
-	var tests = []struct {
-		src   string
+	const lib = `package lib
+
+func F[P any](P) {}
+
+type T[P any] []P
+`
+
+	type testInst struct {
 		name  string
 		targs []string
 		typ   string
+	}
+
+	var tests = []struct {
+		src       string
+		instances []testInst // recorded instances in source order
 	}{
 		{`package p0; func f[T any](T) {}; func _() { f(42) }`,
-			`f`,
-			[]string{`int`},
-			`func(int)`,
+			[]testInst{{`f`, []string{`int`}, `func(int)`}},
 		},
 		{`package p1; func f[T any](T) T { panic(0) }; func _() { f('@') }`,
-			`f`,
-			[]string{`rune`},
-			`func(rune) rune`,
+			[]testInst{{`f`, []string{`rune`}, `func(rune) rune`}},
 		},
 		{`package p2; func f[T any](...T) T { panic(0) }; func _() { f(0i) }`,
-			`f`,
-			[]string{`complex128`},
-			`func(...complex128) complex128`,
+			[]testInst{{`f`, []string{`complex128`}, `func(...complex128) complex128`}},
 		},
 		{`package p3; func f[A, B, C any](A, *B, []C) {}; func _() { f(1.2, new(string), []byte{}) }`,
-			`f`,
-			[]string{`float64`, `string`, `byte`},
-			`func(float64, *string, []byte)`,
+			[]testInst{{`f`, []string{`float64`, `string`, `byte`}, `func(float64, *string, []byte)`}},
 		},
 		{`package p4; func f[A, B any](A, *B, ...[]B) {}; func _() { f(1.2, new(byte)) }`,
-			`f`,
-			[]string{`float64`, `byte`},
-			`func(float64, *byte, ...[]byte)`,
+			[]testInst{{`f`, []string{`float64`, `byte`}, `func(float64, *byte, ...[]byte)`}},
 		},
-
 		// we don't know how to translate these but we can type-check them
 		{`package q0; type T struct{}; func (T) m[P any](P) {}; func _(x T) { x.m(42) }`,
-			`m`,
-			[]string{`int`},
-			`func(int)`,
+			[]testInst{{`m`, []string{`int`}, `func(int)`}},
 		},
 		{`package q1; type T struct{}; func (T) m[P any](P) P { panic(0) }; func _(x T) { x.m(42) }`,
-			`m`,
-			[]string{`int`},
-			`func(int) int`,
+			[]testInst{{`m`, []string{`int`}, `func(int) int`}},
 		},
 		{`package q2; type T struct{}; func (T) m[P any](...P) P { panic(0) }; func _(x T) { x.m(42) }`,
-			`m`,
-			[]string{`int`},
-			`func(...int) int`,
+			[]testInst{{`m`, []string{`int`}, `func(...int) int`}},
 		},
 		{`package q3; type T struct{}; func (T) m[A, B, C any](A, *B, []C) {}; func _(x T) { x.m(1.2, new(string), []byte{}) }`,
-			`m`,
-			[]string{`float64`, `string`, `byte`},
-			`func(float64, *string, []byte)`,
+			[]testInst{{`m`, []string{`float64`, `string`, `byte`}, `func(float64, *string, []byte)`}},
 		},
 		{`package q4; type T struct{}; func (T) m[A, B any](A, *B, ...[]B) {}; func _(x T) { x.m(1.2, new(byte)) }`,
-			`m`,
-			[]string{`float64`, `byte`},
-			`func(float64, *byte, ...[]byte)`,
+			[]testInst{{`m`, []string{`float64`, `byte`}, `func(float64, *byte, ...[]byte)`}},
 		},
 
-		{`package r0; type T[P any] struct{}; func (_ T[P]) m[Q any](Q) {}; func _[P any](x T[P]) { x.m(42) }`,
-			`m`,
-			[]string{`int`},
-			`func(int)`,
+		{`package r0; type T[P1 any] struct{}; func (_ T[P2]) m[Q any](Q) {}; func _[P3 any](x T[P3]) { x.m(42) }`,
+			[]testInst{
+				{`T`, []string{`P2`}, `struct{}`},
+				{`T`, []string{`P3`}, `struct{}`},
+				{`m`, []string{`int`}, `func(int)`},
+			},
 		},
 		// TODO(gri) record method type parameters in syntax.FuncType so we can check this
 		// {`package r1; type T interface{ m[P any](P) }; func _(x T) { x.m(4.2) }`,
@@ -474,97 +467,113 @@
 		// 	`func(float64)`,
 		// },
 
-		{`package s1; func f[T any, P interface{~*T}](x T) {}; func _(x string) { f(x) }`,
-			`f`,
-			[]string{`string`, `*string`},
-			`func(x string)`,
+		{`package s1; func f[T any, P interface{*T}](x T) {}; func _(x string) { f(x) }`,
+			[]testInst{{`f`, []string{`string`, `*string`}, `func(x string)`}},
 		},
-		{`package s2; func f[T any, P interface{~*T}](x []T) {}; func _(x []int) { f(x) }`,
-			`f`,
-			[]string{`int`, `*int`},
-			`func(x []int)`,
+		{`package s2; func f[T any, P interface{*T}](x []T) {}; func _(x []int) { f(x) }`,
+			[]testInst{{`f`, []string{`int`, `*int`}, `func(x []int)`}},
 		},
-		{`package s3; type C[T any] interface{~chan<- T}; func f[T any, P C[T]](x []T) {}; func _(x []int) { f(x) }`,
-			`f`,
-			[]string{`int`, `chan<- int`},
-			`func(x []int)`,
+		{`package s3; type C[T any] interface{chan<- T}; func f[T any, P C[T]](x []T) {}; func _(x []int) { f(x) }`,
+			[]testInst{
+				{`C`, []string{`T`}, `interface{chan<- T}`},
+				{`f`, []string{`int`, `chan<- int`}, `func(x []int)`},
+			},
 		},
-		{`package s4; type C[T any] interface{~chan<- T}; func f[T any, P C[T], Q C[[]*P]](x []T) {}; func _(x []int) { f(x) }`,
-			`f`,
-			[]string{`int`, `chan<- int`, `chan<- []*chan<- int`},
-			`func(x []int)`,
+		{`package s4; type C[T any] interface{chan<- T}; func f[T any, P C[T], Q C[[]*P]](x []T) {}; func _(x []int) { f(x) }`,
+			[]testInst{
+				{`C`, []string{`T`}, `interface{chan<- T}`},
+				{`C`, []string{`[]*P`}, `interface{chan<- []*P}`},
+				{`f`, []string{`int`, `chan<- int`, `chan<- []*chan<- int`}, `func(x []int)`},
+			},
 		},
 
-		{`package t1; func f[T any, P interface{~*T}]() T { panic(0) }; func _() { _ = f[string] }`,
-			`f`,
-			[]string{`string`, `*string`},
-			`func() string`,
+		{`package t1; func f[T any, P interface{*T}]() T { panic(0) }; func _() { _ = f[string] }`,
+			[]testInst{{`f`, []string{`string`, `*string`}, `func() string`}},
 		},
-		{`package t2; func f[T any, P interface{~*T}]() T { panic(0) }; func _() { _ = (f[string]) }`,
-			`f`,
-			[]string{`string`, `*string`},
-			`func() string`,
+		{`package t2; func f[T any, P interface{*T}]() T { panic(0) }; func _() { _ = (f[string]) }`,
+			[]testInst{{`f`, []string{`string`, `*string`}, `func() string`}},
 		},
-		{`package t3; type C[T any] interface{~chan<- T}; func f[T any, P C[T], Q C[[]*P]]() []T { return nil }; func _() { _ = f[int] }`,
-			`f`,
-			[]string{`int`, `chan<- int`, `chan<- []*chan<- int`},
-			`func() []int`,
+		{`package t3; type C[T any] interface{chan<- T}; func f[T any, P C[T], Q C[[]*P]]() []T { return nil }; func _() { _ = f[int] }`,
+			[]testInst{
+				{`C`, []string{`T`}, `interface{chan<- T}`},
+				{`C`, []string{`[]*P`}, `interface{chan<- []*P}`},
+				{`f`, []string{`int`, `chan<- int`, `chan<- []*chan<- int`}, `func() []int`},
+			},
 		},
-		{`package t4; type C[T any] interface{~chan<- T}; func f[T any, P C[T], Q C[[]*P]]() []T { return nil }; func _() { _ = f[int] }`,
-			`f`,
-			[]string{`int`, `chan<- int`, `chan<- []*chan<- int`},
-			`func() []int`,
+		{`package t4; type C[T any] interface{chan<- T}; func f[T any, P C[T], Q C[[]*P]]() []T { return nil }; func _() { _ = (f[int]) }`,
+			[]testInst{
+				{`C`, []string{`T`}, `interface{chan<- T}`},
+				{`C`, []string{`[]*P`}, `interface{chan<- []*P}`},
+				{`f`, []string{`int`, `chan<- int`, `chan<- []*chan<- int`}, `func() []int`},
+			},
 		},
-		{`package i0; import lib "generic_lib"; func _() { lib.F(42) }`,
-			`F`,
-			[]string{`int`},
-			`func(int)`,
+		{`package i0; import "lib"; func _() { lib.F(42) }`,
+			[]testInst{{`F`, []string{`int`}, `func(int)`}},
 		},
+
+		{`package duplfunc0; func f[T any](T) {}; func _() { f(42); f("foo"); f[int](3) }`,
+			[]testInst{
+				{`f`, []string{`int`}, `func(int)`},
+				{`f`, []string{`string`}, `func(string)`},
+				{`f`, []string{`int`}, `func(int)`},
+			},
+		},
+		{`package duplfunc1; import "lib"; func _() { lib.F(42); lib.F("foo"); lib.F(3) }`,
+			[]testInst{
+				{`F`, []string{`int`}, `func(int)`},
+				{`F`, []string{`string`}, `func(string)`},
+				{`F`, []string{`int`}, `func(int)`},
+			},
+		},
+
 		{`package type0; type T[P interface{~int}] struct{ x P }; var _ T[int]`,
-			`T`,
-			[]string{`int`},
-			`struct{x int}`,
+			[]testInst{{`T`, []string{`int`}, `struct{x int}`}},
 		},
 		{`package type1; type T[P interface{~int}] struct{ x P }; var _ (T[int])`,
-			`T`,
-			[]string{`int`},
-			`struct{x int}`,
+			[]testInst{{`T`, []string{`int`}, `struct{x int}`}},
 		},
 		{`package type2; type T[P interface{~int}] struct{ x P }; var _ T[(int)]`,
-			`T`,
-			[]string{`int`},
-			`struct{x int}`,
+			[]testInst{{`T`, []string{`int`}, `struct{x int}`}},
 		},
 		{`package type3; type T[P1 interface{~[]P2}, P2 any] struct{ x P1; y P2 }; var _ T[[]int, int]`,
-			`T`,
-			[]string{`[]int`, `int`},
-			`struct{x []int; y int}`,
+			[]testInst{{`T`, []string{`[]int`, `int`}, `struct{x []int; y int}`}},
 		},
-		{`package type4; import lib "generic_lib"; var _ lib.T[int]`,
-			`T`,
-			[]string{`int`},
-			`[]int`,
+		{`package type4; import "lib"; var _ lib.T[int]`,
+			[]testInst{{`T`, []string{`int`}, `[]int`}},
+		},
+
+		{`package dupltype0; type T[P interface{~int}] struct{ x P }; var x T[int]; var y T[int]`,
+			[]testInst{
+				{`T`, []string{`int`}, `struct{x int}`},
+				{`T`, []string{`int`}, `struct{x int}`},
+			},
+		},
+		{`package dupltype1; type T[P ~int] struct{ x P }; func (r *T[Q]) add(z T[Q]) { r.x += z.x }`,
+			[]testInst{
+				{`T`, []string{`Q`}, `struct{x Q}`},
+				{`T`, []string{`Q`}, `struct{x Q}`},
+			},
+		},
+		{`package dupltype1; import "lib"; var x lib.T[int]; var y lib.T[int]; var z lib.T[string]`,
+			[]testInst{
+				{`T`, []string{`int`}, `[]int`},
+				{`T`, []string{`int`}, `[]int`},
+				{`T`, []string{`string`}, `[]string`},
+			},
 		},
 	}
 
 	for _, test := range tests {
-		const lib = `package generic_lib
-
-func F[P any](P) {}
-
-type T[P any] []P
-`
-
 		imports := make(testImporter)
 		conf := Config{Importer: imports}
-		instances := make(map[*syntax.Name]Instance)
-		uses := make(map[*syntax.Name]Object)
+		instMap := make(map[*syntax.Name]Instance)
+		useMap := make(map[*syntax.Name]Object)
 		makePkg := func(src string) *Package {
 			f, err := parseSrc("p.go", src)
 			if err != nil {
 				t.Fatal(err)
 			}
-			pkg, err := conf.Check("", []*syntax.File{f}, &Info{Instances: instances, Uses: uses})
+			pkg, err := conf.Check("", []*syntax.File{f}, &Info{Instances: instMap, Uses: useMap})
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -574,60 +583,72 @@
 		makePkg(lib)
 		pkg := makePkg(test.src)
 
-		// look for instance information
-		var targs []Type
-		var typ Type
-		for ident, inst := range instances {
-			if syntax.String(ident) == test.name {
-				for i := 0; i < inst.TypeArgs.Len(); i++ {
-					targs = append(targs, inst.TypeArgs.At(i))
-				}
-				typ = inst.Type
+		t.Run(pkg.Name(), func(t *testing.T) {
+			// Sort instances in source order for stability.
+			instances := sortedInstances(instMap)
+			if got, want := len(instances), len(test.instances); got != want {
+				t.Fatalf("got %d instances, want %d", got, want)
+			}
 
-				// Check that we can find the corresponding parameterized type.
-				ptype := uses[ident].Type()
+			// Pairwise compare with the expected instances.
+			for ii, inst := range instances {
+				var targs []Type
+				for i := 0; i < inst.Inst.TypeArgs.Len(); i++ {
+					targs = append(targs, inst.Inst.TypeArgs.At(i))
+				}
+				typ := inst.Inst.Type
+
+				testInst := test.instances[ii]
+				if got := inst.Name.Value; got != testInst.name {
+					t.Fatalf("got name %s, want %s", got, testInst.name)
+				}
+
+				if len(targs) != len(testInst.targs) {
+					t.Fatalf("got %d type arguments; want %d", len(targs), len(testInst.targs))
+				}
+				for i, targ := range targs {
+					if got := targ.String(); got != testInst.targs[i] {
+						t.Errorf("type argument %d: got %s; want %s", i, got, testInst.targs[i])
+					}
+				}
+				if got := typ.Underlying().String(); got != testInst.typ {
+					t.Errorf("package %s: got %s; want %s", pkg.Name(), got, testInst.typ)
+				}
+
+				// Verify the invariant that re-instantiating the corresponding generic
+				// type with TypeArgs results in an identical instance.
+				ptype := useMap[inst.Name].Type()
 				lister, _ := ptype.(interface{ TypeParams() *TypeParamList })
 				if lister == nil || lister.TypeParams().Len() == 0 {
-					t.Errorf("package %s: info.Types[%v] = %v, want parameterized type", pkg.Name(), ident, ptype)
-					continue
+					t.Fatalf("info.Types[%v] = %v, want parameterized type", inst.Name, ptype)
 				}
-
-				// Verify the invariant that re-instantiating the generic type with
-				// TypeArgs results in an equivalent type.
 				inst2, err := Instantiate(nil, ptype, targs, true)
 				if err != nil {
 					t.Errorf("Instantiate(%v, %v) failed: %v", ptype, targs, err)
 				}
-				if !Identical(inst.Type, inst2) {
-					t.Errorf("%v and %v are not identical", inst.Type, inst2)
+				if !Identical(inst.Inst.Type, inst2) {
+					t.Errorf("%v and %v are not identical", inst.Inst.Type, inst2)
 				}
-				break
 			}
-		}
-		if targs == nil {
-			t.Errorf("package %s: no instance information found for %s", pkg.Name(), test.name)
-			continue
-		}
-
-		// check that type arguments are correct
-		if len(targs) != len(test.targs) {
-			t.Errorf("package %s: got %d type arguments; want %d", pkg.Name(), len(targs), len(test.targs))
-			continue
-		}
-		for i, targ := range targs {
-			if got := targ.String(); got != test.targs[i] {
-				t.Errorf("package %s, %d. type argument: got %s; want %s", pkg.Name(), i, got, test.targs[i])
-				continue
-			}
-		}
-
-		// check that the types match
-		if got := typ.Underlying().String(); got != test.typ {
-			t.Errorf("package %s: got %s; want %s", pkg.Name(), got, test.typ)
-		}
+		})
 	}
 }
 
+type recordedInstance struct {
+	Name *syntax.Name
+	Inst Instance
+}
+
+func sortedInstances(m map[*syntax.Name]Instance) (instances []recordedInstance) {
+	for id, inst := range m {
+		instances = append(instances, recordedInstance{id, inst})
+	}
+	sort.Slice(instances, func(i, j int) bool {
+		return instances[i].Name.Pos().Cmp(instances[j].Name.Pos()) < 0
+	})
+	return instances
+}
+
 func TestDefsInfo(t *testing.T) {
 	var tests = []struct {
 		src  string
@@ -1697,7 +1718,7 @@
 	var F = /*F=func:12*/ F /*F=var:17*/ ; _ = F
 
 	var a []int
-	for i, x := range /*i=undef*/ /*x=var:16*/ a /*i=var:20*/ /*x=var:20*/ { _ = i; _ = x }
+	for i, x := range a /*i=undef*/ /*x=var:16*/ { _ = i; _ = x }
 
 	var i interface{}
 	switch y := i.(type) { /*y=undef*/
diff --git a/src/cmd/compile/internal/types2/assignments.go b/src/cmd/compile/internal/types2/assignments.go
index 936930f..d88b037 100644
--- a/src/cmd/compile/internal/types2/assignments.go
+++ b/src/cmd/compile/internal/types2/assignments.go
@@ -294,15 +294,14 @@
 	return "(" + strings.Join(res, ", ") + ")"
 }
 
-func (check *Checker) assignError(rhs []syntax.Expr, nvars, nvals int) {
-	measure := func(x int, unit string) string {
-		s := fmt.Sprintf("%d %s", x, unit)
-		if x != 1 {
-			s += "s"
-		}
-		return s
+func measure(x int, unit string) string {
+	if x != 1 {
+		unit += "s"
 	}
+	return fmt.Sprintf("%d %s", x, unit)
+}
 
+func (check *Checker) assignError(rhs []syntax.Expr, nvars, nvals int) {
 	vars := measure(nvars, "variable")
 	vals := measure(nvals, "value")
 	rhs0 := rhs[0]
diff --git a/src/cmd/compile/internal/types2/call.go b/src/cmd/compile/internal/types2/call.go
index 22f65ed..6cc30a7 100644
--- a/src/cmd/compile/internal/types2/call.go
+++ b/src/cmd/compile/internal/types2/call.go
@@ -423,7 +423,7 @@
 	"_Cmacro_", // function to evaluate the expanded expression
 }
 
-func (check *Checker) selector(x *operand, e *syntax.SelectorExpr) {
+func (check *Checker) selector(x *operand, e *syntax.SelectorExpr, def *Named) {
 	// these must be declared before the "goto Error" statements
 	var (
 		obj      Object
@@ -525,7 +525,17 @@
 	}
 
 	check.exprOrType(x, e.X, false)
-	if x.mode == invalid {
+	switch x.mode {
+	case typexpr:
+		// don't crash for "type T T.x" (was issue #51509)
+		if def != nil && x.typ == def {
+			check.cycleError([]Object{def.obj})
+			goto Error
+		}
+	case builtin:
+		check.errorf(e.Pos(), "cannot select on %s", x)
+		goto Error
+	case invalid:
 		goto Error
 	}
 
diff --git a/src/cmd/compile/internal/types2/check.go b/src/cmd/compile/internal/types2/check.go
index 535de02..4ec6a7b 100644
--- a/src/cmd/compile/internal/types2/check.go
+++ b/src/cmd/compile/internal/types2/check.go
@@ -126,7 +126,7 @@
 	untyped  map[syntax.Expr]exprInfo // map of expressions without final type
 	delayed  []action                 // stack of delayed action segments; segments are processed in FIFO order
 	objPath  []Object                 // path of object dependencies during type inference (for cycle reporting)
-	defTypes []*Named                 // defined types created during type checking, for final validation.
+	cleaners []cleaner                // list of types that may need a final cleanup at the end of type-checking
 
 	// environment within which the current object is type-checked (valid only
 	// for the duration of type-checking a specific object)
@@ -205,6 +205,16 @@
 	return obj
 }
 
+type cleaner interface {
+	cleanup()
+}
+
+// needsCleanup records objects/types that implement the cleanup method
+// which will be called at the end of type-checking.
+func (check *Checker) needsCleanup(c cleaner) {
+	check.cleaners = append(check.cleaners, c)
+}
+
 // NewChecker returns a new Checker instance for a given package.
 // Package files may be added incrementally via checker.Files.
 func NewChecker(conf *Config, pkg *Package, info *Info) *Checker {
@@ -247,6 +257,8 @@
 	check.methods = nil
 	check.untyped = nil
 	check.delayed = nil
+	check.objPath = nil
+	check.cleaners = nil
 
 	// determine package name and collect valid files
 	pkg := check.pkg
@@ -315,8 +327,8 @@
 	print("== processDelayed ==")
 	check.processDelayed(0) // incl. all functions
 
-	print("== expandDefTypes ==")
-	check.expandDefTypes()
+	print("== cleanup ==")
+	check.cleanup()
 
 	print("== initOrder ==")
 	check.initOrder()
@@ -344,7 +356,6 @@
 	check.recvTParamMap = nil
 	check.brokenAliases = nil
 	check.unionTypeSets = nil
-	check.defTypes = nil
 	check.ctxt = nil
 
 	// TODO(gri) There's more memory we should release at this point.
@@ -372,27 +383,13 @@
 	check.delayed = check.delayed[:top]
 }
 
-func (check *Checker) expandDefTypes() {
-	// Ensure that every defined type created in the course of type-checking has
-	// either non-*Named underlying, or is unresolved.
-	//
-	// This guarantees that we don't leak any types whose underlying is *Named,
-	// because any unresolved instances will lazily compute their underlying by
-	// substituting in the underlying of their origin. The origin must have
-	// either been imported or type-checked and expanded here, and in either case
-	// its underlying will be fully expanded.
-	for i := 0; i < len(check.defTypes); i++ {
-		n := check.defTypes[i]
-		switch n.underlying.(type) {
-		case nil:
-			if n.resolver == nil {
-				panic("nil underlying")
-			}
-		case *Named:
-			n.under() // n.under may add entries to check.defTypes
-		}
-		n.check = nil
+// cleanup runs cleanup for all collected cleaners.
+func (check *Checker) cleanup() {
+	// Don't use a range clause since Named.cleanup may add more cleaners.
+	for i := 0; i < len(check.cleaners); i++ {
+		check.cleaners[i].cleanup()
 	}
+	check.cleaners = nil
 }
 
 func (check *Checker) record(x *operand) {
diff --git a/src/cmd/compile/internal/types2/conversions.go b/src/cmd/compile/internal/types2/conversions.go
index 7fe1d50..08b3cbf 100644
--- a/src/cmd/compile/internal/types2/conversions.go
+++ b/src/cmd/compile/internal/types2/conversions.go
@@ -49,11 +49,14 @@
 		// have specific types, constant x cannot be
 		// converted.
 		ok = T.(*TypeParam).underIs(func(u Type) bool {
-			// t is nil if there are no specific type terms
+			// u is nil if there are no specific type terms
 			if u == nil {
 				cause = check.sprintf("%s does not contain specific types", T)
 				return false
 			}
+			if isString(x.typ) && isBytesOrRunes(u) {
+				return true
+			}
 			if !constConvertibleTo(u, nil) {
 				cause = check.sprintf("cannot convert %s to %s (in %s)", x, u, T)
 				return false
diff --git a/src/cmd/compile/internal/types2/decl.go b/src/cmd/compile/internal/types2/decl.go
index 0e8f508..579fa55 100644
--- a/src/cmd/compile/internal/types2/decl.go
+++ b/src/cmd/compile/internal/types2/decl.go
@@ -569,7 +569,6 @@
 
 	// Keep track of bounds for later validation.
 	var bound Type
-	var bounds []Type
 	for i, f := range list {
 		// Optimization: Re-use the previous type bound if it hasn't changed.
 		// This also preserves the grouped output of type parameter lists
@@ -584,7 +583,6 @@
 				check.error(f.Type, "cannot use a type parameter as constraint")
 				bound = Typ[Invalid]
 			}
-			bounds = append(bounds, bound)
 		}
 		tparams[i].bound = bound
 	}
diff --git a/src/cmd/compile/internal/types2/expr.go b/src/cmd/compile/internal/types2/expr.go
index 02ece21..05cf1d0 100644
--- a/src/cmd/compile/internal/types2/expr.go
+++ b/src/cmd/compile/internal/types2/expr.go
@@ -899,7 +899,7 @@
 	}
 	// see if we can extract a more specific error
 	var cause string
-	comparable(typ, nil, func(format string, args ...interface{}) {
+	comparable(typ, true, nil, func(format string, args ...interface{}) {
 		cause = check.sprintf(format, args...)
 	})
 	return cause
@@ -1360,6 +1360,10 @@
 			// no composite literal type present - use hint (element type of enclosing type)
 			typ = hint
 			base, _ = deref(coreType(typ)) // *T implies &T{}
+			if base == nil {
+				check.errorf(e, "invalid composite literal element type %s: no core type", typ)
+				goto Error
+			}
 
 		default:
 			// TODO(gri) provide better error messages depending on context
@@ -1552,7 +1556,7 @@
 		return kind
 
 	case *syntax.SelectorExpr:
-		check.selector(x, e)
+		check.selector(x, e, nil)
 
 	case *syntax.IndexExpr:
 		if check.indexExpr(x, e) {
@@ -1638,6 +1642,7 @@
 				case invalid:
 					goto Error
 				case typexpr:
+					check.validVarType(e.X, x.typ)
 					x.typ = &Pointer{base: x.typ}
 				default:
 					var base Type
diff --git a/src/cmd/compile/internal/types2/index.go b/src/cmd/compile/internal/types2/index.go
index 1eaddde..61009c1 100644
--- a/src/cmd/compile/internal/types2/index.go
+++ b/src/cmd/compile/internal/types2/index.go
@@ -182,7 +182,7 @@
 	}
 
 	if !valid {
-		check.errorf(x, invalidOp+"cannot index %s", x)
+		check.errorf(e.Pos(), invalidOp+"cannot index %s", x)
 		x.mode = invalid
 		return false
 	}
diff --git a/src/cmd/compile/internal/types2/infer.go b/src/cmd/compile/internal/types2/infer.go
index 2d6f26c..e131077 100644
--- a/src/cmd/compile/internal/types2/infer.go
+++ b/src/cmd/compile/internal/types2/infer.go
@@ -488,21 +488,88 @@
 		}
 	}
 
-	// If a constraint has a core type, unify the corresponding type parameter with it.
-	for _, tpar := range tparams {
-		if ctype := adjCoreType(tpar); ctype != nil {
-			if !u.unify(tpar, ctype) {
-				// TODO(gri) improve error message by providing the type arguments
-				//           which we know already
-				check.errorf(pos, "%s does not match %s", tpar, ctype)
-				return nil, 0
+	// Repeatedly apply constraint type inference as long as
+	// there are still unknown type arguments and progress is
+	// being made.
+	//
+	// This is an O(n^2) algorithm where n is the number of
+	// type parameters: if there is progress (and iteration
+	// continues), at least one type argument is inferred
+	// per iteration and we have a doubly nested loop.
+	// In practice this is not a problem because the number
+	// of type parameters tends to be very small (< 5 or so).
+	// (It should be possible for unification to efficiently
+	// signal newly inferred type arguments; then the loops
+	// here could handle the respective type parameters only,
+	// but that will come at a cost of extra complexity which
+	// may not be worth it.)
+	for n := u.x.unknowns(); n > 0; {
+		nn := n
+
+		for i, tpar := range tparams {
+			// If there is a core term (i.e., a core type with tilde information)
+			// unify the type parameter with the core type.
+			if core, single := coreTerm(tpar); core != nil {
+				// A type parameter can be unified with its core type in two cases.
+				tx := u.x.at(i)
+				switch {
+				case tx != nil:
+					// The corresponding type argument tx is known.
+					// In this case, if the core type has a tilde, the type argument's underlying
+					// type must match the core type, otherwise the type argument and the core type
+					// must match.
+					// If tx is an external type parameter, don't consider its underlying type
+					// (which is an interface). Core type unification will attempt to unify against
+					// core.typ.
+					// Note also that even with inexact unification we cannot leave away the under
+					// call here because it's possible that both tx and core.typ are named types,
+					// with under(tx) being a (named) basic type matching core.typ. Such cases do
+					// not match with inexact unification.
+					if core.tilde && !isTypeParam(tx) {
+						tx = under(tx)
+					}
+					if !u.unify(tx, core.typ) {
+						// TODO(gri) improve error message by providing the type arguments
+						//           which we know already
+						// Don't use term.String() as it always qualifies types, even if they
+						// are in the current package.
+						tilde := ""
+						if core.tilde {
+							tilde = "~"
+						}
+						check.errorf(pos, "%s does not match %s%s", tpar, tilde, core.typ)
+						return nil, 0
+					}
+
+				case single && !core.tilde:
+					// The corresponding type argument tx is unknown and there's a single
+					// specific type and no tilde.
+					// In this case the type argument must be that single type; set it.
+					u.x.set(i, core.typ)
+
+				default:
+					// Unification is not possible and no progress was made.
+					continue
+				}
+
+				// The number of known type arguments may have changed.
+				nn = u.x.unknowns()
+				if nn == 0 {
+					break // all type arguments are known
+				}
 			}
 		}
+
+		assert(nn <= n)
+		if nn == n {
+			break // no progress
+		}
+		n = nn
 	}
 
 	// u.x.types() now contains the incoming type arguments plus any additional type
-	// arguments which were inferred from core types. The newly inferred non-
-	// nil entries may still contain references to other type parameters.
+	// arguments which were inferred from core terms. The newly inferred non-nil
+	// entries may still contain references to other type parameters.
 	// For instance, for [A any, B interface{ []C }, C interface{ *A }], if A == int
 	// was given, unification produced the type list [int, []C, *A]. We eliminate the
 	// remaining type parameters by substituting the type parameters in this type list
@@ -591,17 +658,40 @@
 	return
 }
 
-func adjCoreType(tpar *TypeParam) Type {
-	// If the type parameter embeds a single, possibly named
-	// type, use that one instead of the core type (which is
-	// always the underlying type of that single type).
-	if single := tpar.singleType(); single != nil {
-		if debug {
-			assert(under(single) == coreType(tpar))
+// If the type parameter has a single specific type S, coreTerm returns (S, true).
+// Otherwise, if tpar has a core type T, it returns a term corresponding to that
+// core type and false. In that case, if any term of tpar has a tilde, the core
+// term has a tilde. In all other cases coreTerm returns (nil, false).
+func coreTerm(tpar *TypeParam) (*term, bool) {
+	n := 0
+	var single *term // valid if n == 1
+	var tilde bool
+	tpar.is(func(t *term) bool {
+		if t == nil {
+			assert(n == 0)
+			return false // no terms
 		}
-		return single
+		n++
+		single = t
+		if t.tilde {
+			tilde = true
+		}
+		return true
+	})
+	if n == 1 {
+		if debug {
+			assert(debug && under(single.typ) == coreType(tpar))
+		}
+		return single, true
 	}
-	return coreType(tpar)
+	if typ := coreType(tpar); typ != nil {
+		// A core type is always an underlying type.
+		// If any term of tpar has a tilde, we don't
+		// have a precise core type and we must return
+		// a tilde as well.
+		return &term{tilde, typ}, false
+	}
+	return nil, false
 }
 
 type cycleFinder struct {
@@ -649,8 +739,6 @@
 	//      in signatures where they are handled explicitly.
 
 	case *Signature:
-		// There are no "method types" so we should never see a recv.
-		assert(t.recv == nil)
 		if t.params != nil {
 			w.varList(t.params.vars)
 		}
diff --git a/src/cmd/compile/internal/types2/instantiate.go b/src/cmd/compile/internal/types2/instantiate.go
index f54938b..9eced48 100644
--- a/src/cmd/compile/internal/types2/instantiate.go
+++ b/src/cmd/compile/internal/types2/instantiate.go
@@ -15,10 +15,10 @@
 
 // Instantiate instantiates the type orig with the given type arguments targs.
 // orig must be a *Named or a *Signature type. If there is no error, the
-// resulting Type is a new, instantiated (not parameterized) type of the same
-// kind (either a *Named or a *Signature). Methods attached to a *Named type
-// are also instantiated, and associated with a new *Func that has the same
-// position as the original method, but nil function scope.
+// resulting Type is an instantiated type of the same kind (either a *Named or
+// a *Signature). Methods attached to a *Named type are also instantiated, and
+// associated with a new *Func that has the same position as the original
+// method, but nil function scope.
 //
 // If ctxt is non-nil, it may be used to de-duplicate the instance against
 // previous instances with the same identity. As a special case, generic
@@ -204,7 +204,7 @@
 	// If T is comparable, V must be comparable.
 	// Remember as a pending error and report only if we don't have a more specific error.
 	var pending error
-	if Ti.IsComparable() && ((Vi != nil && !Vi.IsComparable()) || (Vi == nil && !Comparable(V))) {
+	if Ti.IsComparable() && !comparable(V, false, nil, nil) {
 		pending = errorf("%s does not implement comparable", V)
 	}
 
diff --git a/src/cmd/compile/internal/types2/interface.go b/src/cmd/compile/internal/types2/interface.go
index ca5140d..75597ab 100644
--- a/src/cmd/compile/internal/types2/interface.go
+++ b/src/cmd/compile/internal/types2/interface.go
@@ -37,7 +37,7 @@
 	}
 
 	// set method receivers if necessary
-	typ := new(Interface)
+	typ := (*Checker)(nil).newInterface()
 	for _, m := range methods {
 		if sig := m.typ.(*Signature); sig.recv == nil {
 			sig.recv = NewVar(m.pos, m.pkg, "", typ)
@@ -54,6 +54,15 @@
 	return typ
 }
 
+// check may be nil
+func (check *Checker) newInterface() *Interface {
+	typ := &Interface{check: check}
+	if check != nil {
+		check.needsCleanup(typ)
+	}
+	return typ
+}
+
 // MarkImplicit marks the interface t as implicit, meaning this interface
 // corresponds to a constraint literal such as ~T or A|B without explicit
 // interface embedding. MarkImplicit should be called before any concurrent use
@@ -100,6 +109,11 @@
 // ----------------------------------------------------------------------------
 // Implementation
 
+func (t *Interface) cleanup() {
+	t.check = nil
+	t.embedPos = nil
+}
+
 func (check *Checker) interfaceType(ityp *Interface, iface *syntax.InterfaceType, def *Named) {
 	addEmbedded := func(pos syntax.Pos, typ Type) {
 		ityp.embeddeds = append(ityp.embeddeds, typ)
@@ -162,16 +176,10 @@
 	// (don't sort embeddeds: they must correspond to *embedPos entries)
 	sortMethods(ityp.methods)
 
-	// Compute type set with a non-nil *Checker as soon as possible
-	// to report any errors. Subsequent uses of type sets will use
-	// this computed type set and won't need to pass in a *Checker.
-	//
-	// Pin the checker to the interface type in the interim, in case the type set
-	// must be used before delayed funcs are processed (see issue #48234).
-	// TODO(rfindley): clean up use of *Checker with computeInterfaceTypeSet
-	ityp.check = check
+	// Compute type set as soon as possible to report any errors.
+	// Subsequent uses of type sets will use this computed type
+	// set and won't need to pass in a *Checker.
 	check.later(func() {
 		computeInterfaceTypeSet(check, iface.Pos(), ityp)
-		ityp.check = nil
 	}).describef(iface, "compute type set for %s", ityp)
 }
diff --git a/src/cmd/compile/internal/types2/lookup.go b/src/cmd/compile/internal/types2/lookup.go
index 0a2d2a5..0832877 100644
--- a/src/cmd/compile/internal/types2/lookup.go
+++ b/src/cmd/compile/internal/types2/lookup.go
@@ -70,7 +70,8 @@
 	// see if there is a matching field (but not a method, those need to be declared
 	// explicitly in the constraint). If the constraint is a named pointer type (see
 	// above), we are ok here because only fields are accepted as results.
-	if obj == nil && isTypeParam(T) {
+	const enableTParamFieldLookup = false // see issue #51576
+	if enableTParamFieldLookup && obj == nil && isTypeParam(T) {
 		if t := coreType(T); t != nil {
 			obj, index, indirect = lookupFieldOrMethod(t, addressable, pkg, name, false)
 			if _, ok := obj.(*Var); !ok {
diff --git a/src/cmd/compile/internal/types2/named.go b/src/cmd/compile/internal/types2/named.go
index bb522e8..daf8fdc 100644
--- a/src/cmd/compile/internal/types2/named.go
+++ b/src/cmd/compile/internal/types2/named.go
@@ -72,16 +72,36 @@
 	}
 	// Ensure that typ is always expanded and sanity-checked.
 	if check != nil {
-		check.defTypes = append(check.defTypes, typ)
+		check.needsCleanup(typ)
 	}
 	return typ
 }
 
+func (t *Named) cleanup() {
+	// Ensure that every defined type created in the course of type-checking has
+	// either non-*Named underlying, or is unresolved.
+	//
+	// This guarantees that we don't leak any types whose underlying is *Named,
+	// because any unresolved instances will lazily compute their underlying by
+	// substituting in the underlying of their origin. The origin must have
+	// either been imported or type-checked and expanded here, and in either case
+	// its underlying will be fully expanded.
+	switch t.underlying.(type) {
+	case nil:
+		if t.resolver == nil {
+			panic("nil underlying")
+		}
+	case *Named:
+		t.under() // t.under may add entries to check.cleaners
+	}
+	t.check = nil
+}
+
 // Obj returns the type name for the declaration defining the named type t. For
-// instantiated types, this is the type name of the base type.
+// instantiated types, this is same as the type name of the origin type.
 func (t *Named) Obj() *TypeName { return t.orig.obj } // for non-instances this is the same as t.obj
 
-// Origin returns the parameterized type from which the named type t is
+// Origin returns the generic type from which the named type t is
 // instantiated. If t is not an instantiated type, the result is t.
 func (t *Named) Origin() *Named { return t.orig }
 
@@ -89,7 +109,7 @@
 //           between parameterized instantiated and non-instantiated types.
 
 // TypeParams returns the type parameters of the named type t, or nil.
-// The result is non-nil for an (originally) parameterized type even if it is instantiated.
+// The result is non-nil for an (originally) generic type even if it is instantiated.
 func (t *Named) TypeParams() *TypeParamList { return t.resolve(nil).tparams }
 
 // SetTypeParams sets the type parameters of the named type t.
@@ -102,7 +122,11 @@
 // TypeArgs returns the type arguments used to instantiate the named type t.
 func (t *Named) TypeArgs() *TypeList { return t.targs }
 
-// NumMethods returns the number of explicit methods whose receiver is named type t.
+// NumMethods returns the number of explicit methods defined for t.
+//
+// For an ordinary or instantiated type t, the receiver base type of these
+// methods will be the named type t. For an uninstantiated generic type t, each
+// method receiver will be instantiated with its receiver type parameters.
 func (t *Named) NumMethods() int { return t.resolve(nil).methods.Len() }
 
 // Method returns the i'th method of named type t for 0 <= i < t.NumMethods().
@@ -360,11 +384,11 @@
 				// that it wasn't substituted. In this case we need to create a new
 				// *Interface before modifying receivers.
 				if iface == n.orig.underlying {
-					iface = &Interface{
-						embeddeds: iface.embeddeds,
-						complete:  iface.complete,
-						implicit:  iface.implicit, // should be false but be conservative
-					}
+					old := iface
+					iface = check.newInterface()
+					iface.embeddeds = old.embeddeds
+					iface.complete = old.complete
+					iface.implicit = old.implicit // should be false but be conservative
 					underlying = iface
 				}
 				iface.methods = methods
diff --git a/src/cmd/compile/internal/types2/predicates.go b/src/cmd/compile/internal/types2/predicates.go
index 0e46333..ba25934 100644
--- a/src/cmd/compile/internal/types2/predicates.go
+++ b/src/cmd/compile/internal/types2/predicates.go
@@ -102,11 +102,12 @@
 
 // Comparable reports whether values of type T are comparable.
 func Comparable(T Type) bool {
-	return comparable(T, nil, nil)
+	return comparable(T, true, nil, nil)
 }
 
+// If dynamic is set, non-type parameter interfaces are always comparable.
 // If reportf != nil, it may be used to report why T is not comparable.
-func comparable(T Type, seen map[Type]bool, reportf func(string, ...interface{})) bool {
+func comparable(T Type, dynamic bool, seen map[Type]bool, reportf func(string, ...interface{})) bool {
 	if seen[T] {
 		return true
 	}
@@ -124,7 +125,7 @@
 		return true
 	case *Struct:
 		for _, f := range t.fields {
-			if !comparable(f.typ, seen, nil) {
+			if !comparable(f.typ, dynamic, seen, nil) {
 				if reportf != nil {
 					reportf("struct containing %s cannot be compared", f.typ)
 				}
@@ -133,7 +134,7 @@
 		}
 		return true
 	case *Array:
-		if !comparable(t.elem, seen, nil) {
+		if !comparable(t.elem, dynamic, seen, nil) {
 			if reportf != nil {
 				reportf("%s cannot be compared", t)
 			}
@@ -141,7 +142,7 @@
 		}
 		return true
 	case *Interface:
-		return !isTypeParam(T) || t.typeSet().IsComparable(seen)
+		return dynamic && !isTypeParam(T) || t.typeSet().IsComparable(seen)
 	}
 	return false
 }
diff --git a/src/cmd/compile/internal/types2/resolver.go b/src/cmd/compile/internal/types2/resolver.go
index 05755f8..61963cb 100644
--- a/src/cmd/compile/internal/types2/resolver.go
+++ b/src/cmd/compile/internal/types2/resolver.go
@@ -413,7 +413,7 @@
 
 			case *syntax.TypeDecl:
 				if len(s.TParamList) != 0 && !check.allowVersion(pkg, 1, 18) {
-					check.softErrorf(s.TParamList[0], "type parameters require go1.18 or later")
+					check.versionErrorf(s.TParamList[0], "go1.18", "type parameter")
 				}
 				obj := NewTypeName(s.Name.Pos(), pkg, s.Name.Value, nil)
 				check.declarePkgObj(s.Name, obj, &declInfo{file: fileScope, tdecl: s})
@@ -458,7 +458,7 @@
 					check.recordDef(s.Name, obj)
 				}
 				if len(s.TParamList) != 0 && !check.allowVersion(pkg, 1, 18) && !hasTParamError {
-					check.softErrorf(s.TParamList[0], "type parameters require go1.18 or later")
+					check.versionErrorf(s.TParamList[0], "go1.18", "type parameter")
 				}
 				info := &declInfo{file: fileScope, fdecl: s}
 				// Methods are not package-level objects but we still track them in the
diff --git a/src/cmd/compile/internal/types2/signature.go b/src/cmd/compile/internal/types2/signature.go
index c87fab7..c98024f 100644
--- a/src/cmd/compile/internal/types2/signature.go
+++ b/src/cmd/compile/internal/types2/signature.go
@@ -116,11 +116,10 @@
 			// lookup in the scope.
 			for i, p := range rparams {
 				if p.Value == "_" {
-					tpar := sig.rparams.At(i)
 					if check.recvTParamMap == nil {
 						check.recvTParamMap = make(map[*syntax.Name]*TypeParam)
 					}
-					check.recvTParamMap[p] = tpar
+					check.recvTParamMap[p] = tparams[i]
 				}
 			}
 			// determine receiver type to get its type parameters
@@ -136,22 +135,23 @@
 				}
 			}
 			// provide type parameter bounds
-			// - only do this if we have the right number (otherwise an error is reported elsewhere)
-			if sig.RecvTypeParams().Len() == len(recvTParams) {
-				// We have a list of *TypeNames but we need a list of Types.
-				list := make([]Type, sig.RecvTypeParams().Len())
-				for i, t := range sig.RecvTypeParams().list() {
-					list[i] = t
-					check.mono.recordCanon(t, recvTParams[i])
+			if len(tparams) == len(recvTParams) {
+				smap := makeRenameMap(recvTParams, tparams)
+				for i, tpar := range tparams {
+					recvTPar := recvTParams[i]
+					check.mono.recordCanon(tpar, recvTPar)
+					// recvTPar.bound is (possibly) parameterized in the context of the
+					// receiver type declaration. Substitute parameters for the current
+					// context.
+					tpar.bound = check.subst(tpar.obj.pos, recvTPar.bound, smap, nil)
 				}
-				smap := makeSubstMap(recvTParams, list)
-				for i, tpar := range sig.RecvTypeParams().list() {
-					bound := recvTParams[i].bound
-					// bound is (possibly) parameterized in the context of the
-					// receiver type declaration. Substitute parameters for the
-					// current context.
-					tpar.bound = check.subst(tpar.obj.pos, bound, smap, nil)
-				}
+			} else if len(tparams) < len(recvTParams) {
+				// Reporting an error here is a stop-gap measure to avoid crashes in the
+				// compiler when a type parameter/argument cannot be inferred later. It
+				// may lead to follow-on errors (see issues #51339, #51343).
+				// TODO(gri) find a better solution
+				got := measure(len(tparams), "type parameter")
+				check.errorf(recvPar, "got %s, but receiver base type declares %d", got, len(recvTParams))
 			}
 		}
 	}
@@ -194,66 +194,69 @@
 		case 1:
 			recv = recvList[0]
 		}
+		sig.recv = recv
 
-		// TODO(gri) We should delay rtyp expansion to when we actually need the
-		//           receiver; thus all checks here should be delayed to later.
-		rtyp, _ := deref(recv.typ)
+		// Delay validation of receiver type as it may cause premature expansion
+		// of types the receiver type is dependent on (see issues #51232, #51233).
+		check.later(func() {
+			rtyp, _ := deref(recv.typ)
 
-		// spec: "The receiver type must be of the form T or *T where T is a type name."
-		// (ignore invalid types - error was reported before)
-		if rtyp != Typ[Invalid] {
-			var err string
-			switch T := rtyp.(type) {
-			case *Named:
-				T.resolve(check.bestContext(nil))
-				// The receiver type may be an instantiated type referred to
-				// by an alias (which cannot have receiver parameters for now).
-				if T.TypeArgs() != nil && sig.RecvTypeParams() == nil {
-					check.errorf(recv.pos, "cannot define methods on instantiated type %s", recv.typ)
-					break
-				}
-				// spec: "The type denoted by T is called the receiver base type; it must not
-				// be a pointer or interface type and it must be declared in the same package
-				// as the method."
-				if T.obj.pkg != check.pkg {
-					err = "type not defined in this package"
+			// spec: "The receiver type must be of the form T or *T where T is a type name."
+			// (ignore invalid types - error was reported before)
+			if rtyp != Typ[Invalid] {
+				var err string
+				switch T := rtyp.(type) {
+				case *Named:
+					T.resolve(check.bestContext(nil))
+					// The receiver type may be an instantiated type referred to
+					// by an alias (which cannot have receiver parameters for now).
+					if T.TypeArgs() != nil && sig.RecvTypeParams() == nil {
+						check.errorf(recv.pos, "cannot define methods on instantiated type %s", recv.typ)
+						break
+					}
+					// spec: "The type denoted by T is called the receiver base type; it must not
+					// be a pointer or interface type and it must be declared in the same package
+					// as the method."
+					if T.obj.pkg != check.pkg {
+						err = "type not defined in this package"
+						if check.conf.CompilerErrorMessages {
+							check.errorf(recv.pos, "cannot define new methods on non-local type %s", recv.typ)
+							err = ""
+						}
+					} else {
+						// The underlying type of a receiver base type can be a type parameter;
+						// e.g. for methods with a generic receiver T[P] with type T[P any] P.
+						// TODO(gri) Such declarations are currently disallowed.
+						//           Revisit the need for underIs.
+						underIs(T, func(u Type) bool {
+							switch u := u.(type) {
+							case *Basic:
+								// unsafe.Pointer is treated like a regular pointer
+								if u.kind == UnsafePointer {
+									err = "unsafe.Pointer"
+									return false
+								}
+							case *Pointer, *Interface:
+								err = "pointer or interface type"
+								return false
+							}
+							return true
+						})
+					}
+				case *Basic:
+					err = "basic or unnamed type"
 					if check.conf.CompilerErrorMessages {
 						check.errorf(recv.pos, "cannot define new methods on non-local type %s", recv.typ)
 						err = ""
 					}
-				} else {
-					// The underlying type of a receiver base type can be a type parameter;
-					// e.g. for methods with a generic receiver T[P] with type T[P any] P.
-					underIs(T, func(u Type) bool {
-						switch u := u.(type) {
-						case *Basic:
-							// unsafe.Pointer is treated like a regular pointer
-							if u.kind == UnsafePointer {
-								err = "unsafe.Pointer"
-								return false
-							}
-						case *Pointer, *Interface:
-							err = "pointer or interface type"
-							return false
-						}
-						return true
-					})
+				default:
+					check.errorf(recv.pos, "invalid receiver type %s", recv.typ)
 				}
-			case *Basic:
-				err = "basic or unnamed type"
-				if check.conf.CompilerErrorMessages {
-					check.errorf(recv.pos, "cannot define new methods on non-local type %s", recv.typ)
-					err = ""
+				if err != "" {
+					check.errorf(recv.pos, "invalid receiver type %s (%s)", recv.typ, err)
 				}
-			default:
-				check.errorf(recv.pos, "invalid receiver type %s", recv.typ)
 			}
-			if err != "" {
-				check.errorf(recv.pos, "invalid receiver type %s (%s)", recv.typ, err)
-				// ok to continue
-			}
-		}
-		sig.recv = recv
+		}).describef(recv, "validate receiver %s", recv)
 	}
 
 	sig.params = NewTuple(params...)
diff --git a/src/cmd/compile/internal/types2/stmt.go b/src/cmd/compile/internal/types2/stmt.go
index 836b95d..4c8eac7 100644
--- a/src/cmd/compile/internal/types2/stmt.go
+++ b/src/cmd/compile/internal/types2/stmt.go
@@ -626,14 +626,15 @@
 
 	case *syntax.ForStmt:
 		inner |= breakOk | continueOk
-		check.openScope(s, "for")
-		defer check.closeScope()
 
 		if rclause, _ := s.Init.(*syntax.RangeClause); rclause != nil {
 			check.rangeStmt(inner, s, rclause)
 			break
 		}
 
+		check.openScope(s, "for")
+		defer check.closeScope()
+
 		check.simpleStmt(s.Init)
 		if s.Cond != nil {
 			var x operand
@@ -809,8 +810,6 @@
 }
 
 func (check *Checker) rangeStmt(inner stmtContext, s *syntax.ForStmt, rclause *syntax.RangeClause) {
-	// scope already opened
-
 	// determine lhs, if any
 	sKey := rclause.Lhs // possibly nil
 	var sValue, sExtra syntax.Expr
@@ -866,6 +865,11 @@
 		}
 	}
 
+	// Open the for-statement block scope now, after the range clause.
+	// Iteration variables declared with := need to go in this scope (was issue #51437).
+	check.openScope(s, "range")
+	defer check.closeScope()
+
 	// check assignment to/declaration of iteration variables
 	// (irregular assignment, cannot easily map to existing assignment checks)
 
@@ -874,9 +878,7 @@
 	rhs := [2]Type{key, val} // key, val may be nil
 
 	if rclause.Def {
-		// short variable declaration; variable scope starts after the range clause
-		// (the for loop opens a new scope, so variables on the lhs never redeclare
-		// previously declared variables)
+		// short variable declaration
 		var vars []*Var
 		for i, lhs := range lhs {
 			if lhs == nil {
@@ -913,12 +915,8 @@
 
 		// declare variables
 		if len(vars) > 0 {
-			scopePos := syntax.EndPos(rclause.X) // TODO(gri) should this just be s.Body.Pos (spec clarification)?
+			scopePos := s.Body.Pos()
 			for _, obj := range vars {
-				// spec: "The scope of a constant or variable identifier declared inside
-				// a function begins at the end of the ConstSpec or VarSpec (ShortVarDecl
-				// for short variable declarations) and ends at the end of the innermost
-				// containing block."
 				check.declare(check.scope, nil /* recordDef already called */, obj, scopePos)
 			}
 		} else {
diff --git a/src/cmd/compile/internal/types2/subst.go b/src/cmd/compile/internal/types2/subst.go
index 44a59f5..037f047 100644
--- a/src/cmd/compile/internal/types2/subst.go
+++ b/src/cmd/compile/internal/types2/subst.go
@@ -160,7 +160,10 @@
 		methods, mcopied := subst.funcList(t.methods)
 		embeddeds, ecopied := subst.typeList(t.embeddeds)
 		if mcopied || ecopied {
-			iface := &Interface{embeddeds: embeddeds, implicit: t.implicit, complete: t.complete}
+			iface := subst.check.newInterface()
+			iface.embeddeds = embeddeds
+			iface.implicit = t.implicit
+			iface.complete = t.complete
 			// If we've changed the interface type, we may need to replace its
 			// receiver if the receiver type is the original interface. Receivers of
 			// *Named type are replaced during named type expansion.
diff --git a/src/cmd/compile/internal/types2/termlist.go b/src/cmd/compile/internal/types2/termlist.go
index 844e39e..a0108c4 100644
--- a/src/cmd/compile/internal/types2/termlist.go
+++ b/src/cmd/compile/internal/types2/termlist.go
@@ -92,15 +92,6 @@
 	return rl
 }
 
-// If the type set represented by xl is specified by a single (non-𝓤) term,
-// singleType returns that type. Otherwise it returns nil.
-func (xl termlist) singleType() Type {
-	if nl := xl.norm(); len(nl) == 1 {
-		return nl[0].typ // if nl.isAll() then typ is nil, which is ok
-	}
-	return nil
-}
-
 // union returns the union xl ∪ yl.
 func (xl termlist) union(yl termlist) termlist {
 	return append(xl, yl...).norm()
diff --git a/src/cmd/compile/internal/types2/termlist_test.go b/src/cmd/compile/internal/types2/termlist_test.go
index 1bdf9e1..d1e3bdf 100644
--- a/src/cmd/compile/internal/types2/termlist_test.go
+++ b/src/cmd/compile/internal/types2/termlist_test.go
@@ -106,35 +106,6 @@
 	}
 }
 
-func TestTermlistSingleType(t *testing.T) {
-	// helper to deal with nil types
-	tstring := func(typ Type) string {
-		if typ == nil {
-			return "nil"
-		}
-		return typ.String()
-	}
-
-	for test, want := range map[string]string{
-		"∅":                 "nil",
-		"𝓤":                 "nil",
-		"int":               "int",
-		"myInt":             "myInt",
-		"~int":              "int",
-		"~int ∪ string":     "nil",
-		"~int ∪ myInt":      "int",
-		"∅ ∪ int":           "int",
-		"∅ ∪ ~int":          "int",
-		"∅ ∪ ~int ∪ string": "nil",
-	} {
-		xl := maketl(test)
-		got := tstring(xl.singleType())
-		if got != want {
-			t.Errorf("(%v).singleType() == %v; want %v", test, got, want)
-		}
-	}
-}
-
 func TestTermlistUnion(t *testing.T) {
 	for _, test := range []struct {
 		xl, yl, want string
diff --git a/src/cmd/compile/internal/types2/testdata/check/funcinference.go2 b/src/cmd/compile/internal/types2/testdata/check/funcinference.go2
index 7160e18..45d0781 100644
--- a/src/cmd/compile/internal/types2/testdata/check/funcinference.go2
+++ b/src/cmd/compile/internal/types2/testdata/check/funcinference.go2
@@ -8,21 +8,21 @@
 
 type any interface{}
 
-func f0[A any, B interface{~*C}, C interface{~*D}, D interface{~*A}](A, B, C, D) {}
+func f0[A any, B interface{*C}, C interface{*D}, D interface{*A}](A, B, C, D) {}
 func _() {
 	f := f0[string]
 	f("a", nil, nil, nil)
 	f0("a", nil, nil, nil)
 }
 
-func f1[A any, B interface{~*A}](A, B) {}
+func f1[A any, B interface{*A}](A, B) {}
 func _() {
 	f := f1[int]
 	f(int(0), new(int))
 	f1(int(0), new(int))
 }
 
-func f2[A any, B interface{~[]A}](A, B) {}
+func f2[A any, B interface{[]A}](A, B) {}
 func _() {
 	f := f2[byte]
 	f(byte(0), []byte{})
@@ -38,7 +38,7 @@
 // 	f3(x, &x, &x)
 // }
 
-func f4[A any, B interface{~[]C}, C interface{~*A}](A, B, C) {}
+func f4[A any, B interface{[]C}, C interface{*A}](A, B, C) {}
 func _() {
 	f := f4[int]
 	var x int
@@ -46,7 +46,7 @@
 	f4(x, []*int{}, &x)
 }
 
-func f5[A interface{~struct{b B; c C}}, B any, C interface{~*B}](x B) A { panic(0) }
+func f5[A interface{struct{b B; c C}}, B any, C interface{*B}](x B) A { panic(0) }
 func _() {
 	x := f5(1.2)
 	var _ float64 = x.b
@@ -79,14 +79,14 @@
 
 type Setter[B any] interface {
 	Set(string)
-	~*B
+	*B
 }
 
 func FromStrings[T interface{}, PT Setter[T]](s []string) []T {
 	result := make([]T, len(s))
 	for i, v := range s {
 		// The type of &result[i] is *T which is in the type list
-		// of Setter2, so we can convert it to PT.
+		// of Setter, so we can convert it to PT.
 		p := PT(&result[i])
 		// PT has a Set method.
 		p.Set(v)
diff --git a/src/cmd/compile/internal/types2/testdata/check/typeinference.go2 b/src/cmd/compile/internal/types2/testdata/check/typeinference.go2
index 8876cca..28f3e28 100644
--- a/src/cmd/compile/internal/types2/testdata/check/typeinference.go2
+++ b/src/cmd/compile/internal/types2/testdata/check/typeinference.go2
@@ -4,44 +4,46 @@
 
 package typeInference
 
+// As of issue #51527, type-type inference has been disabled.
+
 // basic inference
 type Tb[P ~*Q, Q any] int
 func _() {
-	var x Tb[*int]
+	var x Tb /* ERROR got 1 arguments */ [*int]
 	var y Tb[*int, int]
-	x = y
+	x = y /* ERROR cannot use y .* in assignment */
 	_ = x
 }
 
 // recursive inference
-type Tr[A any, B ~*C, C ~*D, D ~*A] int
+type Tr[A any, B *C, C *D, D *A] int
 func _() {
-	var x Tr[string]
+	var x Tr /* ERROR got 1 arguments */ [string]
 	var y Tr[string, ***string, **string, *string]
 	var z Tr[int, ***int, **int, *int]
-	x = y
+	x = y /* ERROR cannot use y .* in assignment */
 	x = z // ERROR cannot use z .* as Tr
 	_ = x
 }
 
 // other patterns of inference
-type To0[A any, B ~[]A] int
-type To1[A any, B ~struct{a A}] int
-type To2[A any, B ~[][]A] int
-type To3[A any, B ~[3]*A] int
-type To4[A any, B any, C ~struct{a A; b B}] int
+type To0[A any, B []A] int
+type To1[A any, B struct{a A}] int
+type To2[A any, B [][]A] int
+type To3[A any, B [3]*A] int
+type To4[A any, B any, C struct{a A; b B}] int
 func _() {
-	var _ To0[int]
-	var _ To1[int]
-	var _ To2[int]
-	var _ To3[int]
-	var _ To4[int, string]
+	var _ To0 /* ERROR got 1 arguments */ [int]
+	var _ To1 /* ERROR got 1 arguments */ [int]
+	var _ To2 /* ERROR got 1 arguments */ [int]
+	var _ To3 /* ERROR got 1 arguments */ [int]
+	var _ To4 /* ERROR got 2 arguments */ [int, string]
 }
 
 // failed inference
 type Tf0[A, B any] int
 type Tf1[A any, B ~struct{a A; c C}, C any] int
 func _() {
-	var _ Tf0 /* ERROR cannot infer B */ /* ERROR got 1 arguments but 2 type parameters */ [int]
-	var _ Tf1 /* ERROR cannot infer B */ /* ERROR got 1 arguments but 3 type parameters */ [int]
+	var _ Tf0 /* ERROR got 1 arguments but 2 type parameters */ [int]
+	var _ Tf1 /* ERROR got 1 arguments but 3 type parameters */ [int]
 }
diff --git a/src/cmd/compile/internal/types2/testdata/examples/inference.go2 b/src/cmd/compile/internal/types2/testdata/examples/inference.go2
index e762f33..e3d6bfb 100644
--- a/src/cmd/compile/internal/types2/testdata/examples/inference.go2
+++ b/src/cmd/compile/internal/types2/testdata/examples/inference.go2
@@ -78,7 +78,7 @@
 	related1(si, "foo" /* ERROR cannot use "foo" */ )
 }
 
-func related2[Elem any, Slice interface{~[]Elem}](e Elem, s Slice) {}
+func related2[Elem any, Slice interface{[]Elem}](e Elem, s Slice) {}
 
 func _() {
 	// related2 can be called with explicit instantiation.
@@ -109,16 +109,8 @@
 	related3[int, []int]()
 	related3[byte, List[byte]]()
 
-	// Alternatively, the 2nd type argument can be inferred
-	// from the first one through constraint type inference.
-	related3[int]()
-
-	// The inferred type is the core type of the Slice
-	// type parameter.
-	var _ []int = related3[int]()
-
-	// It is not the defined parameterized type List.
-	type anotherList []float32
-	var _ anotherList = related3[float32]() // valid
-	var _ anotherList = related3 /* ERROR cannot use .* \(value of type List\[float32\]\) as anotherList */ [float32, List[float32]]()
+	// The 2nd type argument cannot be inferred from the first
+	// one because there's two possible choices: []Elem and
+	// List[Elem].
+	related3[int]( /* ERROR cannot infer Slice */ )
 }
diff --git a/src/cmd/compile/internal/types2/testdata/examples/methods.go2 b/src/cmd/compile/internal/types2/testdata/examples/methods.go2
index 1d76d55..a46f789 100644
--- a/src/cmd/compile/internal/types2/testdata/examples/methods.go2
+++ b/src/cmd/compile/internal/types2/testdata/examples/methods.go2
@@ -35,7 +35,7 @@
 // style. In m3 below, int is the name of the local receiver type parameter
 // and it shadows the predeclared identifier int which then cannot be used
 // anymore as expected.
-// This is no different from locally redelaring a predeclared identifier
+// This is no different from locally re-declaring a predeclared identifier
 // and usually should be avoided. There are some notable exceptions; e.g.,
 // sometimes it makes sense to use the identifier "copy" which happens to
 // also be the name of a predeclared built-in function.
diff --git a/src/cmd/compile/internal/types2/testdata/examples/typesets.go2 b/src/cmd/compile/internal/types2/testdata/examples/typesets.go2
index e19dcf8..55ef022 100644
--- a/src/cmd/compile/internal/types2/testdata/examples/typesets.go2
+++ b/src/cmd/compile/internal/types2/testdata/examples/typesets.go2
@@ -35,7 +35,7 @@
 	return deref(p)
 }
 
-func addrOfCopy[V any, P ~*V](v V) P {
+func addrOfCopy[V any, P *V](v V) P {
 	return &v
 }
 
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue41124.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue41124.go2
index 7f55ba8..4550dd7 100644
--- a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue41124.go2
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue41124.go2
@@ -47,7 +47,7 @@
 }
 
 type _ struct{
-	I3 // ERROR interface is .* comparable
+	I3 // ERROR interface contains type constraints
 }
 
 // General composite types.
@@ -59,19 +59,19 @@
 	_ []I1 // ERROR interface is .* comparable
 	_ []I2 // ERROR interface contains type constraints
 
-	_ *I3 // ERROR interface is .* comparable
+	_ *I3 // ERROR interface contains type constraints
 	_ map[I1 /* ERROR interface is .* comparable */ ]I2 // ERROR interface contains type constraints
-	_ chan I3 // ERROR interface is .* comparable
+	_ chan I3 // ERROR interface contains type constraints
 	_ func(I1 /* ERROR interface is .* comparable */ )
 	_ func() I2 // ERROR interface contains type constraints
 )
 
 // Other cases.
 
-var _ = [...]I3 /* ERROR interface is .* comparable */ {}
+var _ = [...]I3 /* ERROR interface contains type constraints */ {}
 
 func _(x interface{}) {
-	_ = x.(I3 /* ERROR interface is .* comparable */ )
+	_ = x.(I3 /* ERROR interface contains type constraints */ )
 }
 
 type T1[_ any] struct{}
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue45548.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue45548.go2
index b8ba0ad..01c9672 100644
--- a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue45548.go2
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue45548.go2
@@ -4,7 +4,7 @@
 
 package p
 
-func f[F interface{~*Q}, G interface{~*R}, Q, R any](q Q, r R) {}
+func f[F interface{*Q}, G interface{*R}, Q, R any](q Q, r R) {}
 
 func _() {
 	f[*float64, *int](1, 2)
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue47818.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue47818.go2
index 546de1c..6069f1f 100644
--- a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue47818.go2
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue47818.go2
@@ -8,13 +8,13 @@
 
 package go1_17
 
-type T[P /* ERROR type parameters require go1\.18 or later */ any /* ERROR undeclared name: any \(requires version go1\.18 or later\) */ ] struct{}
+type T[P /* ERROR type parameter requires go1\.18 or later */ any /* ERROR undeclared name: any \(requires version go1\.18 or later\) */ ] struct{}
 
 // for init (and main, but we're not in package main) we should only get one error
 func init[P /* ERROR func init must have no type parameters */ any /* ERROR undeclared name: any \(requires version go1\.18 or later\) */ ]()   {}
-func main[P /* ERROR type parameters require go1\.18 or later */ any /* ERROR undeclared name: any \(requires version go1\.18 or later\) */ ]() {}
+func main[P /* ERROR type parameter requires go1\.18 or later */ any /* ERROR undeclared name: any \(requires version go1\.18 or later\) */ ]() {}
 
-func f[P /* ERROR type parameters require go1\.18 or later */ any /* ERROR undeclared name: any \(requires version go1\.18 or later\) */ ](x P) {
+func f[P /* ERROR type parameter requires go1\.18 or later */ any /* ERROR undeclared name: any \(requires version go1\.18 or later\) */ ](x P) {
 	var _ T[ /* ERROR type instantiation requires go1\.18 or later */ int]
 	var _ (T[ /* ERROR type instantiation requires go1\.18 or later */ int])
 	_ = T[ /* ERROR type instantiation requires go1\.18 or later */ int]{}
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue49541.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue49541.go2
index b7bf12a..c8499c1 100644
--- a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue49541.go2
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue49541.go2
@@ -10,9 +10,10 @@
 
 func (S[A, B]) m() {}
 
-// TODO(gri) We should only report one error below. See issue #50588.
+// TODO(gri): with type-type inference enabled we should only report one error
+// below. See issue #50588.
 
-func _[A any](s S /* ERROR cannot infer B */ /* ERROR got 1 arguments but 2 type parameters */ [A]) {
+func _[A any](s S /* ERROR got 1 arguments but 2 type parameters */ [A]) {
 	// we should see no follow-on errors below
 	s.f = 1
 	s.m()
@@ -21,7 +22,7 @@
 // another test case from the issue
 
 func _() {
-	X(Interface[*F /* ERROR cannot infer B */ /* ERROR got 1 arguments but 2 type parameters */ [string]](Impl{}))
+	X(Interface[*F /* ERROR got 1 arguments but 2 type parameters */ [string]](Impl{}))
 }
 
 func X[Q Qer](fs Interface[Q]) {
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue50417.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue50417.go2
index 50487fa..2caef1b 100644
--- a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue50417.go2
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue50417.go2
@@ -2,6 +2,10 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// Field accesses through type parameters are disabled
+// until we have a more thorough understanding of the
+// implications on the spec. See issue #51576.
+
 package p
 
 type Sf struct {
@@ -9,13 +13,13 @@
 }
 
 func f0[P Sf](p P) {
-        _ = p.f
-        p.f = 0
+        _ = p.f // ERROR p\.f undefined
+        p.f /* ERROR p\.f undefined */ = 0
 }
 
 func f0t[P ~struct{f int}](p P) {
-        _ = p.f
-        p.f = 0
+        _ = p.f // ERROR p\.f undefined
+        p.f /* ERROR p\.f undefined */ = 0
 }
 
 var _ = f0[Sf]
@@ -25,8 +29,8 @@
 var _ = f0t[Sm /* ERROR does not implement */ ]
 
 func f1[P interface{ Sf; m() }](p P) {
-        _ = p.f
-        p.f = 0
+        _ = p.f // ERROR p\.f undefined
+        p.f /* ERROR p\.f undefined */ = 0
         p.m()
 }
 
@@ -44,8 +48,8 @@
 func (Sfm) m() {}
 
 func f2[P interface{ Sfm; m() }](p P) {
-        _ = p.f
-        p.f = 0
+        _ = p.f // ERROR p\.f undefined
+        p.f /* ERROR p\.f undefined */ = 0
         p.m()
 }
 
@@ -56,8 +60,8 @@
 type PSfm *Sfm
 
 func f3[P interface{ PSfm }](p P) {
-        _ = p.f
-        p.f = 0
+        _ = p.f // ERROR p\.f undefined
+        p.f /* ERROR p\.f undefined */ = 0
         p.m /* ERROR type P has no field or method m */ ()
 }
 
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue50782.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue50782.go2
index 8f41b84..fd1ab11 100644
--- a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue50782.go2
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue50782.go2
@@ -2,6 +2,10 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// Field accesses through type parameters are disabled
+// until we have a more thorough understanding of the
+// implications on the spec. See issue #51576.
+
 package p
 
 // The first example from the issue.
@@ -18,9 +22,12 @@
 // AbsDifference computes the absolute value of the difference of
 // a and b, where the absolute value is determined by the Abs method.
 func absDifference[T numericAbs[T /* ERROR T does not implement Numeric */]](a, b T) T {
-	// TODO: the error below should probably be positioned on the '-'.
-	d := a /* ERROR "invalid operation: operator - not defined" */ .Value - b.Value
-	return d.Abs()
+	// Field accesses are not permitted for now. Keep an error so
+	// we can find and fix this code once the situation changes.
+	return a.Value // ERROR a\.Value undefined
+	// TODO: The error below should probably be positioned on the '-'.
+	// d := a /* ERROR "invalid operation: operator - not defined" */ .Value - b.Value
+	// return d.Abs()
 }
 
 // The second example from the issue.
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue50929.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue50929.go2
index 941dbaa..3629ecf 100644
--- a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue50929.go2
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue50929.go2
@@ -16,7 +16,7 @@
 
 func _() {
 	// TODO(gri) only report one error below (issue #50932)
-	var x F /* ERROR cannot infer B */ /* ERROR got 1 arguments but 2 type parameters */ [int]
+	var x F /* ERROR got 1 arguments but 2 type parameters */ [int]
 	G(x /* ERROR does not match */)
 }
 
@@ -46,9 +46,9 @@
 	fmt.Println(c)
 }
 
-func MMD[Rc RC /* ERROR cannot infer RG */ /* ERROR got 1 arguments */ [RG], RG any, G any]() M /* ERROR got 2 arguments */ /* ERROR Rc does not match */ [Rc, RG] {
+func MMD[Rc RC /* ERROR got 1 arguments */ [RG], RG any, G any]() M /* ERROR got 2 arguments */ [Rc, RG] {
 
-	var nFn NFn /* ERROR got 2 arguments */ /* ERROR Rc does not match */ [Rc, RG]
+	var nFn NFn /* ERROR got 2 arguments */ [Rc, RG]
 
 	var empty Rc
 	switch any(empty).(type) {
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51229.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51229.go2
new file mode 100644
index 0000000..ef873e6
--- /dev/null
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51229.go2
@@ -0,0 +1,164 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+// Constraint type inference should be independent of the
+// ordering of the type parameter declarations. Try all
+// permutations in the test case below.
+// Permutations produced by https://go.dev/play/p/PHcZNGJTEBZ.
+
+func f00[S1 ~[]E1, S2 ~[]E2, E1 ~byte, E2 ~byte](S1, S2) {}
+func f01[S2 ~[]E2, S1 ~[]E1, E1 ~byte, E2 ~byte](S1, S2) {}
+func f02[E1 ~byte, S1 ~[]E1, S2 ~[]E2, E2 ~byte](S1, S2) {}
+func f03[S1 ~[]E1, E1 ~byte, S2 ~[]E2, E2 ~byte](S1, S2) {}
+func f04[S2 ~[]E2, E1 ~byte, S1 ~[]E1, E2 ~byte](S1, S2) {}
+func f05[E1 ~byte, S2 ~[]E2, S1 ~[]E1, E2 ~byte](S1, S2) {}
+func f06[E2 ~byte, S2 ~[]E2, S1 ~[]E1, E1 ~byte](S1, S2) {}
+func f07[S2 ~[]E2, E2 ~byte, S1 ~[]E1, E1 ~byte](S1, S2) {}
+func f08[S1 ~[]E1, E2 ~byte, S2 ~[]E2, E1 ~byte](S1, S2) {}
+func f09[E2 ~byte, S1 ~[]E1, S2 ~[]E2, E1 ~byte](S1, S2) {}
+func f10[S2 ~[]E2, S1 ~[]E1, E2 ~byte, E1 ~byte](S1, S2) {}
+func f11[S1 ~[]E1, S2 ~[]E2, E2 ~byte, E1 ~byte](S1, S2) {}
+func f12[S1 ~[]E1, E1 ~byte, E2 ~byte, S2 ~[]E2](S1, S2) {}
+func f13[E1 ~byte, S1 ~[]E1, E2 ~byte, S2 ~[]E2](S1, S2) {}
+func f14[E2 ~byte, S1 ~[]E1, E1 ~byte, S2 ~[]E2](S1, S2) {}
+func f15[S1 ~[]E1, E2 ~byte, E1 ~byte, S2 ~[]E2](S1, S2) {}
+func f16[E1 ~byte, E2 ~byte, S1 ~[]E1, S2 ~[]E2](S1, S2) {}
+func f17[E2 ~byte, E1 ~byte, S1 ~[]E1, S2 ~[]E2](S1, S2) {}
+func f18[E2 ~byte, E1 ~byte, S2 ~[]E2, S1 ~[]E1](S1, S2) {}
+func f19[E1 ~byte, E2 ~byte, S2 ~[]E2, S1 ~[]E1](S1, S2) {}
+func f20[S2 ~[]E2, E2 ~byte, E1 ~byte, S1 ~[]E1](S1, S2) {}
+func f21[E2 ~byte, S2 ~[]E2, E1 ~byte, S1 ~[]E1](S1, S2) {}
+func f22[E1 ~byte, S2 ~[]E2, E2 ~byte, S1 ~[]E1](S1, S2) {}
+func f23[S2 ~[]E2, E1 ~byte, E2 ~byte, S1 ~[]E1](S1, S2) {}
+
+type myByte byte
+
+func _(a []byte, b []myByte) {
+	f00(a, b)
+	f01(a, b)
+	f02(a, b)
+	f03(a, b)
+	f04(a, b)
+	f05(a, b)
+	f06(a, b)
+	f07(a, b)
+	f08(a, b)
+	f09(a, b)
+	f10(a, b)
+	f11(a, b)
+	f12(a, b)
+	f13(a, b)
+	f14(a, b)
+	f15(a, b)
+	f16(a, b)
+	f17(a, b)
+	f18(a, b)
+	f19(a, b)
+	f20(a, b)
+	f21(a, b)
+	f22(a, b)
+	f23(a, b)
+}
+
+// Constraint type inference may have to iterate.
+// Again, the order of the type parameters shouldn't matter.
+
+func g0[S ~[]E, M ~map[string]S, E any](m M) {}
+func g1[M ~map[string]S, S ~[]E, E any](m M) {}
+func g2[E any, S ~[]E, M ~map[string]S](m M) {}
+func g3[S ~[]E, E any, M ~map[string]S](m M) {}
+func g4[M ~map[string]S, E any, S ~[]E](m M) {}
+func g5[E any, M ~map[string]S, S ~[]E](m M) {}
+
+func _(m map[string][]byte) {
+	g0(m)
+	g1(m)
+	g2(m)
+	g3(m)
+	g4(m)
+	g5(m)
+}
+
+// Worst-case scenario.
+// There are 10 unknown type parameters. In each iteration of
+// constraint type inference we infer one more, from right to left.
+// Each iteration looks repeatedly at all 11 type parameters,
+// requiring a total of 10*11 = 110 iterations with the current
+// implementation. Pathological case.
+
+func h[K any, J ~*K, I ~*J, H ~*I, G ~*H, F ~*G, E ~*F, D ~*E, C ~*D, B ~*C, A ~*B](x A) {}
+
+func _(x **********int) {
+	h(x)
+}
+
+// Examples with channel constraints and tilde.
+
+func ch1[P chan<- int]() (_ P)           { return } // core(P) == chan<- int   (single type, no tilde)
+func ch2[P ~chan int]()                  { return } // core(P) == ~chan<- int  (tilde)
+func ch3[P chan E, E any](E)             { return } // core(P) == chan<- E     (single type, no tilde)
+func ch4[P chan E | ~chan<- E, E any](E) { return } // core(P) == ~chan<- E    (tilde)
+func ch5[P chan int | chan<- int]()      { return } // core(P) == chan<- int   (not a single type)
+
+func _() {
+	// P can be inferred as there's a single specific type and no tilde.
+	var _ chan int = ch1 /* ERROR cannot use ch1.*value of type chan<- int */ ()
+	var _ chan<- int = ch1()
+
+	// P cannot be inferred as there's a tilde.
+	ch2( /* ERROR cannot infer P */ )
+	type myChan chan int
+	ch2[myChan]()
+
+	// P can be inferred as there's a single specific type and no tilde.
+	var e int
+	ch3(e)
+
+	// P cannot be inferred as there's more than one specific type and a tilde.
+	ch4( /* ERROR cannot infer P */ e)
+	_ = ch4[chan int]
+
+	// P cannot be inferred as there's more than one specific type.
+	ch5( /* ERROR cannot infer P */ )
+	ch5[chan<- int]()
+}
+
+// test case from issue
+
+func equal[M1 ~map[K1]V1, M2 ~map[K2]V2, K1, K2 ~uint32, V1, V2 ~string](m1 M1, m2 M2) bool {
+	if len(m1) != len(m2) {
+		return false
+	}
+	for k, v1 := range m1 {
+		if v2, ok := m2[K2(k)]; !ok || V2(v1) != v2 {
+			return false
+		}
+	}
+	return true
+}
+
+func equalFixed[K1, K2 ~uint32, V1, V2 ~string](m1 map[K1]V1, m2 map[K2]V2) bool {
+	if len(m1) != len(m2) {
+		return false
+	}
+	for k, v1 := range m1 {
+		if v2, ok := m2[K2(k)]; !ok || v1 != V1(v2) {
+			return false
+		}
+	}
+	return true
+}
+
+type (
+	someNumericID uint32
+	someStringID  string
+)
+
+func _() {
+	foo := map[uint32]string{10: "bar"}
+	bar := map[someNumericID]someStringID{10: "bar"}
+	equal(foo, bar)
+}
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51232.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51232.go2
new file mode 100644
index 0000000..3fa6a05
--- /dev/null
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51232.go2
@@ -0,0 +1,30 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type RC[RG any] interface {
+	~[]RG
+}
+
+type Fn[RCT RC[RG], RG any] func(RCT)
+
+type F[RCT RC[RG], RG any] interface {
+	Fn() Fn /* ERROR got 1 arguments */ [RCT]
+}
+
+type concreteF[RCT RC[RG], RG any] struct {
+	makeFn func() Fn /* ERROR got 1 arguments */ [RCT]
+}
+
+func (c *concreteF[RCT, RG]) Fn() Fn /* ERROR got 1 arguments */ [RCT] {
+	return c.makeFn()
+}
+
+func NewConcrete[RCT RC[RG], RG any](Rc RCT) F /* ERROR got 1 arguments */ [RCT] {
+	// TODO(rfindley): eliminate the duplicate error below.
+	return & /* ERROR cannot use .* as F\[RCT\] */ concreteF /* ERROR got 1 arguments */ [RCT]{
+		makeFn: nil,
+	}
+}
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51233.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51233.go2
new file mode 100644
index 0000000..9c15028
--- /dev/null
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51233.go2
@@ -0,0 +1,27 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+// As of issue #51527, type-type inference has been disabled.
+
+type RC[RG any] interface {
+	~[]RG
+}
+
+type Fn[RCT RC[RG], RG any] func(RCT)
+
+type FFn[RCT RC[RG], RG any] func() Fn /* ERROR got 1 arguments */ [RCT]
+
+type F[RCT RC[RG], RG any] interface {
+	Fn() Fn /* ERROR got 1 arguments */ [RCT]
+}
+
+type concreteF[RCT RC[RG], RG any] struct {
+	makeFn FFn /* ERROR got 1 arguments */ [RCT]
+}
+
+func (c *concreteF[RCT, RG]) Fn() Fn /* ERROR got 1 arguments */ [RCT] {
+	return c.makeFn()
+}
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51257.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51257.go2
new file mode 100644
index 0000000..bc4208e
--- /dev/null
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51257.go2
@@ -0,0 +1,46 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+func f[_ comparable]() {}
+
+type S1 struct{ x int }
+type S2 struct{ x any }
+type S3 struct{ x [10]interface{ m() } }
+
+func _[P1 comparable, P2 S2]() {
+	_ = f[S1]
+	_ = f[S2 /* ERROR S2 does not implement comparable */ ]
+	_ = f[S3 /* ERROR S3 does not implement comparable */ ]
+
+	type L1 struct { x P1 }
+	type L2 struct { x P2 }
+	_ = f[L1]
+	_ = f[L2 /* ERROR L2 does not implement comparable */ ]
+}
+
+
+// example from issue
+
+type Set[T comparable] map[T]struct{}
+
+func NewSetFromSlice[T comparable](items []T) *Set[T] {
+	s := Set[T]{}
+
+	for _, item := range items {
+		s[item] = struct{}{}
+	}
+
+	return &s
+}
+
+type T struct{ x any }
+
+func main() {
+	NewSetFromSlice( /* ERROR T does not implement comparable */ []T{
+		{"foo"},
+		{5},
+	})
+}
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51335.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51335.go2
new file mode 100644
index 0000000..0b5a1af
--- /dev/null
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51335.go2
@@ -0,0 +1,16 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type S1 struct{}
+type S2 struct{}
+
+func _[P *S1|*S2]() {
+	_= []P{{ /* ERROR invalid composite literal element type P: no core type */ }}
+}
+
+func _[P *S1|S1]() {
+	_= []P{{ /* ERROR invalid composite literal element type P: no core type */ }}
+}
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51339.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51339.go2
new file mode 100644
index 0000000..84e551d
--- /dev/null
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51339.go2
@@ -0,0 +1,18 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file is tested when running "go test -run Manual"
+// without source arguments. Use for one-off debugging.
+
+package p
+
+type T[P any, B *P] struct{}
+
+func (T /* ERROR cannot use generic type */ ) m0() {}
+
+// TODO(rfindley): eliminate the duplicate errors here.
+func (T /* ERROR got 1 type parameter, but receiver base type declares 2 */ /* ERROR got 1 arguments but 2 type parameters */ [_]) m1() {}
+func (T[_, _]) m2() {}
+// TODO(gri) this error is unfortunate (issue #51343)
+func (T /* ERROR got 3 arguments but 2 type parameters */ [_, _, _]) m3() {}
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51360.go b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51360.go
new file mode 100644
index 0000000..447ce03
--- /dev/null
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51360.go
@@ -0,0 +1,13 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+func _() {
+	len. /* ERROR cannot select on len */ Println
+	len. /* ERROR cannot select on len */ Println()
+	_ = len. /* ERROR cannot select on len */ Println
+	_ = len[ /* ERROR cannot index len */ 0]
+	_ = *len /* ERROR cannot indirect len */
+}
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51376.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51376.go2
new file mode 100644
index 0000000..4eba071
--- /dev/null
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51376.go2
@@ -0,0 +1,24 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type Map map[string]int
+
+func f[M ~map[K]V, K comparable, V any](M) {}
+func g[M map[K]V, K comparable, V any](M) {}
+
+func _[M1 ~map[K]V, M2 map[K]V, K comparable, V any]() {
+        var m1 M1
+        f(m1)
+        g( /* ERROR M1 does not implement map\[K\]V */ m1) // M1 has tilde
+
+        var m2 M2
+        f(m2)
+        g(m2) // M1 does not have tilde
+
+        var m3 Map
+        f(m3)
+        g( /* ERROR Map does not implement map\[string\]int */ m3) // M in g does not have tilde
+}
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51386.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51386.go2
new file mode 100644
index 0000000..ef62239
--- /dev/null
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51386.go2
@@ -0,0 +1,17 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type myString string
+
+func _[P ~string | ~[]byte | ~[]rune]() {
+	_ = P("")
+	const s myString = ""
+	_ = P(s)
+}
+
+func _[P myString]() {
+	_ = P("")
+}
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51437.go b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51437.go
new file mode 100644
index 0000000..3762615
--- /dev/null
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51437.go
@@ -0,0 +1,17 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type T struct{}
+
+func (T) m() []int { return nil }
+
+func f(x T) {
+	for _, x := range func() []int {
+		return x.m() // x declared in parameter list of f
+	}() {
+		_ = x // x declared by range clause
+	}
+}
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51472.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51472.go2
new file mode 100644
index 0000000..f19d906
--- /dev/null
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51472.go2
@@ -0,0 +1,54 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+func _[T comparable](x T) {
+        _ = x == x
+}
+
+func _[T interface{interface{comparable}}](x T) {
+        _ = x == x
+}
+
+func _[T interface{comparable; interface{comparable}}](x T) {
+        _ = x == x
+}
+
+func _[T interface{comparable; ~int}](x T) {
+        _ = x == x
+}
+
+func _[T interface{comparable; ~[]byte}](x T) {
+        _ = x /* ERROR cannot compare */ == x
+}
+
+// TODO(gri) The error message here should be better. See issue #51525.
+func _[T interface{comparable; ~int; ~string}](x T) {
+        _ = x /* ERROR cannot compare */ == x
+}
+
+// TODO(gri) The error message here should be better. See issue #51525.
+func _[T interface{~int; ~string}](x T) {
+        _ = x /* ERROR cannot compare */ == x
+}
+
+func _[T interface{comparable; interface{~int}; interface{int|float64}}](x T) {
+        _ = x == x
+}
+
+func _[T interface{interface{comparable; ~int}; interface{~float64; comparable; m()}}](x T) {
+        _ = x /* ERROR cannot compare */ == x
+}
+
+// test case from issue
+
+func f[T interface{comparable; []byte|string}](x T) {
+        _ = x == x
+}
+
+func _(s []byte) {
+	f( /* ERROR \[\]byte does not implement interface{comparable; \[\]byte\|string} */ s)
+        _ = f[[ /* ERROR does not implement */ ]byte]
+}
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51509.go b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51509.go
new file mode 100644
index 0000000..5ae4717
--- /dev/null
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51509.go
@@ -0,0 +1,7 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type T /* ERROR illegal cycle */ T.x
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51578.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51578.go2
new file mode 100644
index 0000000..5c204ba
--- /dev/null
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51578.go2
@@ -0,0 +1,17 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+var _ = (*interface /* ERROR interface contains type constraints */ {int})(nil)
+
+// abbreviated test case from issue
+
+type TypeSet interface{ int | string }
+
+func _() {
+	f((*TypeSet /* ERROR interface contains type constraints */)(nil))
+}
+
+func f(any) {}
\ No newline at end of file
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51593.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51593.go2
new file mode 100644
index 0000000..d323618
--- /dev/null
+++ b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue51593.go2
@@ -0,0 +1,13 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+func f[P interface{ m(R) }, R any]() {}
+
+type T = interface { m(int) }
+
+func _() {
+	_ = f[ /* ERROR cannot infer R */ T] // don't crash in type inference
+}
diff --git a/src/cmd/compile/internal/types2/type.go b/src/cmd/compile/internal/types2/type.go
index ca8f155..0fe39db 100644
--- a/src/cmd/compile/internal/types2/type.go
+++ b/src/cmd/compile/internal/types2/type.go
@@ -7,9 +7,7 @@
 // A Type represents a type of Go.
 // All types implement the Type interface.
 type Type interface {
-	// Underlying returns the underlying type of a type
-	// w/o following forwarding chains. Only used by
-	// client packages.
+	// Underlying returns the underlying type of a type.
 	Underlying() Type
 
 	// String returns a string representation of a type.
diff --git a/src/cmd/compile/internal/types2/typeparam.go b/src/cmd/compile/internal/types2/typeparam.go
index 971fdae..2e9a2ad 100644
--- a/src/cmd/compile/internal/types2/typeparam.go
+++ b/src/cmd/compile/internal/types2/typeparam.go
@@ -31,11 +31,13 @@
 // or Signature type by calling SetTypeParams. Setting a type parameter on more
 // than one type will result in a panic.
 //
-// The constraint argument can be nil, and set later via SetConstraint.
+// The constraint argument can be nil, and set later via SetConstraint. If the
+// constraint is non-nil, it must be fully defined.
 func NewTypeParam(obj *TypeName, constraint Type) *TypeParam {
 	return (*Checker)(nil).newTypeParam(obj, constraint)
 }
 
+// check may be nil
 func (check *Checker) newTypeParam(obj *TypeName, constraint Type) *TypeParam {
 	// Always increment lastID, even if it is not used.
 	id := nextID()
@@ -50,9 +52,7 @@
 	// iface may mutate typ.bound, so we must ensure that iface() is called
 	// at least once before the resulting TypeParam escapes.
 	if check != nil {
-		check.later(func() {
-			typ.iface()
-		})
+		check.needsCleanup(typ)
 	} else if constraint != nil {
 		typ.iface()
 	}
@@ -72,8 +72,10 @@
 
 // SetConstraint sets the type constraint for t.
 //
-// SetConstraint should not be called concurrently, but once SetConstraint
-// returns the receiver t is safe for concurrent use.
+// It must be called by users of NewTypeParam after the bound's underlying is
+// fully defined, and before using the type parameter in any way other than to
+// form other types. Once SetConstraint returns the receiver, t is safe for
+// concurrent use.
 func (t *TypeParam) SetConstraint(bound Type) {
 	if bound == nil {
 		panic("nil constraint")
@@ -93,9 +95,12 @@
 // ----------------------------------------------------------------------------
 // Implementation
 
+func (t *TypeParam) cleanup() {
+	t.iface()
+	t.check = nil
+}
+
 // iface returns the constraint interface of t.
-// TODO(gri) If we make tparamIsIface the default, this should be renamed to under
-//           (similar to Named.under).
 func (t *TypeParam) iface() *Interface {
 	bound := t.bound
 
@@ -136,16 +141,6 @@
 	return ityp
 }
 
-// singleType returns the single type of the type parameter constraint; or nil.
-func (t *TypeParam) singleType() Type {
-	return t.iface().typeSet().singleType()
-}
-
-// hasTerms reports whether the type parameter constraint has specific type terms.
-func (t *TypeParam) hasTerms() bool {
-	return t.iface().typeSet().hasTerms()
-}
-
 // is calls f with the specific type terms of t's constraint and reports whether
 // all calls to f returned true. If there are no specific terms, is
 // returns the result of f(nil).
diff --git a/src/cmd/compile/internal/types2/typeset.go b/src/cmd/compile/internal/types2/typeset.go
index fff348b..8df8949 100644
--- a/src/cmd/compile/internal/types2/typeset.go
+++ b/src/cmd/compile/internal/types2/typeset.go
@@ -15,20 +15,25 @@
 // API
 
 // A _TypeSet represents the type set of an interface.
+// Because of existing language restrictions, methods can be "factored out"
+// from the terms. The actual type set is the intersection of the type set
+// implied by the methods and the type set described by the terms and the
+// comparable bit. To test whether a type is included in a type set
+// ("implements" relation), the type must implement all methods _and_ be
+// an element of the type set described by the terms and the comparable bit.
+// If the term list describes the set of all types and comparable is true,
+// only comparable types are meant; in all other cases comparable is false.
 type _TypeSet struct {
-	comparable bool // if set, the interface is or embeds comparable
-	// TODO(gri) consider using a set for the methods for faster lookup
-	methods []*Func  // all methods of the interface; sorted by unique ID
-	terms   termlist // type terms of the type set
+	methods    []*Func  // all methods of the interface; sorted by unique ID
+	terms      termlist // type terms of the type set
+	comparable bool     // invariant: !comparable || terms.isAll()
 }
 
 // IsEmpty reports whether type set s is the empty set.
 func (s *_TypeSet) IsEmpty() bool { return s.terms.isEmpty() }
 
 // IsAll reports whether type set s is the set of all types (corresponding to the empty interface).
-func (s *_TypeSet) IsAll() bool {
-	return !s.comparable && len(s.methods) == 0 && s.terms.isAll()
-}
+func (s *_TypeSet) IsAll() bool { return s.IsMethodSet() && len(s.methods) == 0 }
 
 // IsMethodSet reports whether the interface t is fully described by its method set.
 func (s *_TypeSet) IsMethodSet() bool { return !s.comparable && s.terms.isAll() }
@@ -39,17 +44,10 @@
 		return s.comparable
 	}
 	return s.is(func(t *term) bool {
-		return t != nil && comparable(t.typ, seen, nil)
+		return t != nil && comparable(t.typ, false, seen, nil)
 	})
 }
 
-// TODO(gri) IsTypeSet is not a great name for this predicate. Find a better one.
-
-// IsTypeSet reports whether the type set s is represented by a finite set of underlying types.
-func (s *_TypeSet) IsTypeSet() bool {
-	return !s.comparable && len(s.methods) == 0
-}
-
 // NumMethods returns the number of methods available.
 func (s *_TypeSet) NumMethods() int { return len(s.methods) }
 
@@ -103,9 +101,6 @@
 // hasTerms reports whether the type set has specific type terms.
 func (s *_TypeSet) hasTerms() bool { return !s.terms.isEmpty() && !s.terms.isAll() }
 
-// singleType returns the single type in s if there is exactly one; otherwise the result is nil.
-func (s *_TypeSet) singleType() Type { return s.terms.singleType() }
-
 // subsetOf reports whether s1 ⊆ s2.
 func (s1 *_TypeSet) subsetOf(s2 *_TypeSet) bool { return s1.terms.subsetOf(s2.terms) }
 
@@ -218,12 +213,12 @@
 
 	var todo []*Func
 	var seen objset
-	var methods []*Func
+	var allMethods []*Func
 	mpos := make(map[*Func]syntax.Pos) // method specification or method embedding position, for good error messages
 	addMethod := func(pos syntax.Pos, m *Func, explicit bool) {
 		switch other := seen.insert(m); {
 		case other == nil:
-			methods = append(methods, m)
+			allMethods = append(allMethods, m)
 			mpos[m] = pos
 		case explicit:
 			if check == nil {
@@ -262,7 +257,8 @@
 	}
 
 	// collect embedded elements
-	var allTerms = allTermlist
+	allTerms := allTermlist
+	allComparable := false
 	for i, typ := range ityp.embeddeds {
 		// The embedding position is nil for imported interfaces
 		// and also for interface copies after substitution (but
@@ -271,6 +267,7 @@
 		if ityp.embedPos != nil {
 			pos = (*ityp.embedPos)[i]
 		}
+		var comparable bool
 		var terms termlist
 		switch u := under(typ).(type) {
 		case *Interface:
@@ -282,9 +279,7 @@
 				check.versionErrorf(pos, "go1.18", "embedding constraint interface %s", typ)
 				continue
 			}
-			if tset.comparable {
-				ityp.tset.comparable = true
-			}
+			comparable = tset.comparable
 			for _, m := range tset.methods {
 				addMethod(pos, m, false) // use embedding position pos rather than m.pos
 			}
@@ -298,6 +293,8 @@
 			if tset == &invalidTypeSet {
 				continue // ignore invalid unions
 			}
+			assert(!tset.comparable)
+			assert(len(tset.methods) == 0)
 			terms = tset.terms
 		default:
 			if u == Typ[Invalid] {
@@ -309,11 +306,11 @@
 			}
 			terms = termlist{{false, typ}}
 		}
-		// The type set of an interface is the intersection
-		// of the type sets of all its elements.
-		// Intersection cannot produce longer termlists and
-		// thus cannot overflow.
-		allTerms = allTerms.intersect(terms)
+
+		// The type set of an interface is the intersection of the type sets of all its elements.
+		// Due to language restrictions, only embedded interfaces can add methods, they are handled
+		// separately. Here we only need to intersect the term lists and comparable bits.
+		allTerms, allComparable = intersectTermLists(allTerms, allComparable, terms, comparable)
 	}
 	ityp.embedPos = nil // not needed anymore (errors have been reported)
 
@@ -326,15 +323,46 @@
 		}
 	}
 
-	if methods != nil {
-		sortMethods(methods)
-		ityp.tset.methods = methods
+	ityp.tset.comparable = allComparable
+	if len(allMethods) != 0 {
+		sortMethods(allMethods)
+		ityp.tset.methods = allMethods
 	}
 	ityp.tset.terms = allTerms
 
 	return ityp.tset
 }
 
+// TODO(gri) The intersectTermLists function belongs to the termlist implementation.
+//           The comparable type set may also be best represented as a term (using
+//           a special type).
+
+// intersectTermLists computes the intersection of two term lists and respective comparable bits.
+// xcomp, ycomp are valid only if xterms.isAll() and yterms.isAll() respectively.
+func intersectTermLists(xterms termlist, xcomp bool, yterms termlist, ycomp bool) (termlist, bool) {
+	terms := xterms.intersect(yterms)
+	// If one of xterms or yterms is marked as comparable,
+	// the result must only include comparable types.
+	comp := xcomp || ycomp
+	if comp && !terms.isAll() {
+		// only keep comparable terms
+		i := 0
+		for _, t := range terms {
+			assert(t.typ != nil)
+			if Comparable(t.typ) {
+				terms[i] = t
+				i++
+			}
+		}
+		terms = terms[:i]
+		if !terms.isAll() {
+			comp = false
+		}
+	}
+	assert(!comp || terms.isAll()) // comparable invariant
+	return terms, comp
+}
+
 func sortMethods(list []*Func) {
 	sort.Sort(byUniqueMethodName(list))
 }
diff --git a/src/cmd/compile/internal/types2/typeset_test.go b/src/cmd/compile/internal/types2/typeset_test.go
index 7f7cc06..68e5d8a 100644
--- a/src/cmd/compile/internal/types2/typeset_test.go
+++ b/src/cmd/compile/internal/types2/typeset_test.go
@@ -25,9 +25,9 @@
 		"{int; string}": "∅",
 
 		"{comparable}":              "{comparable}",
-		"{comparable; int}":         "{comparable; int}",
-		"{~int; comparable}":        "{comparable; ~int}",
-		"{int|string; comparable}":  "{comparable; int ∪ string}",
+		"{comparable; int}":         "{int}",
+		"{~int; comparable}":        "{~int}",
+		"{int|string; comparable}":  "{int ∪ string}",
 		"{comparable; int; string}": "∅",
 
 		"{m()}":                         "{func (p.T).m()}",
@@ -37,8 +37,8 @@
 		"{m1(); comparable; m2() int }": "{comparable; func (p.T).m1(); func (p.T).m2() int}",
 		"{comparable; error}":           "{comparable; func (error).Error() string}",
 
-		"{m(); comparable; int|float32|string}": "{comparable; func (p.T).m(); int ∪ float32 ∪ string}",
-		"{m1(); int; m2(); comparable }":        "{comparable; func (p.T).m1(); func (p.T).m2(); int}",
+		"{m(); comparable; int|float32|string}": "{func (p.T).m(); int ∪ float32 ∪ string}",
+		"{m1(); int; m2(); comparable }":        "{func (p.T).m1(); func (p.T).m2(); int}",
 
 		"{E}; type E interface{}":           "𝓤",
 		"{E}; type E interface{int;string}": "∅",
diff --git a/src/cmd/compile/internal/types2/typexpr.go b/src/cmd/compile/internal/types2/typexpr.go
index 149bd5b..7e30562 100644
--- a/src/cmd/compile/internal/types2/typexpr.go
+++ b/src/cmd/compile/internal/types2/typexpr.go
@@ -147,10 +147,16 @@
 // constraint interface.
 func (check *Checker) varType(e syntax.Expr) Type {
 	typ := check.definedType(e, nil)
+	check.validVarType(e, typ)
+	return typ
+}
 
+// validVarType reports an error if typ is a constraint interface.
+// The expression e is used for error reporting, if any.
+func (check *Checker) validVarType(e syntax.Expr, typ Type) {
 	// If we have a type parameter there's nothing to do.
 	if isTypeParam(typ) {
-		return typ
+		return
 	}
 
 	// We don't want to call under() or complete interfaces while we are in
@@ -169,8 +175,6 @@
 			}
 		}
 	})
-
-	return typ
 }
 
 // definedType is like typ but also accepts a type name def.
@@ -256,7 +260,7 @@
 
 	case *syntax.SelectorExpr:
 		var x operand
-		check.selector(&x, e)
+		check.selector(&x, e, def)
 
 		switch x.mode {
 		case typexpr:
@@ -342,7 +346,7 @@
 		return typ
 
 	case *syntax.InterfaceType:
-		typ := new(Interface)
+		typ := check.newInterface()
 		def.setUnderlying(typ)
 		if def != nil {
 			typ.obj = def.obj
@@ -430,10 +434,14 @@
 	// evaluate arguments
 	targs := check.typeList(xlist)
 	if targs == nil {
-		def.setUnderlying(Typ[Invalid]) // avoid later errors due to lazy instantiation
+		def.setUnderlying(Typ[Invalid]) // avoid errors later due to lazy instantiation
 		return Typ[Invalid]
 	}
 
+	// enableTypeTypeInference controls whether to infer missing type arguments
+	// using constraint type inference. See issue #51527.
+	const enableTypeTypeInference = false
+
 	// create the instance
 	ctxt := check.bestContext(nil)
 	h := ctxt.instanceHash(orig, targs)
@@ -453,19 +461,18 @@
 	def.setUnderlying(inst)
 
 	inst.resolver = func(ctxt *Context, n *Named) (*TypeParamList, Type, *methodList) {
-		tparams := orig.TypeParams().list()
+		tparams := n.orig.TypeParams().list()
 
-		inferred := targs
-		if len(targs) < len(tparams) {
+		targs := n.targs.list()
+		if enableTypeTypeInference && len(targs) < len(tparams) {
 			// If inference fails, len(inferred) will be 0, and inst.underlying will
 			// be set to Typ[Invalid] in expandNamed.
-			inferred = check.infer(x.Pos(), tparams, targs, nil, nil)
+			inferred := check.infer(x.Pos(), tparams, targs, nil, nil)
 			if len(inferred) > len(targs) {
-				inst.targs = newTypeList(inferred)
+				n.targs = newTypeList(inferred)
 			}
 		}
 
-		check.recordInstance(x, inferred, inst)
 		return expandNamed(ctxt, n, x.Pos())
 	}
 
@@ -478,6 +485,7 @@
 		// Since check is non-nil, we can still mutate inst. Unpinning the resolver
 		// frees some memory.
 		inst.resolver = nil
+		check.recordInstance(x, inst.TypeArgs().list(), inst)
 
 		if check.validateTArgLen(x.Pos(), inst.tparams.Len(), inst.targs.Len()) {
 			if i, err := check.verify(x.Pos(), inst.tparams.list(), inst.targs.list()); err != nil {
diff --git a/src/cmd/compile/internal/types2/unify.go b/src/cmd/compile/internal/types2/unify.go
index 50edce9..97d327c 100644
--- a/src/cmd/compile/internal/types2/unify.go
+++ b/src/cmd/compile/internal/types2/unify.go
@@ -247,6 +247,17 @@
 	}
 }
 
+// unknowns returns the number of type parameters for which no type has been set yet.
+func (d *tparamsList) unknowns() int {
+	n := 0
+	for _, ti := range d.indices {
+		if ti <= 0 {
+			n++
+		}
+	}
+	return n
+}
+
 // types returns the list of inferred types (via unification) for the type parameters
 // described by d, and an index. If all types were inferred, the returned index is < 0.
 // Otherwise, it is the index of the first type parameter which couldn't be inferred;
@@ -349,12 +360,16 @@
 	if enableCoreTypeUnification && !u.exact {
 		if isTypeParam(x) && !hasName(y) {
 			// When considering the type parameter for unification
-			// we look at the adjusted core type (adjCoreType).
+			// we look at the adjusted core term (adjusted core type
+			// with tilde information).
 			// If the adjusted core type is a named type N; the
 			// corresponding core type is under(N). Since !u.exact
 			// and y doesn't have a name, unification will end up
 			// comparing under(N) to y, so we can just use the core
-			// type instead. Optimization.
+			// type instead. And we can ignore the tilde because we
+			// already look at the underlying types on both sides
+			// and we have known types on both sides.
+			// Optimization.
 			if cx := coreType(x); cx != nil {
 				if traceInference {
 					u.tracef("core %s ≡ %s", x, y)
diff --git a/src/cmd/compile/internal/types2/union.go b/src/cmd/compile/internal/types2/union.go
index 3c0df04..e317b9c 100644
--- a/src/cmd/compile/internal/types2/union.go
+++ b/src/cmd/compile/internal/types2/union.go
@@ -100,25 +100,27 @@
 
 				if !Identical(u, t.typ) {
 					check.errorf(tlist[i], "invalid use of ~ (underlying type of %s is %s)", t.typ, u)
-					continue // don't report another error for t
+					continue
 				}
 			}
 
 			// Stand-alone embedded interfaces are ok and are handled by the single-type case
 			// in the beginning. Embedded interfaces with tilde are excluded above. If we reach
-			// here, we must have at least two terms in the union.
-			if f != nil && !f.typeSet().IsTypeSet() {
+			// here, we must have at least two terms in the syntactic term list (but not necessarily
+			// in the term list of the union's type set).
+			if f != nil {
+				tset := f.typeSet()
 				switch {
-				case f.typeSet().NumMethods() != 0:
+				case tset.NumMethods() != 0:
 					check.errorf(tlist[i], "cannot use %s in union (%s contains methods)", t, t)
+					continue
 				case t.typ == universeComparable.Type():
 					check.error(tlist[i], "cannot use comparable in union")
-				case f.typeSet().comparable:
+					continue
+				case tset.comparable:
 					check.errorf(tlist[i], "cannot use %s in union (%s embeds comparable)", t, t)
-				default:
-					panic("not a type set but no methods and not comparable")
+					continue
 				}
-				continue // don't report another error for t
 			}
 
 			// Report overlapping (non-disjoint) terms such as
diff --git a/src/cmd/compile/internal/types2/universe.go b/src/cmd/compile/internal/types2/universe.go
index 6ee5dbd..11c8186 100644
--- a/src/cmd/compile/internal/types2/universe.go
+++ b/src/cmd/compile/internal/types2/universe.go
@@ -111,7 +111,7 @@
 		typ := NewNamed(obj, nil, nil)
 
 		// interface{} // marked as comparable
-		ityp := &Interface{obj: obj, complete: true, tset: &_TypeSet{true, nil, allTermlist}}
+		ityp := &Interface{obj: obj, complete: true, tset: &_TypeSet{nil, allTermlist, true}}
 
 		typ.SetUnderlying(ityp)
 		def(obj)
diff --git a/src/cmd/compile/internal/types2/validtype.go b/src/cmd/compile/internal/types2/validtype.go
index c508ead..f365ad1 100644
--- a/src/cmd/compile/internal/types2/validtype.go
+++ b/src/cmd/compile/internal/types2/validtype.go
@@ -79,7 +79,7 @@
 			// would have reported a type cycle and couldn't have been
 			// imported in the first place.
 			assert(t.obj.pkg == check.pkg)
-			t.underlying = Typ[Invalid] // t is in the current package (no race possibilty)
+			t.underlying = Typ[Invalid] // t is in the current package (no race possibility)
 			// Find the starting point of the cycle and report it.
 			for i, tn := range path {
 				if tn == t.obj {
diff --git a/src/cmd/compile/internal/walk/closure.go b/src/cmd/compile/internal/walk/closure.go
index 4d1c562..cd922c9 100644
--- a/src/cmd/compile/internal/walk/closure.go
+++ b/src/cmd/compile/internal/walk/closure.go
@@ -235,15 +235,7 @@
 	saveLineNo := base.Pos
 	ir.CurFunc = nil
 
-	// Set line number equal to the line number where the method is declared.
-	if pos := dot.Selection.Pos; pos.IsKnown() {
-		base.Pos = pos
-	}
-	// Note: !dot.Selection.Pos.IsKnown() happens for method expressions where
-	// the method is implicitly declared. The Error method of the
-	// built-in error type is one such method.  We leave the line
-	// number at the use of the method expression in this
-	// case. See issue 29389.
+	base.Pos = base.AutogeneratedPos
 
 	tfn := ir.NewFuncType(base.Pos, nil,
 		typecheck.NewFuncParams(t0.Params(), true),
diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go
index 63e7900..420529b 100644
--- a/src/cmd/go/alldocs.go
+++ b/src/cmd/go/alldocs.go
@@ -1356,7 +1356,7 @@
 //
 // Workspace maintenance
 //
-// Go workspace provides access to operations on workspaces.
+// Work provides access to operations on workspaces.
 //
 // Note that support for workspaces is built into many other commands, not
 // just 'go work'.
@@ -1364,6 +1364,12 @@
 // See 'go help modules' for information about Go's module system of which
 // workspaces are a part.
 //
+// See https://go.dev/ref/mod#workspaces for an in-depth reference on
+// workspaces.
+//
+// See https://go.dev/doc/tutorial/workspaces for an introductory
+// tutorial on workspaces.
+//
 // A workspace is specified by a go.work file that specifies a set of
 // module directories with the "use" directive. These modules are used as
 // root modules by the go command for builds and related operations.  A
@@ -1485,9 +1491,8 @@
 // 		Version string
 // 	}
 //
-// See the workspaces design proposal at
-// https://go.googlesource.com/proposal/+/master/design/45713-workspace.md for
-// more information.
+// See the workspaces reference at https://go.dev/ref/mod#workspaces
+// for more information.
 //
 //
 // Initialize workspace file
@@ -1507,6 +1512,9 @@
 // Each argument path is added to a use directive in the go.work file. The
 // current go version will also be listed in the go.work file.
 //
+// See the workspaces reference at https://go.dev/ref/mod#workspaces
+// for more information.
+//
 //
 // Sync workspace build list to modules
 //
@@ -1530,12 +1538,15 @@
 // build list's version of each module is always the same or higher than
 // that in each workspace module.
 //
+// See the workspaces reference at https://go.dev/ref/mod#workspaces
+// for more information.
+//
 //
 // Add modules to workspace file
 //
 // Usage:
 //
-// 	go work use [-r] [moddirs]
+// 	go work use [-r] moddirs
 //
 // Use provides a command-line interface for adding
 // directories, optionally recursively, to a go.work file.
@@ -1549,6 +1560,9 @@
 // were specified as arguments: namely, use directives will be added for
 // directories that exist, and removed for directories that do not exist.
 //
+// See the workspaces reference at https://go.dev/ref/mod#workspaces
+// for more information.
+//
 //
 // Compile and run Go program
 //
diff --git a/src/cmd/go/internal/modfetch/coderepo.go b/src/cmd/go/internal/modfetch/coderepo.go
index 2206c7c..dfaf16d 100644
--- a/src/cmd/go/internal/modfetch/coderepo.go
+++ b/src/cmd/go/internal/modfetch/coderepo.go
@@ -305,17 +305,46 @@
 	//
 	// (If the version is +incompatible, then the go.mod file must not exist:
 	// +incompatible is not an ongoing opt-out from semantic import versioning.)
-	var canUseIncompatible func() bool
-	canUseIncompatible = func() bool {
-		var ok bool
-		if r.codeDir == "" && r.pathMajor == "" {
+	incompatibleOk := map[string]bool{}
+	canUseIncompatible := func(v string) bool {
+		if r.codeDir != "" || r.pathMajor != "" {
+			// A non-empty codeDir indicates a module within a subdirectory,
+			// which necessarily has a go.mod file indicating the module boundary.
+			// A non-empty pathMajor indicates a module path with a major-version
+			// suffix, which must match.
+			return false
+		}
+
+		ok, seen := incompatibleOk[""]
+		if !seen {
 			_, errGoMod := r.code.ReadFile(info.Name, "go.mod", codehost.MaxGoMod)
-			if errGoMod != nil {
-				ok = true
+			ok = (errGoMod != nil)
+			incompatibleOk[""] = ok
+		}
+		if !ok {
+			// A go.mod file exists at the repo root.
+			return false
+		}
+
+		// Per https://go.dev/issue/51324, previous versions of the 'go' command
+		// didn't always check for go.mod files in subdirectories, so if the user
+		// requests a +incompatible version explicitly, we should continue to allow
+		// it. Otherwise, if vN/go.mod exists, expect that release tags for that
+		// major version are intended for the vN module.
+		if v != "" && !strings.HasSuffix(statVers, "+incompatible") {
+			major := semver.Major(v)
+			ok, seen = incompatibleOk[major]
+			if !seen {
+				_, errGoModSub := r.code.ReadFile(info.Name, path.Join(major, "go.mod"), codehost.MaxGoMod)
+				ok = (errGoModSub != nil)
+				incompatibleOk[major] = ok
+			}
+			if !ok {
+				return false
 			}
 		}
-		canUseIncompatible = func() bool { return ok }
-		return ok
+
+		return true
 	}
 
 	// checkCanonical verifies that the canonical version v is compatible with the
@@ -367,7 +396,7 @@
 		base := strings.TrimSuffix(v, "+incompatible")
 		var errIncompatible error
 		if !module.MatchPathMajor(base, r.pathMajor) {
-			if canUseIncompatible() {
+			if canUseIncompatible(base) {
 				v = base + "+incompatible"
 			} else {
 				if r.pathMajor != "" {
@@ -495,7 +524,7 @@
 		// Save the highest non-retracted canonical tag for the revision.
 		// If we don't find a better match, we'll use it as the canonical version.
 		if tagIsCanonical && semver.Compare(highestCanonical, v) < 0 && !isRetracted(v) {
-			if module.MatchPathMajor(v, r.pathMajor) || canUseIncompatible() {
+			if module.MatchPathMajor(v, r.pathMajor) || canUseIncompatible(v) {
 				highestCanonical = v
 			}
 		}
@@ -513,12 +542,12 @@
 	// retracted versions.
 	allowedMajor := func(major string) func(v string) bool {
 		return func(v string) bool {
-			return (major == "" || semver.Major(v) == major) && !isRetracted(v)
+			return ((major == "" && canUseIncompatible(v)) || semver.Major(v) == major) && !isRetracted(v)
 		}
 	}
 	if pseudoBase == "" {
 		var tag string
-		if r.pseudoMajor != "" || canUseIncompatible() {
+		if r.pseudoMajor != "" || canUseIncompatible("") {
 			tag, _ = r.code.RecentTag(info.Name, tagPrefix, allowedMajor(r.pseudoMajor))
 		} else {
 			// Allow either v1 or v0, but not incompatible higher versions.
diff --git a/src/cmd/go/internal/modfetch/coderepo_test.go b/src/cmd/go/internal/modfetch/coderepo_test.go
index d98ea87..bb9268a 100644
--- a/src/cmd/go/internal/modfetch/coderepo_test.go
+++ b/src/cmd/go/internal/modfetch/coderepo_test.go
@@ -458,6 +458,54 @@
 		rev:  "v3.0.0-devel",
 		err:  `resolves to version v0.1.1-0.20220203155313-d59622f6e4d7 (v3.0.0-devel is not a tag)`,
 	},
+
+	// If v2/go.mod exists, then we should prefer to match the "v2"
+	// pseudo-versions to the nested module, and resolve the module in the parent
+	// directory to only compatible versions.
+	//
+	// However (https://go.dev/issue/51324), previous versions of the 'go' command
+	// didn't always do so, so if the user explicitly requests a +incompatible
+	// version (as would be present in an existing go.mod file), we should
+	// continue to allow it.
+	{
+		vcs:     "git",
+		path:    "vcs-test.golang.org/git/v2sub.git",
+		rev:     "80beb17a1603",
+		version: "v0.0.0-20220222205507-80beb17a1603",
+		name:    "80beb17a16036f17a5aedd1bb5bd6d407b3c6dc5",
+		short:   "80beb17a1603",
+		time:    time.Date(2022, 2, 22, 20, 55, 7, 0, time.UTC),
+	},
+	{
+		vcs:  "git",
+		path: "vcs-test.golang.org/git/v2sub.git",
+		rev:  "v2.0.0",
+		err:  `module contains a go.mod file, so module path must match major version ("vcs-test.golang.org/git/v2sub.git/v2")`,
+	},
+	{
+		vcs:  "git",
+		path: "vcs-test.golang.org/git/v2sub.git",
+		rev:  "v2.0.1-0.20220222205507-80beb17a1603",
+		err:  `module contains a go.mod file, so module path must match major version ("vcs-test.golang.org/git/v2sub.git/v2")`,
+	},
+	{
+		vcs:     "git",
+		path:    "vcs-test.golang.org/git/v2sub.git",
+		rev:     "v2.0.0+incompatible",
+		version: "v2.0.0+incompatible",
+		name:    "5fcd3eaeeb391d399f562fd45a50dac9fc34ae8b",
+		short:   "5fcd3eaeeb39",
+		time:    time.Date(2022, 2, 22, 20, 53, 33, 0, time.UTC),
+	},
+	{
+		vcs:     "git",
+		path:    "vcs-test.golang.org/git/v2sub.git",
+		rev:     "v2.0.1-0.20220222205507-80beb17a1603+incompatible",
+		version: "v2.0.1-0.20220222205507-80beb17a1603+incompatible",
+		name:    "80beb17a16036f17a5aedd1bb5bd6d407b3c6dc5",
+		short:   "80beb17a1603",
+		time:    time.Date(2022, 2, 22, 20, 55, 7, 0, time.UTC),
+	},
 }
 
 func TestCodeRepo(t *testing.T) {
diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go
index a070666..f960edd 100644
--- a/src/cmd/go/internal/modload/init.go
+++ b/src/cmd/go/internal/modload/init.go
@@ -288,6 +288,11 @@
 // operate in workspace mode. It should not be called by other commands,
 // for example 'go mod tidy', that don't operate in workspace mode.
 func InitWorkfile() {
+	if RootMode == NoRoot {
+		workFilePath = ""
+		return
+	}
+
 	switch gowork := cfg.Getenv("GOWORK"); gowork {
 	case "off":
 		workFilePath = ""
diff --git a/src/cmd/go/internal/modload/modfile.go b/src/cmd/go/internal/modload/modfile.go
index 627cf1d..75c278a 100644
--- a/src/cmd/go/internal/modload/modfile.go
+++ b/src/cmd/go/internal/modload/modfile.go
@@ -802,7 +802,7 @@
 // an absolute path or a relative path starting with a '.' or '..'
 // path component.
 func ToDirectoryPath(path string) string {
-	if modfile.IsDirectoryPath(path) {
+	if path == "." || modfile.IsDirectoryPath(path) {
 		return path
 	}
 	// The path is not a relative path or an absolute path, so make it relative
diff --git a/src/cmd/go/internal/run/run.go b/src/cmd/go/internal/run/run.go
index 00a3e4b..312b49e 100644
--- a/src/cmd/go/internal/run/run.go
+++ b/src/cmd/go/internal/run/run.go
@@ -73,8 +73,6 @@
 }
 
 func runRun(ctx context.Context, cmd *base.Command, args []string) {
-	modload.InitWorkfile()
-
 	if shouldUseOutsideModuleMode(args) {
 		// Set global module flags for 'go run cmd@version'.
 		// This must be done before modload.Init, but we need to call work.BuildInit
@@ -84,7 +82,10 @@
 		modload.RootMode = modload.NoRoot
 		modload.AllowMissingModuleImports()
 		modload.Init()
+	} else {
+		modload.InitWorkfile()
 	}
+
 	work.BuildInit()
 	var b work.Builder
 	b.Init()
diff --git a/src/cmd/go/internal/vcs/vcs.go b/src/cmd/go/internal/vcs/vcs.go
index fd521b2..2acabf7 100644
--- a/src/cmd/go/internal/vcs/vcs.go
+++ b/src/cmd/go/internal/vcs/vcs.go
@@ -312,7 +312,7 @@
 	// uncommitted files and skip tagging revision / committime.
 	var rev string
 	var commitTime time.Time
-	out, err = vcsGit.runOutputVerboseOnly(rootDir, "show -s --no-show-signature --format=%H:%ct")
+	out, err = vcsGit.runOutputVerboseOnly(rootDir, "-c log.showsignature=false show -s --format=%H:%ct")
 	if err != nil && !uncommitted {
 		return Status{}, err
 	} else if err == nil {
diff --git a/src/cmd/go/internal/workcmd/edit.go b/src/cmd/go/internal/workcmd/edit.go
index 05f4f3d..1478c19 100644
--- a/src/cmd/go/internal/workcmd/edit.go
+++ b/src/cmd/go/internal/workcmd/edit.go
@@ -84,9 +84,8 @@
 		Version string
 	}
 
-See the workspaces design proposal at
-https://go.googlesource.com/proposal/+/master/design/45713-workspace.md for
-more information.
+See the workspaces reference at https://go.dev/ref/mod#workspaces
+for more information.
 `,
 }
 
diff --git a/src/cmd/go/internal/workcmd/init.go b/src/cmd/go/internal/workcmd/init.go
index 63bee6e..c2513ba 100644
--- a/src/cmd/go/internal/workcmd/init.go
+++ b/src/cmd/go/internal/workcmd/init.go
@@ -27,6 +27,8 @@
 Each argument path is added to a use directive in the go.work file. The
 current go version will also be listed in the go.work file.
 
+See the workspaces reference at https://go.dev/ref/mod#workspaces
+for more information.
 `,
 	Run: runInit,
 }
diff --git a/src/cmd/go/internal/workcmd/sync.go b/src/cmd/go/internal/workcmd/sync.go
index b0f61c5..7712eb6 100644
--- a/src/cmd/go/internal/workcmd/sync.go
+++ b/src/cmd/go/internal/workcmd/sync.go
@@ -33,6 +33,9 @@
 list's version. Note that Minimal Version Selection guarantees that the
 build list's version of each module is always the same or higher than
 that in each workspace module.
+
+See the workspaces reference at https://go.dev/ref/mod#workspaces
+for more information.
 `,
 	Run: runSync,
 }
diff --git a/src/cmd/go/internal/workcmd/use.go b/src/cmd/go/internal/workcmd/use.go
index 1ee2d4e..e20041f 100644
--- a/src/cmd/go/internal/workcmd/use.go
+++ b/src/cmd/go/internal/workcmd/use.go
@@ -20,7 +20,7 @@
 )
 
 var cmdUse = &base.Command{
-	UsageLine: "go work use [-r] [moddirs]",
+	UsageLine: "go work use [-r] moddirs",
 	Short:     "add modules to workspace file",
 	Long: `Use provides a command-line interface for adding
 directories, optionally recursively, to a go.work file.
@@ -33,6 +33,9 @@
 directories, and the use command operates as if each of the directories
 were specified as arguments: namely, use directives will be added for
 directories that exist, and removed for directories that do not exist.
+
+See the workspaces reference at https://go.dev/ref/mod#workspaces
+for more information.
 `,
 }
 
@@ -101,6 +104,9 @@
 		keepDirs[absDir] = dir
 	}
 
+	if len(args) == 0 {
+		base.Fatalf("go: 'go work use' requires one or more directory arguments")
+	}
 	for _, useDir := range args {
 		if !*useR {
 			lookDir(useDir)
@@ -186,5 +192,5 @@
 
 	// Normalize relative paths to use slashes, so that checked-in go.work
 	// files with relative paths within the repo are platform-independent.
-	return abs, filepath.ToSlash(rel)
+	return abs, modload.ToDirectoryPath(rel)
 }
diff --git a/src/cmd/go/internal/workcmd/work.go b/src/cmd/go/internal/workcmd/work.go
index d3cc250..39c81e8 100644
--- a/src/cmd/go/internal/workcmd/work.go
+++ b/src/cmd/go/internal/workcmd/work.go
@@ -12,7 +12,7 @@
 var CmdWork = &base.Command{
 	UsageLine: "go work",
 	Short:     "workspace maintenance",
-	Long: `Go workspace provides access to operations on workspaces.
+	Long: `Work provides access to operations on workspaces.
 
 Note that support for workspaces is built into many other commands, not
 just 'go work'.
@@ -20,6 +20,12 @@
 See 'go help modules' for information about Go's module system of which
 workspaces are a part.
 
+See https://go.dev/ref/mod#workspaces for an in-depth reference on
+workspaces.
+
+See https://go.dev/doc/tutorial/workspaces for an introductory
+tutorial on workspaces.
+
 A workspace is specified by a go.work file that specifies a set of
 module directories with the "use" directive. These modules are used as
 root modules by the go command for builds and related operations.  A
diff --git a/src/cmd/go/testdata/script/run_work_versioned.txt b/src/cmd/go/testdata/script/run_work_versioned.txt
new file mode 100644
index 0000000..eb0f22d
--- /dev/null
+++ b/src/cmd/go/testdata/script/run_work_versioned.txt
@@ -0,0 +1,16 @@
+[short] skip
+go run example.com/printversion@v0.1.0
+stdout '^main is example.com/printversion v0.1.0$'
+
+-- go.work --
+go 1.18
+
+use (
+	.
+)
+-- go.mod --
+module example
+
+go 1.18
+
+require example.com/printversion v1.0.0
diff --git a/src/cmd/go/testdata/script/test_fuzz_minimize_dirty_cov.txt b/src/cmd/go/testdata/script/test_fuzz_minimize_dirty_cov.txt
new file mode 100644
index 0000000..571bf75
--- /dev/null
+++ b/src/cmd/go/testdata/script/test_fuzz_minimize_dirty_cov.txt
@@ -0,0 +1,84 @@
+# Test that minimization doesn't use dirty coverage snapshots when it
+# is unable to actually minimize the input. We do this by checking that
+# a expected value appears in the cache. If a dirty coverage map is used
+# (i.e. the coverage map generated during the last minimization step,
+# rather than the map provided with the initial input) then this value
+# is unlikely to appear in the cache, since the map generated during
+# the last minimization step should not increase the coverage.
+
+[short] skip
+[!fuzz-instrumented] skip
+
+env GOCACHE=$WORK/gocache
+go test -fuzz=FuzzCovMin -fuzztime=25s -test.fuzzcachedir=$GOCACHE/fuzz
+go run check_file/main.go $GOCACHE/fuzz/FuzzCovMin abcd
+
+-- go.mod --
+module test
+
+-- covmin_test.go --
+package covmin
+
+import "testing"
+
+func FuzzCovMin(f *testing.F) {
+	f.Fuzz(func(t *testing.T, data []byte) {
+		if len(data) >= 4 && data[0] == 'a' && data[1] == 'b' && data[2] == 'c' && data[3] == 'd' {
+			return
+		}
+	})
+}
+
+-- check_file/main.go --
+package main
+
+import (
+	"bytes"
+	"fmt"
+	"os"
+	"path/filepath"
+	"regexp"
+	"strconv"
+)
+
+func checkFile(name, expected string) (bool, error) {
+	data, err := os.ReadFile(name)
+	if err != nil {
+		return false, err
+	}
+	for _, line := range bytes.Split(data, []byte("\n")) {
+		m := valRe.FindSubmatch(line)
+		if m == nil {
+			continue
+		}
+		fmt.Println(strconv.Unquote(string(m[1])))
+		if s, err := strconv.Unquote(string(m[1])); err != nil {
+			return false, err
+		} else if s == expected {
+			return true, nil
+		}
+	}
+	return false, nil
+}
+
+var valRe = regexp.MustCompile(`^\[\]byte\(([^)]+)\)$`)
+
+func main() {
+	dir, expected := os.Args[1], os.Args[2]
+	ents, err := os.ReadDir(dir)
+	if err != nil {
+		fmt.Fprintln(os.Stderr, err)
+		os.Exit(1)
+	}
+	for _, ent := range ents {
+		name := filepath.Join(dir, ent.Name())
+		if good, err := checkFile(name, expected); err != nil {
+			fmt.Fprintln(os.Stderr, err)
+			os.Exit(1)
+		} else if good {
+			os.Exit(0)
+		}
+	}
+	fmt.Fprintln(os.Stderr, "input over minimized")
+	os.Exit(1)
+}
diff --git a/src/cmd/go/testdata/script/test_fuzz_minimize_interesting.txt b/src/cmd/go/testdata/script/test_fuzz_minimize_interesting.txt
index 5d0de17..a09e85b 100644
--- a/src/cmd/go/testdata/script/test_fuzz_minimize_interesting.txt
+++ b/src/cmd/go/testdata/script/test_fuzz_minimize_interesting.txt
@@ -127,19 +127,8 @@
 		if bytes.Equal(buf, seed) {
 			return
 		}
-		if n := sum(buf); n < 0 {
-			t.Error("sum cannot be negative")
-		}
 	})
 }
-
-func sum(buf []byte) int {
-	n := 0
-	for _, b := range buf {
-		n += int(b)
-	}
-	return n
-}
 -- check_testdata/check_testdata.go --
 //go:build ignore
 // +build ignore
diff --git a/src/cmd/go/testdata/script/version_buildvcs_git.txt b/src/cmd/go/testdata/script/version_buildvcs_git.txt
index 86d1de0..4470687 100644
--- a/src/cmd/go/testdata/script/version_buildvcs_git.txt
+++ b/src/cmd/go/testdata/script/version_buildvcs_git.txt
@@ -111,7 +111,7 @@
 go list -x ./...
 stdout -count=3 '^example.com'
 stderr -count=1 '^git status'
-stderr -count=1 '^git show'
+stderr -count=1 '^git -c log.showsignature=false show'
 
 -- $WORK/fakebin/git --
 #!/bin/sh
diff --git a/src/cmd/go/testdata/script/work.txt b/src/cmd/go/testdata/script/work.txt
index a10bf5a..fa1558f 100644
--- a/src/cmd/go/testdata/script/work.txt
+++ b/src/cmd/go/testdata/script/work.txt
@@ -4,7 +4,7 @@
 ! stdout .
 
 go work init ./a ./b
-cmp go.work go.work.want
+cmpenv go.work go.work.want
 go env GOWORK
 stdout '^'$WORK'(\\|/)gopath(\\|/)src(\\|/)go.work$'
 
@@ -69,7 +69,7 @@
   ../src/a
 )
 -- go.work.want --
-go 1.18
+go $goversion
 
 use (
 	./a
diff --git a/src/cmd/go/testdata/script/work_edit.txt b/src/cmd/go/testdata/script/work_edit.txt
index 71959ca..278afb7 100644
--- a/src/cmd/go/testdata/script/work_edit.txt
+++ b/src/cmd/go/testdata/script/work_edit.txt
@@ -1,10 +1,10 @@
 # Test editing go.work files.
 
 go work init m
-cmp go.work go.work.want_initial
+cmpenv go.work go.work.want_initial
 
 go work edit -use n
-cmp go.work go.work.want_use_n
+cmpenv go.work go.work.want_use_n
 
 go work edit -go 1.18
 cmp go.work go.work.want_go_118
@@ -39,11 +39,11 @@
 
 go 1.18
 -- go.work.want_initial --
-go 1.18
+go $goversion
 
 use ./m
 -- go.work.want_use_n --
-go 1.18
+go $goversion
 
 use (
 	./m
diff --git a/src/cmd/go/testdata/script/work_init_path.txt b/src/cmd/go/testdata/script/work_init_path.txt
new file mode 100644
index 0000000..e397788
--- /dev/null
+++ b/src/cmd/go/testdata/script/work_init_path.txt
@@ -0,0 +1,17 @@
+# Regression test for https://go.dev/issue/51448.
+# 'go work init . foo/bar' should produce a go.work file
+# with the same paths as 'go work init; go work use -r .'.
+
+go work init . foo/bar
+mv go.work go.work.init
+
+go work init
+go work use -r .
+cmp go.work go.work.init
+
+-- go.mod --
+module example
+go 1.18
+-- foo/bar/go.mod --
+module example
+go 1.18
diff --git a/src/cmd/go/testdata/script/work_use.txt b/src/cmd/go/testdata/script/work_use.txt
index f5ea89c..12c8cec 100644
--- a/src/cmd/go/testdata/script/work_use.txt
+++ b/src/cmd/go/testdata/script/work_use.txt
@@ -14,16 +14,16 @@
 go 1.18
 
 use (
-	foo
-	foo/bar/baz
+	./foo
+	./foo/bar/baz
 )
 -- go.want_work_other --
 go 1.18
 
 use (
-	foo
-	foo/bar/baz
-	other
+	./foo
+	./foo/bar/baz
+	./other
 )
 -- foo/go.mod --
 module foo
diff --git a/src/cmd/go/testdata/script/work_use_deleted.txt b/src/cmd/go/testdata/script/work_use_deleted.txt
index 660eb56..b379cbc 100644
--- a/src/cmd/go/testdata/script/work_use_deleted.txt
+++ b/src/cmd/go/testdata/script/work_use_deleted.txt
@@ -6,13 +6,13 @@
 
 use (
 	.
-	sub
-	sub/dir/deleted
+	./sub
+	./sub/dir/deleted
 )
 -- go.work.want --
 go 1.18
 
-use sub/dir
+use ./sub/dir
 -- sub/README.txt --
 A go.mod file has been deleted from this directory.
 In addition, the entire subdirectory sub/dir/deleted
diff --git a/src/cmd/go/testdata/script/work_use_dot.txt b/src/cmd/go/testdata/script/work_use_dot.txt
index ccd83d6..8f21042 100644
--- a/src/cmd/go/testdata/script/work_use_dot.txt
+++ b/src/cmd/go/testdata/script/work_use_dot.txt
@@ -31,7 +31,7 @@
 # resulting workspace would contain a duplicate module.
 cp ../../go.work.orig ../../go.work
 ! go work use $PWD .
-stderr '^go: already added "bar/baz" as "'$PWD'"$'
+stderr '^go: already added "\./bar/baz" as "'$PWD'"$'
 cmp ../../go.work ../../go.work.orig
 
 
@@ -43,7 +43,7 @@
 -- go.work.rel --
 go 1.18
 
-use bar/baz
+use ./bar/baz
 -- bar/baz/go.mod --
 module example/bar/baz
 go 1.18
diff --git a/src/cmd/go/testdata/script/work_use_noargs.txt b/src/cmd/go/testdata/script/work_use_noargs.txt
new file mode 100644
index 0000000..ca05434
--- /dev/null
+++ b/src/cmd/go/testdata/script/work_use_noargs.txt
@@ -0,0 +1,11 @@
+# For now, 'go work use' requires arguments.
+# (Eventually, we may may it implicitly behave like 'go work use .'.
+
+! go work use
+stderr '^go: ''go work use'' requires one or more directory arguments'
+
+! go work use -r
+stderr '^go: ''go work use'' requires one or more directory arguments'
+
+-- go.work --
+go 1.18
diff --git a/src/cmd/internal/obj/riscv/testdata/testbranch/branch_test.go b/src/cmd/internal/obj/riscv/testdata/testbranch/branch_test.go
index 68d9589..843398d 100644
--- a/src/cmd/internal/obj/riscv/testdata/testbranch/branch_test.go
+++ b/src/cmd/internal/obj/riscv/testdata/testbranch/branch_test.go
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+//go:build riscv64
 // +build riscv64
 
 package testbranch
diff --git a/src/cmd/internal/obj/riscv/testdata/testbranch/branch_test.s b/src/cmd/internal/obj/riscv/testdata/testbranch/branch_test.s
index cce296f..d7141e3 100644
--- a/src/cmd/internal/obj/riscv/testdata/testbranch/branch_test.s
+++ b/src/cmd/internal/obj/riscv/testdata/testbranch/branch_test.s
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+//go:build riscv64
 // +build riscv64
 
 #include "textflag.h"
diff --git a/src/crypto/x509/internal/macos/corefoundation.go b/src/crypto/x509/internal/macos/corefoundation.go
index cda1d95..75c2129 100644
--- a/src/crypto/x509/internal/macos/corefoundation.go
+++ b/src/crypto/x509/internal/macos/corefoundation.go
@@ -48,7 +48,7 @@
 // TimeToCFDateRef converts a time.Time into an apple CFDateRef
 func TimeToCFDateRef(t time.Time) CFRef {
 	secs := t.Sub(time.Date(2001, 1, 1, 0, 0, 0, 0, time.UTC)).Seconds()
-	ref := CFDateCreate(int(secs))
+	ref := CFDateCreate(secs)
 	return ref
 }
 
@@ -170,8 +170,8 @@
 
 //go:cgo_import_dynamic x509_CFDateCreate CFDateCreate "/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation"
 
-func CFDateCreate(seconds int) CFRef {
-	ret := syscall(abi.FuncPCABI0(x509_CFDateCreate_trampoline), kCFAllocatorDefault, uintptr(seconds), 0, 0, 0, 0)
+func CFDateCreate(seconds float64) CFRef {
+	ret := syscall(abi.FuncPCABI0(x509_CFDateCreate_trampoline), kCFAllocatorDefault, 0, 0, 0, 0, seconds)
 	return CFRef(ret)
 }
 func x509_CFDateCreate_trampoline()
@@ -193,7 +193,7 @@
 func x509_CFStringCreateExternalRepresentation_trampoline()
 
 // syscall is implemented in the runtime package (runtime/sys_darwin.go)
-func syscall(fn, a1, a2, a3, a4, a5, a6 uintptr) uintptr
+func syscall(fn, a1, a2, a3, a4, a5 uintptr, f1 float64) uintptr
 
 // ReleaseCFArray iterates through an array, releasing its contents, and then
 // releases the array itself. This is necessary because we cannot, easily, set the
diff --git a/src/encoding/xml/marshal.go b/src/encoding/xml/marshal.go
index 6859be0..7792ac7 100644
--- a/src/encoding/xml/marshal.go
+++ b/src/encoding/xml/marshal.go
@@ -512,7 +512,7 @@
 		}
 		fv := finfo.value(val, dontInitNilPointers)
 
-		if finfo.flags&fOmitEmpty != 0 && isEmptyValue(fv) {
+		if finfo.flags&fOmitEmpty != 0 && (!fv.IsValid() || isEmptyValue(fv)) {
 			continue
 		}
 
diff --git a/src/encoding/xml/marshal_test.go b/src/encoding/xml/marshal_test.go
index 5fdbae7..3fe7e2d 100644
--- a/src/encoding/xml/marshal_test.go
+++ b/src/encoding/xml/marshal_test.go
@@ -2495,3 +2495,39 @@
 		t.Errorf("error %q does not contain %q", err, want)
 	}
 }
+
+// Issue 50164. Crash on zero value XML attribute.
+type LayerOne struct {
+	XMLName Name `xml:"l1"`
+
+	Value     *float64 `xml:"value,omitempty"`
+	*LayerTwo `xml:",omitempty"`
+}
+
+type LayerTwo struct {
+	ValueTwo *int `xml:"value_two,attr,omitempty"`
+}
+
+func TestMarshalZeroValue(t *testing.T) {
+	proofXml := `<l1><value>1.2345</value></l1>`
+	var l1 LayerOne
+	err := Unmarshal([]byte(proofXml), &l1)
+	if err != nil {
+		t.Fatalf("unmarshal XML error: %v", err)
+	}
+	want := float64(1.2345)
+	got := *l1.Value
+	if got != want {
+		t.Fatalf("unexpected unmarshal result, want %f but got %f", want, got)
+	}
+
+	// Marshal again (or Encode again)
+	// In issue 50164, here `Marshal(l1)` will panic because of the zero value of xml attribute ValueTwo `value_two`.
+	anotherXML, err := Marshal(l1)
+	if err != nil {
+		t.Fatalf("marshal XML error: %v", err)
+	}
+	if string(anotherXML) != proofXml {
+		t.Fatalf("unexpected unmarshal result, want %q but got %q", proofXml, anotherXML)
+	}
+}
diff --git a/src/go/internal/gcimporter/iimport.go b/src/go/internal/gcimporter/iimport.go
index 8ec4c54..bff1c09 100644
--- a/src/go/internal/gcimporter/iimport.go
+++ b/src/go/internal/gcimporter/iimport.go
@@ -181,6 +181,15 @@
 		p.doDecl(localpkg, name)
 	}
 
+	// SetConstraint can't be called if the constraint type is not yet complete.
+	// When type params are created in the 'P' case of (*importReader).obj(),
+	// the associated constraint type may not be complete due to recursion.
+	// Therefore, we defer calling SetConstraint there, and call it here instead
+	// after all types are complete.
+	for _, d := range p.later {
+		d.t.SetConstraint(d.constraint)
+	}
+
 	for _, typ := range p.interfaceList {
 		typ.Complete()
 	}
@@ -195,6 +204,11 @@
 	return localpkg, nil
 }
 
+type setConstraintArgs struct {
+	t          *types.TypeParam
+	constraint types.Type
+}
+
 type iimporter struct {
 	exportVersion int64
 	ipath         string
@@ -211,6 +225,9 @@
 
 	fake          fakeFileSet
 	interfaceList []*types.Interface
+
+	// Arguments for calls to SetConstraint that are deferred due to recursive types
+	later []setConstraintArgs
 }
 
 func (p *iimporter) doDecl(pkg *types.Package, name string) {
@@ -391,7 +408,11 @@
 			}
 			iface.MarkImplicit()
 		}
-		t.SetConstraint(constraint)
+		// The constraint type may not be complete, if we
+		// are in the middle of a type recursion involving type
+		// constraints. So, we defer SetConstraint until we have
+		// completely set up all types in ImportData.
+		r.p.later = append(r.p.later, setConstraintArgs{t: t, constraint: constraint})
 
 	case 'V':
 		typ := r.typ()
diff --git a/src/go/printer/nodes.go b/src/go/printer/nodes.go
index f2170db..9a09d58 100644
--- a/src/go/printer/nodes.go
+++ b/src/go/printer/nodes.go
@@ -319,9 +319,17 @@
 	}
 }
 
-func (p *printer) parameters(fields *ast.FieldList, isTypeParam bool) {
+type paramMode int
+
+const (
+	funcParam paramMode = iota
+	funcTParam
+	typeTParam
+)
+
+func (p *printer) parameters(fields *ast.FieldList, mode paramMode) {
 	openTok, closeTok := token.LPAREN, token.RPAREN
-	if isTypeParam {
+	if mode != funcParam {
 		openTok, closeTok = token.LBRACK, token.RBRACK
 	}
 	p.print(fields.Opening, openTok)
@@ -373,7 +381,7 @@
 		if closing := p.lineFor(fields.Closing); 0 < prevLine && prevLine < closing {
 			p.print(token.COMMA)
 			p.linebreak(closing, 0, ignore, true)
-		} else if isTypeParam && fields.NumFields() == 1 {
+		} else if mode == typeTParam && fields.NumFields() == 1 {
 			// Otherwise, if we are in a type parameter list that could be confused
 			// with the constant array length expression [P*C], print a comma so that
 			// parsing is unambiguous.
@@ -411,10 +419,10 @@
 
 func (p *printer) signature(sig *ast.FuncType) {
 	if sig.TypeParams != nil {
-		p.parameters(sig.TypeParams, true)
+		p.parameters(sig.TypeParams, funcTParam)
 	}
 	if sig.Params != nil {
-		p.parameters(sig.Params, false)
+		p.parameters(sig.Params, funcParam)
 	} else {
 		p.print(token.LPAREN, token.RPAREN)
 	}
@@ -428,7 +436,7 @@
 			p.expr(stripParensAlways(res.List[0].Type))
 			return
 		}
-		p.parameters(res, false)
+		p.parameters(res, funcParam)
 	}
 }
 
@@ -1639,7 +1647,7 @@
 		p.setComment(s.Doc)
 		p.expr(s.Name)
 		if s.TypeParams != nil {
-			p.parameters(s.TypeParams, true)
+			p.parameters(s.TypeParams, typeTParam)
 		}
 		if n == 1 {
 			p.print(blank)
@@ -1829,7 +1837,7 @@
 	// FUNC is emitted).
 	startCol := p.out.Column - len("func ")
 	if d.Recv != nil {
-		p.parameters(d.Recv, false) // method: print receiver
+		p.parameters(d.Recv, funcParam) // method: print receiver
 		p.print(blank)
 	}
 	p.expr(d.Name)
diff --git a/src/go/printer/testdata/generics.golden b/src/go/printer/testdata/generics.golden
index 4fac2c9..c3a7df8 100644
--- a/src/go/printer/testdata/generics.golden
+++ b/src/go/printer/testdata/generics.golden
@@ -64,3 +64,29 @@
 type _[
 	P *T,
 ] struct{}
+
+// equivalent test cases for potentially ambiguous type parameter lists, except
+// for function declarations there is no ambiguity (issue #51548)
+func _[P *T]()		{}
+func _[P *T, _ any]()	{}
+func _[P *T]()		{}
+func _[P *T, _ any]()	{}
+func _[P T]()		{}
+func _[P T, _ any]()	{}
+
+func _[P *struct{}]()	{}
+func _[P *struct{}]()	{}
+func _[P []int]()	{}
+
+func _[P T]()	{}
+func _[P T]()	{}
+func _[P **T]()	{}
+func _[P *T]()	{}
+func _[P *T]()	{}
+func _[P **T]()	{}
+func _[P *T]()	{}
+
+func _[
+	P *T,
+]() {
+}
diff --git a/src/go/printer/testdata/generics.input b/src/go/printer/testdata/generics.input
index fde9d32..66e1554 100644
--- a/src/go/printer/testdata/generics.input
+++ b/src/go/printer/testdata/generics.input
@@ -61,3 +61,28 @@
 type _[
 	P *T,
 ] struct{}
+
+// equivalent test cases for potentially ambiguous type parameter lists, except
+// for function declarations there is no ambiguity (issue #51548)
+func _[P *T,]() {}
+func _[P *T, _ any]() {}
+func _[P (*T),]() {}
+func _[P (*T), _ any]() {}
+func _[P (T),]() {}
+func _[P (T), _ any]() {}
+
+func _[P *struct{}] () {}
+func _[P (*struct{})] () {}
+func _[P ([]int)] () {}
+
+func _ [P(T)]() {}
+func _ [P((T))]() {}
+func _ [P * *T]() {}
+func _ [P * T]() {}
+func _ [P(*T)]() {}
+func _ [P(**T)]() {}
+func _ [P * T]() {}
+
+func _[
+	P *T,
+]() {}
diff --git a/src/go/types/api.go b/src/go/types/api.go
index 8284614..f2dcd10 100644
--- a/src/go/types/api.go
+++ b/src/go/types/api.go
@@ -199,12 +199,12 @@
 	// qualified identifiers are collected in the Uses map.
 	Types map[ast.Expr]TypeAndValue
 
-	// Instances maps identifiers denoting parameterized types or functions to
-	// their type arguments and instantiated type.
+	// Instances maps identifiers denoting generic types or functions to their
+	// type arguments and instantiated type.
 	//
 	// For example, Instances will map the identifier for 'T' in the type
 	// instantiation T[int, string] to the type arguments [int, string] and
-	// resulting instantiated *Named type. Given a parameterized function
+	// resulting instantiated *Named type. Given a generic function
 	// func F[A any](A), Instances will map the identifier for 'F' in the call
 	// expression F(int(1)) to the inferred type arguments [int], and resulting
 	// instantiated *Signature.
@@ -417,8 +417,11 @@
 }
 
 // AssertableTo reports whether a value of type V can be asserted to have type T.
-// The behavior of AssertableTo is undefined if V is a generalized interface; i.e.,
-// an interface that may only be used as a type constraint in Go code.
+//
+// The behavior of AssertableTo is undefined in two cases:
+//  - if V is a generalized interface; i.e., an interface that may only be used
+//    as a type constraint in Go code
+//  - if T is an uninstantiated generic type
 func AssertableTo(V *Interface, T Type) bool {
 	// Checker.newAssertableTo suppresses errors for invalid types, so we need special
 	// handling here.
@@ -428,20 +431,31 @@
 	return (*Checker)(nil).newAssertableTo(V, T) == nil
 }
 
-// AssignableTo reports whether a value of type V is assignable to a variable of type T.
+// AssignableTo reports whether a value of type V is assignable to a variable
+// of type T.
+//
+// The behavior of AssignableTo is undefined if V or T is an uninstantiated
+// generic type.
 func AssignableTo(V, T Type) bool {
 	x := operand{mode: value, typ: V}
 	ok, _ := x.assignableTo(nil, T, nil) // check not needed for non-constant x
 	return ok
 }
 
-// ConvertibleTo reports whether a value of type V is convertible to a value of type T.
+// ConvertibleTo reports whether a value of type V is convertible to a value of
+// type T.
+//
+// The behavior of ConvertibleTo is undefined if V or T is an uninstantiated
+// generic type.
 func ConvertibleTo(V, T Type) bool {
 	x := operand{mode: value, typ: V}
 	return x.convertibleTo(nil, T, nil) // check not needed for non-constant x
 }
 
 // Implements reports whether type V implements interface T.
+//
+// The behavior of Implements is undefined if V is an uninstantiated generic
+// type.
 func Implements(V Type, T *Interface) bool {
 	if T.Empty() {
 		// All types (even Typ[Invalid]) implement the empty interface.
diff --git a/src/go/types/api_test.go b/src/go/types/api_test.go
index 85452df..4014201 100644
--- a/src/go/types/api_test.go
+++ b/src/go/types/api_test.go
@@ -16,6 +16,7 @@
 	"internal/testenv"
 	"reflect"
 	"regexp"
+	"sort"
 	"strings"
 	"testing"
 
@@ -434,129 +435,146 @@
 }
 
 func TestInstanceInfo(t *testing.T) {
-	var tests = []struct {
-		src   string
-		name  string
-		targs []string
-		typ   string
-	}{
-		{`package p0; func f[T any](T) {}; func _() { f(42) }`,
-			`f`,
-			[]string{`int`},
-			`func(int)`,
-		},
-		{`package p1; func f[T any](T) T { panic(0) }; func _() { f('@') }`,
-			`f`,
-			[]string{`rune`},
-			`func(rune) rune`,
-		},
-		{`package p2; func f[T any](...T) T { panic(0) }; func _() { f(0i) }`,
-			`f`,
-			[]string{`complex128`},
-			`func(...complex128) complex128`,
-		},
-		{`package p3; func f[A, B, C any](A, *B, []C) {}; func _() { f(1.2, new(string), []byte{}) }`,
-			`f`,
-			[]string{`float64`, `string`, `byte`},
-			`func(float64, *string, []byte)`,
-		},
-		{`package p4; func f[A, B any](A, *B, ...[]B) {}; func _() { f(1.2, new(byte)) }`,
-			`f`,
-			[]string{`float64`, `byte`},
-			`func(float64, *byte, ...[]byte)`,
-		},
-
-		{`package s1; func f[T any, P interface{~*T}](x T) {}; func _(x string) { f(x) }`,
-			`f`,
-			[]string{`string`, `*string`},
-			`func(x string)`,
-		},
-		{`package s2; func f[T any, P interface{~*T}](x []T) {}; func _(x []int) { f(x) }`,
-			`f`,
-			[]string{`int`, `*int`},
-			`func(x []int)`,
-		},
-		{`package s3; type C[T any] interface{~chan<- T}; func f[T any, P C[T]](x []T) {}; func _(x []int) { f(x) }`,
-			`f`,
-			[]string{`int`, `chan<- int`},
-			`func(x []int)`,
-		},
-		{`package s4; type C[T any] interface{~chan<- T}; func f[T any, P C[T], Q C[[]*P]](x []T) {}; func _(x []int) { f(x) }`,
-			`f`,
-			[]string{`int`, `chan<- int`, `chan<- []*chan<- int`},
-			`func(x []int)`,
-		},
-
-		{`package t1; func f[T any, P interface{~*T}]() T { panic(0) }; func _() { _ = f[string] }`,
-			`f`,
-			[]string{`string`, `*string`},
-			`func() string`,
-		},
-		{`package t2; func f[T any, P interface{~*T}]() T { panic(0) }; func _() { _ = (f[string]) }`,
-			`f`,
-			[]string{`string`, `*string`},
-			`func() string`,
-		},
-		{`package t3; type C[T any] interface{~chan<- T}; func f[T any, P C[T]]() []T { return nil }; func _() { _ = f[int] }`,
-			`f`,
-			[]string{`int`, `chan<- int`},
-			`func() []int`,
-		},
-		{`package t4; type C[T any] interface{~chan<- T}; func f[T any, P C[T], Q C[[]*P]]() []T { return nil }; func _() { _ = f[int] }`,
-			`f`,
-			[]string{`int`, `chan<- int`, `chan<- []*chan<- int`},
-			`func() []int`,
-		},
-		{`package i0; import "lib"; func _() { lib.F(42) }`,
-			`F`,
-			[]string{`int`},
-			`func(int)`,
-		},
-		{`package type0; type T[P interface{~int}] struct{ x P }; var _ T[int]`,
-			`T`,
-			[]string{`int`},
-			`struct{x int}`,
-		},
-		{`package type1; type T[P interface{~int}] struct{ x P }; var _ (T[int])`,
-			`T`,
-			[]string{`int`},
-			`struct{x int}`,
-		},
-		{`package type2; type T[P interface{~int}] struct{ x P }; var _ T[(int)]`,
-			`T`,
-			[]string{`int`},
-			`struct{x int}`,
-		},
-		{`package type3; type T[P1 interface{~[]P2}, P2 any] struct{ x P1; y P2 }; var _ T[[]int, int]`,
-			`T`,
-			[]string{`[]int`, `int`},
-			`struct{x []int; y int}`,
-		},
-		{`package type4; import "lib"; var _ lib.T[int]`,
-			`T`,
-			[]string{`int`},
-			`[]int`,
-		},
-	}
-
-	for _, test := range tests {
-		const lib = `package lib
+	const lib = `package lib
 
 func F[P any](P) {}
 
 type T[P any] []P
 `
 
+	type testInst struct {
+		name  string
+		targs []string
+		typ   string
+	}
+
+	var tests = []struct {
+		src       string
+		instances []testInst // recorded instances in source order
+	}{
+		{`package p0; func f[T any](T) {}; func _() { f(42) }`,
+			[]testInst{{`f`, []string{`int`}, `func(int)`}},
+		},
+		{`package p1; func f[T any](T) T { panic(0) }; func _() { f('@') }`,
+			[]testInst{{`f`, []string{`rune`}, `func(rune) rune`}},
+		},
+		{`package p2; func f[T any](...T) T { panic(0) }; func _() { f(0i) }`,
+			[]testInst{{`f`, []string{`complex128`}, `func(...complex128) complex128`}},
+		},
+		{`package p3; func f[A, B, C any](A, *B, []C) {}; func _() { f(1.2, new(string), []byte{}) }`,
+			[]testInst{{`f`, []string{`float64`, `string`, `byte`}, `func(float64, *string, []byte)`}},
+		},
+		{`package p4; func f[A, B any](A, *B, ...[]B) {}; func _() { f(1.2, new(byte)) }`,
+			[]testInst{{`f`, []string{`float64`, `byte`}, `func(float64, *byte, ...[]byte)`}},
+		},
+
+		{`package s1; func f[T any, P interface{*T}](x T) {}; func _(x string) { f(x) }`,
+			[]testInst{{`f`, []string{`string`, `*string`}, `func(x string)`}},
+		},
+		{`package s2; func f[T any, P interface{*T}](x []T) {}; func _(x []int) { f(x) }`,
+			[]testInst{{`f`, []string{`int`, `*int`}, `func(x []int)`}},
+		},
+		{`package s3; type C[T any] interface{chan<- T}; func f[T any, P C[T]](x []T) {}; func _(x []int) { f(x) }`,
+			[]testInst{
+				{`C`, []string{`T`}, `interface{chan<- T}`},
+				{`f`, []string{`int`, `chan<- int`}, `func(x []int)`},
+			},
+		},
+		{`package s4; type C[T any] interface{chan<- T}; func f[T any, P C[T], Q C[[]*P]](x []T) {}; func _(x []int) { f(x) }`,
+			[]testInst{
+				{`C`, []string{`T`}, `interface{chan<- T}`},
+				{`C`, []string{`[]*P`}, `interface{chan<- []*P}`},
+				{`f`, []string{`int`, `chan<- int`, `chan<- []*chan<- int`}, `func(x []int)`},
+			},
+		},
+
+		{`package t1; func f[T any, P interface{*T}]() T { panic(0) }; func _() { _ = f[string] }`,
+			[]testInst{{`f`, []string{`string`, `*string`}, `func() string`}},
+		},
+		{`package t2; func f[T any, P interface{*T}]() T { panic(0) }; func _() { _ = (f[string]) }`,
+			[]testInst{{`f`, []string{`string`, `*string`}, `func() string`}},
+		},
+		{`package t3; type C[T any] interface{chan<- T}; func f[T any, P C[T], Q C[[]*P]]() []T { return nil }; func _() { _ = f[int] }`,
+			[]testInst{
+				{`C`, []string{`T`}, `interface{chan<- T}`},
+				{`C`, []string{`[]*P`}, `interface{chan<- []*P}`},
+				{`f`, []string{`int`, `chan<- int`, `chan<- []*chan<- int`}, `func() []int`},
+			},
+		},
+		{`package t4; type C[T any] interface{chan<- T}; func f[T any, P C[T], Q C[[]*P]]() []T { return nil }; func _() { _ = (f[int]) }`,
+			[]testInst{
+				{`C`, []string{`T`}, `interface{chan<- T}`},
+				{`C`, []string{`[]*P`}, `interface{chan<- []*P}`},
+				{`f`, []string{`int`, `chan<- int`, `chan<- []*chan<- int`}, `func() []int`},
+			},
+		},
+		{`package i0; import "lib"; func _() { lib.F(42) }`,
+			[]testInst{{`F`, []string{`int`}, `func(int)`}},
+		},
+
+		{`package duplfunc0; func f[T any](T) {}; func _() { f(42); f("foo"); f[int](3) }`,
+			[]testInst{
+				{`f`, []string{`int`}, `func(int)`},
+				{`f`, []string{`string`}, `func(string)`},
+				{`f`, []string{`int`}, `func(int)`},
+			},
+		},
+		{`package duplfunc1; import "lib"; func _() { lib.F(42); lib.F("foo"); lib.F(3) }`,
+			[]testInst{
+				{`F`, []string{`int`}, `func(int)`},
+				{`F`, []string{`string`}, `func(string)`},
+				{`F`, []string{`int`}, `func(int)`},
+			},
+		},
+
+		{`package type0; type T[P interface{~int}] struct{ x P }; var _ T[int]`,
+			[]testInst{{`T`, []string{`int`}, `struct{x int}`}},
+		},
+		{`package type1; type T[P interface{~int}] struct{ x P }; var _ (T[int])`,
+			[]testInst{{`T`, []string{`int`}, `struct{x int}`}},
+		},
+		{`package type2; type T[P interface{~int}] struct{ x P }; var _ T[(int)]`,
+			[]testInst{{`T`, []string{`int`}, `struct{x int}`}},
+		},
+		{`package type3; type T[P1 interface{~[]P2}, P2 any] struct{ x P1; y P2 }; var _ T[[]int, int]`,
+			[]testInst{{`T`, []string{`[]int`, `int`}, `struct{x []int; y int}`}},
+		},
+		{`package type4; import "lib"; var _ lib.T[int]`,
+			[]testInst{{`T`, []string{`int`}, `[]int`}},
+		},
+
+		{`package dupltype0; type T[P interface{~int}] struct{ x P }; var x T[int]; var y T[int]`,
+			[]testInst{
+				{`T`, []string{`int`}, `struct{x int}`},
+				{`T`, []string{`int`}, `struct{x int}`},
+			},
+		},
+		{`package dupltype1; type T[P ~int] struct{ x P }; func (r *T[Q]) add(z T[Q]) { r.x += z.x }`,
+			[]testInst{
+				{`T`, []string{`Q`}, `struct{x Q}`},
+				{`T`, []string{`Q`}, `struct{x Q}`},
+			},
+		},
+		{`package dupltype1; import "lib"; var x lib.T[int]; var y lib.T[int]; var z lib.T[string]`,
+			[]testInst{
+				{`T`, []string{`int`}, `[]int`},
+				{`T`, []string{`int`}, `[]int`},
+				{`T`, []string{`string`}, `[]string`},
+			},
+		},
+	}
+
+	for _, test := range tests {
 		imports := make(testImporter)
 		conf := Config{Importer: imports}
-		instances := make(map[*ast.Ident]Instance)
-		uses := make(map[*ast.Ident]Object)
+		instMap := make(map[*ast.Ident]Instance)
+		useMap := make(map[*ast.Ident]Object)
 		makePkg := func(src string) *Package {
 			f, err := parser.ParseFile(fset, "p.go", src, 0)
 			if err != nil {
 				t.Fatal(err)
 			}
-			pkg, err := conf.Check("", fset, []*ast.File{f}, &Info{Instances: instances, Uses: uses})
+			pkg, err := conf.Check("", fset, []*ast.File{f}, &Info{Instances: instMap, Uses: useMap})
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -566,60 +584,71 @@
 		makePkg(lib)
 		pkg := makePkg(test.src)
 
-		// look for instance information
-		var targs []Type
-		var typ Type
-		for ident, inst := range instances {
-			if ExprString(ident) == test.name {
-				for i := 0; i < inst.TypeArgs.Len(); i++ {
-					targs = append(targs, inst.TypeArgs.At(i))
-				}
-				typ = inst.Type
+		t.Run(pkg.Name(), func(t *testing.T) {
+			// Sort instances in source order for stability.
+			instances := sortedInstances(instMap)
+			if got, want := len(instances), len(test.instances); got != want {
+				t.Fatalf("got %d instances, want %d", got, want)
+			}
 
-				// Check that we can find the corresponding parameterized type.
-				ptype := uses[ident].Type()
+			// Pairwise compare with the expected instances.
+			for ii, inst := range instances {
+				var targs []Type
+				for i := 0; i < inst.Inst.TypeArgs.Len(); i++ {
+					targs = append(targs, inst.Inst.TypeArgs.At(i))
+				}
+				typ := inst.Inst.Type
+
+				testInst := test.instances[ii]
+				if got := inst.Ident.Name; got != testInst.name {
+					t.Fatalf("got name %s, want %s", got, testInst.name)
+				}
+				if len(targs) != len(testInst.targs) {
+					t.Fatalf("got %d type arguments; want %d", len(targs), len(testInst.targs))
+				}
+				for i, targ := range targs {
+					if got := targ.String(); got != testInst.targs[i] {
+						t.Errorf("type argument %d: got %s; want %s", i, got, testInst.targs[i])
+					}
+				}
+				if got := typ.Underlying().String(); got != testInst.typ {
+					t.Errorf("package %s: got %s; want %s", pkg.Name(), got, testInst.typ)
+				}
+
+				// Verify the invariant that re-instantiating the corresponding generic
+				// type with TypeArgs results in an identical instance.
+				ptype := useMap[inst.Ident].Type()
 				lister, _ := ptype.(interface{ TypeParams() *TypeParamList })
 				if lister == nil || lister.TypeParams().Len() == 0 {
-					t.Errorf("package %s: info.Types[%v] = %v, want parameterized type", pkg.Name(), ident, ptype)
-					continue
+					t.Fatalf("info.Types[%v] = %v, want parameterized type", inst.Ident, ptype)
 				}
-
-				// Verify the invariant that re-instantiating the generic type with
-				// TypeArgs results in an equivalent type.
 				inst2, err := Instantiate(nil, ptype, targs, true)
 				if err != nil {
 					t.Errorf("Instantiate(%v, %v) failed: %v", ptype, targs, err)
 				}
-				if !Identical(inst.Type, inst2) {
-					t.Errorf("%v and %v are not identical", inst.Type, inst2)
+				if !Identical(inst.Inst.Type, inst2) {
+					t.Errorf("%v and %v are not identical", inst.Inst.Type, inst2)
 				}
-				break
 			}
-		}
-		if targs == nil {
-			t.Errorf("package %s: no instance information found for %s", pkg.Name(), test.name)
-			continue
-		}
-
-		// check that type arguments are correct
-		if len(targs) != len(test.targs) {
-			t.Errorf("package %s: got %d type arguments; want %d", pkg.Name(), len(targs), len(test.targs))
-			continue
-		}
-		for i, targ := range targs {
-			if got := targ.String(); got != test.targs[i] {
-				t.Errorf("package %s, %d. type argument: got %s; want %s", pkg.Name(), i, got, test.targs[i])
-				continue
-			}
-		}
-
-		// check that the types match
-		if got := typ.Underlying().String(); got != test.typ {
-			t.Errorf("package %s: got %s; want %s", pkg.Name(), got, test.typ)
-		}
+		})
 	}
 }
 
+type recordedInstance struct {
+	Ident *ast.Ident
+	Inst  Instance
+}
+
+func sortedInstances(m map[*ast.Ident]Instance) (instances []recordedInstance) {
+	for id, inst := range m {
+		instances = append(instances, recordedInstance{id, inst})
+	}
+	sort.Slice(instances, func(i, j int) bool {
+		return instances[i].Ident.Pos() < instances[j].Ident.Pos()
+	})
+	return instances
+}
+
 func TestDefsInfo(t *testing.T) {
 	var tests = []struct {
 		src  string
@@ -1688,7 +1717,7 @@
 	var F = /*F=func:12*/ F /*F=var:17*/ ; _ = F
 
 	var a []int
-	for i, x := range /*i=undef*/ /*x=var:16*/ a /*i=var:20*/ /*x=var:20*/ { _ = i; _ = x }
+	for i, x := range a /*i=undef*/ /*x=var:16*/ { _ = i; _ = x }
 
 	var i interface{}
 	switch y := i.(type) { /*y=undef*/
diff --git a/src/go/types/assignments.go b/src/go/types/assignments.go
index f75b8b6..f5e22c2 100644
--- a/src/go/types/assignments.go
+++ b/src/go/types/assignments.go
@@ -290,15 +290,14 @@
 	return "(" + strings.Join(res, ", ") + ")"
 }
 
-func (check *Checker) assignError(rhs []ast.Expr, nvars, nvals int) {
-	measure := func(x int, unit string) string {
-		s := fmt.Sprintf("%d %s", x, unit)
-		if x != 1 {
-			s += "s"
-		}
-		return s
+func measure(x int, unit string) string {
+	if x != 1 {
+		unit += "s"
 	}
+	return fmt.Sprintf("%d %s", x, unit)
+}
 
+func (check *Checker) assignError(rhs []ast.Expr, nvars, nvals int) {
 	vars := measure(nvars, "variable")
 	vals := measure(nvals, "value")
 	rhs0 := rhs[0]
diff --git a/src/go/types/call.go b/src/go/types/call.go
index 3dab284..5d1f60d 100644
--- a/src/go/types/call.go
+++ b/src/go/types/call.go
@@ -429,7 +429,7 @@
 	"_Cmacro_", // function to evaluate the expanded expression
 }
 
-func (check *Checker) selector(x *operand, e *ast.SelectorExpr) {
+func (check *Checker) selector(x *operand, e *ast.SelectorExpr, def *Named) {
 	// these must be declared before the "goto Error" statements
 	var (
 		obj      Object
@@ -527,7 +527,18 @@
 	}
 
 	check.exprOrType(x, e.X, false)
-	if x.mode == invalid {
+	switch x.mode {
+	case typexpr:
+		// don't crash for "type T T.x" (was issue #51509)
+		if def != nil && x.typ == def {
+			check.cycleError([]Object{def.obj})
+			goto Error
+		}
+	case builtin:
+		// types2 uses the position of '.' for the error
+		check.errorf(e.Sel, _UncalledBuiltin, "cannot select on %s", x)
+		goto Error
+	case invalid:
 		goto Error
 	}
 
diff --git a/src/go/types/check.go b/src/go/types/check.go
index 6e1da04..2313637 100644
--- a/src/go/types/check.go
+++ b/src/go/types/check.go
@@ -133,7 +133,7 @@
 	untyped  map[ast.Expr]exprInfo // map of expressions without final type
 	delayed  []action              // stack of delayed action segments; segments are processed in FIFO order
 	objPath  []Object              // path of object dependencies during type inference (for cycle reporting)
-	defTypes []*Named              // defined types created during type checking, for final validation.
+	cleaners []cleaner             // list of types that may need a final cleanup at the end of type-checking
 
 	// environment within which the current object is type-checked (valid only
 	// for the duration of type-checking a specific object)
@@ -212,6 +212,16 @@
 	return obj
 }
 
+type cleaner interface {
+	cleanup()
+}
+
+// needsCleanup records objects/types that implement the cleanup method
+// which will be called at the end of type-checking.
+func (check *Checker) needsCleanup(c cleaner) {
+	check.cleaners = append(check.cleaners, c)
+}
+
 // NewChecker returns a new Checker instance for a given package.
 // Package files may be added incrementally via checker.Files.
 func NewChecker(conf *Config, fset *token.FileSet, pkg *Package, info *Info) *Checker {
@@ -255,6 +265,8 @@
 	check.methods = nil
 	check.untyped = nil
 	check.delayed = nil
+	check.objPath = nil
+	check.cleaners = nil
 
 	// determine package name and collect valid files
 	pkg := check.pkg
@@ -304,22 +316,37 @@
 
 	defer check.handleBailout(&err)
 
+	print := func(msg string) {
+		if trace {
+			fmt.Println()
+			fmt.Println(msg)
+		}
+	}
+
+	print("== initFiles ==")
 	check.initFiles(files)
 
+	print("== collectObjects ==")
 	check.collectObjects()
 
+	print("== packageObjects ==")
 	check.packageObjects()
 
+	print("== processDelayed ==")
 	check.processDelayed(0) // incl. all functions
 
-	check.expandDefTypes()
+	print("== cleanup ==")
+	check.cleanup()
 
+	print("== initOrder ==")
 	check.initOrder()
 
 	if !check.conf.DisableUnusedImportCheck {
+		print("== unusedImports ==")
 		check.unusedImports()
 	}
 
+	print("== recordUntyped ==")
 	check.recordUntyped()
 
 	if check.firstErr == nil {
@@ -337,7 +364,6 @@
 	check.recvTParamMap = nil
 	check.brokenAliases = nil
 	check.unionTypeSets = nil
-	check.defTypes = nil
 	check.ctxt = nil
 
 	// TODO(rFindley) There's more memory we should release at this point.
@@ -365,27 +391,13 @@
 	check.delayed = check.delayed[:top]
 }
 
-func (check *Checker) expandDefTypes() {
-	// Ensure that every defined type created in the course of type-checking has
-	// either non-*Named underlying, or is unresolved.
-	//
-	// This guarantees that we don't leak any types whose underlying is *Named,
-	// because any unresolved instances will lazily compute their underlying by
-	// substituting in the underlying of their origin. The origin must have
-	// either been imported or type-checked and expanded here, and in either case
-	// its underlying will be fully expanded.
-	for i := 0; i < len(check.defTypes); i++ {
-		n := check.defTypes[i]
-		switch n.underlying.(type) {
-		case nil:
-			if n.resolver == nil {
-				panic("nil underlying")
-			}
-		case *Named:
-			n.under() // n.under may add entries to check.defTypes
-		}
-		n.check = nil
+// cleanup runs cleanup for all collected cleaners.
+func (check *Checker) cleanup() {
+	// Don't use a range clause since Named.cleanup may add more cleaners.
+	for i := 0; i < len(check.cleaners); i++ {
+		check.cleaners[i].cleanup()
 	}
+	check.cleaners = nil
 }
 
 func (check *Checker) record(x *operand) {
diff --git a/src/go/types/conversions.go b/src/go/types/conversions.go
index 8474135..c5a69cd 100644
--- a/src/go/types/conversions.go
+++ b/src/go/types/conversions.go
@@ -48,11 +48,14 @@
 		// have specific types, constant x cannot be
 		// converted.
 		ok = T.(*TypeParam).underIs(func(u Type) bool {
-			// t is nil if there are no specific type terms
+			// u is nil if there are no specific type terms
 			if u == nil {
 				cause = check.sprintf("%s does not contain specific types", T)
 				return false
 			}
+			if isString(x.typ) && isBytesOrRunes(u) {
+				return true
+			}
 			if !constConvertibleTo(u, nil) {
 				cause = check.sprintf("cannot convert %s to %s (in %s)", x, u, T)
 				return false
diff --git a/src/go/types/decl.go b/src/go/types/decl.go
index cd6f709..93a37d7 100644
--- a/src/go/types/decl.go
+++ b/src/go/types/decl.go
@@ -624,7 +624,6 @@
 	}()
 
 	index := 0
-	var bounds []Type
 	for _, f := range list.List {
 		var bound Type
 		// NOTE: we may be able to assert that f.Type != nil here, but this is not
@@ -642,7 +641,6 @@
 		} else {
 			bound = Typ[Invalid]
 		}
-		bounds = append(bounds, bound)
 		for i := range f.Names {
 			tparams[index+i].bound = bound
 		}
diff --git a/src/go/types/errorcodes.go b/src/go/types/errorcodes.go
index a7514b3..64cf24c 100644
--- a/src/go/types/errorcodes.go
+++ b/src/go/types/errorcodes.go
@@ -1339,11 +1339,6 @@
 	//  func _() {
 	//  	f()
 	//  }
-	//
-	// Example:
-	//   type N[P, Q any] struct{}
-	//
-	//   var _ N[int]
 	_CannotInferTypeArgs
 
 	// _InvalidTypeArg occurs when a type argument does not satisfy its
diff --git a/src/go/types/eval.go b/src/go/types/eval.go
index c8bb005..5700cbf 100644
--- a/src/go/types/eval.go
+++ b/src/go/types/eval.go
@@ -37,8 +37,8 @@
 
 // CheckExpr type checks the expression expr as if it had appeared at position
 // pos of package pkg. Type information about the expression is recorded in
-// info. The expression may be an uninstantiated parameterized function or
-// type.
+// info. The expression may be an identifier denoting an uninstantiated generic
+// function or type.
 //
 // If pkg == nil, the Universe scope is used and the provided
 // position pos is ignored. If pkg != nil, and pos is invalid,
diff --git a/src/go/types/expr.go b/src/go/types/expr.go
index 8747838..e24bd60 100644
--- a/src/go/types/expr.go
+++ b/src/go/types/expr.go
@@ -859,7 +859,7 @@
 	}
 	// see if we can extract a more specific error
 	var cause string
-	comparable(typ, nil, func(format string, args ...interface{}) {
+	comparable(typ, true, nil, func(format string, args ...interface{}) {
 		cause = check.sprintf(format, args...)
 	})
 	return cause
@@ -1339,6 +1339,10 @@
 			// no composite literal type present - use hint (element type of enclosing type)
 			typ = hint
 			base, _ = deref(coreType(typ)) // *T implies &T{}
+			if base == nil {
+				check.errorf(e, _InvalidLit, "invalid composite literal element type %s: no core type", typ)
+				goto Error
+			}
 
 		default:
 			// TODO(gri) provide better error messages depending on context
@@ -1529,7 +1533,7 @@
 		return kind
 
 	case *ast.SelectorExpr:
-		check.selector(x, e)
+		check.selector(x, e, nil)
 
 	case *ast.IndexExpr, *ast.IndexListExpr:
 		ix := typeparams.UnpackIndexExpr(e)
@@ -1584,6 +1588,7 @@
 		case invalid:
 			goto Error
 		case typexpr:
+			check.validVarType(e.X, x.typ)
 			x.typ = &Pointer{base: x.typ}
 		default:
 			var base Type
diff --git a/src/go/types/index.go b/src/go/types/index.go
index eac6017..33075ed 100644
--- a/src/go/types/index.go
+++ b/src/go/types/index.go
@@ -183,6 +183,7 @@
 	}
 
 	if !valid {
+		// types2 uses the position of '[' for the error
 		check.invalidOp(x, _NonIndexableOperand, "cannot index %s", x)
 		x.mode = invalid
 		return false
diff --git a/src/go/types/infer.go b/src/go/types/infer.go
index 8f22144..6bed55c 100644
--- a/src/go/types/infer.go
+++ b/src/go/types/infer.go
@@ -487,21 +487,88 @@
 		}
 	}
 
-	// If a constraint has a core type, unify the corresponding type parameter with it.
-	for _, tpar := range tparams {
-		if ctype := adjCoreType(tpar); ctype != nil {
-			if !u.unify(tpar, ctype) {
-				// TODO(gri) improve error message by providing the type arguments
-				//           which we know already
-				check.errorf(posn, _InvalidTypeArg, "%s does not match %s", tpar, ctype)
-				return nil, 0
+	// Repeatedly apply constraint type inference as long as
+	// there are still unknown type arguments and progress is
+	// being made.
+	//
+	// This is an O(n^2) algorithm where n is the number of
+	// type parameters: if there is progress (and iteration
+	// continues), at least one type argument is inferred
+	// per iteration and we have a doubly nested loop.
+	// In practice this is not a problem because the number
+	// of type parameters tends to be very small (< 5 or so).
+	// (It should be possible for unification to efficiently
+	// signal newly inferred type arguments; then the loops
+	// here could handle the respective type parameters only,
+	// but that will come at a cost of extra complexity which
+	// may not be worth it.)
+	for n := u.x.unknowns(); n > 0; {
+		nn := n
+
+		for i, tpar := range tparams {
+			// If there is a core term (i.e., a core type with tilde information)
+			// unify the type parameter with the core type.
+			if core, single := coreTerm(tpar); core != nil {
+				// A type parameter can be unified with its core type in two cases.
+				tx := u.x.at(i)
+				switch {
+				case tx != nil:
+					// The corresponding type argument tx is known.
+					// In this case, if the core type has a tilde, the type argument's underlying
+					// type must match the core type, otherwise the type argument and the core type
+					// must match.
+					// If tx is an external type parameter, don't consider its underlying type
+					// (which is an interface). Core type unification will attempt to unify against
+					// core.typ.
+					// Note also that even with inexact unification we cannot leave away the under
+					// call here because it's possible that both tx and core.typ are named types,
+					// with under(tx) being a (named) basic type matching core.typ. Such cases do
+					// not match with inexact unification.
+					if core.tilde && !isTypeParam(tx) {
+						tx = under(tx)
+					}
+					if !u.unify(tx, core.typ) {
+						// TODO(gri) improve error message by providing the type arguments
+						//           which we know already
+						// Don't use term.String() as it always qualifies types, even if they
+						// are in the current package.
+						tilde := ""
+						if core.tilde {
+							tilde = "~"
+						}
+						check.errorf(posn, _InvalidTypeArg, "%s does not match %s%s", tpar, tilde, core.typ)
+						return nil, 0
+					}
+
+				case single && !core.tilde:
+					// The corresponding type argument tx is unknown and there's a single
+					// specific type and no tilde.
+					// In this case the type argument must be that single type; set it.
+					u.x.set(i, core.typ)
+
+				default:
+					// Unification is not possible and no progress was made.
+					continue
+				}
+
+				// The number of known type arguments may have changed.
+				nn = u.x.unknowns()
+				if nn == 0 {
+					break // all type arguments are known
+				}
 			}
 		}
+
+		assert(nn <= n)
+		if nn == n {
+			break // no progress
+		}
+		n = nn
 	}
 
 	// u.x.types() now contains the incoming type arguments plus any additional type
-	// arguments which were inferred from core types. The newly inferred non-
-	// nil entries may still contain references to other type parameters.
+	// arguments which were inferred from core terms. The newly inferred non-nil
+	// entries may still contain references to other type parameters.
 	// For instance, for [A any, B interface{ []C }, C interface{ *A }], if A == int
 	// was given, unification produced the type list [int, []C, *A]. We eliminate the
 	// remaining type parameters by substituting the type parameters in this type list
@@ -590,17 +657,40 @@
 	return
 }
 
-func adjCoreType(tpar *TypeParam) Type {
-	// If the type parameter embeds a single, possibly named
-	// type, use that one instead of the core type (which is
-	// always the underlying type of that single type).
-	if single := tpar.singleType(); single != nil {
-		if debug {
-			assert(under(single) == coreType(tpar))
+// If the type parameter has a single specific type S, coreTerm returns (S, true).
+// Otherwise, if tpar has a core type T, it returns a term corresponding to that
+// core type and false. In that case, if any term of tpar has a tilde, the core
+// term has a tilde. In all other cases coreTerm returns (nil, false).
+func coreTerm(tpar *TypeParam) (*term, bool) {
+	n := 0
+	var single *term // valid if n == 1
+	var tilde bool
+	tpar.is(func(t *term) bool {
+		if t == nil {
+			assert(n == 0)
+			return false // no terms
 		}
-		return single
+		n++
+		single = t
+		if t.tilde {
+			tilde = true
+		}
+		return true
+	})
+	if n == 1 {
+		if debug {
+			assert(debug && under(single.typ) == coreType(tpar))
+		}
+		return single, true
 	}
-	return coreType(tpar)
+	if typ := coreType(tpar); typ != nil {
+		// A core type is always an underlying type.
+		// If any term of tpar has a tilde, we don't
+		// have a precise core type and we must return
+		// a tilde as well.
+		return &term{tilde, typ}, false
+	}
+	return nil, false
 }
 
 type cycleFinder struct {
@@ -648,8 +738,6 @@
 	//      in signatures where they are handled explicitly.
 
 	case *Signature:
-		// There are no "method types" so we should never see a recv.
-		assert(t.recv == nil)
 		if t.params != nil {
 			w.varList(t.params.vars)
 		}
diff --git a/src/go/types/instantiate.go b/src/go/types/instantiate.go
index 4aeaeb7..a481746 100644
--- a/src/go/types/instantiate.go
+++ b/src/go/types/instantiate.go
@@ -15,10 +15,10 @@
 
 // Instantiate instantiates the type orig with the given type arguments targs.
 // orig must be a *Named or a *Signature type. If there is no error, the
-// resulting Type is a new, instantiated (not parameterized) type of the same
-// kind (either a *Named or a *Signature). Methods attached to a *Named type
-// are also instantiated, and associated with a new *Func that has the same
-// position as the original method, but nil function scope.
+// resulting Type is an instantiated type of the same kind (either a *Named or
+// a *Signature). Methods attached to a *Named type are also instantiated, and
+// associated with a new *Func that has the same position as the original
+// method, but nil function scope.
 //
 // If ctxt is non-nil, it may be used to de-duplicate the instance against
 // previous instances with the same identity. As a special case, generic
@@ -204,7 +204,7 @@
 	// If T is comparable, V must be comparable.
 	// Remember as a pending error and report only if we don't have a more specific error.
 	var pending error
-	if Ti.IsComparable() && ((Vi != nil && !Vi.IsComparable()) || (Vi == nil && !Comparable(V))) {
+	if Ti.IsComparable() && !comparable(V, false, nil, nil) {
 		pending = errorf("%s does not implement comparable", V)
 	}
 
diff --git a/src/go/types/interface.go b/src/go/types/interface.go
index b9d4660..3db3580 100644
--- a/src/go/types/interface.go
+++ b/src/go/types/interface.go
@@ -56,7 +56,7 @@
 	}
 
 	// set method receivers if necessary
-	typ := new(Interface)
+	typ := (*Checker)(nil).newInterface()
 	for _, m := range methods {
 		if sig := m.typ.(*Signature); sig.recv == nil {
 			sig.recv = NewVar(m.pos, m.pkg, "", typ)
@@ -73,6 +73,15 @@
 	return typ
 }
 
+// check may be nil
+func (check *Checker) newInterface() *Interface {
+	typ := &Interface{check: check}
+	if check != nil {
+		check.needsCleanup(typ)
+	}
+	return typ
+}
+
 // MarkImplicit marks the interface t as implicit, meaning this interface
 // corresponds to a constraint literal such as ~T or A|B without explicit
 // interface embedding. MarkImplicit should be called before any concurrent use
@@ -141,6 +150,11 @@
 // ----------------------------------------------------------------------------
 // Implementation
 
+func (t *Interface) cleanup() {
+	t.check = nil
+	t.embedPos = nil
+}
+
 func (check *Checker) interfaceType(ityp *Interface, iface *ast.InterfaceType, def *Named) {
 	addEmbedded := func(pos token.Pos, typ Type) {
 		ityp.embeddeds = append(ityp.embeddeds, typ)
@@ -210,16 +224,10 @@
 	sortMethods(ityp.methods)
 	// (don't sort embeddeds: they must correspond to *embedPos entries)
 
-	// Compute type set with a non-nil *Checker as soon as possible
-	// to report any errors. Subsequent uses of type sets will use
-	// this computed type set and won't need to pass in a *Checker.
-	//
-	// Pin the checker to the interface type in the interim, in case the type set
-	// must be used before delayed funcs are processed (see issue #48234).
-	// TODO(rfindley): clean up use of *Checker with computeInterfaceTypeSet
-	ityp.check = check
+	// Compute type set as soon as possible to report any errors.
+	// Subsequent uses of type sets will use this computed type
+	// set and won't need to pass in a *Checker.
 	check.later(func() {
 		computeInterfaceTypeSet(check, iface.Pos(), ityp)
-		ityp.check = nil
 	}).describef(iface, "compute type set for %s", ityp)
 }
diff --git a/src/go/types/lookup.go b/src/go/types/lookup.go
index 501c230..335fada 100644
--- a/src/go/types/lookup.go
+++ b/src/go/types/lookup.go
@@ -70,7 +70,8 @@
 	// see if there is a matching field (but not a method, those need to be declared
 	// explicitly in the constraint). If the constraint is a named pointer type (see
 	// above), we are ok here because only fields are accepted as results.
-	if obj == nil && isTypeParam(T) {
+	const enableTParamFieldLookup = false // see issue #51576
+	if enableTParamFieldLookup && obj == nil && isTypeParam(T) {
 		if t := coreType(T); t != nil {
 			obj, index, indirect = lookupFieldOrMethod(t, addressable, pkg, name, false)
 			if _, ok := obj.(*Var); !ok {
diff --git a/src/go/types/named.go b/src/go/types/named.go
index 5e84c39..876f7e8 100644
--- a/src/go/types/named.go
+++ b/src/go/types/named.go
@@ -72,18 +72,38 @@
 	}
 	// Ensure that typ is always expanded and sanity-checked.
 	if check != nil {
-		check.defTypes = append(check.defTypes, typ)
+		check.needsCleanup(typ)
 	}
 	return typ
 }
 
+func (t *Named) cleanup() {
+	// Ensure that every defined type created in the course of type-checking has
+	// either non-*Named underlying, or is unresolved.
+	//
+	// This guarantees that we don't leak any types whose underlying is *Named,
+	// because any unresolved instances will lazily compute their underlying by
+	// substituting in the underlying of their origin. The origin must have
+	// either been imported or type-checked and expanded here, and in either case
+	// its underlying will be fully expanded.
+	switch t.underlying.(type) {
+	case nil:
+		if t.resolver == nil {
+			panic("nil underlying")
+		}
+	case *Named:
+		t.under() // t.under may add entries to check.cleaners
+	}
+	t.check = nil
+}
+
 // Obj returns the type name for the declaration defining the named type t. For
-// instantiated types, this is the type name of the base type.
+// instantiated types, this is same as the type name of the origin type.
 func (t *Named) Obj() *TypeName {
 	return t.orig.obj // for non-instances this is the same as t.obj
 }
 
-// Origin returns the parameterized type from which the named type t is
+// Origin returns the generic type from which the named type t is
 // instantiated. If t is not an instantiated type, the result is t.
 func (t *Named) Origin() *Named { return t.orig }
 
@@ -91,7 +111,7 @@
 //           between parameterized instantiated and non-instantiated types.
 
 // TypeParams returns the type parameters of the named type t, or nil.
-// The result is non-nil for an (originally) parameterized type even if it is instantiated.
+// The result is non-nil for an (originally) generic type even if it is instantiated.
 func (t *Named) TypeParams() *TypeParamList { return t.resolve(nil).tparams }
 
 // SetTypeParams sets the type parameters of the named type t.
@@ -104,7 +124,11 @@
 // TypeArgs returns the type arguments used to instantiate the named type t.
 func (t *Named) TypeArgs() *TypeList { return t.targs }
 
-// NumMethods returns the number of explicit methods whose receiver is named type t.
+// NumMethods returns the number of explicit methods defined for t.
+//
+// For an ordinary or instantiated type t, the receiver base type of these
+// methods will be the named type t. For an uninstantiated generic type t, each
+// method receiver will be instantiated with its receiver type parameters.
 func (t *Named) NumMethods() int { return t.resolve(nil).methods.Len() }
 
 // Method returns the i'th method of named type t for 0 <= i < t.NumMethods().
@@ -362,11 +386,11 @@
 				// that it wasn't substituted. In this case we need to create a new
 				// *Interface before modifying receivers.
 				if iface == n.orig.underlying {
-					iface = &Interface{
-						embeddeds: iface.embeddeds,
-						complete:  iface.complete,
-						implicit:  iface.implicit, // should be false but be conservative
-					}
+					old := iface
+					iface = check.newInterface()
+					iface.embeddeds = old.embeddeds
+					iface.complete = old.complete
+					iface.implicit = old.implicit // should be false but be conservative
 					underlying = iface
 				}
 				iface.methods = methods
diff --git a/src/go/types/predicates.go b/src/go/types/predicates.go
index 14e99bf..0360f27 100644
--- a/src/go/types/predicates.go
+++ b/src/go/types/predicates.go
@@ -104,11 +104,12 @@
 
 // Comparable reports whether values of type T are comparable.
 func Comparable(T Type) bool {
-	return comparable(T, nil, nil)
+	return comparable(T, true, nil, nil)
 }
 
+// If dynamic is set, non-type parameter interfaces are always comparable.
 // If reportf != nil, it may be used to report why T is not comparable.
-func comparable(T Type, seen map[Type]bool, reportf func(string, ...interface{})) bool {
+func comparable(T Type, dynamic bool, seen map[Type]bool, reportf func(string, ...interface{})) bool {
 	if seen[T] {
 		return true
 	}
@@ -126,7 +127,7 @@
 		return true
 	case *Struct:
 		for _, f := range t.fields {
-			if !comparable(f.typ, seen, nil) {
+			if !comparable(f.typ, dynamic, seen, nil) {
 				if reportf != nil {
 					reportf("struct containing %s cannot be compared", f.typ)
 				}
@@ -135,7 +136,7 @@
 		}
 		return true
 	case *Array:
-		if !comparable(t.elem, seen, nil) {
+		if !comparable(t.elem, dynamic, seen, nil) {
 			if reportf != nil {
 				reportf("%s cannot be compared", t)
 			}
@@ -143,7 +144,7 @@
 		}
 		return true
 	case *Interface:
-		return !isTypeParam(T) || t.typeSet().IsComparable(seen)
+		return dynamic && !isTypeParam(T) || t.typeSet().IsComparable(seen)
 	}
 	return false
 }
diff --git a/src/go/types/signature.go b/src/go/types/signature.go
index 8f89e93..a340ac7 100644
--- a/src/go/types/signature.go
+++ b/src/go/types/signature.go
@@ -112,7 +112,8 @@
 		// - the receiver specification acts as local declaration for its type parameters, which may be blank
 		_, rname, rparams := check.unpackRecv(recvPar.List[0].Type, true)
 		if len(rparams) > 0 {
-			sig.rparams = bindTParams(check.declareTypeParams(nil, rparams))
+			tparams := check.declareTypeParams(nil, rparams)
+			sig.rparams = bindTParams(tparams)
 			// Blank identifiers don't get declared, so naive type-checking of the
 			// receiver type expression would fail in Checker.collectParams below,
 			// when Checker.ident cannot resolve the _ to a type.
@@ -122,11 +123,10 @@
 			// lookup in the scope.
 			for i, p := range rparams {
 				if p.Name == "_" {
-					tpar := sig.rparams.At(i)
 					if check.recvTParamMap == nil {
 						check.recvTParamMap = make(map[*ast.Ident]*TypeParam)
 					}
-					check.recvTParamMap[p] = tpar
+					check.recvTParamMap[p] = tparams[i]
 				}
 			}
 			// determine receiver type to get its type parameters
@@ -142,22 +142,23 @@
 				}
 			}
 			// provide type parameter bounds
-			// - only do this if we have the right number (otherwise an error is reported elsewhere)
-			if sig.RecvTypeParams().Len() == len(recvTParams) {
-				// We have a list of *TypeNames but we need a list of Types.
-				list := make([]Type, sig.RecvTypeParams().Len())
-				for i, t := range sig.RecvTypeParams().list() {
-					list[i] = t
-					check.mono.recordCanon(t, recvTParams[i])
+			if len(tparams) == len(recvTParams) {
+				smap := makeRenameMap(recvTParams, tparams)
+				for i, tpar := range tparams {
+					recvTPar := recvTParams[i]
+					check.mono.recordCanon(tpar, recvTPar)
+					// recvTPar.bound is (possibly) parameterized in the context of the
+					// receiver type declaration. Substitute parameters for the current
+					// context.
+					tpar.bound = check.subst(tpar.obj.pos, recvTPar.bound, smap, nil)
 				}
-				smap := makeSubstMap(recvTParams, list)
-				for i, tpar := range sig.RecvTypeParams().list() {
-					bound := recvTParams[i].bound
-					// bound is (possibly) parameterized in the context of the
-					// receiver type declaration. Substitute parameters for the
-					// current context.
-					tpar.bound = check.subst(tpar.obj.pos, bound, smap, nil)
-				}
+			} else if len(tparams) < len(recvTParams) {
+				// Reporting an error here is a stop-gap measure to avoid crashes in the
+				// compiler when a type parameter/argument cannot be inferred later. It
+				// may lead to follow-on errors (see issues #51339, #51343).
+				// TODO(gri) find a better solution
+				got := measure(len(tparams), "type parameter")
+				check.errorf(recvPar, _BadRecv, "got %s, but receiver base type declares %d", got, len(recvTParams))
 			}
 		}
 	}
@@ -192,66 +193,77 @@
 		switch len(recvList) {
 		case 0:
 			// error reported by resolver
-			recv = NewParam(0, nil, "", Typ[Invalid]) // ignore recv below
+			recv = NewParam(token.NoPos, nil, "", Typ[Invalid]) // ignore recv below
 		default:
 			// more than one receiver
-			check.error(recvList[len(recvList)-1], _BadRecv, "method must have exactly one receiver")
+			check.error(recvList[len(recvList)-1], _InvalidRecv, "method must have exactly one receiver")
 			fallthrough // continue with first receiver
 		case 1:
 			recv = recvList[0]
 		}
+		sig.recv = recv
 
-		// TODO(gri) We should delay rtyp expansion to when we actually need the
-		//           receiver; thus all checks here should be delayed to later.
-		rtyp, _ := deref(recv.typ)
+		// Delay validation of receiver type as it may cause premature expansion
+		// of types the receiver type is dependent on (see issues #51232, #51233).
+		check.later(func() {
+			rtyp, _ := deref(recv.typ)
 
-		// spec: "The receiver type must be of the form T or *T where T is a type name."
-		// (ignore invalid types - error was reported before)
-		if rtyp != Typ[Invalid] {
-			var err string
-			switch T := rtyp.(type) {
-			case *Named:
-				T.resolve(check.bestContext(nil))
-				// The receiver type may be an instantiated type referred to
-				// by an alias (which cannot have receiver parameters for now).
-				if T.TypeArgs() != nil && sig.RecvTypeParams() == nil {
-					check.errorf(atPos(recv.pos), _InvalidRecv, "cannot define methods on instantiated type %s", recv.typ)
-					break
-				}
-				// spec: "The type denoted by T is called the receiver base type; it must not
-				// be a pointer or interface type and it must be declared in the same package
-				// as the method."
-				if T.obj.pkg != check.pkg {
-					err = "type not defined in this package"
-				} else {
-					// The underlying type of a receiver base type can be a type parameter;
-					// e.g. for methods with a generic receiver T[P] with type T[P any] P.
-					underIs(T, func(u Type) bool {
-						switch u := u.(type) {
-						case *Basic:
-							// unsafe.Pointer is treated like a regular pointer
-							if u.kind == UnsafePointer {
-								err = "unsafe.Pointer"
+			// spec: "The receiver type must be of the form T or *T where T is a type name."
+			// (ignore invalid types - error was reported before)
+			if rtyp != Typ[Invalid] {
+				var err string
+				switch T := rtyp.(type) {
+				case *Named:
+					T.resolve(check.bestContext(nil))
+					// The receiver type may be an instantiated type referred to
+					// by an alias (which cannot have receiver parameters for now).
+					if T.TypeArgs() != nil && sig.RecvTypeParams() == nil {
+						check.errorf(recv, _InvalidRecv, "cannot define methods on instantiated type %s", recv.typ)
+						break
+					}
+					// spec: "The type denoted by T is called the receiver base type; it must not
+					// be a pointer or interface type and it must be declared in the same package
+					// as the method."
+					if T.obj.pkg != check.pkg {
+						err = "type not defined in this package"
+						if compilerErrorMessages {
+							check.errorf(recv, _InvalidRecv, "cannot define new methods on non-local type %s", recv.typ)
+							err = ""
+						}
+					} else {
+						// The underlying type of a receiver base type can be a type parameter;
+						// e.g. for methods with a generic receiver T[P] with type T[P any] P.
+						// TODO(gri) Such declarations are currently disallowed.
+						//           Revisit the need for underIs.
+						underIs(T, func(u Type) bool {
+							switch u := u.(type) {
+							case *Basic:
+								// unsafe.Pointer is treated like a regular pointer
+								if u.kind == UnsafePointer {
+									err = "unsafe.Pointer"
+									return false
+								}
+							case *Pointer, *Interface:
+								err = "pointer or interface type"
 								return false
 							}
-						case *Pointer, *Interface:
-							err = "pointer or interface type"
-							return false
-						}
-						return true
-					})
+							return true
+						})
+					}
+				case *Basic:
+					err = "basic or unnamed type"
+					if compilerErrorMessages {
+						check.errorf(recv, _InvalidRecv, "cannot define new methods on non-local type %s", recv.typ)
+						err = ""
+					}
+				default:
+					check.errorf(recv, _InvalidRecv, "invalid receiver type %s", recv.typ)
 				}
-			case *Basic:
-				err = "basic or unnamed type"
-			default:
-				check.errorf(recv, _InvalidRecv, "invalid receiver type %s", recv.typ)
+				if err != "" {
+					check.errorf(recv, _InvalidRecv, "invalid receiver type %s (%s)", recv.typ, err)
+				}
 			}
-			if err != "" {
-				check.errorf(recv, _InvalidRecv, "invalid receiver type %s (%s)", recv.typ, err)
-				// ok to continue
-			}
-		}
-		sig.recv = recv
+		}).describef(recv, "validate receiver %s", recv)
 	}
 
 	sig.params = NewTuple(params...)
diff --git a/src/go/types/stmt.go b/src/go/types/stmt.go
index a5aee48..9ebfbb6 100644
--- a/src/go/types/stmt.go
+++ b/src/go/types/stmt.go
@@ -821,8 +821,6 @@
 
 	case *ast.RangeStmt:
 		inner |= breakOk | continueOk
-		check.openScope(s, "for")
-		defer check.closeScope()
 
 		// check expression to iterate over
 		var x operand
@@ -857,6 +855,11 @@
 			}
 		}
 
+		// Open the for-statement block scope now, after the range clause.
+		// Iteration variables declared with := need to go in this scope (was issue #51437).
+		check.openScope(s, "range")
+		defer check.closeScope()
+
 		// check assignment to/declaration of iteration variables
 		// (irregular assignment, cannot easily map to existing assignment checks)
 
@@ -865,9 +868,7 @@
 		rhs := [2]Type{key, val} // key, val may be nil
 
 		if s.Tok == token.DEFINE {
-			// short variable declaration; variable scope starts after the range clause
-			// (the for loop opens a new scope, so variables on the lhs never redeclare
-			// previously declared variables)
+			// short variable declaration
 			var vars []*Var
 			for i, lhs := range lhs {
 				if lhs == nil {
@@ -904,12 +905,8 @@
 
 			// declare variables
 			if len(vars) > 0 {
-				scopePos := s.X.End()
+				scopePos := s.Body.Pos()
 				for _, obj := range vars {
-					// spec: "The scope of a constant or variable identifier declared inside
-					// a function begins at the end of the ConstSpec or VarSpec (ShortVarDecl
-					// for short variable declarations) and ends at the end of the innermost
-					// containing block."
 					check.declare(check.scope, nil /* recordDef already called */, obj, scopePos)
 				}
 			} else {
diff --git a/src/go/types/subst.go b/src/go/types/subst.go
index 53247a3..4b4a0f4 100644
--- a/src/go/types/subst.go
+++ b/src/go/types/subst.go
@@ -160,7 +160,10 @@
 		methods, mcopied := subst.funcList(t.methods)
 		embeddeds, ecopied := subst.typeList(t.embeddeds)
 		if mcopied || ecopied {
-			iface := &Interface{embeddeds: embeddeds, implicit: t.implicit, complete: t.complete}
+			iface := subst.check.newInterface()
+			iface.embeddeds = embeddeds
+			iface.implicit = t.implicit
+			iface.complete = t.complete
 			// If we've changed the interface type, we may need to replace its
 			// receiver if the receiver type is the original interface. Receivers of
 			// *Named type are replaced during named type expansion.
diff --git a/src/go/types/termlist.go b/src/go/types/termlist.go
index c4ab0e0..94e49ca 100644
--- a/src/go/types/termlist.go
+++ b/src/go/types/termlist.go
@@ -92,15 +92,6 @@
 	return rl
 }
 
-// If the type set represented by xl is specified by a single (non-𝓤) term,
-// singleType returns that type. Otherwise it returns nil.
-func (xl termlist) singleType() Type {
-	if nl := xl.norm(); len(nl) == 1 {
-		return nl[0].typ // if nl.isAll() then typ is nil, which is ok
-	}
-	return nil
-}
-
 // union returns the union xl ∪ yl.
 func (xl termlist) union(yl termlist) termlist {
 	return append(xl, yl...).norm()
diff --git a/src/go/types/termlist_test.go b/src/go/types/termlist_test.go
index dddca7a..f0d58ac 100644
--- a/src/go/types/termlist_test.go
+++ b/src/go/types/termlist_test.go
@@ -106,35 +106,6 @@
 	}
 }
 
-func TestTermlistSingleType(t *testing.T) {
-	// helper to deal with nil types
-	tstring := func(typ Type) string {
-		if typ == nil {
-			return "nil"
-		}
-		return typ.String()
-	}
-
-	for test, want := range map[string]string{
-		"∅":                 "nil",
-		"𝓤":                 "nil",
-		"int":               "int",
-		"myInt":             "myInt",
-		"~int":              "int",
-		"~int ∪ string":     "nil",
-		"~int ∪ myInt":      "int",
-		"∅ ∪ int":           "int",
-		"∅ ∪ ~int":          "int",
-		"∅ ∪ ~int ∪ string": "nil",
-	} {
-		xl := maketl(test)
-		got := tstring(xl.singleType())
-		if got != want {
-			t.Errorf("(%v).singleType() == %v; want %v", test, got, want)
-		}
-	}
-}
-
 func TestTermlistUnion(t *testing.T) {
 	for _, test := range []struct {
 		xl, yl, want string
diff --git a/src/go/types/testdata/check/funcinference.go2 b/src/go/types/testdata/check/funcinference.go2
index f04b76c..45d0781 100644
--- a/src/go/types/testdata/check/funcinference.go2
+++ b/src/go/types/testdata/check/funcinference.go2
@@ -8,21 +8,21 @@
 
 type any interface{}
 
-func f0[A any, B interface{~*C}, C interface{~*D}, D interface{~*A}](A, B, C, D) {}
+func f0[A any, B interface{*C}, C interface{*D}, D interface{*A}](A, B, C, D) {}
 func _() {
 	f := f0[string]
 	f("a", nil, nil, nil)
 	f0("a", nil, nil, nil)
 }
 
-func f1[A any, B interface{~*A}](A, B) {}
+func f1[A any, B interface{*A}](A, B) {}
 func _() {
 	f := f1[int]
 	f(int(0), new(int))
 	f1(int(0), new(int))
 }
 
-func f2[A any, B interface{~[]A}](A, B) {}
+func f2[A any, B interface{[]A}](A, B) {}
 func _() {
 	f := f2[byte]
 	f(byte(0), []byte{})
@@ -38,7 +38,7 @@
 // 	f3(x, &x, &x)
 // }
 
-func f4[A any, B interface{~[]C}, C interface{~*A}](A, B, C) {}
+func f4[A any, B interface{[]C}, C interface{*A}](A, B, C) {}
 func _() {
 	f := f4[int]
 	var x int
@@ -46,7 +46,7 @@
 	f4(x, []*int{}, &x)
 }
 
-func f5[A interface{~struct{b B; c C}}, B any, C interface{~*B}](x B) A { panic(0) }
+func f5[A interface{struct{b B; c C}}, B any, C interface{*B}](x B) A { panic(0) }
 func _() {
 	x := f5(1.2)
 	var _ float64 = x.b
@@ -79,7 +79,7 @@
 
 type Setter[B any] interface {
 	Set(string)
-	~*B
+	*B
 }
 
 func FromStrings[T interface{}, PT Setter[T]](s []string) []T {
diff --git a/src/go/types/testdata/check/typeinference.go2 b/src/go/types/testdata/check/typeinference.go2
index 8876cca..28f3e28 100644
--- a/src/go/types/testdata/check/typeinference.go2
+++ b/src/go/types/testdata/check/typeinference.go2
@@ -4,44 +4,46 @@
 
 package typeInference
 
+// As of issue #51527, type-type inference has been disabled.
+
 // basic inference
 type Tb[P ~*Q, Q any] int
 func _() {
-	var x Tb[*int]
+	var x Tb /* ERROR got 1 arguments */ [*int]
 	var y Tb[*int, int]
-	x = y
+	x = y /* ERROR cannot use y .* in assignment */
 	_ = x
 }
 
 // recursive inference
-type Tr[A any, B ~*C, C ~*D, D ~*A] int
+type Tr[A any, B *C, C *D, D *A] int
 func _() {
-	var x Tr[string]
+	var x Tr /* ERROR got 1 arguments */ [string]
 	var y Tr[string, ***string, **string, *string]
 	var z Tr[int, ***int, **int, *int]
-	x = y
+	x = y /* ERROR cannot use y .* in assignment */
 	x = z // ERROR cannot use z .* as Tr
 	_ = x
 }
 
 // other patterns of inference
-type To0[A any, B ~[]A] int
-type To1[A any, B ~struct{a A}] int
-type To2[A any, B ~[][]A] int
-type To3[A any, B ~[3]*A] int
-type To4[A any, B any, C ~struct{a A; b B}] int
+type To0[A any, B []A] int
+type To1[A any, B struct{a A}] int
+type To2[A any, B [][]A] int
+type To3[A any, B [3]*A] int
+type To4[A any, B any, C struct{a A; b B}] int
 func _() {
-	var _ To0[int]
-	var _ To1[int]
-	var _ To2[int]
-	var _ To3[int]
-	var _ To4[int, string]
+	var _ To0 /* ERROR got 1 arguments */ [int]
+	var _ To1 /* ERROR got 1 arguments */ [int]
+	var _ To2 /* ERROR got 1 arguments */ [int]
+	var _ To3 /* ERROR got 1 arguments */ [int]
+	var _ To4 /* ERROR got 2 arguments */ [int, string]
 }
 
 // failed inference
 type Tf0[A, B any] int
 type Tf1[A any, B ~struct{a A; c C}, C any] int
 func _() {
-	var _ Tf0 /* ERROR cannot infer B */ /* ERROR got 1 arguments but 2 type parameters */ [int]
-	var _ Tf1 /* ERROR cannot infer B */ /* ERROR got 1 arguments but 3 type parameters */ [int]
+	var _ Tf0 /* ERROR got 1 arguments but 2 type parameters */ [int]
+	var _ Tf1 /* ERROR got 1 arguments but 3 type parameters */ [int]
 }
diff --git a/src/go/types/testdata/examples/inference.go2 b/src/go/types/testdata/examples/inference.go2
index 70d393b..e59a544 100644
--- a/src/go/types/testdata/examples/inference.go2
+++ b/src/go/types/testdata/examples/inference.go2
@@ -78,7 +78,7 @@
 	related1(si, "foo" /* ERROR cannot use "foo" */ )
 }
 
-func related2[Elem any, Slice interface{~[]Elem}](e Elem, s Slice) {}
+func related2[Elem any, Slice interface{[]Elem}](e Elem, s Slice) {}
 
 func _() {
 	// related2 can be called with explicit instantiation.
@@ -109,16 +109,8 @@
 	related3[int, []int]()
 	related3[byte, List[byte]]()
 
-	// Alternatively, the 2nd type argument can be inferred
-	// from the first one through constraint type inference.
-	related3[int]()
-
-	// The inferred type is the core type of the Slice
-	// type parameter.
-	var _ []int = related3[int]()
-
-	// It is not the defined parameterized type List.
-	type anotherList []float32
-	var _ anotherList = related3[float32]() // valid
-	var _ anotherList = related3 /* ERROR cannot use .* \(value of type List\[float32\]\) as anotherList */ [float32, List[float32]]()
+	// The 2nd type argument cannot be inferred from the first
+	// one because there's two possible choices: []Elem and
+	// List[Elem].
+	related3 /* ERROR cannot infer Slice */ [int]()
 }
diff --git a/src/go/types/testdata/examples/methods.go2 b/src/go/types/testdata/examples/methods.go2
index 1d76d55..a46f789 100644
--- a/src/go/types/testdata/examples/methods.go2
+++ b/src/go/types/testdata/examples/methods.go2
@@ -35,7 +35,7 @@
 // style. In m3 below, int is the name of the local receiver type parameter
 // and it shadows the predeclared identifier int which then cannot be used
 // anymore as expected.
-// This is no different from locally redelaring a predeclared identifier
+// This is no different from locally re-declaring a predeclared identifier
 // and usually should be avoided. There are some notable exceptions; e.g.,
 // sometimes it makes sense to use the identifier "copy" which happens to
 // also be the name of a predeclared built-in function.
diff --git a/src/go/types/testdata/examples/typesets.go2 b/src/go/types/testdata/examples/typesets.go2
index cf01072..fcddf1f 100644
--- a/src/go/types/testdata/examples/typesets.go2
+++ b/src/go/types/testdata/examples/typesets.go2
@@ -35,7 +35,7 @@
 	return deref(p)
 }
 
-func addrOfCopy[V any, P ~*V](v V) P {
+func addrOfCopy[V any, P *V](v V) P {
 	return &v
 }
 
diff --git a/src/go/types/testdata/fixedbugs/issue41124.go2 b/src/go/types/testdata/fixedbugs/issue41124.go2
index 7f55ba8..4550dd7 100644
--- a/src/go/types/testdata/fixedbugs/issue41124.go2
+++ b/src/go/types/testdata/fixedbugs/issue41124.go2
@@ -47,7 +47,7 @@
 }
 
 type _ struct{
-	I3 // ERROR interface is .* comparable
+	I3 // ERROR interface contains type constraints
 }
 
 // General composite types.
@@ -59,19 +59,19 @@
 	_ []I1 // ERROR interface is .* comparable
 	_ []I2 // ERROR interface contains type constraints
 
-	_ *I3 // ERROR interface is .* comparable
+	_ *I3 // ERROR interface contains type constraints
 	_ map[I1 /* ERROR interface is .* comparable */ ]I2 // ERROR interface contains type constraints
-	_ chan I3 // ERROR interface is .* comparable
+	_ chan I3 // ERROR interface contains type constraints
 	_ func(I1 /* ERROR interface is .* comparable */ )
 	_ func() I2 // ERROR interface contains type constraints
 )
 
 // Other cases.
 
-var _ = [...]I3 /* ERROR interface is .* comparable */ {}
+var _ = [...]I3 /* ERROR interface contains type constraints */ {}
 
 func _(x interface{}) {
-	_ = x.(I3 /* ERROR interface is .* comparable */ )
+	_ = x.(I3 /* ERROR interface contains type constraints */ )
 }
 
 type T1[_ any] struct{}
diff --git a/src/go/types/testdata/fixedbugs/issue45548.go2 b/src/go/types/testdata/fixedbugs/issue45548.go2
index b8ba0ad..01c9672 100644
--- a/src/go/types/testdata/fixedbugs/issue45548.go2
+++ b/src/go/types/testdata/fixedbugs/issue45548.go2
@@ -4,7 +4,7 @@
 
 package p
 
-func f[F interface{~*Q}, G interface{~*R}, Q, R any](q Q, r R) {}
+func f[F interface{*Q}, G interface{*R}, Q, R any](q Q, r R) {}
 
 func _() {
 	f[*float64, *int](1, 2)
diff --git a/src/go/types/testdata/fixedbugs/issue49541.go2 b/src/go/types/testdata/fixedbugs/issue49541.go2
index b7bf12a..c8499c1 100644
--- a/src/go/types/testdata/fixedbugs/issue49541.go2
+++ b/src/go/types/testdata/fixedbugs/issue49541.go2
@@ -10,9 +10,10 @@
 
 func (S[A, B]) m() {}
 
-// TODO(gri) We should only report one error below. See issue #50588.
+// TODO(gri): with type-type inference enabled we should only report one error
+// below. See issue #50588.
 
-func _[A any](s S /* ERROR cannot infer B */ /* ERROR got 1 arguments but 2 type parameters */ [A]) {
+func _[A any](s S /* ERROR got 1 arguments but 2 type parameters */ [A]) {
 	// we should see no follow-on errors below
 	s.f = 1
 	s.m()
@@ -21,7 +22,7 @@
 // another test case from the issue
 
 func _() {
-	X(Interface[*F /* ERROR cannot infer B */ /* ERROR got 1 arguments but 2 type parameters */ [string]](Impl{}))
+	X(Interface[*F /* ERROR got 1 arguments but 2 type parameters */ [string]](Impl{}))
 }
 
 func X[Q Qer](fs Interface[Q]) {
diff --git a/src/go/types/testdata/fixedbugs/issue50417.go2 b/src/go/types/testdata/fixedbugs/issue50417.go2
index 50487fa..2caef1b 100644
--- a/src/go/types/testdata/fixedbugs/issue50417.go2
+++ b/src/go/types/testdata/fixedbugs/issue50417.go2
@@ -2,6 +2,10 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// Field accesses through type parameters are disabled
+// until we have a more thorough understanding of the
+// implications on the spec. See issue #51576.
+
 package p
 
 type Sf struct {
@@ -9,13 +13,13 @@
 }
 
 func f0[P Sf](p P) {
-        _ = p.f
-        p.f = 0
+        _ = p.f // ERROR p\.f undefined
+        p.f /* ERROR p\.f undefined */ = 0
 }
 
 func f0t[P ~struct{f int}](p P) {
-        _ = p.f
-        p.f = 0
+        _ = p.f // ERROR p\.f undefined
+        p.f /* ERROR p\.f undefined */ = 0
 }
 
 var _ = f0[Sf]
@@ -25,8 +29,8 @@
 var _ = f0t[Sm /* ERROR does not implement */ ]
 
 func f1[P interface{ Sf; m() }](p P) {
-        _ = p.f
-        p.f = 0
+        _ = p.f // ERROR p\.f undefined
+        p.f /* ERROR p\.f undefined */ = 0
         p.m()
 }
 
@@ -44,8 +48,8 @@
 func (Sfm) m() {}
 
 func f2[P interface{ Sfm; m() }](p P) {
-        _ = p.f
-        p.f = 0
+        _ = p.f // ERROR p\.f undefined
+        p.f /* ERROR p\.f undefined */ = 0
         p.m()
 }
 
@@ -56,8 +60,8 @@
 type PSfm *Sfm
 
 func f3[P interface{ PSfm }](p P) {
-        _ = p.f
-        p.f = 0
+        _ = p.f // ERROR p\.f undefined
+        p.f /* ERROR p\.f undefined */ = 0
         p.m /* ERROR type P has no field or method m */ ()
 }
 
diff --git a/src/go/types/testdata/fixedbugs/issue50782.go2 b/src/go/types/testdata/fixedbugs/issue50782.go2
index 8f41b84..fd1ab11 100644
--- a/src/go/types/testdata/fixedbugs/issue50782.go2
+++ b/src/go/types/testdata/fixedbugs/issue50782.go2
@@ -2,6 +2,10 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// Field accesses through type parameters are disabled
+// until we have a more thorough understanding of the
+// implications on the spec. See issue #51576.
+
 package p
 
 // The first example from the issue.
@@ -18,9 +22,12 @@
 // AbsDifference computes the absolute value of the difference of
 // a and b, where the absolute value is determined by the Abs method.
 func absDifference[T numericAbs[T /* ERROR T does not implement Numeric */]](a, b T) T {
-	// TODO: the error below should probably be positioned on the '-'.
-	d := a /* ERROR "invalid operation: operator - not defined" */ .Value - b.Value
-	return d.Abs()
+	// Field accesses are not permitted for now. Keep an error so
+	// we can find and fix this code once the situation changes.
+	return a.Value // ERROR a\.Value undefined
+	// TODO: The error below should probably be positioned on the '-'.
+	// d := a /* ERROR "invalid operation: operator - not defined" */ .Value - b.Value
+	// return d.Abs()
 }
 
 // The second example from the issue.
diff --git a/src/go/types/testdata/fixedbugs/issue50929.go2 b/src/go/types/testdata/fixedbugs/issue50929.go2
index 941dbaa..3629ecf 100644
--- a/src/go/types/testdata/fixedbugs/issue50929.go2
+++ b/src/go/types/testdata/fixedbugs/issue50929.go2
@@ -16,7 +16,7 @@
 
 func _() {
 	// TODO(gri) only report one error below (issue #50932)
-	var x F /* ERROR cannot infer B */ /* ERROR got 1 arguments but 2 type parameters */ [int]
+	var x F /* ERROR got 1 arguments but 2 type parameters */ [int]
 	G(x /* ERROR does not match */)
 }
 
@@ -46,9 +46,9 @@
 	fmt.Println(c)
 }
 
-func MMD[Rc RC /* ERROR cannot infer RG */ /* ERROR got 1 arguments */ [RG], RG any, G any]() M /* ERROR got 2 arguments */ /* ERROR Rc does not match */ [Rc, RG] {
+func MMD[Rc RC /* ERROR got 1 arguments */ [RG], RG any, G any]() M /* ERROR got 2 arguments */ [Rc, RG] {
 
-	var nFn NFn /* ERROR got 2 arguments */ /* ERROR Rc does not match */ [Rc, RG]
+	var nFn NFn /* ERROR got 2 arguments */ [Rc, RG]
 
 	var empty Rc
 	switch any(empty).(type) {
diff --git a/src/go/types/testdata/fixedbugs/issue51229.go2 b/src/go/types/testdata/fixedbugs/issue51229.go2
new file mode 100644
index 0000000..808b647
--- /dev/null
+++ b/src/go/types/testdata/fixedbugs/issue51229.go2
@@ -0,0 +1,164 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+// Constraint type inference should be independent of the
+// ordering of the type parameter declarations. Try all
+// permutations in the test case below.
+// Permutations produced by https://go.dev/play/p/PHcZNGJTEBZ.
+
+func f00[S1 ~[]E1, S2 ~[]E2, E1 ~byte, E2 ~byte](S1, S2) {}
+func f01[S2 ~[]E2, S1 ~[]E1, E1 ~byte, E2 ~byte](S1, S2) {}
+func f02[E1 ~byte, S1 ~[]E1, S2 ~[]E2, E2 ~byte](S1, S2) {}
+func f03[S1 ~[]E1, E1 ~byte, S2 ~[]E2, E2 ~byte](S1, S2) {}
+func f04[S2 ~[]E2, E1 ~byte, S1 ~[]E1, E2 ~byte](S1, S2) {}
+func f05[E1 ~byte, S2 ~[]E2, S1 ~[]E1, E2 ~byte](S1, S2) {}
+func f06[E2 ~byte, S2 ~[]E2, S1 ~[]E1, E1 ~byte](S1, S2) {}
+func f07[S2 ~[]E2, E2 ~byte, S1 ~[]E1, E1 ~byte](S1, S2) {}
+func f08[S1 ~[]E1, E2 ~byte, S2 ~[]E2, E1 ~byte](S1, S2) {}
+func f09[E2 ~byte, S1 ~[]E1, S2 ~[]E2, E1 ~byte](S1, S2) {}
+func f10[S2 ~[]E2, S1 ~[]E1, E2 ~byte, E1 ~byte](S1, S2) {}
+func f11[S1 ~[]E1, S2 ~[]E2, E2 ~byte, E1 ~byte](S1, S2) {}
+func f12[S1 ~[]E1, E1 ~byte, E2 ~byte, S2 ~[]E2](S1, S2) {}
+func f13[E1 ~byte, S1 ~[]E1, E2 ~byte, S2 ~[]E2](S1, S2) {}
+func f14[E2 ~byte, S1 ~[]E1, E1 ~byte, S2 ~[]E2](S1, S2) {}
+func f15[S1 ~[]E1, E2 ~byte, E1 ~byte, S2 ~[]E2](S1, S2) {}
+func f16[E1 ~byte, E2 ~byte, S1 ~[]E1, S2 ~[]E2](S1, S2) {}
+func f17[E2 ~byte, E1 ~byte, S1 ~[]E1, S2 ~[]E2](S1, S2) {}
+func f18[E2 ~byte, E1 ~byte, S2 ~[]E2, S1 ~[]E1](S1, S2) {}
+func f19[E1 ~byte, E2 ~byte, S2 ~[]E2, S1 ~[]E1](S1, S2) {}
+func f20[S2 ~[]E2, E2 ~byte, E1 ~byte, S1 ~[]E1](S1, S2) {}
+func f21[E2 ~byte, S2 ~[]E2, E1 ~byte, S1 ~[]E1](S1, S2) {}
+func f22[E1 ~byte, S2 ~[]E2, E2 ~byte, S1 ~[]E1](S1, S2) {}
+func f23[S2 ~[]E2, E1 ~byte, E2 ~byte, S1 ~[]E1](S1, S2) {}
+
+type myByte byte
+
+func _(a []byte, b []myByte) {
+	f00(a, b)
+	f01(a, b)
+	f02(a, b)
+	f03(a, b)
+	f04(a, b)
+	f05(a, b)
+	f06(a, b)
+	f07(a, b)
+	f08(a, b)
+	f09(a, b)
+	f10(a, b)
+	f11(a, b)
+	f12(a, b)
+	f13(a, b)
+	f14(a, b)
+	f15(a, b)
+	f16(a, b)
+	f17(a, b)
+	f18(a, b)
+	f19(a, b)
+	f20(a, b)
+	f21(a, b)
+	f22(a, b)
+	f23(a, b)
+}
+
+// Constraint type inference may have to iterate.
+// Again, the order of the type parameters shouldn't matter.
+
+func g0[S ~[]E, M ~map[string]S, E any](m M) {}
+func g1[M ~map[string]S, S ~[]E, E any](m M) {}
+func g2[E any, S ~[]E, M ~map[string]S](m M) {}
+func g3[S ~[]E, E any, M ~map[string]S](m M) {}
+func g4[M ~map[string]S, E any, S ~[]E](m M) {}
+func g5[E any, M ~map[string]S, S ~[]E](m M) {}
+
+func _(m map[string][]byte) {
+	g0(m)
+	g1(m)
+	g2(m)
+	g3(m)
+	g4(m)
+	g5(m)
+}
+
+// Worst-case scenario.
+// There are 10 unknown type parameters. In each iteration of
+// constraint type inference we infer one more, from right to left.
+// Each iteration looks repeatedly at all 11 type parameters,
+// requiring a total of 10*11 = 110 iterations with the current
+// implementation. Pathological case.
+
+func h[K any, J ~*K, I ~*J, H ~*I, G ~*H, F ~*G, E ~*F, D ~*E, C ~*D, B ~*C, A ~*B](x A) {}
+
+func _(x **********int) {
+	h(x)
+}
+
+// Examples with channel constraints and tilde.
+
+func ch1[P chan<- int]() (_ P)           { return } // core(P) == chan<- int   (single type, no tilde)
+func ch2[P ~chan int]()                  { return } // core(P) == ~chan<- int  (tilde)
+func ch3[P chan E, E any](E)             { return } // core(P) == chan<- E     (single type, no tilde)
+func ch4[P chan E | ~chan<- E, E any](E) { return } // core(P) == ~chan<- E    (tilde)
+func ch5[P chan int | chan<- int]()      { return } // core(P) == chan<- int   (not a single type)
+
+func _() {
+	// P can be inferred as there's a single specific type and no tilde.
+	var _ chan int = ch1 /* ERROR cannot use ch1.*value of type chan<- int */ ()
+	var _ chan<- int = ch1()
+
+	// P cannot be inferred as there's a tilde.
+	ch2 /* ERROR cannot infer P */ ()
+	type myChan chan int
+	ch2[myChan]()
+
+	// P can be inferred as there's a single specific type and no tilde.
+	var e int
+	ch3(e)
+
+	// P cannot be inferred as there's more than one specific type and a tilde.
+	ch4 /* ERROR cannot infer P */ (e)
+	_ = ch4[chan int]
+
+	// P cannot be inferred as there's more than one specific type.
+	ch5 /* ERROR cannot infer P */ ()
+	ch5[chan<- int]()
+}
+
+// test case from issue
+
+func equal[M1 ~map[K1]V1, M2 ~map[K2]V2, K1, K2 ~uint32, V1, V2 ~string](m1 M1, m2 M2) bool {
+	if len(m1) != len(m2) {
+		return false
+	}
+	for k, v1 := range m1 {
+		if v2, ok := m2[K2(k)]; !ok || V2(v1) != v2 {
+			return false
+		}
+	}
+	return true
+}
+
+func equalFixed[K1, K2 ~uint32, V1, V2 ~string](m1 map[K1]V1, m2 map[K2]V2) bool {
+	if len(m1) != len(m2) {
+		return false
+	}
+	for k, v1 := range m1 {
+		if v2, ok := m2[K2(k)]; !ok || v1 != V1(v2) {
+			return false
+		}
+	}
+	return true
+}
+
+type (
+	someNumericID uint32
+	someStringID  string
+)
+
+func _() {
+	foo := map[uint32]string{10: "bar"}
+	bar := map[someNumericID]someStringID{10: "bar"}
+	equal(foo, bar)
+}
diff --git a/src/go/types/testdata/fixedbugs/issue51232.go2 b/src/go/types/testdata/fixedbugs/issue51232.go2
new file mode 100644
index 0000000..3fa6a05
--- /dev/null
+++ b/src/go/types/testdata/fixedbugs/issue51232.go2
@@ -0,0 +1,30 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type RC[RG any] interface {
+	~[]RG
+}
+
+type Fn[RCT RC[RG], RG any] func(RCT)
+
+type F[RCT RC[RG], RG any] interface {
+	Fn() Fn /* ERROR got 1 arguments */ [RCT]
+}
+
+type concreteF[RCT RC[RG], RG any] struct {
+	makeFn func() Fn /* ERROR got 1 arguments */ [RCT]
+}
+
+func (c *concreteF[RCT, RG]) Fn() Fn /* ERROR got 1 arguments */ [RCT] {
+	return c.makeFn()
+}
+
+func NewConcrete[RCT RC[RG], RG any](Rc RCT) F /* ERROR got 1 arguments */ [RCT] {
+	// TODO(rfindley): eliminate the duplicate error below.
+	return & /* ERROR cannot use .* as F\[RCT\] */ concreteF /* ERROR got 1 arguments */ [RCT]{
+		makeFn: nil,
+	}
+}
diff --git a/src/go/types/testdata/fixedbugs/issue51233.go2 b/src/go/types/testdata/fixedbugs/issue51233.go2
new file mode 100644
index 0000000..9c15028
--- /dev/null
+++ b/src/go/types/testdata/fixedbugs/issue51233.go2
@@ -0,0 +1,27 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+// As of issue #51527, type-type inference has been disabled.
+
+type RC[RG any] interface {
+	~[]RG
+}
+
+type Fn[RCT RC[RG], RG any] func(RCT)
+
+type FFn[RCT RC[RG], RG any] func() Fn /* ERROR got 1 arguments */ [RCT]
+
+type F[RCT RC[RG], RG any] interface {
+	Fn() Fn /* ERROR got 1 arguments */ [RCT]
+}
+
+type concreteF[RCT RC[RG], RG any] struct {
+	makeFn FFn /* ERROR got 1 arguments */ [RCT]
+}
+
+func (c *concreteF[RCT, RG]) Fn() Fn /* ERROR got 1 arguments */ [RCT] {
+	return c.makeFn()
+}
diff --git a/src/go/types/testdata/fixedbugs/issue51257.go2 b/src/go/types/testdata/fixedbugs/issue51257.go2
new file mode 100644
index 0000000..8a3eb32
--- /dev/null
+++ b/src/go/types/testdata/fixedbugs/issue51257.go2
@@ -0,0 +1,46 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+func f[_ comparable]() {}
+
+type S1 struct{ x int }
+type S2 struct{ x any }
+type S3 struct{ x [10]interface{ m() } }
+
+func _[P1 comparable, P2 S2]() {
+	_ = f[S1]
+	_ = f[S2 /* ERROR S2 does not implement comparable */ ]
+	_ = f[S3 /* ERROR S3 does not implement comparable */ ]
+
+	type L1 struct { x P1 }
+	type L2 struct { x P2 }
+	_ = f[L1]
+	_ = f[L2 /* ERROR L2 does not implement comparable */ ]
+}
+
+
+// example from issue
+
+type Set[T comparable] map[T]struct{}
+
+func NewSetFromSlice[T comparable](items []T) *Set[T] {
+	s := Set[T]{}
+
+	for _, item := range items {
+		s[item] = struct{}{}
+	}
+
+	return &s
+}
+
+type T struct{ x any }
+
+func main() {
+	NewSetFromSlice /* ERROR T does not implement comparable */ ([]T{
+		{"foo"},
+		{5},
+	})
+}
diff --git a/src/go/types/testdata/fixedbugs/issue51335.go2 b/src/go/types/testdata/fixedbugs/issue51335.go2
new file mode 100644
index 0000000..0b5a1af
--- /dev/null
+++ b/src/go/types/testdata/fixedbugs/issue51335.go2
@@ -0,0 +1,16 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type S1 struct{}
+type S2 struct{}
+
+func _[P *S1|*S2]() {
+	_= []P{{ /* ERROR invalid composite literal element type P: no core type */ }}
+}
+
+func _[P *S1|S1]() {
+	_= []P{{ /* ERROR invalid composite literal element type P: no core type */ }}
+}
diff --git a/src/go/types/testdata/fixedbugs/issue51339.go2 b/src/go/types/testdata/fixedbugs/issue51339.go2
new file mode 100644
index 0000000..38f8610
--- /dev/null
+++ b/src/go/types/testdata/fixedbugs/issue51339.go2
@@ -0,0 +1,18 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file is tested when running "go test -run Manual"
+// without source arguments. Use for one-off debugging.
+
+package p
+
+type T[P any, B *P] struct{}
+
+func (T /* ERROR cannot use generic type */ ) m0() {}
+
+// TODO(rfindley): eliminate the duplicate errors here.
+func (/* ERROR got 1 type parameter, but receiver base type declares 2 */ T /* ERROR got 1 arguments but 2 type parameters */ [_]) m1() {}
+func (T[_, _]) m2() {}
+// TODO(gri) this error is unfortunate (issue #51343)
+func (T /* ERROR got 3 arguments but 2 type parameters */ [_, _, _]) m3() {}
diff --git a/src/go/types/testdata/fixedbugs/issue51360.go b/src/go/types/testdata/fixedbugs/issue51360.go
new file mode 100644
index 0000000..fe3de04
--- /dev/null
+++ b/src/go/types/testdata/fixedbugs/issue51360.go
@@ -0,0 +1,13 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+func _() {
+	len.Println /* ERROR cannot select on len */
+	len.Println /* ERROR cannot select on len */ ()
+	_ = len.Println /* ERROR cannot select on len */
+	_ = len /* ERROR cannot index len */ [0]
+	_ = *len /* ERROR cannot indirect len */
+}
diff --git a/src/go/types/testdata/fixedbugs/issue51376.go2 b/src/go/types/testdata/fixedbugs/issue51376.go2
new file mode 100644
index 0000000..d51607b
--- /dev/null
+++ b/src/go/types/testdata/fixedbugs/issue51376.go2
@@ -0,0 +1,24 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type Map map[string]int
+
+func f[M ~map[K]V, K comparable, V any](M) {}
+func g[M map[K]V, K comparable, V any](M) {}
+
+func _[M1 ~map[K]V, M2 map[K]V, K comparable, V any]() {
+        var m1 M1
+        f(m1)
+        g /* ERROR M1 does not implement map\[K\]V */ (m1) // M1 has tilde
+
+        var m2 M2
+        f(m2)
+        g(m2) // M1 does not have tilde
+
+        var m3 Map
+        f(m3)
+        g /* ERROR Map does not implement map\[string\]int */ (m3) // M in g does not have tilde
+}
diff --git a/src/go/types/testdata/fixedbugs/issue51386.go2 b/src/go/types/testdata/fixedbugs/issue51386.go2
new file mode 100644
index 0000000..ef62239
--- /dev/null
+++ b/src/go/types/testdata/fixedbugs/issue51386.go2
@@ -0,0 +1,17 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type myString string
+
+func _[P ~string | ~[]byte | ~[]rune]() {
+	_ = P("")
+	const s myString = ""
+	_ = P(s)
+}
+
+func _[P myString]() {
+	_ = P("")
+}
diff --git a/src/go/types/testdata/fixedbugs/issue51437.go b/src/go/types/testdata/fixedbugs/issue51437.go
new file mode 100644
index 0000000..3762615
--- /dev/null
+++ b/src/go/types/testdata/fixedbugs/issue51437.go
@@ -0,0 +1,17 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type T struct{}
+
+func (T) m() []int { return nil }
+
+func f(x T) {
+	for _, x := range func() []int {
+		return x.m() // x declared in parameter list of f
+	}() {
+		_ = x // x declared by range clause
+	}
+}
diff --git a/src/go/types/testdata/fixedbugs/issue51472.go2 b/src/go/types/testdata/fixedbugs/issue51472.go2
new file mode 100644
index 0000000..3126770
--- /dev/null
+++ b/src/go/types/testdata/fixedbugs/issue51472.go2
@@ -0,0 +1,54 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+func _[T comparable](x T) {
+        _ = x == x
+}
+
+func _[T interface{interface{comparable}}](x T) {
+        _ = x == x
+}
+
+func _[T interface{comparable; interface{comparable}}](x T) {
+        _ = x == x
+}
+
+func _[T interface{comparable; ~int}](x T) {
+        _ = x == x
+}
+
+func _[T interface{comparable; ~[]byte}](x T) {
+        _ = x /* ERROR cannot compare */ == x
+}
+
+// TODO(gri) The error message here should be better. See issue #51525.
+func _[T interface{comparable; ~int; ~string}](x T) {
+        _ = x /* ERROR cannot compare */ == x
+}
+
+// TODO(gri) The error message here should be better. See issue #51525.
+func _[T interface{~int; ~string}](x T) {
+        _ = x /* ERROR cannot compare */ == x
+}
+
+func _[T interface{comparable; interface{~int}; interface{int|float64}}](x T) {
+        _ = x == x
+}
+
+func _[T interface{interface{comparable; ~int}; interface{~float64; comparable; m()}}](x T) {
+        _ = x /* ERROR cannot compare */ == x
+}
+
+// test case from issue
+
+func f[T interface{comparable; []byte|string}](x T) {
+        _ = x == x
+}
+
+func _(s []byte) {
+	f /* ERROR \[\]byte does not implement interface{comparable; \[\]byte\|string} */ (s)
+        _ = f[[ /* ERROR does not implement */ ]byte]
+}
diff --git a/src/go/types/testdata/fixedbugs/issue51509.go b/src/go/types/testdata/fixedbugs/issue51509.go
new file mode 100644
index 0000000..5ae4717
--- /dev/null
+++ b/src/go/types/testdata/fixedbugs/issue51509.go
@@ -0,0 +1,7 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type T /* ERROR illegal cycle */ T.x
diff --git a/src/go/types/testdata/fixedbugs/issue51578.go2 b/src/go/types/testdata/fixedbugs/issue51578.go2
new file mode 100644
index 0000000..5c204ba
--- /dev/null
+++ b/src/go/types/testdata/fixedbugs/issue51578.go2
@@ -0,0 +1,17 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+var _ = (*interface /* ERROR interface contains type constraints */ {int})(nil)
+
+// abbreviated test case from issue
+
+type TypeSet interface{ int | string }
+
+func _() {
+	f((*TypeSet /* ERROR interface contains type constraints */)(nil))
+}
+
+func f(any) {}
\ No newline at end of file
diff --git a/src/go/types/testdata/fixedbugs/issue51593.go2 b/src/go/types/testdata/fixedbugs/issue51593.go2
new file mode 100644
index 0000000..e06c39f
--- /dev/null
+++ b/src/go/types/testdata/fixedbugs/issue51593.go2
@@ -0,0 +1,13 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+func f[P interface{ m(R) }, R any]() {}
+
+type T = interface { m(int) }
+
+func _() {
+	_ = f /* ERROR cannot infer R */ [T] // don't crash in type inference
+}
diff --git a/src/go/types/type.go b/src/go/types/type.go
index 323365a..1306375 100644
--- a/src/go/types/type.go
+++ b/src/go/types/type.go
@@ -7,9 +7,7 @@
 // A Type represents a type of Go.
 // All types implement the Type interface.
 type Type interface {
-	// Underlying returns the underlying type of a type
-	// w/o following forwarding chains. Only used by
-	// client packages.
+	// Underlying returns the underlying type of a type.
 	Underlying() Type
 
 	// String returns a string representation of a type.
diff --git a/src/go/types/typeparam.go b/src/go/types/typeparam.go
index 71e6861..40d96ac 100644
--- a/src/go/types/typeparam.go
+++ b/src/go/types/typeparam.go
@@ -30,11 +30,13 @@
 // or Signature type by calling SetTypeParams. Setting a type parameter on more
 // than one type will result in a panic.
 //
-// The constraint argument can be nil, and set later via SetConstraint.
+// The constraint argument can be nil, and set later via SetConstraint. If the
+// constraint is non-nil, it must be fully defined.
 func NewTypeParam(obj *TypeName, constraint Type) *TypeParam {
 	return (*Checker)(nil).newTypeParam(obj, constraint)
 }
 
+// check may be nil
 func (check *Checker) newTypeParam(obj *TypeName, constraint Type) *TypeParam {
 	// Always increment lastID, even if it is not used.
 	id := nextID()
@@ -49,9 +51,7 @@
 	// iface may mutate typ.bound, so we must ensure that iface() is called
 	// at least once before the resulting TypeParam escapes.
 	if check != nil {
-		check.later(func() {
-			typ.iface()
-		})
+		check.needsCleanup(typ)
 	} else if constraint != nil {
 		typ.iface()
 	}
@@ -74,8 +74,10 @@
 
 // SetConstraint sets the type constraint for t.
 //
-// SetConstraint should not be called concurrently, but once SetConstraint
-// returns the receiver t is safe for concurrent use.
+// It must be called by users of NewTypeParam after the bound's underlying is
+// fully defined, and before using the type parameter in any way other than to
+// form other types. Once SetConstraint returns the receiver, t is safe for
+// concurrent use.
 func (t *TypeParam) SetConstraint(bound Type) {
 	if bound == nil {
 		panic("nil constraint")
@@ -95,9 +97,12 @@
 // ----------------------------------------------------------------------------
 // Implementation
 
+func (t *TypeParam) cleanup() {
+	t.iface()
+	t.check = nil
+}
+
 // iface returns the constraint interface of t.
-// TODO(gri) If we make tparamIsIface the default, this should be renamed to under
-//           (similar to Named.under).
 func (t *TypeParam) iface() *Interface {
 	bound := t.bound
 
@@ -138,16 +143,6 @@
 	return ityp
 }
 
-// singleType returns the single type of the type parameter constraint; or nil.
-func (t *TypeParam) singleType() Type {
-	return t.iface().typeSet().singleType()
-}
-
-// hasTerms reports whether the type parameter constraint has specific type terms.
-func (t *TypeParam) hasTerms() bool {
-	return t.iface().typeSet().hasTerms()
-}
-
 // is calls f with the specific type terms of t's constraint and reports whether
 // all calls to f returned true. If there are no specific terms, is
 // returns the result of f(nil).
diff --git a/src/go/types/typeset.go b/src/go/types/typeset.go
index e1f7301..6603383 100644
--- a/src/go/types/typeset.go
+++ b/src/go/types/typeset.go
@@ -15,18 +15,25 @@
 // API
 
 // A _TypeSet represents the type set of an interface.
+// Because of existing language restrictions, methods can be "factored out"
+// from the terms. The actual type set is the intersection of the type set
+// implied by the methods and the type set described by the terms and the
+// comparable bit. To test whether a type is included in a type set
+// ("implements" relation), the type must implement all methods _and_ be
+// an element of the type set described by the terms and the comparable bit.
+// If the term list describes the set of all types and comparable is true,
+// only comparable types are meant; in all other cases comparable is false.
 type _TypeSet struct {
-	comparable bool // if set, the interface is or embeds comparable
-	// TODO(gri) consider using a set for the methods for faster lookup
-	methods []*Func  // all methods of the interface; sorted by unique ID
-	terms   termlist // type terms of the type set
+	methods    []*Func  // all methods of the interface; sorted by unique ID
+	terms      termlist // type terms of the type set
+	comparable bool     // invariant: !comparable || terms.isAll()
 }
 
 // IsEmpty reports whether type set s is the empty set.
 func (s *_TypeSet) IsEmpty() bool { return s.terms.isEmpty() }
 
 // IsAll reports whether type set s is the set of all types (corresponding to the empty interface).
-func (s *_TypeSet) IsAll() bool { return !s.comparable && len(s.methods) == 0 && s.terms.isAll() }
+func (s *_TypeSet) IsAll() bool { return s.IsMethodSet() && len(s.methods) == 0 }
 
 // IsMethodSet reports whether the interface t is fully described by its method set.
 func (s *_TypeSet) IsMethodSet() bool { return !s.comparable && s.terms.isAll() }
@@ -37,17 +44,10 @@
 		return s.comparable
 	}
 	return s.is(func(t *term) bool {
-		return t != nil && comparable(t.typ, seen, nil)
+		return t != nil && comparable(t.typ, false, seen, nil)
 	})
 }
 
-// TODO(gri) IsTypeSet is not a great name for this predicate. Find a better one.
-
-// IsTypeSet reports whether the type set s is represented by a finite set of underlying types.
-func (s *_TypeSet) IsTypeSet() bool {
-	return !s.comparable && len(s.methods) == 0
-}
-
 // NumMethods returns the number of methods available.
 func (s *_TypeSet) NumMethods() int { return len(s.methods) }
 
@@ -101,9 +101,6 @@
 // hasTerms reports whether the type set has specific type terms.
 func (s *_TypeSet) hasTerms() bool { return !s.terms.isEmpty() && !s.terms.isAll() }
 
-// singleType returns the single type in s if there is exactly one; otherwise the result is nil.
-func (s *_TypeSet) singleType() Type { return s.terms.singleType() }
-
 // subsetOf reports whether s1 ⊆ s2.
 func (s1 *_TypeSet) subsetOf(s2 *_TypeSet) bool { return s1.terms.subsetOf(s2.terms) }
 
@@ -220,12 +217,12 @@
 
 	var todo []*Func
 	var seen objset
-	var methods []*Func
+	var allMethods []*Func
 	mpos := make(map[*Func]token.Pos) // method specification or method embedding position, for good error messages
 	addMethod := func(pos token.Pos, m *Func, explicit bool) {
 		switch other := seen.insert(m); {
 		case other == nil:
-			methods = append(methods, m)
+			allMethods = append(allMethods, m)
 			mpos[m] = pos
 		case explicit:
 			if check == nil {
@@ -260,7 +257,8 @@
 	}
 
 	// collect embedded elements
-	var allTerms = allTermlist
+	allTerms := allTermlist
+	allComparable := false
 	for i, typ := range ityp.embeddeds {
 		// The embedding position is nil for imported interfaces
 		// and also for interface copies after substitution (but
@@ -269,6 +267,7 @@
 		if ityp.embedPos != nil {
 			pos = (*ityp.embedPos)[i]
 		}
+		var comparable bool
 		var terms termlist
 		switch u := under(typ).(type) {
 		case *Interface:
@@ -280,9 +279,7 @@
 				check.errorf(atPos(pos), _UnsupportedFeature, "embedding constraint interface %s requires go1.18 or later", typ)
 				continue
 			}
-			if tset.comparable {
-				ityp.tset.comparable = true
-			}
+			comparable = tset.comparable
 			for _, m := range tset.methods {
 				addMethod(pos, m, false) // use embedding position pos rather than m.pos
 			}
@@ -296,6 +293,8 @@
 			if tset == &invalidTypeSet {
 				continue // ignore invalid unions
 			}
+			assert(!tset.comparable)
+			assert(len(tset.methods) == 0)
 			terms = tset.terms
 		default:
 			if u == Typ[Invalid] {
@@ -307,11 +306,11 @@
 			}
 			terms = termlist{{false, typ}}
 		}
-		// The type set of an interface is the intersection
-		// of the type sets of all its elements.
-		// Intersection cannot produce longer termlists and
-		// thus cannot overflow.
-		allTerms = allTerms.intersect(terms)
+
+		// The type set of an interface is the intersection of the type sets of all its elements.
+		// Due to language restrictions, only embedded interfaces can add methods, they are handled
+		// separately. Here we only need to intersect the term lists and comparable bits.
+		allTerms, allComparable = intersectTermLists(allTerms, allComparable, terms, comparable)
 	}
 	ityp.embedPos = nil // not needed anymore (errors have been reported)
 
@@ -324,15 +323,46 @@
 		}
 	}
 
-	if methods != nil {
-		sort.Sort(byUniqueMethodName(methods))
-		ityp.tset.methods = methods
+	ityp.tset.comparable = allComparable
+	if len(allMethods) != 0 {
+		sortMethods(allMethods)
+		ityp.tset.methods = allMethods
 	}
 	ityp.tset.terms = allTerms
 
 	return ityp.tset
 }
 
+// TODO(gri) The intersectTermLists function belongs to the termlist implementation.
+//           The comparable type set may also be best represented as a term (using
+//           a special type).
+
+// intersectTermLists computes the intersection of two term lists and respective comparable bits.
+// xcomp, ycomp are valid only if xterms.isAll() and yterms.isAll() respectively.
+func intersectTermLists(xterms termlist, xcomp bool, yterms termlist, ycomp bool) (termlist, bool) {
+	terms := xterms.intersect(yterms)
+	// If one of xterms or yterms is marked as comparable,
+	// the result must only include comparable types.
+	comp := xcomp || ycomp
+	if comp && !terms.isAll() {
+		// only keep comparable terms
+		i := 0
+		for _, t := range terms {
+			assert(t.typ != nil)
+			if Comparable(t.typ) {
+				terms[i] = t
+				i++
+			}
+		}
+		terms = terms[:i]
+		if !terms.isAll() {
+			comp = false
+		}
+	}
+	assert(!comp || terms.isAll()) // comparable invariant
+	return terms, comp
+}
+
 func sortMethods(list []*Func) {
 	sort.Sort(byUniqueMethodName(list))
 }
diff --git a/src/go/types/typeset_test.go b/src/go/types/typeset_test.go
index 1c0eece..2bbe611 100644
--- a/src/go/types/typeset_test.go
+++ b/src/go/types/typeset_test.go
@@ -26,9 +26,9 @@
 		"{int; string}": "∅",
 
 		"{comparable}":              "{comparable}",
-		"{comparable; int}":         "{comparable; int}",
-		"{~int; comparable}":        "{comparable; ~int}",
-		"{int|string; comparable}":  "{comparable; int ∪ string}",
+		"{comparable; int}":         "{int}",
+		"{~int; comparable}":        "{~int}",
+		"{int|string; comparable}":  "{int ∪ string}",
 		"{comparable; int; string}": "∅",
 
 		"{m()}":                         "{func (p.T).m()}",
@@ -38,8 +38,8 @@
 		"{m1(); comparable; m2() int }": "{comparable; func (p.T).m1(); func (p.T).m2() int}",
 		"{comparable; error}":           "{comparable; func (error).Error() string}",
 
-		"{m(); comparable; int|float32|string}": "{comparable; func (p.T).m(); int ∪ float32 ∪ string}",
-		"{m1(); int; m2(); comparable }":        "{comparable; func (p.T).m1(); func (p.T).m2(); int}",
+		"{m(); comparable; int|float32|string}": "{func (p.T).m(); int ∪ float32 ∪ string}",
+		"{m1(); int; m2(); comparable }":        "{func (p.T).m1(); func (p.T).m2(); int}",
 
 		"{E}; type E interface{}":           "𝓤",
 		"{E}; type E interface{int;string}": "∅",
diff --git a/src/go/types/typexpr.go b/src/go/types/typexpr.go
index db6a904..5bb2d8f 100644
--- a/src/go/types/typexpr.go
+++ b/src/go/types/typexpr.go
@@ -144,10 +144,16 @@
 // constraint interface.
 func (check *Checker) varType(e ast.Expr) Type {
 	typ := check.definedType(e, nil)
+	check.validVarType(e, typ)
+	return typ
+}
 
+// validVarType reports an error if typ is a constraint interface.
+// The expression e is used for error reporting, if any.
+func (check *Checker) validVarType(e ast.Expr, typ Type) {
 	// If we have a type parameter there's nothing to do.
 	if isTypeParam(typ) {
-		return typ
+		return
 	}
 
 	// We don't want to call under() or complete interfaces while we are in
@@ -165,8 +171,6 @@
 			}
 		}
 	})
-
-	return typ
 }
 
 // definedType is like typ but also accepts a type name def.
@@ -254,7 +258,7 @@
 
 	case *ast.SelectorExpr:
 		var x operand
-		check.selector(&x, e)
+		check.selector(&x, e, def)
 
 		switch x.mode {
 		case typexpr:
@@ -323,7 +327,7 @@
 		return typ
 
 	case *ast.InterfaceType:
-		typ := new(Interface)
+		typ := check.newInterface()
 		def.setUnderlying(typ)
 		if def != nil {
 			typ.obj = def.obj
@@ -415,10 +419,14 @@
 	// evaluate arguments
 	targs := check.typeList(ix.Indices)
 	if targs == nil {
-		def.setUnderlying(Typ[Invalid]) // avoid later errors due to lazy instantiation
+		def.setUnderlying(Typ[Invalid]) // avoid errors later due to lazy instantiation
 		return Typ[Invalid]
 	}
 
+	// enableTypeTypeInference controls whether to infer missing type arguments
+	// using constraint type inference. See issue #51527.
+	const enableTypeTypeInference = false
+
 	// create the instance
 	ctxt := check.bestContext(nil)
 	h := ctxt.instanceHash(orig, targs)
@@ -438,19 +446,18 @@
 	def.setUnderlying(inst)
 
 	inst.resolver = func(ctxt *Context, n *Named) (*TypeParamList, Type, *methodList) {
-		tparams := orig.TypeParams().list()
+		tparams := n.orig.TypeParams().list()
 
-		inferred := targs
-		if len(targs) < len(tparams) {
+		targs := n.targs.list()
+		if enableTypeTypeInference && len(targs) < len(tparams) {
 			// If inference fails, len(inferred) will be 0, and inst.underlying will
 			// be set to Typ[Invalid] in expandNamed.
-			inferred = check.infer(ix.Orig, tparams, targs, nil, nil)
+			inferred := check.infer(ix.Orig, tparams, targs, nil, nil)
 			if len(inferred) > len(targs) {
-				inst.targs = newTypeList(inferred)
+				n.targs = newTypeList(inferred)
 			}
 		}
 
-		check.recordInstance(ix.Orig, inferred, inst)
 		return expandNamed(ctxt, n, pos)
 	}
 
@@ -463,6 +470,7 @@
 		// Since check is non-nil, we can still mutate inst. Unpinning the resolver
 		// frees some memory.
 		inst.resolver = nil
+		check.recordInstance(ix.Orig, inst.TypeArgs().list(), inst)
 
 		if check.validateTArgLen(pos, inst.tparams.Len(), inst.targs.Len()) {
 			if i, err := check.verify(pos, inst.tparams.list(), inst.targs.list()); err != nil {
diff --git a/src/go/types/unify.go b/src/go/types/unify.go
index ac904d6..7b9aeee 100644
--- a/src/go/types/unify.go
+++ b/src/go/types/unify.go
@@ -247,6 +247,17 @@
 	}
 }
 
+// unknowns returns the number of type parameters for which no type has been set yet.
+func (d *tparamsList) unknowns() int {
+	n := 0
+	for _, ti := range d.indices {
+		if ti <= 0 {
+			n++
+		}
+	}
+	return n
+}
+
 // types returns the list of inferred types (via unification) for the type parameters
 // described by d, and an index. If all types were inferred, the returned index is < 0.
 // Otherwise, it is the index of the first type parameter which couldn't be inferred;
@@ -349,12 +360,16 @@
 	if enableCoreTypeUnification && !u.exact {
 		if isTypeParam(x) && !hasName(y) {
 			// When considering the type parameter for unification
-			// we look at the adjusted core type (adjCoreType).
+			// we look at the adjusted core term (adjusted core type
+			// with tilde information).
 			// If the adjusted core type is a named type N; the
 			// corresponding core type is under(N). Since !u.exact
 			// and y doesn't have a name, unification will end up
 			// comparing under(N) to y, so we can just use the core
-			// type instead. Optimization.
+			// type instead. And we can ignore the tilde because we
+			// already look at the underlying types on both sides
+			// and we have known types on both sides.
+			// Optimization.
 			if cx := coreType(x); cx != nil {
 				if traceInference {
 					u.tracef("core %s ≡ %s", x, y)
diff --git a/src/go/types/union.go b/src/go/types/union.go
index 9c59279..8397d65 100644
--- a/src/go/types/union.go
+++ b/src/go/types/union.go
@@ -103,25 +103,27 @@
 
 				if !Identical(u, t.typ) {
 					check.errorf(tlist[i], _InvalidUnion, "invalid use of ~ (underlying type of %s is %s)", t.typ, u)
-					continue // don't report another error for t
+					continue
 				}
 			}
 
 			// Stand-alone embedded interfaces are ok and are handled by the single-type case
 			// in the beginning. Embedded interfaces with tilde are excluded above. If we reach
-			// here, we must have at least two terms in the union.
-			if f != nil && !f.typeSet().IsTypeSet() {
+			// here, we must have at least two terms in the syntactic term list (but not necessarily
+			// in the term list of the union's type set).
+			if f != nil {
+				tset := f.typeSet()
 				switch {
-				case f.typeSet().NumMethods() != 0:
+				case tset.NumMethods() != 0:
 					check.errorf(tlist[i], _InvalidUnion, "cannot use %s in union (%s contains methods)", t, t)
+					continue
 				case t.typ == universeComparable.Type():
 					check.error(tlist[i], _InvalidUnion, "cannot use comparable in union")
-				case f.typeSet().comparable:
+					continue
+				case tset.comparable:
 					check.errorf(tlist[i], _InvalidUnion, "cannot use %s in union (%s embeds comparable)", t, t)
-				default:
-					panic("not a type set but no methods and not comparable")
+					continue
 				}
-				continue // don't report another error for t
 			}
 
 			// Report overlapping (non-disjoint) terms such as
diff --git a/src/go/types/universe.go b/src/go/types/universe.go
index 3421634..303ada4 100644
--- a/src/go/types/universe.go
+++ b/src/go/types/universe.go
@@ -112,7 +112,7 @@
 		typ := NewNamed(obj, nil, nil)
 
 		// interface{} // marked as comparable
-		ityp := &Interface{obj: obj, complete: true, tset: &_TypeSet{true, nil, allTermlist}}
+		ityp := &Interface{obj: obj, complete: true, tset: &_TypeSet{nil, allTermlist, true}}
 
 		typ.SetUnderlying(ityp)
 		def(obj)
diff --git a/src/go/types/validtype.go b/src/go/types/validtype.go
index c4ec2f2..7d7029b 100644
--- a/src/go/types/validtype.go
+++ b/src/go/types/validtype.go
@@ -79,7 +79,7 @@
 			// would have reported a type cycle and couldn't have been
 			// imported in the first place.
 			assert(t.obj.pkg == check.pkg)
-			t.underlying = Typ[Invalid] // t is in the current package (no race possibilty)
+			t.underlying = Typ[Invalid] // t is in the current package (no race possibility)
 			// Find the starting point of the cycle and report it.
 			for i, tn := range path {
 				if tn == t.obj {
diff --git a/src/internal/buildcfg/zbootstrap.go b/src/internal/buildcfg/zbootstrap.go
index 471b6ac..d710914 100644
--- a/src/internal/buildcfg/zbootstrap.go
+++ b/src/internal/buildcfg/zbootstrap.go
@@ -13,6 +13,6 @@
 const defaultGOEXPERIMENT = ``
 const defaultGO_EXTLINK_ENABLED = ``
 const defaultGO_LDSO = `/lib64/ld-linux-x86-64.so.2`
-const version = `go1.18rc1`
+const version = `go1.18`
 const defaultGOOS = runtime.GOOS
 const defaultGOARCH = runtime.GOARCH
diff --git a/src/internal/fuzz/coverage.go b/src/internal/fuzz/coverage.go
index 3dee73b..88f98a1 100644
--- a/src/internal/fuzz/coverage.go
+++ b/src/internal/fuzz/coverage.go
@@ -66,6 +66,17 @@
 	return n
 }
 
+// isCoverageSubset returns true if all the base coverage bits are set in
+// snapshot
+func isCoverageSubset(base, snapshot []byte) bool {
+	for i, v := range base {
+		if v&snapshot[i] != v {
+			return false
+		}
+	}
+	return true
+}
+
 // hasCoverageBit returns true if snapshot has at least one bit set that is
 // also set in base.
 func hasCoverageBit(base, snapshot []byte) bool {
diff --git a/src/internal/fuzz/encoding.go b/src/internal/fuzz/encoding.go
index 2bfa02b..c95d9e0 100644
--- a/src/internal/fuzz/encoding.go
+++ b/src/internal/fuzz/encoding.go
@@ -10,7 +10,9 @@
 	"go/ast"
 	"go/parser"
 	"go/token"
+	"math"
 	"strconv"
+	"unicode/utf8"
 )
 
 // encVersion1 will be the first line of a file with version 1 encoding.
@@ -27,13 +29,64 @@
 	// instead of changing to byte and rune respectively.
 	for _, val := range vals {
 		switch t := val.(type) {
-		case int, int8, int16, int64, uint, uint16, uint32, uint64, float32, float64, bool:
+		case int, int8, int16, int64, uint, uint16, uint32, uint64, bool:
 			fmt.Fprintf(b, "%T(%v)\n", t, t)
+		case float32:
+			if math.IsNaN(float64(t)) && math.Float32bits(t) != math.Float32bits(float32(math.NaN())) {
+				// We encode unusual NaNs as hex values, because that is how users are
+				// likely to encounter them in literature about floating-point encoding.
+				// This allows us to reproduce fuzz failures that depend on the specific
+				// NaN representation (for float32 there are about 2^24 possibilities!),
+				// not just the fact that the value is *a* NaN.
+				//
+				// Note that the specific value of float32(math.NaN()) can vary based on
+				// whether the architecture represents signaling NaNs using a low bit
+				// (as is common) or a high bit (as commonly implemented on MIPS
+				// hardware before around 2012). We believe that the increase in clarity
+				// from identifying "NaN" with math.NaN() is worth the slight ambiguity
+				// from a platform-dependent value.
+				fmt.Fprintf(b, "math.Float32frombits(0x%x)\n", math.Float32bits(t))
+			} else {
+				// We encode all other values — including the NaN value that is
+				// bitwise-identical to float32(math.Nan()) — using the default
+				// formatting, which is equivalent to strconv.FormatFloat with format
+				// 'g' and can be parsed by strconv.ParseFloat.
+				//
+				// For an ordinary floating-point number this format includes
+				// sufficiently many digits to reconstruct the exact value. For positive
+				// or negative infinity it is the string "+Inf" or "-Inf". For positive
+				// or negative zero it is "0" or "-0". For NaN, it is the string "NaN".
+				fmt.Fprintf(b, "%T(%v)\n", t, t)
+			}
+		case float64:
+			if math.IsNaN(t) && math.Float64bits(t) != math.Float64bits(math.NaN()) {
+				fmt.Fprintf(b, "math.Float64frombits(0x%x)\n", math.Float64bits(t))
+			} else {
+				fmt.Fprintf(b, "%T(%v)\n", t, t)
+			}
 		case string:
 			fmt.Fprintf(b, "string(%q)\n", t)
 		case rune: // int32
-			fmt.Fprintf(b, "rune(%q)\n", t)
+			// Although rune and int32 are represented by the same type, only a subset
+			// of valid int32 values can be expressed as rune literals. Notably,
+			// negative numbers, surrogate halves, and values above unicode.MaxRune
+			// have no quoted representation.
+			//
+			// fmt with "%q" (and the corresponding functions in the strconv package)
+			// would quote out-of-range values to the Unicode replacement character
+			// instead of the original value (see https://go.dev/issue/51526), so
+			// they must be treated as int32 instead.
+			//
+			// We arbitrarily draw the line at UTF-8 validity, which biases toward the
+			// "rune" interpretation. (However, we accept either format as input.)
+			if utf8.ValidRune(t) {
+				fmt.Fprintf(b, "rune(%q)\n", t)
+			} else {
+				fmt.Fprintf(b, "int32(%v)\n", t)
+			}
 		case byte: // uint8
+			// For bytes, we arbitrarily prefer the character interpretation.
+			// (Every byte has a valid character encoding.)
 			fmt.Fprintf(b, "byte(%q)\n", t)
 		case []byte: // []uint8
 			fmt.Fprintf(b, "[]byte(%q)\n", t)
@@ -105,44 +158,78 @@
 		return []byte(s), nil
 	}
 
-	idType, ok := call.Fun.(*ast.Ident)
-	if !ok {
-		return nil, fmt.Errorf("expected []byte or primitive type")
-	}
-	if idType.Name == "bool" {
-		id, ok := arg.(*ast.Ident)
+	var idType *ast.Ident
+	if selector, ok := call.Fun.(*ast.SelectorExpr); ok {
+		xIdent, ok := selector.X.(*ast.Ident)
+		if !ok || xIdent.Name != "math" {
+			return nil, fmt.Errorf("invalid selector type")
+		}
+		switch selector.Sel.Name {
+		case "Float64frombits":
+			idType = &ast.Ident{Name: "float64-bits"}
+		case "Float32frombits":
+			idType = &ast.Ident{Name: "float32-bits"}
+		default:
+			return nil, fmt.Errorf("invalid selector type")
+		}
+	} else {
+		idType, ok = call.Fun.(*ast.Ident)
 		if !ok {
-			return nil, fmt.Errorf("malformed bool")
+			return nil, fmt.Errorf("expected []byte or primitive type")
 		}
-		if id.Name == "true" {
-			return true, nil
-		} else if id.Name == "false" {
-			return false, nil
-		} else {
-			return nil, fmt.Errorf("true or false required for type bool")
+		if idType.Name == "bool" {
+			id, ok := arg.(*ast.Ident)
+			if !ok {
+				return nil, fmt.Errorf("malformed bool")
+			}
+			if id.Name == "true" {
+				return true, nil
+			} else if id.Name == "false" {
+				return false, nil
+			} else {
+				return nil, fmt.Errorf("true or false required for type bool")
+			}
 		}
 	}
+
 	var (
 		val  string
 		kind token.Token
 	)
 	if op, ok := arg.(*ast.UnaryExpr); ok {
-		// Special case for negative numbers.
-		lit, ok := op.X.(*ast.BasicLit)
-		if !ok || (lit.Kind != token.INT && lit.Kind != token.FLOAT) {
+		switch lit := op.X.(type) {
+		case *ast.BasicLit:
+			if op.Op != token.SUB {
+				return nil, fmt.Errorf("unsupported operation on int/float: %v", op.Op)
+			}
+			// Special case for negative numbers.
+			val = op.Op.String() + lit.Value // e.g. "-" + "124"
+			kind = lit.Kind
+		case *ast.Ident:
+			if lit.Name != "Inf" {
+				return nil, fmt.Errorf("expected operation on int or float type")
+			}
+			if op.Op == token.SUB {
+				val = "-Inf"
+			} else {
+				val = "+Inf"
+			}
+			kind = token.FLOAT
+		default:
 			return nil, fmt.Errorf("expected operation on int or float type")
 		}
-		if op.Op != token.SUB {
-			return nil, fmt.Errorf("unsupported operation on int: %v", op.Op)
-		}
-		val = op.Op.String() + lit.Value // e.g. "-" + "124"
-		kind = lit.Kind
 	} else {
-		lit, ok := arg.(*ast.BasicLit)
-		if !ok {
+		switch lit := arg.(type) {
+		case *ast.BasicLit:
+			val, kind = lit.Value, lit.Kind
+		case *ast.Ident:
+			if lit.Name != "NaN" {
+				return nil, fmt.Errorf("literal value required for primitive type")
+			}
+			val, kind = "NaN", token.FLOAT
+		default:
 			return nil, fmt.Errorf("literal value required for primitive type")
 		}
-		val, kind = lit.Value, lit.Kind
 	}
 
 	switch typ := idType.Name; typ {
@@ -152,6 +239,14 @@
 		}
 		return strconv.Unquote(val)
 	case "byte", "rune":
+		if kind == token.INT {
+			switch typ {
+			case "rune":
+				return parseInt(val, typ)
+			case "byte":
+				return parseUint(val, typ)
+			}
+		}
 		if kind != token.CHAR {
 			return nil, fmt.Errorf("character literal required for byte/rune types")
 		}
@@ -191,6 +286,24 @@
 			return nil, fmt.Errorf("float or integer literal required for float64 type")
 		}
 		return strconv.ParseFloat(val, 64)
+	case "float32-bits":
+		if kind != token.INT {
+			return nil, fmt.Errorf("integer literal required for math.Float32frombits type")
+		}
+		bits, err := parseUint(val, "uint32")
+		if err != nil {
+			return nil, err
+		}
+		return math.Float32frombits(bits.(uint32)), nil
+	case "float64-bits":
+		if kind != token.FLOAT && kind != token.INT {
+			return nil, fmt.Errorf("integer literal required for math.Float64frombits type")
+		}
+		bits, err := parseUint(val, "uint64")
+		if err != nil {
+			return nil, err
+		}
+		return math.Float64frombits(bits.(uint64)), nil
 	default:
 		return nil, fmt.Errorf("expected []byte or primitive type")
 	}
@@ -200,18 +313,24 @@
 func parseInt(val, typ string) (any, error) {
 	switch typ {
 	case "int":
-		return strconv.Atoi(val)
+		// The int type may be either 32 or 64 bits. If 32, the fuzz tests in the
+		// corpus may include 64-bit values produced by fuzzing runs on 64-bit
+		// architectures. When running those tests, we implicitly wrap the values to
+		// fit in a regular int. (The test case is still “interesting”, even if the
+		// specific values of its inputs are platform-dependent.)
+		i, err := strconv.ParseInt(val, 0, 64)
+		return int(i), err
 	case "int8":
-		i, err := strconv.ParseInt(val, 10, 8)
+		i, err := strconv.ParseInt(val, 0, 8)
 		return int8(i), err
 	case "int16":
-		i, err := strconv.ParseInt(val, 10, 16)
+		i, err := strconv.ParseInt(val, 0, 16)
 		return int16(i), err
-	case "int32":
-		i, err := strconv.ParseInt(val, 10, 32)
+	case "int32", "rune":
+		i, err := strconv.ParseInt(val, 0, 32)
 		return int32(i), err
 	case "int64":
-		return strconv.ParseInt(val, 10, 64)
+		return strconv.ParseInt(val, 0, 64)
 	default:
 		panic("unreachable")
 	}
@@ -221,19 +340,19 @@
 func parseUint(val, typ string) (any, error) {
 	switch typ {
 	case "uint":
-		i, err := strconv.ParseUint(val, 10, 0)
+		i, err := strconv.ParseUint(val, 0, 64)
 		return uint(i), err
-	case "uint8":
-		i, err := strconv.ParseUint(val, 10, 8)
+	case "uint8", "byte":
+		i, err := strconv.ParseUint(val, 0, 8)
 		return uint8(i), err
 	case "uint16":
-		i, err := strconv.ParseUint(val, 10, 16)
+		i, err := strconv.ParseUint(val, 0, 16)
 		return uint16(i), err
 	case "uint32":
-		i, err := strconv.ParseUint(val, 10, 32)
+		i, err := strconv.ParseUint(val, 0, 32)
 		return uint32(i), err
 	case "uint64":
-		return strconv.ParseUint(val, 10, 64)
+		return strconv.ParseUint(val, 0, 64)
 	default:
 		panic("unreachable")
 	}
diff --git a/src/internal/fuzz/encoding_test.go b/src/internal/fuzz/encoding_test.go
index b429d42..8e3800e 100644
--- a/src/internal/fuzz/encoding_test.go
+++ b/src/internal/fuzz/encoding_test.go
@@ -5,85 +5,104 @@
 package fuzz
 
 import (
+	"math"
 	"strconv"
-	"strings"
 	"testing"
+	"unicode"
 )
 
 func TestUnmarshalMarshal(t *testing.T) {
 	var tests = []struct {
-		in string
-		ok bool
+		desc   string
+		in     string
+		reject bool
+		want   string // if different from in
 	}{
 		{
-			in: "int(1234)",
-			ok: false, // missing version
+			desc:   "missing version",
+			in:     "int(1234)",
+			reject: true,
 		},
 		{
+			desc: "malformed string",
 			in: `go test fuzz v1
 string("a"bcad")`,
-			ok: false, // malformed
+			reject: true,
 		},
 		{
+			desc: "empty value",
 			in: `go test fuzz v1
 int()`,
-			ok: false, // empty value
+			reject: true,
 		},
 		{
+			desc: "negative uint",
 			in: `go test fuzz v1
 uint(-32)`,
-			ok: false, // invalid negative uint
+			reject: true,
 		},
 		{
+			desc: "int8 too large",
 			in: `go test fuzz v1
 int8(1234456)`,
-			ok: false, // int8 too large
+			reject: true,
 		},
 		{
+			desc: "multiplication in int value",
 			in: `go test fuzz v1
 int(20*5)`,
-			ok: false, // expression in int value
+			reject: true,
 		},
 		{
+			desc: "double negation",
 			in: `go test fuzz v1
 int(--5)`,
-			ok: false, // expression in int value
+			reject: true,
 		},
 		{
+			desc: "malformed bool",
 			in: `go test fuzz v1
 bool(0)`,
-			ok: false, // malformed bool
+			reject: true,
 		},
 		{
+			desc: "malformed byte",
 			in: `go test fuzz v1
 byte('aa)`,
-			ok: false, // malformed byte
+			reject: true,
 		},
 		{
+			desc: "byte out of range",
 			in: `go test fuzz v1
 byte('☃')`,
-			ok: false, // byte out of range
+			reject: true,
 		},
 		{
+			desc: "extra newline",
 			in: `go test fuzz v1
-string("has final newline")
+string("has extra newline")
 `,
-			ok: true, // has final newline
+			want: `go test fuzz v1
+string("has extra newline")`,
 		},
 		{
+			desc: "trailing spaces",
 			in: `go test fuzz v1
 string("extra")
 []byte("spacing")  
     `,
-			ok: true, // extra spaces in the final newline
+			want: `go test fuzz v1
+string("extra")
+[]byte("spacing")`,
 		},
 		{
+			desc: "float types",
 			in: `go test fuzz v1
 float64(0)
 float32(0)`,
-			ok: true, // will be an integer literal since there is no decimal
 		},
 		{
+			desc: "various types",
 			in: `go test fuzz v1
 int(-23)
 int8(-2)
@@ -101,19 +120,112 @@
 string("hello\\xbd\\xb2=\\xbc ⌘")
 float64(-12.5)
 float32(2.5)`,
-			ok: true,
+		},
+		{
+			desc: "float edge cases",
+			// The two IEEE 754 bit patterns used for the math.Float{64,32}frombits
+			// encodings are non-math.NAN quiet-NaN values. Since they are not equal
+			// to math.NaN(), they should be re-encoded to their bit patterns. They
+			// are, respectively:
+			//   * math.Float64bits(math.NaN())+1
+			//   * math.Float32bits(float32(math.NaN()))+1
+			in: `go test fuzz v1
+float32(-0)
+float64(-0)
+float32(+Inf)
+float32(-Inf)
+float32(NaN)
+float64(+Inf)
+float64(-Inf)
+float64(NaN)
+math.Float64frombits(0x7ff8000000000002)
+math.Float32frombits(0x7fc00001)`,
+		},
+		{
+			desc: "int variations",
+			// Although we arbitrarily choose default integer bases (0 or 16), we may
+			// want to change those arbitrary choices in the future and should not
+			// break the parser. Verify that integers in the opposite bases still
+			// parse correctly.
+			in: `go test fuzz v1
+int(0x0)
+int32(0x41)
+int64(0xfffffffff)
+uint32(0xcafef00d)
+uint64(0xffffffffffffffff)
+uint8(0b0000000)
+byte(0x0)
+byte('\000')
+byte('\u0000')
+byte('\'')
+math.Float64frombits(9221120237041090562)
+math.Float32frombits(2143289345)`,
+			want: `go test fuzz v1
+int(0)
+rune('A')
+int64(68719476735)
+uint32(3405705229)
+uint64(18446744073709551615)
+byte('\x00')
+byte('\x00')
+byte('\x00')
+byte('\x00')
+byte('\'')
+math.Float64frombits(0x7ff8000000000002)
+math.Float32frombits(0x7fc00001)`,
+		},
+		{
+			desc: "rune validation",
+			in: `go test fuzz v1
+rune(0)
+rune(0x41)
+rune(-1)
+rune(0xfffd)
+rune(0xd800)
+rune(0x10ffff)
+rune(0x110000)
+`,
+			want: `go test fuzz v1
+rune('\x00')
+rune('A')
+int32(-1)
+rune('�')
+int32(55296)
+rune('\U0010ffff')
+int32(1114112)`,
+		},
+		{
+			desc: "int overflow",
+			in: `go test fuzz v1
+int(0x7fffffffffffffff)
+uint(0xffffffffffffffff)`,
+			want: func() string {
+				switch strconv.IntSize {
+				case 32:
+					return `go test fuzz v1
+int(-1)
+uint(4294967295)`
+				case 64:
+					return `go test fuzz v1
+int(9223372036854775807)
+uint(18446744073709551615)`
+				default:
+					panic("unreachable")
+				}
+			}(),
 		},
 	}
 	for _, test := range tests {
-		t.Run(test.in, func(t *testing.T) {
+		t.Run(test.desc, func(t *testing.T) {
 			vals, err := unmarshalCorpusFile([]byte(test.in))
-			if test.ok && err != nil {
-				t.Fatalf("unmarshal unexpected error: %v", err)
-			} else if !test.ok && err == nil {
-				t.Fatalf("unmarshal unexpected success")
+			if test.reject {
+				if err == nil {
+					t.Fatalf("unmarshal unexpected success")
+				}
+				return
 			}
-			if !test.ok {
-				return // skip the rest of the test
+			if err != nil {
+				t.Fatalf("unmarshal unexpected error: %v", err)
 			}
 			newB := marshalCorpusFile(vals...)
 			if err != nil {
@@ -122,9 +234,15 @@
 			if newB[len(newB)-1] != '\n' {
 				t.Error("didn't write final newline to corpus file")
 			}
-			before, after := strings.TrimSpace(test.in), strings.TrimSpace(string(newB))
-			if before != after {
-				t.Errorf("values changed after unmarshal then marshal\nbefore: %q\nafter:  %q", before, after)
+
+			want := test.want
+			if want == "" {
+				want = test.in
+			}
+			want += "\n"
+			got := string(newB)
+			if got != want {
+				t.Errorf("unexpected marshaled value\ngot:\n%s\nwant:\n%s", got, want)
 			}
 		})
 	}
@@ -170,3 +288,117 @@
 		})
 	}
 }
+
+func TestByteRoundTrip(t *testing.T) {
+	for x := 0; x < 256; x++ {
+		b1 := byte(x)
+		buf := marshalCorpusFile(b1)
+		vs, err := unmarshalCorpusFile(buf)
+		if err != nil {
+			t.Fatal(err)
+		}
+		b2 := vs[0].(byte)
+		if b2 != b1 {
+			t.Fatalf("unmarshaled %v, want %v:\n%s", b2, b1, buf)
+		}
+	}
+}
+
+func TestInt8RoundTrip(t *testing.T) {
+	for x := -128; x < 128; x++ {
+		i1 := int8(x)
+		buf := marshalCorpusFile(i1)
+		vs, err := unmarshalCorpusFile(buf)
+		if err != nil {
+			t.Fatal(err)
+		}
+		i2 := vs[0].(int8)
+		if i2 != i1 {
+			t.Fatalf("unmarshaled %v, want %v:\n%s", i2, i1, buf)
+		}
+	}
+}
+
+func FuzzFloat64RoundTrip(f *testing.F) {
+	f.Add(math.Float64bits(0))
+	f.Add(math.Float64bits(math.Copysign(0, -1)))
+	f.Add(math.Float64bits(math.MaxFloat64))
+	f.Add(math.Float64bits(math.SmallestNonzeroFloat64))
+	f.Add(math.Float64bits(math.NaN()))
+	f.Add(uint64(0x7FF0000000000001)) // signaling NaN
+	f.Add(math.Float64bits(math.Inf(1)))
+	f.Add(math.Float64bits(math.Inf(-1)))
+
+	f.Fuzz(func(t *testing.T, u1 uint64) {
+		x1 := math.Float64frombits(u1)
+
+		b := marshalCorpusFile(x1)
+		t.Logf("marshaled math.Float64frombits(0x%x):\n%s", u1, b)
+
+		xs, err := unmarshalCorpusFile(b)
+		if err != nil {
+			t.Fatal(err)
+		}
+		if len(xs) != 1 {
+			t.Fatalf("unmarshaled %d values", len(xs))
+		}
+		x2 := xs[0].(float64)
+		u2 := math.Float64bits(x2)
+		if u2 != u1 {
+			t.Errorf("unmarshaled %v (bits 0x%x)", x2, u2)
+		}
+	})
+}
+
+func FuzzRuneRoundTrip(f *testing.F) {
+	f.Add(rune(-1))
+	f.Add(rune(0xd800))
+	f.Add(rune(0xdfff))
+	f.Add(rune(unicode.ReplacementChar))
+	f.Add(rune(unicode.MaxASCII))
+	f.Add(rune(unicode.MaxLatin1))
+	f.Add(rune(unicode.MaxRune))
+	f.Add(rune(unicode.MaxRune + 1))
+	f.Add(rune(-0x80000000))
+	f.Add(rune(0x7fffffff))
+
+	f.Fuzz(func(t *testing.T, r1 rune) {
+		b := marshalCorpusFile(r1)
+		t.Logf("marshaled rune(0x%x):\n%s", r1, b)
+
+		rs, err := unmarshalCorpusFile(b)
+		if err != nil {
+			t.Fatal(err)
+		}
+		if len(rs) != 1 {
+			t.Fatalf("unmarshaled %d values", len(rs))
+		}
+		r2 := rs[0].(rune)
+		if r2 != r1 {
+			t.Errorf("unmarshaled rune(0x%x)", r2)
+		}
+	})
+}
+
+func FuzzStringRoundTrip(f *testing.F) {
+	f.Add("")
+	f.Add("\x00")
+	f.Add(string([]rune{unicode.ReplacementChar}))
+
+	f.Fuzz(func(t *testing.T, s1 string) {
+		b := marshalCorpusFile(s1)
+		t.Logf("marshaled %q:\n%s", s1, b)
+
+		rs, err := unmarshalCorpusFile(b)
+		if err != nil {
+			t.Fatal(err)
+		}
+		if len(rs) != 1 {
+			t.Fatalf("unmarshaled %d values", len(rs))
+		}
+		s2 := rs[0].(string)
+		if s2 != s1 {
+			t.Errorf("unmarshaled %q", s2)
+		}
+	})
+}
diff --git a/src/internal/fuzz/worker.go b/src/internal/fuzz/worker.go
index e984ba7..6e4c4e2 100644
--- a/src/internal/fuzz/worker.go
+++ b/src/internal/fuzz/worker.go
@@ -800,6 +800,7 @@
 	if err != nil {
 		panic(err)
 	}
+	inpHash := sha256.Sum256(mem.valueCopy())
 	if args.Timeout != 0 {
 		var cancel func()
 		ctx, cancel = context.WithTimeout(ctx, args.Timeout)
@@ -811,12 +812,22 @@
 	success, err := ws.minimizeInput(ctx, vals, mem, args)
 	if success {
 		writeToMem(vals, mem)
+		outHash := sha256.Sum256(mem.valueCopy())
 		mem.header().rawInMem = false
 		resp.WroteToMem = true
 		if err != nil {
 			resp.Err = err.Error()
 		} else {
-			resp.CoverageData = coverageSnapshot
+			// If the values didn't change during minimization then coverageSnapshot is likely
+			// a dirty snapshot which represents the very last step of minimization, not the
+			// coverage for the initial input. In that case just return the coverage we were
+			// given initially, since it more accurately represents the coverage map for the
+			// input we are returning.
+			if outHash != inpHash {
+				resp.CoverageData = coverageSnapshot
+			} else {
+				resp.CoverageData = args.KeepCoverage
+			}
 		}
 	}
 	return resp
@@ -883,7 +894,8 @@
 			}
 			return true
 		}
-		if keepCoverage != nil && hasCoverageBit(keepCoverage, coverageSnapshot) {
+		// Minimization should preserve coverage bits.
+		if keepCoverage != nil && isCoverageSubset(keepCoverage, coverageSnapshot) {
 			return true
 		}
 		vals[args.Index] = prev
diff --git a/src/net/net.go b/src/net/net.go
index 77e54a9..d91e743 100644
--- a/src/net/net.go
+++ b/src/net/net.go
@@ -703,6 +703,12 @@
 	_ io.Reader   = (*Buffers)(nil)
 )
 
+// WriteTo writes contents of the buffers to w.
+//
+// WriteTo implements io.WriterTo for Buffers.
+//
+// WriteTo modifies the slice v as well as v[i] for 0 <= i < len(v),
+// but does not modify v[i][j] for any i, j.
 func (v *Buffers) WriteTo(w io.Writer) (n int64, err error) {
 	if wv, ok := w.(buffersWriter); ok {
 		return wv.writeBuffers(v)
@@ -719,6 +725,12 @@
 	return n, nil
 }
 
+// Read from the buffers.
+//
+// Read implements io.Reader for Buffers.
+//
+// Read modifies the slice v as well as v[i] for 0 <= i < len(v),
+// but does not modify v[i][j] for any i, j.
 func (v *Buffers) Read(p []byte) (n int, err error) {
 	for len(p) > 0 && len(*v) > 0 {
 		n0 := copy(p, (*v)[0])
diff --git a/src/reflect/asm_arm64.s b/src/reflect/asm_arm64.s
index 5b9b357..812b8a0 100644
--- a/src/reflect/asm_arm64.s
+++ b/src/reflect/asm_arm64.s
@@ -33,9 +33,14 @@
 	ADD	$LOCAL_REGARGS, RSP, R20
 	CALL	runtime·spillArgs(SB)
 	MOVD	R26, 32(RSP) // outside of moveMakeFuncArgPtrs's arg area
+#ifdef GOEXPERIMENT_regabiargs
+	MOVD	R26, R0
+	MOVD	R20, R1
+#else
 	MOVD	R26, 8(RSP)
 	MOVD	R20, 16(RSP)
-	CALL	·moveMakeFuncArgPtrs(SB)
+#endif
+	CALL	·moveMakeFuncArgPtrs<ABIInternal>(SB)
 	MOVD	32(RSP), R26
 	MOVD	R26, 8(RSP)
 	MOVD	$argframe+0(FP), R3
@@ -61,9 +66,14 @@
 	ADD	$LOCAL_REGARGS, RSP, R20
 	CALL	runtime·spillArgs(SB)
 	MOVD	R26, 32(RSP) // outside of moveMakeFuncArgPtrs's arg area
+#ifdef GOEXPERIMENT_regabiargs
+	MOVD	R26, R0
+	MOVD	R20, R1
+#else
 	MOVD	R26, 8(RSP)
 	MOVD	R20, 16(RSP)
-	CALL	·moveMakeFuncArgPtrs(SB)
+#endif
+	CALL	·moveMakeFuncArgPtrs<ABIInternal>(SB)
 	MOVD	32(RSP), R26
 	MOVD	R26, 8(RSP)
 	MOVD	$argframe+0(FP), R3
diff --git a/src/runtime/internal/atomic/atomic_arm.s b/src/runtime/internal/atomic/atomic_arm.s
index be3fd3a..92cbe8a 100644
--- a/src/runtime/internal/atomic/atomic_arm.s
+++ b/src/runtime/internal/atomic/atomic_arm.s
@@ -229,16 +229,22 @@
 // functions tail-call into the appropriate implementation, which
 // means they must not open a frame. Hence, when they go down the
 // panic path, at that point they push the LR to create a real frame
-// (they don't need to pop it because panic won't return).
+// (they don't need to pop it because panic won't return; however, we
+// do need to set the SP delta back).
+
+// Check if R1 is 8-byte aligned, panic if not.
+// Clobbers R2.
+#define CHECK_ALIGN \
+	AND.S	$7, R1, R2 \
+	BEQ 	4(PC) \
+	MOVW.W	R14, -4(R13) /* prepare a real frame */ \
+	BL	·panicUnaligned(SB) \
+	ADD	$4, R13 /* compensate SP delta */
 
 TEXT ·Cas64(SB),NOSPLIT,$-4-21
 	NO_LOCAL_POINTERS
 	MOVW	addr+0(FP), R1
-	// make unaligned atomic access panic
-	AND.S	$7, R1, R2
-	BEQ 	3(PC)
-	MOVW.W	R14, -4(R13) // prepare a real frame
-	BL	·panicUnaligned(SB)
+	CHECK_ALIGN
 
 	MOVB	runtime·goarm(SB), R11
 	CMP	$7, R11
@@ -249,11 +255,7 @@
 TEXT ·Xadd64(SB),NOSPLIT,$-4-20
 	NO_LOCAL_POINTERS
 	MOVW	addr+0(FP), R1
-	// make unaligned atomic access panic
-	AND.S	$7, R1, R2
-	BEQ 	3(PC)
-	MOVW.W	R14, -4(R13) // prepare a real frame
-	BL	·panicUnaligned(SB)
+	CHECK_ALIGN
 
 	MOVB	runtime·goarm(SB), R11
 	CMP	$7, R11
@@ -264,11 +266,7 @@
 TEXT ·Xchg64(SB),NOSPLIT,$-4-20
 	NO_LOCAL_POINTERS
 	MOVW	addr+0(FP), R1
-	// make unaligned atomic access panic
-	AND.S	$7, R1, R2
-	BEQ 	3(PC)
-	MOVW.W	R14, -4(R13) // prepare a real frame
-	BL	·panicUnaligned(SB)
+	CHECK_ALIGN
 
 	MOVB	runtime·goarm(SB), R11
 	CMP	$7, R11
@@ -279,11 +277,7 @@
 TEXT ·Load64(SB),NOSPLIT,$-4-12
 	NO_LOCAL_POINTERS
 	MOVW	addr+0(FP), R1
-	// make unaligned atomic access panic
-	AND.S	$7, R1, R2
-	BEQ 	3(PC)
-	MOVW.W	R14, -4(R13) // prepare a real frame
-	BL	·panicUnaligned(SB)
+	CHECK_ALIGN
 
 	MOVB	runtime·goarm(SB), R11
 	CMP	$7, R11
@@ -294,11 +288,7 @@
 TEXT ·Store64(SB),NOSPLIT,$-4-12
 	NO_LOCAL_POINTERS
 	MOVW	addr+0(FP), R1
-	// make unaligned atomic access panic
-	AND.S	$7, R1, R2
-	BEQ 	3(PC)
-	MOVW.W	R14, -4(R13) // prepare a real frame
-	BL	·panicUnaligned(SB)
+	CHECK_ALIGN
 
 	MOVB	runtime·goarm(SB), R11
 	CMP	$7, R11
diff --git a/src/runtime/mfinal.go b/src/runtime/mfinal.go
index e2ac5d4..10623e4 100644
--- a/src/runtime/mfinal.go
+++ b/src/runtime/mfinal.go
@@ -187,21 +187,15 @@
 				f := &fb.fin[i-1]
 
 				var regs abi.RegArgs
-				var framesz uintptr
-				if argRegs > 0 {
-					// The args can always be passed in registers if they're
-					// available, because platforms we support always have no
-					// argument registers available, or more than 2.
-					//
-					// But unfortunately because we can have an arbitrary
-					// amount of returns and it would be complex to try and
-					// figure out how many of those can get passed in registers,
-					// just conservatively assume none of them do.
-					framesz = f.nret
-				} else {
-					// Need to pass arguments on the stack too.
-					framesz = unsafe.Sizeof((any)(nil)) + f.nret
-				}
+				// The args may be passed in registers or on stack. Even for
+				// the register case, we still need the spill slots.
+				// TODO: revisit if we remove spill slots.
+				//
+				// Unfortunately because we can have an arbitrary
+				// amount of returns and it would be complex to try and
+				// figure out how many of those can get passed in registers,
+				// just conservatively assume none of them do.
+				framesz := unsafe.Sizeof((any)(nil)) + f.nret
 				if framecap < framesz {
 					// The frame does not contain pointers interesting for GC,
 					// all not yet finalized objects are stored in finq.
diff --git a/src/runtime/mfinal_test.go b/src/runtime/mfinal_test.go
index 04ba7a6..902ccc5 100644
--- a/src/runtime/mfinal_test.go
+++ b/src/runtime/mfinal_test.go
@@ -42,6 +42,15 @@
 		{func(x *int) any { return Tintptr(x) }, func(v *int) { finalize(v) }},
 		{func(x *int) any { return (*Tint)(x) }, func(v *Tint) { finalize((*int)(v)) }},
 		{func(x *int) any { return (*Tint)(x) }, func(v Tinter) { finalize((*int)(v.(*Tint))) }},
+		// Test case for argument spill slot.
+		// If the spill slot was not counted for the frame size, it will (incorrectly) choose
+		// call32 as the result has (exactly) 32 bytes. When the argument actually spills,
+		// it clobbers the caller's frame (likely the return PC).
+		{func(x *int) any { return x }, func(v any) [4]int64 {
+			print() // force spill
+			finalize(v.(*int))
+			return [4]int64{}
+		}},
 	}
 
 	for i, tt := range finalizerTests {
diff --git a/src/runtime/race_arm64.s b/src/runtime/race_arm64.s
index 798e232..95fec0b 100644
--- a/src/runtime/race_arm64.s
+++ b/src/runtime/race_arm64.s
@@ -188,8 +188,12 @@
 
 // func runtime·racefuncenter(pc uintptr)
 // Called from instrumented code.
-TEXT	runtime·racefuncenter(SB), NOSPLIT, $0-8
+TEXT	runtime·racefuncenter<ABIInternal>(SB), NOSPLIT, $0-8
+#ifdef GOEXPERIMENT_regabiargs
+	MOVD	R0, R9	// callpc
+#else
 	MOVD	callpc+0(FP), R9
+#endif
 	JMP	racefuncenter<>(SB)
 
 // Common code for racefuncenter
@@ -205,7 +209,7 @@
 
 // func runtime·racefuncexit()
 // Called from instrumented code.
-TEXT	runtime·racefuncexit(SB), NOSPLIT, $0-0
+TEXT	runtime·racefuncexit<ABIInternal>(SB), NOSPLIT, $0-0
 	load_g
 	MOVD	g_racectx(g), R0	// race context
 	// void __tsan_func_exit(ThreadState *thr);
@@ -392,12 +396,12 @@
 	// Addr is outside the good range.
 	// Call __tsan_go_ignore_sync_begin to ignore synchronization during the atomic op.
 	// An attempt to synchronize on the address would cause crash.
-	MOVD	R9, R20	// remember the original function
+	MOVD	R9, R21	// remember the original function
 	MOVD	$__tsan_go_ignore_sync_begin(SB), R9
 	load_g
 	MOVD	g_racectx(g), R0	// goroutine context
 	BL	racecall<>(SB)
-	MOVD	R20, R9	// restore the original function
+	MOVD	R21, R9	// restore the original function
 	// Call the atomic function.
 	// racecall will call LLVM race code which might clobber R28 (g)
 	load_g
@@ -424,10 +428,12 @@
 	JMP	racecall<>(SB)
 
 // Switches SP to g0 stack and calls (R9). Arguments already set.
-TEXT	racecall<>(SB), NOSPLIT, $0-0
+// Clobbers R19, R20.
+TEXT	racecall<>(SB), NOSPLIT|NOFRAME, $0-0
 	MOVD	g_m(g), R10
 	// Switch to g0 stack.
 	MOVD	RSP, R19	// callee-saved, preserved across the CALL
+	MOVD	R30, R20	// callee-saved, preserved across the CALL
 	MOVD	m_g0(R10), R11
 	CMP	R11, g
 	BEQ	call	// already on g0
@@ -436,7 +442,7 @@
 call:
 	BL	R9
 	MOVD	R19, RSP
-	RET
+	JMP	(R20)
 
 // C->Go callback thunk that allows to call runtime·racesymbolize from C code.
 // Direct Go->C race call has only switched SP, finish g->g0 switch by setting correct g.
diff --git a/src/runtime/sys_darwin.go b/src/runtime/sys_darwin.go
index 80dd1a0..58b3a91 100644
--- a/src/runtime/sys_darwin.go
+++ b/src/runtime/sys_darwin.go
@@ -17,87 +17,91 @@
 
 //go:linkname syscall_syscall syscall.syscall
 //go:nosplit
-//go:cgo_unsafe_args
 func syscall_syscall(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
+	args := struct{ fn, a1, a2, a3, r1, r2, err uintptr }{fn, a1, a2, a3, r1, r2, err}
 	entersyscall()
-	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall)), unsafe.Pointer(&fn))
+	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall)), unsafe.Pointer(&args))
 	exitsyscall()
-	return
+	return args.r1, args.r2, args.err
 }
 func syscall()
 
 //go:linkname syscall_syscallX syscall.syscallX
 //go:nosplit
-//go:cgo_unsafe_args
 func syscall_syscallX(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
+	args := struct{ fn, a1, a2, a3, r1, r2, err uintptr }{fn, a1, a2, a3, r1, r2, err}
 	entersyscall()
-	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscallX)), unsafe.Pointer(&fn))
+	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscallX)), unsafe.Pointer(&args))
 	exitsyscall()
-	return
+	return args.r1, args.r2, args.err
 }
 func syscallX()
 
 //go:linkname syscall_syscall6 syscall.syscall6
 //go:nosplit
-//go:cgo_unsafe_args
 func syscall_syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
+	args := struct{ fn, a1, a2, a3, a4, a5, a6, r1, r2, err uintptr }{fn, a1, a2, a3, a4, a5, a6, r1, r2, err}
 	entersyscall()
-	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall6)), unsafe.Pointer(&fn))
+	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall6)), unsafe.Pointer(&args))
 	exitsyscall()
-	return
+	return args.r1, args.r2, args.err
 }
 func syscall6()
 
 //go:linkname syscall_syscall6X syscall.syscall6X
 //go:nosplit
-//go:cgo_unsafe_args
 func syscall_syscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
+	args := struct{ fn, a1, a2, a3, a4, a5, a6, r1, r2, err uintptr }{fn, a1, a2, a3, a4, a5, a6, r1, r2, err}
 	entersyscall()
-	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall6X)), unsafe.Pointer(&fn))
+	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall6X)), unsafe.Pointer(&args))
 	exitsyscall()
-	return
+	return args.r1, args.r2, args.err
 }
 func syscall6X()
 
 //go:linkname syscall_syscallPtr syscall.syscallPtr
 //go:nosplit
-//go:cgo_unsafe_args
 func syscall_syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
+	args := struct{ fn, a1, a2, a3, r1, r2, err uintptr }{fn, a1, a2, a3, r1, r2, err}
 	entersyscall()
-	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscallPtr)), unsafe.Pointer(&fn))
+	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscallPtr)), unsafe.Pointer(&args))
 	exitsyscall()
-	return
+	return args.r1, args.r2, args.err
 }
 func syscallPtr()
 
 //go:linkname syscall_rawSyscall syscall.rawSyscall
 //go:nosplit
-//go:cgo_unsafe_args
 func syscall_rawSyscall(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
-	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall)), unsafe.Pointer(&fn))
-	return
+	args := struct{ fn, a1, a2, a3, r1, r2, err uintptr }{fn, a1, a2, a3, r1, r2, err}
+	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall)), unsafe.Pointer(&args))
+	return args.r1, args.r2, args.err
 }
 
 //go:linkname syscall_rawSyscall6 syscall.rawSyscall6
 //go:nosplit
-//go:cgo_unsafe_args
 func syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
-	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall6)), unsafe.Pointer(&fn))
-	return
+	args := struct{ fn, a1, a2, a3, a4, a5, a6, r1, r2, err uintptr }{fn, a1, a2, a3, a4, a5, a6, r1, r2, err}
+	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall6)), unsafe.Pointer(&args))
+	return args.r1, args.r2, args.err
 }
 
 // syscallNoErr is used in crypto/x509 to call into Security.framework and CF.
 
 //go:linkname crypto_x509_syscall crypto/x509/internal/macos.syscall
 //go:nosplit
-//go:cgo_unsafe_args
-func crypto_x509_syscall(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1 uintptr) {
+func crypto_x509_syscall(fn, a1, a2, a3, a4, a5 uintptr, f1 float64) (r1 uintptr) {
+	args := struct {
+		fn, a1, a2, a3, a4, a5 uintptr
+		f1                     float64
+		r1                     uintptr
+	}{fn, a1, a2, a3, a4, a5, f1, r1}
 	entersyscall()
-	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscallNoErr)), unsafe.Pointer(&fn))
+	libcCall(unsafe.Pointer(abi.FuncPCABI0(syscall_x509)), unsafe.Pointer(&args))
 	exitsyscall()
-	return
+	return args.r1
 }
-func syscallNoErr()
+func syscall_x509()
 
 // The *_trampoline functions convert from the Go calling convention to the C calling convention
 // and then call the underlying libc function.  They are defined in sys_darwin_$ARCH.s.
diff --git a/src/runtime/sys_darwin_amd64.s b/src/runtime/sys_darwin_amd64.s
index 5d89cda..db4715d 100644
--- a/src/runtime/sys_darwin_amd64.s
+++ b/src/runtime/sys_darwin_amd64.s
@@ -831,9 +831,10 @@
 	POPQ	BP
 	RET
 
-// syscallNoErr is like syscall6 but does not check for errors, and
-// only returns one value, for use with standard C ABI library functions.
-TEXT runtime·syscallNoErr(SB),NOSPLIT,$0
+// syscall_x509 is for crypto/x509. It is like syscall6 but does not check for errors,
+// takes 5 uintptrs and 1 float64, and only returns one value,
+// for use with standard C ABI functions.
+TEXT runtime·syscall_x509(SB),NOSPLIT,$0
 	PUSHQ	BP
 	MOVQ	SP, BP
 	SUBQ	$16, SP
@@ -842,7 +843,7 @@
 	MOVQ	(3*8)(DI), DX // a3
 	MOVQ	(4*8)(DI), CX // a4
 	MOVQ	(5*8)(DI), R8 // a5
-	MOVQ	(6*8)(DI), R9 // a6
+	MOVQ	(6*8)(DI), X0 // f1
 	MOVQ	DI, (SP)
 	MOVQ	(1*8)(DI), DI // a1
 	XORL	AX, AX	      // vararg: say "no float args"
diff --git a/src/runtime/sys_darwin_arm64.s b/src/runtime/sys_darwin_arm64.s
index 96d2ed1..e57ac53 100644
--- a/src/runtime/sys_darwin_arm64.s
+++ b/src/runtime/sys_darwin_arm64.s
@@ -736,9 +736,10 @@
 ok:
 	RET
 
-// syscallNoErr is like syscall6 but does not check for errors, and
-// only returns one value, for use with standard C ABI library functions.
-TEXT runtime·syscallNoErr(SB),NOSPLIT,$0
+// syscall_x509 is for crypto/x509. It is like syscall6 but does not check for errors,
+// takes 5 uintptrs and 1 float64, and only returns one value,
+// for use with standard C ABI functions.
+TEXT runtime·syscall_x509(SB),NOSPLIT,$0
 	SUB	$16, RSP	// push structure pointer
 	MOVD	R0, (RSP)
 
@@ -747,7 +748,7 @@
 	MOVD	24(R0), R2	// a3
 	MOVD	32(R0), R3	// a4
 	MOVD	40(R0), R4	// a5
-	MOVD	48(R0), R5	// a6
+	FMOVD	48(R0), F0	// f1
 	MOVD	8(R0), R0	// a1
 	BL	(R12)
 
diff --git a/src/runtime/testdata/testprogcgo/aprof.go b/src/runtime/testdata/testprogcgo/aprof.go
index c70d633..1687014 100644
--- a/src/runtime/testdata/testprogcgo/aprof.go
+++ b/src/runtime/testdata/testprogcgo/aprof.go
@@ -10,7 +10,7 @@
 // This is a regression test for issue 14599, where profiling fails when the
 // function is the first C function. Exported functions are the first C
 // functions, so we use an exported function. Exported functions are created in
-// lexigraphical order of source files, so this file is named aprof.go to
+// lexicographical order of source files, so this file is named aprof.go to
 // ensure its function is first.
 
 // extern void CallGoNop();
diff --git a/src/strings/builder.go b/src/strings/builder.go
index 547e52e..ba4df61 100644
--- a/src/strings/builder.go
+++ b/src/strings/builder.go
@@ -17,10 +17,9 @@
 	buf  []byte
 }
 
-// noescape hides a pointer from escape analysis.  noescape is
-// the identity function but escape analysis doesn't think the
-// output depends on the input. noescape is inlined and currently
-// compiles down to zero instructions.
+// noescape hides a pointer from escape analysis. It is the identity function
+// but escape analysis doesn't think the output depends on the input.
+// noescape is inlined and currently compiles down to zero instructions.
 // USE CAREFULLY!
 // This was copied from the runtime; see issues 23382 and 7921.
 //go:nosplit
diff --git a/src/syscall/syscall_unix_test.go b/src/syscall/syscall_unix_test.go
index 1ef2634..317c0c1 100644
--- a/src/syscall/syscall_unix_test.go
+++ b/src/syscall/syscall_unix_test.go
@@ -326,33 +326,6 @@
 	}
 }
 
-func TestRlimit(t *testing.T) {
-	var rlimit, zero syscall.Rlimit
-	if err := syscall.Getrlimit(syscall.RLIMIT_CPU, &rlimit); err != nil {
-		t.Fatalf("Getrlimit: save failed: %v", err)
-	}
-	if zero == rlimit {
-		t.Fatalf("Getrlimit: save failed: got zero value %#v", rlimit)
-	}
-	set := rlimit
-	set.Cur = set.Max - 1
-	if err := syscall.Setrlimit(syscall.RLIMIT_CPU, &set); err != nil {
-		t.Fatalf("Setrlimit: set failed: %#v %v", set, err)
-	}
-	var get syscall.Rlimit
-	if err := syscall.Getrlimit(syscall.RLIMIT_CPU, &get); err != nil {
-		t.Fatalf("Getrlimit: get failed: %v", err)
-	}
-	set = rlimit
-	set.Cur = set.Max - 1
-	if set != get {
-		t.Fatalf("Rlimit: change failed: wanted %#v got %#v", set, get)
-	}
-	if err := syscall.Setrlimit(syscall.RLIMIT_CPU, &rlimit); err != nil {
-		t.Fatalf("Setrlimit: restore failed: %#v %v", rlimit, err)
-	}
-}
-
 func TestSeekFailure(t *testing.T) {
 	_, err := syscall.Seek(-1, 0, io.SeekStart)
 	if err == nil {
diff --git a/test/fixedbugs/issue51401.go b/test/fixedbugs/issue51401.go
new file mode 100644
index 0000000..1e8e0d0
--- /dev/null
+++ b/test/fixedbugs/issue51401.go
@@ -0,0 +1,44 @@
+// run
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 51401: bad inline info in generated interface method wrapper
+// causes infinite loop in stack unwinding.
+
+package main
+
+import "runtime"
+
+type Outer interface{ Inner }
+
+type impl struct{}
+
+func New() Outer { return &impl{} }
+
+type Inner interface {
+	DoStuff() error
+}
+
+func (a *impl) DoStuff() error {
+	return newError()
+}
+
+func newError() error {
+	stack := make([]uintptr, 50)
+	runtime.Callers(2, stack[:])
+
+	return nil
+}
+
+func main() {
+	funcs := listFuncs(New())
+	for _, f := range funcs {
+		f()
+	}
+}
+
+func listFuncs(outer Outer) []func() error {
+	return []func() error{outer.DoStuff}
+}
diff --git a/test/fixedbugs/issue51437.go b/test/fixedbugs/issue51437.go
new file mode 100644
index 0000000..3d1b9ee
--- /dev/null
+++ b/test/fixedbugs/issue51437.go
@@ -0,0 +1,19 @@
+// compile
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type T struct{}
+
+func (T) m() []T { return nil }
+
+func f(x T) {
+	for _, x := range func() []T {
+		return x.m()
+	}() {
+		_ = x
+	}
+}
diff --git a/test/fixedbugs/issue51531.go b/test/fixedbugs/issue51531.go
new file mode 100644
index 0000000..9a6a438
--- /dev/null
+++ b/test/fixedbugs/issue51531.go
@@ -0,0 +1,13 @@
+// errorcheck -G=3 -lang=go1.17
+
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type empty interface{}
+
+type Foo[T empty] int // ERROR "type parameter requires go1\.18 or later \(-lang was set to go1\.17; check go.mod\)"
+
+func Bar[T empty]() {} // ERROR "type parameter requires go1\.18 or later \(-lang was set to go1\.17; check go.mod\)"
diff --git a/test/typeparam/absdiff2.go b/test/typeparam/absdiff2.go
index 36de8ff..443388e 100644
--- a/test/typeparam/absdiff2.go
+++ b/test/typeparam/absdiff2.go
@@ -23,15 +23,16 @@
 
 // numericAbs matches a struct containing a numeric type that has an Abs method.
 type numericAbs[T Numeric] interface {
-	~struct{ Value T }
+	~struct{ Value_ T }
 	Abs() T
+	Value() T
 }
 
 // absDifference computes the absolute value of the difference of
 // a and b, where the absolute value is determined by the Abs method.
 func absDifference[T Numeric, U numericAbs[T]](a, b U) T {
-	d := a.Value - b.Value
-	dt := U{Value: d}
+	d := a.Value() - b.Value()
+	dt := U{Value_: d}
 	return dt.Abs()
 }
 
@@ -50,20 +51,29 @@
 // orderedAbs is a helper type that defines an Abs method for
 // a struct containing an ordered numeric type.
 type orderedAbs[T orderedNumeric] struct {
-	Value T
+	Value_ T
 }
 
 func (a orderedAbs[T]) Abs() T {
-	if a.Value < 0 {
-		return -a.Value
+	if a.Value_ < 0 {
+		return -a.Value_
 	}
-	return a.Value
+	return a.Value_
+}
+
+// Field accesses through type parameters are disabled
+// until we have a more thorough understanding of the
+// implications on the spec. See issue #51576.
+// Use accessor method instead.
+
+func (a orderedAbs[T]) Value() T {
+	return a.Value_
 }
 
 // complexAbs is a helper type that defines an Abs method for
 // a struct containing a complex type.
 type complexAbs[T Complex] struct {
-	Value T
+	Value_ T
 }
 
 func realimag(x any) (re, im float64) {
@@ -82,13 +92,17 @@
 
 func (a complexAbs[T]) Abs() T {
 	// TODO use direct conversion instead of realimag once #50937 is fixed
-	r, i := realimag(a.Value)
+	r, i := realimag(a.Value_)
 	// r := float64(real(a.Value))
 	// i := float64(imag(a.Value))
 	d := math.Sqrt(r*r + i*i)
 	return T(complex(d, 0))
 }
 
+func (a complexAbs[T]) Value() T {
+	return a.Value_
+}
+
 // OrderedAbsDifference returns the absolute value of the difference
 // between a and b, where a and b are of an ordered type.
 func OrderedAbsDifference[T orderedNumeric](a, b T) T {
diff --git a/test/typeparam/absdiffimp2.dir/a.go b/test/typeparam/absdiffimp2.dir/a.go
index 43493e1..dc64f2d 100644
--- a/test/typeparam/absdiffimp2.dir/a.go
+++ b/test/typeparam/absdiffimp2.dir/a.go
@@ -17,15 +17,16 @@
 
 // numericAbs matches a struct containing a numeric type that has an Abs method.
 type numericAbs[T Numeric] interface {
-	~struct{ Value T }
+	~struct{ Value_ T }
 	Abs() T
+	Value() T
 }
 
 // absDifference computes the absolute value of the difference of
 // a and b, where the absolute value is determined by the Abs method.
 func absDifference[T Numeric, U numericAbs[T]](a, b U) T {
-	d := a.Value - b.Value
-	dt := U{Value: d}
+	d := a.Value() - b.Value()
+	dt := U{Value_: d}
 	return dt.Abs()
 }
 
@@ -44,20 +45,29 @@
 // orderedAbs is a helper type that defines an Abs method for
 // a struct containing an ordered numeric type.
 type orderedAbs[T orderedNumeric] struct {
-	Value T
+	Value_ T
 }
 
 func (a orderedAbs[T]) Abs() T {
-	if a.Value < 0 {
-		return -a.Value
+	if a.Value_ < 0 {
+		return -a.Value_
 	}
-	return a.Value
+	return a.Value_
+}
+
+// Field accesses through type parameters are disabled
+// until we have a more thorough understanding of the
+// implications on the spec. See issue #51576.
+// Use accessor method instead.
+
+func (a orderedAbs[T]) Value() T {
+	return a.Value_
 }
 
 // complexAbs is a helper type that defines an Abs method for
 // a struct containing a complex type.
 type complexAbs[T Complex] struct {
-	Value T
+	Value_ T
 }
 
 func realimag(x any) (re, im float64) {
@@ -76,13 +86,17 @@
 
 func (a complexAbs[T]) Abs() T {
 	// TODO use direct conversion instead of realimag once #50937 is fixed
-	r, i := realimag(a.Value)
+	r, i := realimag(a.Value_)
 	// r := float64(real(a.Value))
 	// i := float64(imag(a.Value))
 	d := math.Sqrt(r*r + i*i)
 	return T(complex(d, 0))
 }
 
+func (a complexAbs[T]) Value() T {
+	return a.Value_
+}
+
 // OrderedAbsDifference returns the absolute value of the difference
 // between a and b, where a and b are of an ordered type.
 func OrderedAbsDifference[T orderedNumeric](a, b T) T {
diff --git a/test/typeparam/issue48424.go b/test/typeparam/issue48424.go
index 3253e64..8d80911 100644
--- a/test/typeparam/issue48424.go
+++ b/test/typeparam/issue48424.go
@@ -13,14 +13,14 @@
 	return x
 }
 
-func min[T int|string](x, y T) T {
+func min[T int | string](x, y T) T {
 	if x < y {
 		return x
 	}
 	return y
 }
 
-func max[T ~float64](x, y T) T {
+func max[T ~int | ~float64](x, y T) T {
 	if x > y {
 		return x
 	}
@@ -48,7 +48,7 @@
 // Some random type parameter lists with elided interfaces.
 
 type (
-	_ [T struct{}] struct{}
-	_ [M map[K]V, K comparable, V any] struct{}
-	_ [_ interface{}|int] struct{}
+	_[T struct{}]                     struct{}
+	_[M map[K]V, K comparable, V any] struct{}
+	_[_ interface{} | int]            struct{}
 )
diff --git a/test/typeparam/issue50417.go b/test/typeparam/issue50417.go
index 12dbd0e..e93583f 100644
--- a/test/typeparam/issue50417.go
+++ b/test/typeparam/issue50417.go
@@ -8,6 +8,11 @@
 
 func main() {}
 
+// Field accesses through type parameters are disabled
+// until we have a more thorough understanding of the
+// implications on the spec. See issue #51576.
+
+/*
 type Sf struct {
 	f int
 }
@@ -138,3 +143,4 @@
 }
 
 var _ = f8[*Sf]
+*/
diff --git a/test/typeparam/issue50417b.go b/test/typeparam/issue50417b.go
index e6b205c..86e1f8a 100644
--- a/test/typeparam/issue50417b.go
+++ b/test/typeparam/issue50417b.go
@@ -6,6 +6,13 @@
 
 package main
 
+func main() {}
+
+// Field accesses through type parameters are disabled
+// until we have a more thorough understanding of the
+// implications on the spec. See issue #51576.
+
+/*
 import "fmt"
 
 type MyStruct struct {
@@ -48,3 +55,4 @@
 		panic(fmt.Sprintf("got %d, want %d", got, want))
 	}
 }
+*/
diff --git a/test/typeparam/issue50690a.go b/test/typeparam/issue50690a.go
index 5af3c9e..0f5f5e9 100644
--- a/test/typeparam/issue50690a.go
+++ b/test/typeparam/issue50690a.go
@@ -29,34 +29,47 @@
 
 // Ledger is an identifiable, financial record.
 type Ledger[T ~string, K Numeric] struct {
-
 	// ID identifies the ledger.
-	ID T
+	ID_ T
 
 	// Amounts is a list of monies associated with this ledger.
-	Amounts []K
+	Amounts_ []K
 
 	// SumFn is a function that can be used to sum the amounts
 	// in this ledger.
-	SumFn func(...K) K
+	SumFn_ func(...K) K
 }
 
+// Field accesses through type parameters are disabled
+// until we have a more thorough understanding of the
+// implications on the spec. See issue #51576.
+// Use accessor methods instead.
+
+func (l Ledger[T, _]) ID() T               { return l.ID_ }
+func (l Ledger[_, K]) Amounts() []K        { return l.Amounts_ }
+func (l Ledger[_, K]) SumFn() func(...K) K { return l.SumFn_ }
+
 func PrintLedger[
 	T ~string,
 	K Numeric,
-	L ~struct {
-		ID      T
-		Amounts []K
-		SumFn   func(...K) K
+	L interface {
+		~struct {
+			ID_      T
+			Amounts_ []K
+			SumFn_   func(...K) K
+		}
+		ID() T
+		Amounts() []K
+		SumFn() func(...K) K
 	},
 ](l L) {
-	fmt.Printf("%s has a sum of %v\n", l.ID, l.SumFn(l.Amounts...))
+	fmt.Printf("%s has a sum of %v\n", l.ID(), l.SumFn()(l.Amounts()...))
 }
 
 func main() {
 	PrintLedger(Ledger[string, int]{
-		ID:      "fake",
-		Amounts: []int{1, 2, 3},
-		SumFn:   Sum[int],
+		ID_:      "fake",
+		Amounts_: []int{1, 2, 3},
+		SumFn_:   Sum[int],
 	})
 }
diff --git a/test/typeparam/issue50690b.go b/test/typeparam/issue50690b.go
index 498b9d3..572d8eb 100644
--- a/test/typeparam/issue50690b.go
+++ b/test/typeparam/issue50690b.go
@@ -18,24 +18,34 @@
 	fmt.Println(s)
 }
 
-func PrintWithPrinter[T ~string, S ~struct {
-	ID      T
-	PrintFn func(T)
+func PrintWithPrinter[T ~string, S interface {
+	~struct {
+		ID       T
+		PrintFn_ func(T)
+	}
+	PrintFn() func(T)
 }](message T, obj S) {
-	obj.PrintFn(message)
+	obj.PrintFn()(message)
 }
 
 type PrintShop[T ~string] struct {
-	ID      T
-	PrintFn func(T)
+	ID       T
+	PrintFn_ func(T)
 }
 
+// Field accesses through type parameters are disabled
+// until we have a more thorough understanding of the
+// implications on the spec. See issue #51576.
+// Use accessor method instead.
+
+func (s PrintShop[T]) PrintFn() func(T) { return s.PrintFn_ }
+
 func main() {
 	PrintWithPrinter(
 		"Hello, world.",
 		PrintShop[string]{
-			ID:      "fake",
-			PrintFn: Print[string],
+			ID:       "fake",
+			PrintFn_: Print[string],
 		},
 	)
 }
diff --git a/test/typeparam/issue50690c.go b/test/typeparam/issue50690c.go
index aa9258f..8b87c2f 100644
--- a/test/typeparam/issue50690c.go
+++ b/test/typeparam/issue50690c.go
@@ -18,19 +18,33 @@
 	fmt.Println(s)
 }
 
-func PrintWithPrinter[T ~string, S struct {
-	ID      T
-	PrintFn func(T)
+func PrintWithPrinter[T ~string, S interface {
+	~struct {
+		ID       T
+		PrintFn_ func(T)
+	}
+	PrintFn() func(T)
 }](message T, obj S) {
-	obj.PrintFn(message)
+	obj.PrintFn()(message)
 }
 
 func main() {
 	PrintWithPrinter(
 		"Hello, world.",
-		struct {
-			ID      string
-			PrintFn func(string)
-		}{ID: "fake", PrintFn: Print[string]},
+		StructWithPrinter{ID: "fake", PrintFn_: Print[string]},
 	)
 }
+
+type StructWithPrinter struct {
+	ID       string
+	PrintFn_ func(string)
+}
+
+// Field accesses through type parameters are disabled
+// until we have a more thorough understanding of the
+// implications on the spec. See issue #51576.
+// Use accessor method instead.
+
+func (s StructWithPrinter) PrintFn() func(string) {
+	return s.PrintFn_
+}
diff --git a/test/typeparam/issue51219.dir/a.go b/test/typeparam/issue51219.dir/a.go
new file mode 100644
index 0000000..29670df
--- /dev/null
+++ b/test/typeparam/issue51219.dir/a.go
@@ -0,0 +1,20 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+// Type I is the first basic test for the issue, which relates to a type that is recursive
+// via a type constraint.  (In this test, I -> IConstraint -> MyStruct -> I.)
+type JsonRaw []byte
+
+type MyStruct struct {
+	x *I[JsonRaw]
+}
+
+type IConstraint interface {
+	JsonRaw | MyStruct
+}
+
+type I[T IConstraint] struct {
+}
diff --git a/test/typeparam/issue51219.dir/main.go b/test/typeparam/issue51219.dir/main.go
new file mode 100644
index 0000000..999b4a9
--- /dev/null
+++ b/test/typeparam/issue51219.dir/main.go
@@ -0,0 +1,16 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"a"
+	"fmt"
+)
+
+func main() {
+	var x a.I[a.JsonRaw]
+
+	fmt.Printf("%v\n", x)
+}
diff --git a/test/typeparam/issue51219.go b/test/typeparam/issue51219.go
new file mode 100644
index 0000000..642f4bf
--- /dev/null
+++ b/test/typeparam/issue51219.go
@@ -0,0 +1,7 @@
+// rundir -G=3
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored
diff --git a/test/typeparam/issue51219.out b/test/typeparam/issue51219.out
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/test/typeparam/issue51219.out
@@ -0,0 +1 @@
+{}
diff --git a/test/typeparam/issue51219b.dir/a.go b/test/typeparam/issue51219b.dir/a.go
new file mode 100644
index 0000000..1904940
--- /dev/null
+++ b/test/typeparam/issue51219b.dir/a.go
@@ -0,0 +1,37 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+type Interaction[DataT InteractionDataConstraint] struct {
+}
+
+type InteractionDataConstraint interface {
+	[]byte |
+		UserCommandInteractionData
+}
+
+type UserCommandInteractionData struct {
+	resolvedInteractionWithOptions
+}
+
+type resolvedInteractionWithOptions struct {
+	Resolved Resolved `json:"resolved,omitempty"`
+}
+
+type Resolved struct {
+	Users ResolvedData[User] `json:"users,omitempty"`
+}
+
+type ResolvedData[T ResolvedDataConstraint] map[uint64]T
+
+type ResolvedDataConstraint interface {
+	User | Message
+}
+
+type User struct{}
+
+type Message struct {
+	Interaction *Interaction[[]byte] `json:"interaction,omitempty"`
+}
diff --git a/test/typeparam/issue51219b.dir/b.go b/test/typeparam/issue51219b.dir/b.go
new file mode 100644
index 0000000..8413d66
--- /dev/null
+++ b/test/typeparam/issue51219b.dir/b.go
@@ -0,0 +1,14 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package b
+
+import (
+	"./a"
+)
+
+// InteractionRequest is an incoming request Interaction
+type InteractionRequest[T a.InteractionDataConstraint] struct {
+	a.Interaction[T]
+}
diff --git a/test/typeparam/issue51219b.dir/p.go b/test/typeparam/issue51219b.dir/p.go
new file mode 100644
index 0000000..9f8b840
--- /dev/null
+++ b/test/typeparam/issue51219b.dir/p.go
@@ -0,0 +1,14 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+import (
+	"./b"
+)
+
+// ResponseWriterMock mocks corde's ResponseWriter interface
+type ResponseWriterMock struct {
+	x b.InteractionRequest[[]byte]
+}
diff --git a/test/typeparam/issue51219b.go b/test/typeparam/issue51219b.go
new file mode 100644
index 0000000..060a121
--- /dev/null
+++ b/test/typeparam/issue51219b.go
@@ -0,0 +1,7 @@
+// compiledir -G=3
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored
diff --git a/test/typeparam/issue51232.go b/test/typeparam/issue51232.go
new file mode 100644
index 0000000..4e9d68c
--- /dev/null
+++ b/test/typeparam/issue51232.go
@@ -0,0 +1,31 @@
+// errorcheck -G=3
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+type RC[RG any] interface {
+	~[]RG
+}
+
+type Fn[RCT RC[RG], RG any] func(RCT)
+
+type F[RCT RC[RG], RG any] interface {
+	Fn() Fn[RCT] // ERROR "got 1 arguments"
+}
+
+type concreteF[RCT RC[RG], RG any] struct {
+	makeFn func() Fn[RCT] // ERROR "got 1 arguments"
+}
+
+func (c *concreteF[RCT, RG]) Fn() Fn[RCT] { // ERROR "got 1 arguments"
+	return c.makeFn()
+}
+
+func NewConcrete[RCT RC[RG], RG any](Rc RCT) F[RCT] { // ERROR "got 1 arguments"
+	return &concreteF[RCT]{ // ERROR "cannot use" "got 1 arguments"
+		makeFn: nil,
+	}
+}
diff --git a/test/typeparam/issue51233.go b/test/typeparam/issue51233.go
new file mode 100644
index 0000000..e6aabf3
--- /dev/null
+++ b/test/typeparam/issue51233.go
@@ -0,0 +1,28 @@
+// errorcheck -G=3
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+package p
+
+// As of issue #51527, type-type inference has been disabled.
+
+type RC[RG any] interface {
+	~[]RG
+}
+
+type Fn[RCT RC[RG], RG any] func(RCT)
+
+type FFn[RCT RC[RG], RG any] func() Fn[RCT] // ERROR "got 1 arguments"
+
+type F[RCT RC[RG], RG any] interface {
+	Fn() Fn[RCT] // ERROR "got 1 arguments"
+}
+
+type concreteF[RCT RC[RG], RG any] struct {
+	makeFn FFn[RCT] // ERROR "got 1 arguments"
+}
+
+func (c *concreteF[RCT, RG]) Fn() Fn[RCT] { // ERROR "got 1 arguments"
+	return c.makeFn()
+}
diff --git a/test/typeparam/issue51236.go b/test/typeparam/issue51236.go
new file mode 100644
index 0000000..779c74e
--- /dev/null
+++ b/test/typeparam/issue51236.go
@@ -0,0 +1,22 @@
+// run -gcflags=-G=3
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+type I interface {
+	[]byte
+}
+
+func F[T I]() {
+	var t T
+	explodes(t)
+}
+
+func explodes(b []byte) {}
+
+func main() {
+
+}
diff --git a/test/typeparam/issue51245.go b/test/typeparam/issue51245.go
new file mode 100644
index 0000000..bd4f7c5
--- /dev/null
+++ b/test/typeparam/issue51245.go
@@ -0,0 +1,16 @@
+// build -gcflags=-G=3
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+type T[P any] int
+const C T[int] = 3
+
+type T2 int
+const C2 T2 = 9
+
+func main() {
+}
diff --git a/test/typeparam/issue51250a.dir/a.go b/test/typeparam/issue51250a.dir/a.go
new file mode 100644
index 0000000..12dd60a
--- /dev/null
+++ b/test/typeparam/issue51250a.dir/a.go
@@ -0,0 +1,9 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+type G[T any] struct {
+	x T
+}
diff --git a/test/typeparam/issue51250a.dir/b.go b/test/typeparam/issue51250a.dir/b.go
new file mode 100644
index 0000000..114c9f8
--- /dev/null
+++ b/test/typeparam/issue51250a.dir/b.go
@@ -0,0 +1,24 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package b
+
+import "./a"
+
+type T struct { a int }
+
+var I interface{} = a.G[T]{}
+
+//go:noinline
+func F(x interface{}) {
+	switch x.(type) {
+	case a.G[T]:
+	case int:
+		panic("bad")
+	case float64:
+		panic("bad")
+	default:
+		panic("bad")
+	}
+}
diff --git a/test/typeparam/issue51250a.dir/main.go b/test/typeparam/issue51250a.dir/main.go
new file mode 100644
index 0000000..45288be
--- /dev/null
+++ b/test/typeparam/issue51250a.dir/main.go
@@ -0,0 +1,24 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"./a"
+	"./b"
+)
+
+func main() {
+	switch b.I.(type) {
+	case a.G[b.T]:
+	case int:
+		panic("bad")
+	case float64:
+		panic("bad")
+	default:
+		panic("bad")
+	}
+
+	b.F(a.G[b.T]{})
+}
diff --git a/test/typeparam/issue51250a.go b/test/typeparam/issue51250a.go
new file mode 100644
index 0000000..aefbe67
--- /dev/null
+++ b/test/typeparam/issue51250a.go
@@ -0,0 +1,7 @@
+// rundir
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored
diff --git a/test/typeparam/issue51303.go b/test/typeparam/issue51303.go
new file mode 100644
index 0000000..5f4bdc0
--- /dev/null
+++ b/test/typeparam/issue51303.go
@@ -0,0 +1,65 @@
+// run -gcflags=-G=3
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"fmt"
+)
+
+func main() {
+	x := [][]int{{1}}
+	y := [][]int{{2, 3}}
+	IntersectSS(x, y)
+}
+
+type list[E any] interface {
+	~[]E
+	Equal(x, y E) bool
+}
+
+// ss is a set of sets
+type ss[E comparable, T []E] []T
+
+func (ss[E, T]) Equal(a, b T) bool {
+	return SetEq(a, b)
+}
+
+func IntersectSS[E comparable](x, y [][]E) [][]E {
+	return IntersectT[[]E, ss[E, []E]](ss[E, []E](x), ss[E, []E](y))
+}
+
+func IntersectT[E any, L list[E]](x, y L) L {
+	var z L
+outer:
+	for _, xe := range x {
+		fmt.Println("xe", xe)
+		for _, ye := range y {
+			fmt.Println("ye", ye)
+			fmt.Println("x", x)
+			if x.Equal(xe, ye) {
+				fmt.Println("appending")
+				z = append(z, xe)
+				continue outer
+			}
+		}
+	}
+	return z
+}
+
+func SetEq[S []E, E comparable](x, y S) bool {
+	fmt.Println("SetEq", x, y)
+outer:
+	for _, xe := range x {
+		for _, ye := range y {
+			if xe == ye {
+				continue outer
+			}
+		}
+		return false // xs wasn't found in y
+	}
+	return true
+}
diff --git a/test/typeparam/issue51303.out b/test/typeparam/issue51303.out
new file mode 100644
index 0000000..34b3be3
--- /dev/null
+++ b/test/typeparam/issue51303.out
@@ -0,0 +1,4 @@
+xe [1]
+ye [2 3]
+x [[1]]
+SetEq [1] [2 3]
diff --git a/test/typeparam/issue51355.go b/test/typeparam/issue51355.go
new file mode 100644
index 0000000..15ffa4b
--- /dev/null
+++ b/test/typeparam/issue51355.go
@@ -0,0 +1,31 @@
+// compile -G=3
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+type Cache[E comparable] struct {
+	adder func(...E)
+}
+
+func New[E comparable]() *Cache[E] {
+	c := &Cache[E]{}
+
+	c.adder = func(elements ...E) {
+		for _, value := range elements {
+			value := value
+			go func() {
+				println(value)
+			}()
+		}
+	}
+
+	return c
+}
+
+func main() {
+	c := New[string]()
+	c.adder("test")
+}
diff --git a/test/typeparam/issue51367.dir/a.go b/test/typeparam/issue51367.dir/a.go
new file mode 100644
index 0000000..be0c3b0
--- /dev/null
+++ b/test/typeparam/issue51367.dir/a.go
@@ -0,0 +1,14 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+type A[T any] struct{}
+
+func (_ A[T]) Method() {}
+
+func DoSomething[P any]() {
+	a := A[*byte]{}
+	a.Method()
+}
diff --git a/test/typeparam/issue51367.dir/main.go b/test/typeparam/issue51367.dir/main.go
new file mode 100644
index 0000000..64273d3
--- /dev/null
+++ b/test/typeparam/issue51367.dir/main.go
@@ -0,0 +1,13 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"a"
+)
+
+func main() {
+	a.DoSomething[byte]()
+}
diff --git a/test/typeparam/issue51367.go b/test/typeparam/issue51367.go
new file mode 100644
index 0000000..642f4bf
--- /dev/null
+++ b/test/typeparam/issue51367.go
@@ -0,0 +1,7 @@
+// rundir -G=3
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored
diff --git a/test/typeparam/issue51423.dir/a.go b/test/typeparam/issue51423.dir/a.go
new file mode 100644
index 0000000..e824d0e
--- /dev/null
+++ b/test/typeparam/issue51423.dir/a.go
@@ -0,0 +1,17 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+type Comparator[T any] func(v1, v2 T) int
+
+func CompareInt[T ~int](a, b T) int {
+	if a < b {
+		return -1
+	}
+	if a == b {
+		return 0
+	}
+	return 1
+}
diff --git a/test/typeparam/issue51423.dir/b.go b/test/typeparam/issue51423.dir/b.go
new file mode 100644
index 0000000..2bad19f
--- /dev/null
+++ b/test/typeparam/issue51423.dir/b.go
@@ -0,0 +1,11 @@
+package b
+
+import "./a"
+
+func C() a.Comparator[int] {
+	return a.CompareInt[int]
+}
+
+func main() {
+	_ = C()(1, 2)
+}
diff --git a/test/typeparam/issue51423.go b/test/typeparam/issue51423.go
new file mode 100644
index 0000000..060a121
--- /dev/null
+++ b/test/typeparam/issue51423.go
@@ -0,0 +1,7 @@
+// compiledir -G=3
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored
diff --git a/test/typeparam/issue51522a.go b/test/typeparam/issue51522a.go
new file mode 100644
index 0000000..31ce4bf
--- /dev/null
+++ b/test/typeparam/issue51522a.go
@@ -0,0 +1,42 @@
+// run -gcflags=-G=3
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+package main
+
+
+func f[T comparable](i any) {
+	var t T
+
+	if i != t {
+		println("FAIL: if i != t")
+	}
+}
+
+type myint int
+
+func (m myint) foo() {
+}
+
+type fooer interface {
+	foo()
+}
+
+type comparableFoo interface {
+	comparable
+	foo()
+}
+
+func g[T comparableFoo](i fooer) {
+	var t T
+
+	if i != t {
+		println("FAIL: if i != t")
+	}
+}
+
+func main() {
+	f[int](int(0))
+	g[myint](myint(0))
+}
diff --git a/test/typeparam/issue51522b.go b/test/typeparam/issue51522b.go
new file mode 100644
index 0000000..47de578
--- /dev/null
+++ b/test/typeparam/issue51522b.go
@@ -0,0 +1,62 @@
+// run -gcflags=-G=3
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+func f[T comparable](i any) {
+	var t T
+
+	switch i {
+	case t:
+		// ok
+	default:
+		println("FAIL: switch i")
+	}
+
+	switch t {
+	case i:
+		// ok
+	default:
+		println("FAIL: switch t")
+	}
+}
+
+type myint int
+
+func (m myint) foo() {
+}
+
+type fooer interface {
+	foo()
+}
+
+type comparableFoo interface {
+	comparable
+	foo()
+}
+
+func g[T comparableFoo](i fooer) {
+	var t T
+
+	switch i {
+	case t:
+		// ok
+	default:
+		println("FAIL: switch i")
+	}
+
+	switch t {
+	case i:
+		// ok
+	default:
+		println("FAIL: switch t")
+	}
+}
+
+func main() {
+	f[int](0)
+	g[myint](myint(0))
+}
diff --git a/test/typeparam/settable.go b/test/typeparam/settable.go
index 412023b..6179ae0 100644
--- a/test/typeparam/settable.go
+++ b/test/typeparam/settable.go
@@ -15,7 +15,7 @@
 
 type Setter[B any] interface {
 	Set(string)
-	~*B
+	*B
 }
 
 // Takes two type parameters where PT = *T
diff --git a/test/typeparam/typelist.go b/test/typeparam/typelist.go
index 477778f..c82cb5f 100644
--- a/test/typeparam/typelist.go
+++ b/test/typeparam/typelist.go
@@ -89,7 +89,7 @@
 }
 */
 
-func f2[A any, B interface{ ~[]A }](_ A, _ B) {}
+func f2[A any, B interface{ []A }](_ A, _ B) {}
 func f2x() {
 	f := f2[byte]
 	f(byte(0), []byte{})
@@ -109,7 +109,7 @@
 }
 */
 
-func f4[A any, B interface{ ~[]C }, C interface{ ~*A }](_ A, _ B, c C) {}
+func f4[A any, B interface{ []C }, C interface{ *A }](_ A, _ B, c C) {}
 func f4x() {
 	f := f4[int]
 	var x int
@@ -118,11 +118,11 @@
 }
 
 func f5[A interface {
-	~struct {
+	struct {
 		b B
 		c C
 	}
-}, B any, C interface{ ~*B }](x B) A {
+}, B any, C interface{ *B }](x B) A {
 	panic(0)
 }
 func f5x() {