Merge tag 'go1.19' into HEAD
Change-Id: I526b2588d7e42eea5e245f4ed5177d4eb0c81135
diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644
index 1a4a57b..0000000
--- a/AUTHORS
+++ /dev/null
@@ -1,1494 +0,0 @@
-# This is the official list of Go authors for copyright purposes.
-# This file is distinct from the CONTRIBUTORS files.
-# See the latter for an explanation.
-
-# Since Go 1.11, this file is not actively maintained.
-# To be included, send a change adding the individual or
-# company who owns a contribution's copyright.
-
-# Names should be added to this file as one of
-# Organization's name
-# Individual's name <submission email address>
-# Individual's name <submission email address> <email2> <emailN>
-# See CONTRIBUTORS for the meaning of multiple email addresses.
-
-# Please keep the list sorted.
-
-10x Genomics, Inc.
-A Medium Corporation
-Aamir Khan <syst3m.w0rm@gmail.com>
-Aaron France <aaron.l.france@gmail.com>
-Aaron Stein <aaronstein12@gmail.com>
-Aaron Torres <tcboox@gmail.com>
-Aarti Parikh <aarti.parikh@gmail.com>
-Abe Haskins <abeisgreat@abeisgreat.com>
-Abhinav Gupta <abhinav.g90@gmail.com>
-Adam Eijdenberg <adam@continusec.com>
-Adam Harvey <aharvey@php.net>
-Adam Kisala <adam.kisala@gmail.com>
-Adam Medzinski <adam.medzinski@gmail.com>
-Adam Shannon <adamkshannon@gmail.com>
-Adam Thomason <athomason@gmail.com>
-Adam Woodbeck <adam@woodbeck.net>
-Aditya Mukerjee <dev@chimeracoder.net>
-Adrian Hesketh <adrianhesketh@hushmail.com>
-Adrian Nos <nos.adrian@gmail.com>
-Adrian O'Grady <elpollouk@gmail.com>
-Adrien Bustany <adrien-xx-google@bustany.org>
-Adrien Petel <peteladrien@gmail.com>
-Aécio Júnior <aeciodantasjunior@gmail.com>
-Aeneas Rekkas (arekkas) <aeneas@ory.am>
-Afanasev Stanislav <phpprogger@gmail.com>
-Agis Anastasopoulos <agis.anast@gmail.com>
-Agniva De Sarker <agnivade@yahoo.co.in>
-Ahmed W. Mones <oneofone@gmail.com>
-Ahmet Soormally <ahmet@mangomm.co.uk>
-Ahmy Yulrizka <yulrizka@gmail.com>
-Aiden Scandella <ai@uber.com>
-Ainar Garipov <gugl.zadolbal@gmail.com>
-Aishraj Dahal <aishraj@users.noreply.github.com>
-Akhil Indurti <aindurti@gmail.com>
-Akihiro Suda <suda.kyoto@gmail.com>
-Akshat Kumar <seed@mail.nanosouffle.net>
-Alan Shreve <alan@inconshreveable.com>
-Albert Nigmatzianov <albertnigma@gmail.com>
-Albert Strasheim <fullung@gmail.com>
-Albert Yu <yukinying@gmail.com>
-Alberto Bertogli <albertito@blitiri.com.ar>
-Alberto Donizetti <alb.donizetti@gmail.com>
-Alberto García Hierro <alberto@garciahierro.com> <alberto.garcia.hierro@gmail.com>
-Aleksandar Dezelin <dezelin@gmail.com>
-Aleksandr Lukinykh <a.lukinykh@xsolla.com>
-Alekseev Artem <a.artem060@gmail.com>
-Alessandro Arzilli <alessandro.arzilli@gmail.com>
-Alessandro Baffa <alessandro.baffa@gmail.com>
-Alex A Skinner <alex@lx.lc>
-Alex Brainman <alex.brainman@gmail.com>
-Alex Browne <stephenalexbrowne@gmail.com>
-Alex Carol <alex.carol.c@gmail.com>
-Alex Jin <toalexjin@gmail.com>
-Alex Myasoedov <msoedov@gmail.com>
-Alex Plugaru <alex@plugaru.org> <alexandru.plugaru@gmail.com>
-Alex Schroeder <alex@gnu.org>
-Alex Sergeyev <abc@alexsergeyev.com>
-Alexander Demakin <alexander.demakin@gmail.com>
-Alexander Döring <email@alexd.ch>
-Alexander F Rødseth <alexander.rodseth@appeartv.com>
-Alexander Guz <kalimatas@gmail.com>
-Alexander Kauer <alexander@affine.space>
-Alexander Kucherenko <alxkchr@gmail.com>
-Alexander Larsson <alexander.larsson@gmail.com>
-Alexander Menzhinsky <amenzhinsky@gmail.com>
-Alexander Morozov <lk4d4math@gmail.com>
-Alexander Neumann <alexander@bumpern.de>
-Alexander Orlov <alexander.orlov@loxal.net>
-Alexander Pantyukhin <apantykhin@gmail.com>
-Alexander Reece <awreece@gmail.com>
-Alexander Surma <surma@surmair.de>
-Alexander Zhavnerchik <alex.vizor@gmail.com>
-Alexander Zolotov <goldifit@gmail.com>
-Alexandre Cesaro <alexandre.cesaro@gmail.com>
-Alexandre Fiori <fiorix@gmail.com>
-Alexandre Normand <alexandre.normand@gmail.com>
-Alexandre Parentea <aubonbeurre@gmail.com>
-Alexandre Viau <alexandre@alexandreviau.net>
-Alexei Sholik <alcosholik@gmail.com>
-Alexey Borzenkov <snaury@gmail.com>
-Alexey Neganov <neganovalexey@gmail.com>
-Alexey Palazhchenko <alexey.palazhchenko@gmail.com>
-Alexey Semenyuk <alexsemenyuk88@gmail.com>
-Alexis Hildebrandt <surryhill@gmail.com>
-Ali Rizvi-Santiago <arizvisa@gmail.com>
-Aliaksandr Valialkin <valyala@gmail.com>
-Alif Rachmawadi <subosito@gmail.com>
-Allan Simon <allan.simon@supinfo.com>
-Alok Menghrajani <alok.menghrajani@gmail.com>
-Aman Gupta <aman@tmm1.net>
-Amazon.com, Inc
-Amir Mohammad Saied <amir@gluegadget.com>
-Amr Mohammed <merodiro@gmail.com>
-Amrut Joshi <amrut.joshi@gmail.com>
-Anand K. Mistry <anand@mistry.ninja>
-Anders Pearson <anders@columbia.edu>
-André Carvalho <asantostc@gmail.com>
-Andre Nathan <andrenth@gmail.com>
-Andreas Auernhammer <aead@mail.de>
-Andreas Litt <andreas.litt@gmail.com>
-Andrei Korzhevskii <a.korzhevskiy@gmail.com>
-Andrei Tudor Călin <mail@acln.ro>
-Andrei Vieru <euvieru@gmail.com>
-Andrew Austin <andrewaclt@gmail.com>
-Andrew Balholm <andybalholm@gmail.com>
-Andrew Benton <andrewmbenton@gmail.com>
-Andrew Bonventre <andybons@chromium.org>
-Andrew Braunstein <awbraunstein@gmail.com>
-Andrew Bursavich <abursavich@gmail.com>
-Andrew Ekstedt <andrew.ekstedt@gmail.com>
-Andrew Etter <andrew.etter@gmail.com>
-Andrew Harding <andrew@spacemonkey.com>
-Andrew Lutomirski <andy@luto.us>
-Andrew Pogrebnoy <absourd.noise@gmail.com>
-Andrew Pritchard <awpritchard@gmail.com>
-Andrew Radev <andrey.radev@gmail.com>
-Andrew Skiba <skibaa@gmail.com>
-Andrew Szeto <andrew@jabagawee.com>
-Andrew Wilkins <axwalk@gmail.com>
-Andrew Williams <williams.andrew@gmail.com>
-Andrey Mirtchovski <mirtchovski@gmail.com>
-Andrey Petrov <andrey.petrov@shazow.net>
-Andrii Soldatenko <andrii.soldatenko@gmail.com>
-Andrii Soluk <isoluchok@gmail.com>
-Andriy Lytvynov <lytvynov.a.v@gmail.com>
-Andrzej Żeżel <andrii.zhezhel@gmail.com>
-Andy Balholm <andy@balholm.com>
-Andy Davis <andy@bigandian.com>
-Andy Finkenstadt <afinkenstadt@zynga.com>
-Andy Lindeman <andy@lindeman.io>
-Andy Maloney <asmaloney@gmail.com>
-Andy Pan <panjf2000@gmail.com> <panjf2000@golangcn.org> <i@andypan.me>
-Andy Walker <walkeraj@gmail.com>
-Anfernee Yongkun Gui <anfernee.gui@gmail.com>
-Angelo Bulfone <mbulfone@gmail.com>
-Anh Hai Trinh <anh.hai.trinh@gmail.com>
-Anit Gandhi <anitgandhi@gmail.com>
-Anmol Sethi <anmol@aubble.com>
-Anschel Schaffer-Cohen <anschelsc@gmail.com>
-Anthony Alves <cvballa3g0@gmail.com>
-Anthony Canino <anthony.canino1@gmail.com>
-Anthony Eufemio <anthony.eufemio@gmail.com>
-Anthony Martin <ality@pbrane.org>
-Anthony Sottile <asottile@umich.edu>
-Anthony Starks <ajstarks@gmail.com>
-Anthony Voutas <voutasaurus@gmail.com>
-Anthony Woods <awoods@raintank.io>
-Antoine Martin <antoine97.martin@gmail.com>
-Antonin Amand <antonin.amand@gmail.com>
-Antonio Antelo <aantelov87@gmail.com>
-Antonio Bibiano <antbbn@gmail.com>
-Antonio Troina <thoeni@gmail.com>
-Apisak Darakananda <pongad@gmail.com>
-Apsalar
-Aram Hăvărneanu <aram@mgk.ro>
-Areski Belaid <areski@gmail.com>
-Ariel Mashraki <ariel@mashraki.co.il>
-Arlo Breault <arlolra@gmail.com>
-ARM Ltd.
-Arnaud Ysmal <arnaud.ysmal@gmail.com>
-Arne Hormann <arnehormann@gmail.com>
-Arnout Engelen <arnout@bzzt.net>
-Aron Nopanen <aron.nopanen@gmail.com>
-Arthur Khashaev <arthur@khashaev.ru>
-Artyom Pervukhin <artyom.pervukhin@gmail.com>
-Arvindh Rajesh Tamilmani <art@a-30.net>
-Ashish Gandhi <ag@ashishgandhi.org>
-Atin Malaviya <amalaviy@akamai.com>
-Ato Araki <ato.araki@gmail.com>
-Audrey Lim <audreylh@gmail.com>
-Audrius Butkevicius <audrius.butkevicius@gmail.com>
-Augusto Roman <aroman@gmail.com>
-Aulus Egnatius Varialus <varialus@gmail.com>
-Aurélien Rainone <aurelien.rainone@gmail.com>
-awaw fumin <awawfumin@gmail.com>
-Awn Umar <awn@cryptolosophy.io>
-Axel Wagner <axel.wagner.hh@googlemail.com>
-Ayanamist Yang <ayanamist@gmail.com>
-Aymerick Jéhanne <aymerick@jehanne.org>
-Azat Kaumov <kaumov.a.r@gmail.com>
-Baiju Muthukadan <baiju.m.mail@gmail.com>
-Baokun Lee <nototon@gmail.com> <bk@golangcn.org>
-Bartosz Grzybowski <melkorm@gmail.com>
-Bastian Ike <bastian.ike@gmail.com>
-Ben Burkert <ben@benburkert.com>
-Ben Haines <bhainesva@gmail.com>
-Ben Lubar <ben.lubar@gmail.com>
-Ben Olive <sionide21@gmail.com>
-Ben Shi <powerman1st@163.com>
-Benjamin Black <b@b3k.us>
-Benjamin Cable <cable.benjamin@gmail.com>
-Benjamin Hsieh <tanookiben@users.noreply.github.com>
-Benny Siegert <bsiegert@gmail.com>
-Benoit Sigoure <tsunanet@gmail.com>
-Berengar Lehr <berengar.lehr@gmx.de>
-Bharath Kumar Uppala <uppala.bharath@gmail.com>
-Bill Zissimopoulos <billziss@navimatics.com>
-Billie Harold Cleek <bhcleek@gmail.com>
-Bjorn Tillenius <bjorn@tillenius.me>
-Bjorn Tipling <bjorn.tipling@gmail.com>
-Blain Smith <rebelgeek@blainsmith.com>
-Blake Gentry <blakesgentry@gmail.com>
-Blake Mesdag <blakemesdag@gmail.com>
-Blake Mizerany <blake.mizerany@gmail.com>
-Blixt <me@blixt.nyc>
-Bob Briski <rbriski@gmail.com>
-Bob Potter <bobby.potter@gmail.com>
-Bobby Powers <bobbypowers@gmail.com>
-Bolt
-Borja Clemente <borja.clemente@gmail.com>
-Brad Burch <brad.burch@gmail.com>
-Brad Morgan <brad@morgabra.com>
-Bradley Falzon <brad@teambrad.net>
-Brady Catherman <brady@gmail.com>
-Brady Sullivan <brady@bsull.com>
-Brendan Daniel Tracey <tracey.brendan@gmail.com>
-Brett Cannon <bcannon@gmail.com>
-Brett Merrill <brett.j.merrill94@gmail.com>
-Brian Dellisanti <briandellisanti@gmail.com>
-Brian Downs <brian.downs@gmail.com>
-Brian G. Merrell <bgmerrell@gmail.com>
-Brian Gitonga Marete <marete@toshnix.com> <bgmarete@gmail.com>
-Brian Kennedy <btkennedy@gmail.com>
-Brian Kessler <brian.m.kessler@gmail.com>
-Brian Ketelsen <bketelsen@gmail.com>
-Brian Smith <ohohvi@gmail.com>
-Brian Starke <brian.starke@gmail.com>
-Bryan Alexander <Kozical@msn.com>
-Bryan Chan <bryanpkc@gmail.com>
-Bryan Ford <brynosaurus@gmail.com>
-Bulat Gaifullin <gaifullinbf@gmail.com>
-Burak Guven <bguven@gmail.com>
-Caine Tighe <arctanofyourface@gmail.com>
-Caleb Martinez <accounts@calebmartinez.com>
-Caleb Spare <cespare@gmail.com>
-Canonical Limited
-Carl Chatfield <carlchatfield@gmail.com>
-Carl Henrik Lunde <chlunde@ifi.uio.no>
-Carl Johnson <me@carlmjohnson.net>
-Carlisia Campos <carlisia@grokkingtech.io>
-Carlo Alberto Ferraris <cafxx@strayorange.com>
-Carlos Castillo <cookieo9@gmail.com>
-Carlos Cirello <uldericofilho@gmail.com>
-Carolyn Van Slyck <me@carolynvanslyck.com>
-Case Nelson <case.nelson@gmail.com>
-Casey Callendrello <squeed@gmail.com>
-Casey Marshall <casey.marshall@gmail.com>
-Cezar Sá Espinola <cezarsa@gmail.com>
-ChaiShushan <chaishushan@gmail.com>
-Chaoqun Han <hanssccv@gmail.com>
-Charles Fenwick Elliott <Charles@FenwickElliott.io>
-Charles L. Dorian <cldorian@gmail.com>
-Charles Lee <zombie.fml@gmail.com>
-Chef Software, Inc.
-Chew Choon Keat <choonkeat@gmail.com>
-Cholerae Hu <choleraehyq@gmail.com>
-Chotepud Teo <AlexRouSg@users.noreply.github.com>
-Chris Ball <chris@printf.net>
-Chris Biscardi <chris@christopherbiscardi.com>
-Chris Dollin <ehog.hedge@gmail.com>
-Chris Farmiloe <chrisfarms@gmail.com>
-Chris Hines <chris.cs.guy@gmail.com>
-Chris Howey <howeyc@gmail.com>
-Chris Jones <chris@cjones.org>
-Chris Kastorff <encryptio@gmail.com>
-Chris Lennert <calennert@gmail.com>
-Chris Liles <caveryliles@gmail.com>
-Chris McGee <sirnewton_01@yahoo.ca> <newton688@gmail.com>
-Chris Roche <rodaine@gmail.com>
-Chris Smith <chrsmith@users.noreply.github.com>
-Chris Stockton <chrisstocktonaz@gmail.com>
-Christian Alexander <christian@linux.com>
-Christian Couder <chriscool@tuxfamily.org>
-Christian Himpel <chressie@googlemail.com>
-Christian Pellegrin <chri@evolware.org>
-Christine Hansmann <chhansmann@gmail.com>
-Christoffer Buchholz <christoffer.buchholz@gmail.com>
-Christoph Blecker <admin@toph.ca>
-Christoph Hack <christoph@tux21b.org>
-Christopher Cahoon <chris.cahoon@gmail.com>
-Christopher Guiney <chris@guiney.net>
-Christopher Henderson <chris@chenderson.org>
-Christopher Nelson <nadiasvertex@gmail.com>
-Christopher Nielsen <m4dh4tt3r@gmail.com>
-Christopher Redden <christopher.redden@gmail.com>
-Christopher Wedgwood <cw@f00f.org>
-Christos Zoulas <christos@zoulas.com> <zoulasc@gmail.com>
-CL Sung <clsung@gmail.com> <cl_sung@htc.com>
-Clement Skau <clementskau@gmail.com>
-CloudFlare Inc.
-Cody Oss <the.cody.oss@gmail.com>
-Colin Edwards <colin@recursivepenguin.com>
-Colin Kennedy <moshen.colin@gmail.com>
-Conrad Irwin <conrad.irwin@gmail.com>
-Conrad Meyer <cemeyer@cs.washington.edu>
-Conrado Gouvea <conradoplg@gmail.com>
-Constantin Konstantinidis <constantinkonstantinidis@gmail.com>
-CoreOS, Inc.
-Corey Thomasson <cthom.lists@gmail.com>
-Cristian Staretu <unclejacksons@gmail.com>
-Currant
-Cyrill Schumacher <cyrill@schumacher.fm>
-Daisuke Fujita <dtanshi45@gmail.com>
-Damian Gryski <dgryski@gmail.com>
-Damien Lespiau <damien.lespiau@gmail.com>
-Damien Mathieu <42@dmathieu.com>
-Dan Ballard <dan@mindstab.net>
-Dan Caddigan <goldcaddy77@gmail.com>
-Dan Callahan <dan.callahan@gmail.com>
-Dan Peterson <dpiddy@gmail.com>
-Dan Sinclair <dan.sinclair@gmail.com>
-Daniel Fleischman <danielfleischman@gmail.com>
-Daniel Johansson <dajo2002@gmail.com>
-Daniel Kerwin <d.kerwin@gini.net>
-Daniel Krech <eikeon@eikeon.com>
-Daniel Lidén <daniel.liden.87@gmail.com>
-Daniel Martí <mvdan@mvdan.cc>
-Daniel Morsing <daniel.morsing@gmail.com>
-Daniel Nephin <dnephin@gmail.com>
-Daniel Ortiz Pereira da Silva <daniel.particular@gmail.com>
-Daniel Skinner <daniel@dasa.cc>
-Daniel Speichert <daniel@speichert.pl>
-Daniel Theophanes <kardianos@gmail.com>
-Daniel Upton <daniel@floppy.co>
-Daniela Petruzalek <daniela.petruzalek@gmail.com>
-Danny Rosseau <daniel.rosseau@gmail.com>
-Darren Elwood <darren@textnode.com>
-Darshan Parajuli <parajulidarshan@gmail.com>
-Datong Sun <dndx@idndx.com>
-Dave Cheney <dave@cheney.net>
-Dave MacFarlane <driusan@gmail.com>
-Dave Russell <forfuncsake@gmail.com>
-David Brophy <dave@brophy.uk>
-David Bürgin <676c7473@gmail.com>
-David Calavera <david.calavera@gmail.com>
-David Carlier <devnexen@gmail.com>
-David du Colombier <0intro@gmail.com>
-David Forsythe <dforsythe@gmail.com>
-David G. Andersen <dave.andersen@gmail.com>
-David Howden <dhowden@gmail.com>
-David Jakob Fritz <david.jakob.fritz@gmail.com>
-David Leon Gil <coruus@gmail.com>
-David NewHamlet <david@newhamlet.com>
-David R. Jenni <david.r.jenni@gmail.com>
-David Sansome <me@davidsansome.com>
-David Stainton <dstainton415@gmail.com>
-David Thomas <davidthomas426@gmail.com>
-David Titarenco <david.titarenco@gmail.com>
-David Url <david@urld.io>
-David Volquartz Lebech <david@lebech.info>
-David Wimmer <davidlwimmer@gmail.com>
-Davies Liu <davies.liu@gmail.com>
-Davor Kapsa <davor.kapsa@gmail.com>
-Dean Prichard <dean.prichard@gmail.com>
-Deepak Jois <deepak.jois@gmail.com>
-Denis Bernard <db047h@gmail.com>
-Denis Brandolini <denis.brandolini@gmail.com>
-Dennis Kuhnert <mail.kuhnert@gmail.com>
-Denys Honsiorovskyi <honsiorovskyi@gmail.com>
-Derek Buitenhuis <derek.buitenhuis@gmail.com>
-Derek McGowan <derek@mcgstyle.net>
-Derek Parker <parkerderek86@gmail.com>
-Derek Shockey <derek.shockey@gmail.com>
-Dev Ojha <dojha12@gmail.com>
-Dev Zhoujun <dev.zhoujun@gmail.com>
-Develer SRL
-Devon H. O'Dell <devon.odell@gmail.com>
-Dhaivat Pandit <dhaivatpandit@gmail.com>
-Dhiru Kholia <dhiru.kholia@gmail.com>
-Dhruvdutt Jadhav <dhruvdutt.jadhav@gmail.com>
-Didier Spezia <didier.06@gmail.com>
-Dimitri Sokolyuk <sokolyuk@gmail.com>
-Dimitri Tcaciuc <dtcaciuc@gmail.com>
-Diogo Pinela <diogoid7400@gmail.com>
-Dirk Gadsden <dirk@esherido.com>
-Diwaker Gupta <diwakergupta@gmail.com>
-Dmitri Popov <operator@cv.dp-net.com>
-Dmitri Shuralyov <dmitri@shuralyov.com> <shurcooL@gmail.com>
-Dmitriy Cherchenko <dcherchenko@gmail.com>
-Dmitriy Dudkin <dudkin.dmitriy@gmail.com>
-Dmitriy Shelenin <deemok@googlemail.com> <deemok@gmail.com>
-Dmitry Chestnykh <dchest@gmail.com>
-Dmitry Doroginin <doroginin@gmail.com>
-Dmitry Savintsev <dsavints@gmail.com>
-Dmitry Yakunin <nonamezeil@gmail.com>
-Dominic Green <dominicgreen1@gmail.com>
-Dominik Honnef <dominik.honnef@gmail.com>
-Donald Huang <don.hcd@gmail.com>
-Dong-hee Na <donghee.na92@gmail.com>
-Donovan Hide <donovanhide@gmail.com>
-Dropbox, Inc.
-Duncan Holm <mail@frou.org>
-Dustin Herbison <djherbis@gmail.com>
-Dustin Sallings <dsallings@gmail.com>
-Dustin Shields-Cloues <dcloues@gmail.com>
-Dvir Volk <dvir@everything.me> <dvirsky@gmail.com>
-Dylan Waits <dylan@waits.io>
-Edan Bedrik <3d4nb3@gmail.com>
-Eden Li <eden.li@gmail.com>
-Eduardo Ramalho <eduardo.ramalho@gmail.com>
-Edward Muller <edwardam@interlix.com>
-Egon Elbre <egonelbre@gmail.com>
-Ehren Kret <ehren.kret@gmail.com>
-Eitan Adler <lists@eitanadler.com>
-Eivind Uggedal <eivind@uggedal.com>
-Elbert Fliek <efliek@gmail.com>
-Eldar Rakhimberdin <ibeono@gmail.com>
-Elena Grahovac <elena@grahovac.me>
-Elias Naur <mail@eliasnaur.com> <elias.naur@gmail.com>
-Elliot Morrison-Reed <elliotmr@gmail.com>
-Emerson Lin <linyintor@gmail.com>
-Emil Hessman <emil@hessman.se>
-Emil Mursalimov <mursalimovemeel@gmail.com>
-Emilien Kenler <hello@emilienkenler.com>
-Emmanuel Odeke <emm.odeke@gmail.com> <odeke@ualberta.ca>
-Empirical Interfaces Inc.
-Eoghan Sherry <ejsherry@gmail.com>
-Eric Chiang <eric.chiang.m@gmail.com>
-Eric Clark <zerohp@gmail.com>
-Eric Daniels <eric@erdaniels.com>
-Eric Engestrom <eric@engestrom.ch>
-Eric Lagergren <ericscottlagergren@gmail.com>
-Eric Milliken <emilliken@gmail.com>
-Eric Pauley <eric@pauley.me>
-Eric Rescorla <ekr@rtfm.com>
-Eric Roshan-Eisner <eric.d.eisner@gmail.com>
-Eric Rykwalder <e.rykwalder@gmail.com>
-Erik Aigner <aigner.erik@gmail.com>
-Erik Dubbelboer <erik@dubbelboer.com>
-Erik St. Martin <alakriti@gmail.com>
-Erik Westrup <erik.westrup@gmail.com>
-Ernest Chiang <ernest_chiang@htc.com>
-Erwin Oegema <blablaechthema@hotmail.com>
-Esko Luontola <esko.luontola@gmail.com>
-Euan Kemp <euank@euank.com>
-Eugene Kalinin <e.v.kalinin@gmail.com>
-Evan Hicks <evan.hicks2@gmail.com>
-Evan Jones <ej@evanjones.ca>
-Evan Phoenix <evan@phx.io>
-Evan Shaw <chickencha@gmail.com>
-Evgeniy Polyakov <zbr@ioremap.net>
-Ewan Chou <coocood@gmail.com>
-Ewan Valentine <ewan.valentine89@gmail.com>
-Eyal Posener <posener@gmail.com>
-Fabian Wickborn <fabian@wickborn.net>
-Fabian Zaremba <fabian@youremail.eu>
-Fabrizio Milo <mistobaan@gmail.com>
-Facebook, Inc.
-Faiyaz Ahmed <ahmedf@vmware.com>
-Fan Hongjian <fan.howard@gmail.com>
-Fastly, Inc.
-Fatih Arslan <fatih@arslan.io>
-Fazlul Shahriar <fshahriar@gmail.com>
-Fedor Indutny <fedor@indutny.com>
-Felipe Oliveira <felipeweb.programador@gmail.com>
-Felix Geisendörfer <haimuiba@gmail.com>
-Felix Kollmann <fk@konsorten.de>
-Filip Gruszczyński <gruszczy@gmail.com>
-Filip Haglund <drathier@users.noreply.github.com>
-Filippo Valsorda <hi@filippo.io>
-Firmansyah Adiputra <frm.adiputra@gmail.com>
-Florian Uekermann <florian@uekermann-online.de>
-Florian Weimer <fw@deneb.enyo.de>
-Florin Patan <florinpatan@gmail.com>
-Ford Hurley <ford.hurley@gmail.com>
-Francesc Campoy <francesc@campoy.cat>
-Francisco Claude <fclaude@recoded.cl>
-Francisco Rojas <francisco.rojas.gallegos@gmail.com>
-Francisco Souza <franciscossouza@gmail.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>
-Fredrik Enestad <fredrik.enestad@soundtrackyourbrand.com>
-Fredrik Forsmo <fredrik.forsmo@gmail.com>
-Fredrik Wallgren <fredrik.wallgren@gmail.com>
-Frithjof Schulze <schulze@math.uni-hannover.de> <sfrithjof@gmail.com>
-Frits van Bommel <fvbommel@gmail.com>
-Gabríel Arthúr Pétursson <gabriel@system.is>
-Gabriel Aszalos <gabriel.aszalos@gmail.com>
-Gabriel Nicolas Avellaneda <avellaneda.gabriel@gmail.com>
-Gabriel Russell <gabriel.russell@gmail.com>
-Gareth Paul Jones <gpj@foursquare.com>
-Gary Burd <gary@beagledreams.com>
-Gaurish Sharma <contact@gaurishsharma.com>
-Gautham Thambidorai <gautham.dorai@gmail.com>
-Gauthier Jolly <gauthier.jolly@gmail.com>
-Geert-Johan Riemer <gjr19912@gmail.com>
-Gengliang Wang <ltnwgl@gmail.com>
-Geoffroy Lorieux <lorieux.g@gmail.com>
-Geon Kim <geon0250@gmail.com>
-Georg Reinke <guelfey@gmail.com>
-George Gkirtsou <ggirtsou@gmail.com>
-George Shammas <george@shamm.as> <georgyo@gmail.com>
-Gerasimos Dimitriadis <gedimitr@gmail.com>
-Getulio Sánchez <valentin2507@gmail.com>
-Gideon Jan-Wessel Redelinghuys <gjredelinghuys@gmail.com>
-Giles Lean <giles.lean@pobox.com>
-Giulio Iotti <dullgiulio@gmail.com>
-Gleb Stepanov <glebstepanov1992@gmail.com>
-Google Inc.
-Gordon Klaus <gordon.klaus@gmail.com>
-Graham King <graham4king@gmail.com>
-Graham Miller <graham.miller@gmail.com>
-Grant Griffiths <ggp493@gmail.com>
-Greg Poirier <greg.istehbest@gmail.com>
-Greg Ward <greg@gerg.ca>
-Grégoire Delattre <gregoire.delattre@gmail.com>
-Gregory Man <man.gregory@gmail.com>
-Guilherme Garnier <guilherme.garnier@gmail.com>
-Guilherme Goncalves <guilhermeaugustosg@gmail.com>
-Guilherme Rezende <guilhermebr@gmail.com>
-Guillaume J. Charmes <guillaume@charmes.net>
-Guobiao Mei <meiguobiao@gmail.com>
-Gustav Paul <gustav.paul@gmail.com>
-Gustav Westling <gustav@westling.xyz>
-Gustavo Niemeyer <gustavo@niemeyer.net>
-Gwenael Treguier <gwenn.kahz@gmail.com>
-Gyu-Ho Lee <gyuhox@gmail.com>
-H. İbrahim Güngör <igungor@gmail.com>
-Hajime Hoshi <hajimehoshi@gmail.com>
-HAMANO Tsukasa <hamano@osstech.co.jp>
-Hang Qian <hangqian90@gmail.com>
-Hanjun Kim <hallazzang@gmail.com>
-Harald Nordgren <haraldnordgren@gmail.com>
-Hari haran <hariharan.uno@gmail.com>
-Hariharan Srinath <srinathh@gmail.com>
-Harley Laue <losinggeneration@gmail.com>
-Harry Moreno <morenoh149@gmail.com>
-Harshavardhana <hrshvardhana@gmail.com>
-Hauke Löffler <hloeffler@users.noreply.github.com>
-Håvard Haugen <havard.haugen@gmail.com>
-Hector Chu <hectorchu@gmail.com>
-Hector Martin Cantero <hector@marcansoft.com>
-Henning Schmiedehausen <henning@schmiedehausen.org>
-Henrik Edwards <henrik.edwards@gmail.com>
-Henrik Hodne <henrik@hodne.io>
-Henry Adi Sumarto <henry.adisumarto@gmail.com>
-Henry Bubert <google@mindeco.de>
-Henry Chang <mr.changyuheng@gmail.com>
-Henry Clifford <h.a.clifford@gmail.com>
-Herbert Georg Fischer <herbert.fischer@gmail.com>
-Hilko Bengen <bengen@hilluzination.de>
-Hiroaki Nakamura <hnakamur@gmail.com>
-Hironao OTSUBO <motemen@gmail.com>
-Hiroshi Ioka <hirochachacha@gmail.com>
-Hitoshi Mitake <mitake.hitoshi@gmail.com>
-Holden Huang <ttyh061@gmail.com>
-Hong Ruiqi <hongruiqi@gmail.com>
-Hongfei Tan <feilengcui008@gmail.com>
-Hootsuite Inc.
-Hsin-Ho Yeh <yhh92u@gmail.com>
-Hu Keping <hukeping@huawei.com>
-Hugues Bruant <hugues.bruant@gmail.com>
-Ian Gudger <ian@loosescre.ws>
-Ian Kent <iankent85@gmail.com>
-IBM
-Ibrahim AshShohail <ibra.sho@gmail.com>
-Icarus Sparry <golang@icarus.freeuk.com>
-Iccha Sethi <icchasethi@gmail.com>
-Idora Shinatose <idora.shinatose@gmail.com>
-Igneous Systems, Inc.
-Igor Dolzhikov <bluesriverz@gmail.com>
-Igor Vashyst <ivashyst@gmail.com>
-INADA Naoki <songofacandy@gmail.com>
-Inanc Gumus <m@inanc.io>
-Infobaleen AB
-Ingo Gottwald <in.gottwald@gmail.com>
-Ingo Krabbe <ikrabbe.ask@gmail.com>
-Ingo Oeser <nightlyone@googlemail.com>
-Intel Corporation
-Ioannis Georgoulas <geototti21@hotmail.com>
-Irfan Sharif <irfanmahmoudsharif@gmail.com>
-Irieda Noboru <irieda@gmail.com>
-Isaac Ardis <isaac.ardis@gmail.com>
-Isaac Wagner <ibw@isaacwagner.me>
-Ivan Babrou <ivan@cloudflare.com>
-Ivan Bertona <ivan.bertona@gmail.com>
-Ivan Markin <sw@nogoegst.net>
-Ivan Moscoso <moscoso@gmail.com>
-Ivan Ukhov <ivan.ukhov@gmail.com>
-Jack Britton <jackxbritton@gmail.com>
-Jacob H. Haven <jacob@jhaven.me>
-Jacob Hoffman-Andrews <github@hoffman-andrews.com>
-Jae Kwon <jae@tendermint.com>
-Jakob Borg <jakob@nym.se>
-Jakob Weisblat <jakobw@mit.edu>
-Jakub Ryszard Czarnowicz <j.czarnowicz@gmail.com>
-James Bardin <j.bardin@gmail.com>
-James Clarke <jrtc27@jrtc27.com>
-James Cowgill <James.Cowgill@imgtec.com>
-James David Chalfant <james.chalfant@gmail.com>
-James Fysh <james.fysh@gmail.com>
-James Gray <james@james4k.com>
-James Hartig <fastest963@gmail.com>
-James Lawrence <jljatone@gmail.com>
-James Meneghello <rawrz0r@gmail.com>
-James Myers <jfmyers9@gmail.com>
-James Neve <jamesoneve@gmail.com>
-James P. Cooper <jamespcooper@gmail.com>
-James Schofield <james@shoeboxapp.com>
-James Smith <jrs1995@icloud.com>
-James Sweet <james.sweet88@googlemail.com>
-James Toy <nil@opensesame.st>
-James Treanor <jtreanor3@gmail.com>
-James Whitehead <jnwhiteh@gmail.com>
-Jamie Beverly <jamie.r.beverly@gmail.com>
-Jamie Kerr <jkerr113@googlemail.com>
-Jamie Stackhouse <contin673@gmail.com>
-Jamil Djadala <djadala@gmail.com>
-Jan Berktold <jan@berktold.co>
-Jan H. Hosang <jan.hosang@gmail.com>
-Jan Lehnardt <jan@apache.org>
-Jan Mercl <0xjnml@gmail.com> <befelemepeseveze@gmail.com>
-Jan Newmarch <jan.newmarch@gmail.com>
-Jan Pilzer <jan.pilzer@gmx.de>
-Jan Ziak <0xe2.0x9a.0x9b@gmail.com>
-Jani Monoses <jani.monoses@ubuntu.com>
-Jared Culp <jculp14@gmail.com>
-Jaroslavas Počepko <jp@webmaster.ms>
-Jason A. Donenfeld <Jason@zx2c4.com>
-Jason Barnett <jason.w.barnett@gmail.com>
-Jason Chu <jasonchujc@gmail.com>
-Jason Del Ponte <delpontej@gmail.com>
-Jason Smale <jsmale@zendesk.com>
-Jason Travis <infomaniac7@gmail.com>
-Jason Wangsadinata <jwangsadinata@gmail.com>
-Javier Segura <javism@gmail.com>
-Jay Weisskopf <jay@jayschwa.net>
-Jean-André Santoni <jean.andre.santoni@gmail.com>
-Jean-Francois Cantin <jfcantin@gmail.com>
-Jean-Nicolas Moal <jn.moal@gmail.com>
-Jeet Parekh <jeetparekh96@gmail.com>
-Jeevanandam M <jeeva@myjeeva.com>
-Jeff Dupont <jeff.dupont@gmail.com>
-Jeff Hodges <jeff@somethingsimilar.com>
-Jeff R. Allen <jra@nella.org>
-Jeff Sickel <jas@corpus-callosum.com>
-Jeff Wendling <jeff@spacemonkey.com>
-Jeffrey H <jeffreyh192@gmail.com>
-Jelte Fennema <github-tech@jeltef.nl>
-Jens Frederich <jfrederich@gmail.com>
-Jeremy Jackins <jeremyjackins@gmail.com>
-Jeroen Bobbeldijk <jerbob92@gmail.com>
-Jerrin Shaji George <jerrinsg@gmail.com>
-Jess Frazelle <me@jessfraz.com>
-Jesse Szwedko <jesse.szwedko@gmail.com>
-Jesús Espino <jespinog@gmail.com>
-Jihyun Yu <yjh0502@gmail.com>
-Jim McGrath <jimmc2@gmail.com>
-Jimmy Frasche <soapboxcicero@gmail.com>
-Jimmy Zelinskie <jimmyzelinskie@gmail.com>
-Jin-wook Jeong <jeweljar@hanmail.net>
-Jingcheng Zhang <diogin@gmail.com>
-Jingguo Yao <yaojingguo@gmail.com>
-Jiong Du <londevil@gmail.com>
-Jirka Daněk <dnk@mail.muni.cz>
-Jiulong Wang <jiulongw@gmail.com>
-Joakim Sernbrant <serbaut@gmail.com>
-Joe Cortopassi <joe@joecortopassi.com>
-Joe Farrell <joe2farrell@gmail.com>
-Joe Harrison <joehazzers@gmail.com>
-Joe Henke <joed.henke@gmail.com>
-Joe Kyo <xunianzu@gmail.com>
-Joe Poirier <jdpoirier@gmail.com>
-Joe Shaw <joe@joeshaw.org>
-Joe Sylve <joe.sylve@gmail.com>
-Joe Tsai <joetsai@digital-static.net>
-Joel Sing <joel@sing.id.au>
-Joel Stemmer <stemmertech@gmail.com>
-Joey Geiger <jgeiger@users.noreply.github.com>
-Johan Brandhorst <johan.brandhorst@gmail.com>
-Johan Sageryd <j@1616.se>
-John Asmuth <jasmuth@gmail.com>
-John C Barstow <jbowtie@amathaine.com>
-John Gibb <johngibb@gmail.com>
-John Graham-Cumming <jgc@jgc.org> <jgrahamc@gmail.com>
-John Howard Palevich <jack.palevich@gmail.com>
-John Jeffery <jjeffery@sp.com.au>
-John Jenkins <twodopeshaggy@gmail.com>
-John Leidegren <john.leidegren@gmail.com>
-John Potocny <johnp@vividcortex.com>
-John R. Lenton <jlenton@gmail.com>
-John Schnake <schnake.john@gmail.com>
-John Shahid <jvshahid@gmail.com>
-John Tuley <john@tuley.org>
-Johnny Luo <johnnyluo1980@gmail.com>
-Jonas Bernoulli <jonas@bernoul.li>
-Jonathan Boulle <jonathanboulle@gmail.com>
-Jonathan Chen <dijonkitchen@users.noreply.github.com>
-Jonathan Gold <jgold.bg@gmail.com>
-Jonathan Mark <jhmark@xenops.com>
-Jonathan Pentecost <pentecostjonathan@gmail.com>
-Jonathan Rudenberg <jonathan@titanous.com>
-Jonathan Stacks <jonstacks13@gmail.com>
-Jonathan Wills <runningwild@gmail.com>
-Jongmin Kim <atomaths@gmail.com>
-Joonas Kuorilehto <joneskoo@derbian.fi>
-Joop Kiefte <ikojba@gmail.com> <joop@kiefte.net>
-Jordan Krage <jmank88@gmail.com>
-Jordan Lewis <jordanthelewis@gmail.com>
-Jose Luis Vázquez González <josvazg@gmail.com>
-Joseph Holsten <joseph@josephholsten.com>
-Josh Bleecher Snyder <josharian@gmail.com>
-Josh Chorlton <jchorlton@gmail.com>
-Josh Deprez <josh.deprez@gmail.com>
-Josh Goebel <dreamer3@gmail.com>
-Josh Holland <jrh@joshh.co.uk>
-Josh Roppo <joshroppo@gmail.com>
-Josh Varga <josh.varga@gmail.com>
-Joshua Chase <jcjoshuachase@gmail.com>
-Joshua Rubin <joshua@rubixconsulting.com>
-Josselin Costanzi <josselin@costanzi.fr>
-Jostein Stuhaug <js@solidsystem.no>
-Joyent, Inc.
-JT Olds <jtolds@xnet5.com>
-Juan Carlos <juanjcsr@gmail.com>
-Jude Pereira <judebpereira@gmail.com>
-Jukka-Pekka Kekkonen <karatepekka@gmail.com>
-Julian Kornberger <jk+github@digineo.de>
-Julian Phillips <julian@quantumfyre.co.uk>
-Julien Salleyron <julien.salleyron@gmail.com>
-Julien Schmidt <google@julienschmidt.com>
-Junda Liu <junda@celer.network>
-Junya Hayashi <ledmonster@gmail.com>
-Justin Gracenin <jgracenin@gmail.com>
-Justin Nuß <nuss.justin@gmail.com>
-Justyn Temme <justyntemme@gmail.com>
-Kai Backman <kaib@golang.org>
-Kai Trukenmüller <ktye78@gmail.com>
-Kale Blankenship <kale@lemnisys.com>
-Kaleb Elwert <kelwert@atlassian.com>
-Kamil Chmielewski <kamil.chm@gmail.com>
-Kamil Kisiel <kamil@kamilkisiel.net> <kamil.kisiel@gmail.com>
-Kamil Rytarowski <krytarowski@users.noreply.github.com>
-Kang Hu <hukangustc@gmail.com>
-Karel Pazdera <pazderak@gmail.com>
-Karoly Negyesi <chx1975@gmail.com>
-Karsten Köhler <karsten.koehler95@gmail.com>
-Kashav Madan <kshvmdn@gmail.com>
-Kate Manson <kate.manson@izettle.com>
-Kato Kazuyoshi <kato.kazuyoshi@gmail.com>
-Katrina Owen <katrina.owen@gmail.com>
-Kaviraj Kanagaraj <kavirajkanagaraj@gmail.com>
-Keegan Carruthers-Smith <keegan.csmith@gmail.com>
-Kei Son <hey.calmdown@gmail.com>
-Keiji Yoshida <keijiyoshida.mail@gmail.com>
-Keith Ball <inflatablewoman@gmail.com>
-Keith Rarick <kr@xph.us>
-Kelsey Hightower <kelsey.hightower@gmail.com>
-Kelvin Foo Chuan Lyi <vmirage@gmail.com>
-Ken Friedenbach <kenliz@cruzio.com>
-Ken Rockot <ken@oz.gs>
-Ken Sedgwick <ken@bonsai.com>
-Kenji Kaneda <kenji.kaneda@gmail.com>
-Kenji Yano <kenji.yano@gmail.com>
-Kenneth Shaw <kenshaw@gmail.com>
-Kenny Grant <kennygrant@gmail.com>
-Kevin Ballard <kevin@sb.org>
-Kevin Burke <kev@inburke.com>
-Kevin Kirsche <kev.kirsche@gmail.com>
-Kevin Ruffin <kruffin@gmail.com>
-Kevin Vu <kevin.m.vu@gmail.com>
-Kieran Colford <kieran@kcolford.com>
-Kim Yongbin <kybinz@gmail.com>
-Kir Kolyshkin <kolyshkin@gmail.com>
-Kirk Han <kirk91.han@gmail.com>
-Klaus Post <klauspost@gmail.com>
-Kodie Goodwin <kodiegoodwin@gmail.com>
-Koichi Shiraishi <zchee.io@gmail.com>
-Koki Ide <niconegoto@yahoo.co.jp>
-Konstantin <konstantin8105@gmail.com>
-Konstantin Shaposhnikov <k.shaposhnikov@gmail.com>
-KPCompass, Inc.
-Kris Nova <kris@nivenly.com>
-Kristopher Watts <traetox@gmail.com>
-Kun Li <likunarmstrong@gmail.com>
-Kunpei Sakai <namusyaka@gmail.com>
-Kuntal Majumder <hellozee@disroot.org>
-Kyle Consalus <consalus@gmail.com>
-Kyle Isom <kyle@gokyle.net>
-Kyle Jones <kyle@kyledj.com>
-Kyle Lemons <kyle@kylelemons.net>
-Kyle Shannon <kyle@pobox.com>
-Kyohei Kadota <lufia@lufia.org>
-Kyrylo Silin <silin@kyrylo.org>
-L Campbell <unpantsu@gmail.com>
-Lai Jiangshan <eag0628@gmail.com>
-Lakshay Garg <lakshay.garg.1996@gmail.com>
-Lanre Adelowo <yo@lanre.wtf>
-Larry Hosken <lahosken@gmail.com>
-Lars Jeppesen <jeppesen.lars@gmail.com>
-Lars Lehtonen <lars.lehtonen@gmail.com>
-Lars Wiegman <lars@namsral.com>
-Larz Conwell <larzconwell@gmail.com>
-Laurent Voisin <lpvoisin@gmail.com>
-Laurie Clark-Michalek <laurie@qubit.com>
-LE Manh Cuong <cuong.manhle.vn@gmail.com>
-Lee Hinman <hinman@gmail.com>
-Lee Packham <lpackham@gmail.com>
-Lehner Florian <dev@der-flo.net>
-Leigh McCulloch <leighmcc@gmail.com>
-Leo Antunes <leo@costela.net>
-Leon Klingele <git@leonklingele.de>
-Leonard Wang <wangdeyu0907@gmail.com> <wangdeyu@golangcn.org>
-Leonel Quinteros <leonel.quinteros@gmail.com>
-Lev Shamardin <shamardin@gmail.com>
-Lewin Bormann <lewin.bormann@gmail.com>
-Liberty Fund Inc
-Linaro Limited
-Lion Yang <lion@aosc.xyz>
-Lloyd Dewolf <foolswisdom@gmail.com>
-Lorenzo Masini <rugginoso@develer.com>
-Lorenzo Stoakes <lstoakes@gmail.com>
-Luan Santos <cfcluan@gmail.com>
-Lubomir I. Ivanov <neolit123@gmail.com>
-Luca Greco <luca.greco@alcacoop.it>
-Lucas Bremgartner <lucas.bremgartner@gmail.com>
-Lucien Stuker <lucien.stuker@gmail.com>
-Lucio De Re <lucio.dere@gmail.com>
-Ludi Rehak <ludi317@gmail.com>
-Luigi Riefolo <luigi.riefolo@gmail.com>
-Luit van Drongelen <luitvd@gmail.com>
-Luka Zakrajšek <tr00.g33k@gmail.com>
-Luke Curley <qpingu@gmail.com>
-Luke Granger-Brown <git@lukegb.com>
-Lyle Franklin <lylejfranklin@gmail.com>
-Ma Peiqi <mapeiqi2017@gmail.com>
-Maicon Costa <maiconscosta@gmail.com>
-Maksym Trykur <maksym.trykur@gmail.com>
-Mal Curtis <mal@mal.co.nz>
-Manfred Touron <m@42.am>
-Manigandan Dharmalingam <manigandan.jeff@gmail.com>
-Manish Goregaokar <manishsmail@gmail.com>
-Mansour Rahimi <rahimi.mnr@gmail.com>
-Manu S Ajith <neo@codingarena.in>
-Manuel Mendez <mmendez534@gmail.com>
-Marc Weistroff <marc@weistroff.net>
-Marcel Edmund Franke <marcel.edmund.franke@gmail.com>
-Marcelo Cantos <marcelo.cantos@gmail.com>
-Marcelo E. Magallon <marcelo.magallon@gmail.com>
-Marco Hennings <marco.hennings@freiheit.com>
-Marin Bašić <marin.basic02@gmail.com>
-Mario Arranz <marioarranzr@gmail.com>
-Mark Adams <mark@markadams.me>
-Mark Bucciarelli <mkbucc@gmail.com>
-Mark Percival <m@mdp.im>
-Mark Pulford <mark@kyne.com.au>
-Mark Rushakoff <mark.rushakoff@gmail.com>
-Mark Severson <miquella@gmail.com>
-Mark Theunissen <mark.theunissen@gmail.com>
-Mark Wolfe <mark@wolfe.id.au>
-Marko Juhani Silokunnas <marko.silokunnas@gmail.com>
-Marko Mudrinic <mudrinic.mare@gmail.com>
-Marko Tiikkaja <marko@joh.to>
-Markover Inc. DBA Poptip
-Markus Duft <markus.duft@salomon.at>
-Markus Sonderegger <marraison@gmail.com>
-Markus Zimmermann <zimmski@gmail.com>
-Martin Bertschler <mbertschler@gmail.com>
-Martin Garton <garton@gmail.com>
-Martin Hamrle <martin.hamrle@gmail.com>
-Martin Hoefling <martin.hoefling@gmx.de>
-Martin Kunc <martinkunc@users.noreply.github.com>
-Martin Lindhe <martin.j.lindhe@gmail.com>
-Martin Möhrmann <martisch@uos.de>
-Martin Neubauer <m.ne@gmx.net>
-Martin Olsen <github.com@martinolsen.net>
-Martin Olsson <martin@minimum.se>
-Martin Probst <martin@probst.io>
-Martin Sucha <anty.sk+git@gmail.com>
-Martins Sipenko <martins.sipenko@gmail.com>
-Marvin Stenger <marvin.stenger94@gmail.com>
-Marwan Sulaiman <marwan.sulaiman@work.co>
-Maryan Hratson <gmarik@gmail.com>
-Masahiro Furudate <masahiro.furudate@gmail.com>
-Masahiro Wakame <vvakame@gmail.com>
-Masaki Yoshida <yoshida.masaki@gmail.com>
-Mat Byczkowski <mbyczkowski@gmail.com>
-Mat Ryer <thatmatryer@gmail.com>
-Máté Gulyás <mgulyas86@gmail.com>
-Matej Baćo <matejbaco@gmail.com>
-Mateus Amin <mateus.amin@gmail.com>
-Mateusz Czapliński <czapkofan@gmail.com>
-Mathias Beke <git@denbeke.be>
-Mathias Hall-Andersen <mathias@hall-andersen.dk>
-Mathias Leppich <mleppich@muhqu.de>
-Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
-Mats Lidell <mats.lidell@cag.se>
-Matt Aimonetti <mattaimonetti@gmail.com>
-Matt Blair <me@matthewblair.net>
-Matt Bostock <matt@mattbostock.com>
-Matt Dee <mdee@hioscar.com>
-Matt Drollette <matt@drollette.com>
-Matt Harden <matt.harden@gmail.com>
-Matt Jibson <matt.jibson@gmail.com>
-Matt Joiner <anacrolix@gmail.com>
-Matt Juran <thepciet@gmail.com>
-Matt Layher <mdlayher@gmail.com>
-Matt Reiferson <mreiferson@gmail.com>
-Matt Robenolt <matt@ydekproductions.com>
-Matt Strong <mstrong1341@gmail.com>
-Matt T. Proud <matt.proud@gmail.com>
-Matt Williams <gh@mattyw.net>
-Matthew Brennan <matty.brennan@gmail.com>
-Matthew Broberg <matthewbbroberg@gmail.com>
-Matthew Cottingham <mattcottingham@gmail.com>
-Matthew Denton <mdenton@skyportsystems.com>
-Matthew Holt <Matthew.Holt+git@gmail.com>
-Matthew Horsnell <matthew.horsnell@gmail.com>
-Matthieu Hauglustaine <matt.hauglustaine@gmail.com>
-Matthieu Olivier <olivier.matthieu@gmail.com>
-Matthijs Kooijman <matthijs@stdin.nl>
-Max Riveiro <kavu13@gmail.com>
-Max Schmitt <max@schmitt.mx>
-Maxim Khitrov <max@mxcrypt.com>
-Maxime de Roucy <maxime.deroucy@gmail.com>
-Máximo Cuadros Ortiz <mcuadros@gmail.com>
-Maxwell Krohn <themax@gmail.com>
-Maya Rashish <maya@netbsd.org>
-Mayank Kumar <krmayankk@gmail.com>
-MediaMath, Inc
-Meir Fischer <meirfischer@gmail.com>
-Meng Zhuo <mengzhuo1203@gmail.com> <mzh@golangcn.org>
-Meteor Development Group
-Mhd Sulhan <m.shulhan@gmail.com>
-Micah Stetson <micah.stetson@gmail.com>
-Michael Brandenburg <mbrandenburg@bolste.com>
-Michael Chaten <mchaten@gmail.com>
-Michael Dorner <mail@michaeldorner.de>
-Michael Edwards <medwards@walledcity.ca>
-Michael Elkins <michael.elkins@gmail.com>
-Michael Fraenkel <michael.fraenkel@gmail.com>
-Michael Gehring <mg@ebfe.org> <gnirheg.leahcim@gmail.com>
-Michael Hendricks <michael@ndrix.org>
-Michael Hoisie <hoisie@gmail.com>
-Michael Kasch <michael.kasch@gmail.com>
-Michael Käufl <golang@c.michael-kaeufl.de>
-Michael Lewis <mikelikespie@gmail.com>
-Michael MacInnis <Michael.P.MacInnis@gmail.com>
-Michael Marineau <mike@marineau.org>
-Michael McConville <momcconville@gmail.com>
-Michael McLoughlin <mmcloughlin@gmail.com>
-Michael Pearson <mipearson@gmail.com>
-Michael Schaller <michael@5challer.de>
-Michael Schurter <michael.schurter@gmail.com>
-Michael Stapelberg <michael@stapelberg.de>
-Michael Steinert <mike.steinert@gmail.com>
-Michael Teichgräber <mteichgraeber@gmx.de>
-Michael Vetter <g.bluehut@gmail.com>
-Michal Bohuslávek <mbohuslavek@gmail.com>
-Michał Derkacz <ziutek@lnet.pl>
-Michal Franc <lam.michal.franc@gmail.com>
-Michal Pristas <michal.pristas@gmail.com>
-Miek Gieben <miek@miek.nl>
-Miguel Mendez <stxmendez@gmail.com>
-Miguel Molina <hi@mvader.me>
-Mihai Borobocea <MihaiBorobocea@gmail.com>
-Mihail Minaev <minaev.mike@gmail.com>
-Mikael Tillenius <mikti42@gmail.com>
-Mike Andrews <mra@xoba.com>
-Mike Appleby <mike@app.leby.org>
-Mike Houston <mike@kothar.net>
-Mike Kabischev <kabischev@gmail.com>
-Mike Rosset <mike.rosset@gmail.com>
-Mike Tsao <mike@sowbug.com>
-Mikhail Gusarov <dottedmag@dottedmag.net>
-Mikhail Panchenko <m@mihasya.com>
-Miki Tebeka <miki.tebeka@gmail.com>
-Mikio Hara <mikioh.mikioh@gmail.com>
-Mikkel Krautz <mikkel@krautz.dk>
-Milan Knezevic <milan.knezevic@mips.com>
-Milutin Jovanović <jovanovic.milutin@gmail.com>
-MinJae Kwon <mingrammer@gmail.com>
-Miquel Sabaté Solà <mikisabate@gmail.com>
-Miroslav Genov <mgenov@gmail.com>
-Misty De Meo <mistydemeo@gmail.com>
-Mohit Agarwal <mohit@sdf.org>
-Mohit kumar Bajoria <mohitbajo36@gmail.com>
-Momchil Velikov <momchil.velikov@gmail.com>
-Monty Taylor <mordred@inaugust.com>
-Moov Corporation
-Moriyoshi Koizumi <mozo@mozo.jp>
-Morten Siebuhr <sbhr@sbhr.dk>
-Môshe van der Sterre <moshevds@gmail.com>
-Mostyn Bramley-Moore <mostyn@antipode.se>
-Muhammad Falak R Wani <falakreyaz@gmail.com>
-Muhammed Uluyol <uluyol0@gmail.com>
-Mura Li <mura_li@castech.com.tw>
-Nan Deng <monnand@gmail.com>
-Naoki Kanatani <k12naoki@gmail.com>
-Nate Wilkinson <nathanwilk7@gmail.com>
-Nathan Cantelmo <n.cantelmo@gmail.com>
-Nathan Caza <mastercactapus@gmail.com>
-Nathan Humphreys <nkhumphreys@gmail.com>
-Nathan John Youngman <nj@nathany.com>
-Nathan Otterness <otternes@cs.unc.edu>
-Nathan P Finch <nate.finch@gmail.com>
-Nathan VanBenschoten <nvanbenschoten@gmail.com>
-Nathan Youngman <git@nathany.com>
-Nathaniel Cook <nvcook42@gmail.com>
-Naveen Kumar Sangi <naveenkumarsangi@protonmail.com>
-Neelesh Chandola <neelesh.c98@gmail.com>
-Neil Alexander <neilalexander@neilalexander.dev>
-Neil Lyons <nwjlyons@googlemail.com>
-Netflix, Inc.
-Neuman Vong <neuman.vong@gmail.com>
-Neven Sajko <nsajko@gmail.com>
-Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
-Nexedi
-ngmoco, LLC
-Niall Sheridan <nsheridan@gmail.com>
-Nic Day <nic.day@me.com>
-Nicholas Katsaros <nick@nickkatsaros.com>
-Nicholas Maniscalco <nicholas@maniscalco.com>
-Nicholas Presta <nick@nickpresta.ca> <nick1presta@gmail.com>
-Nicholas Sullivan <nicholas.sullivan@gmail.com>
-Nicholas Waples <nwaples@gmail.com>
-Nick Craig-Wood <nick@craig-wood.com> <nickcw@gmail.com>
-Nick Leli <nicholasleli@gmail.com>
-Nick Miyake <nmiyake@users.noreply.github.com>
-Nick Patavalis <nick.patavalis@gmail.com>
-Nick Petroni <npetroni@cs.umd.edu>
-Nick Robinson <nrobinson13@gmail.com>
-Nick Smolin <nick27surgut@gmail.com>
-Nicolas BRULEZ <n.brulez@gmail.com>
-Nicolas Kaiser <nikai@nikai.net>
-Nicolas Owens <mischief@offblast.org>
-Nicolas S. Dade <nic.dade@gmail.com>
-Niek Sanders <niek.sanders@gmail.com>
-Niels Widger <niels.widger@gmail.com>
-Nigel Kerr <nigel.kerr@gmail.com>
-Nik Nyby <nnyby@columbia.edu>
-Nikhil Benesch <nikhil.benesch@gmail.com>
-Nikita Gillmann <nikita@n0.is> <ng0@n0.is>
-Niklas Schnelle <niklas.schnelle@gmail.com>
-Niko Dziemba <niko@dziemba.com>
-Nikolay Turpitko <nikolay@turpitko.com>
-Nils Larsgård <nilsmagnus@gmail.com>
-Niranjan Godbole <niranjan8192@gmail.com>
-Nishanth Shanmugham <nishanth.gerrard@gmail.com>
-Noah Campbell <noahcampbell@gmail.com>
-Noble Johnson <noblepoly@gmail.com>
-Noel Georgi <git@frezbo.com>
-Norberto Lopes <nlopes.ml@gmail.com>
-Odin Ugedal <odin@ugedal.com>
-Oleg Bulatov <dmage@yandex-team.ru>
-Oleg Vakheta <helginet@gmail.com>
-Oleku Konko <oleku.konko@gmail.com>
-Oling Cat <olingcat@gmail.com>
-Oliver Hookins <ohookins@gmail.com>
-Oliver Tonnhofer <olt@bogosoft.com>
-Olivier Antoine <olivier.antoine@gmail.com>
-Olivier Duperray <duperray.olivier@gmail.com>
-Olivier Poitrey <rs@dailymotion.com>
-Olivier Saingre <osaingre@gmail.com>
-Oracle
-Orange
-Orijtech, Inc.
-Özgür Kesim <oec-go@kesim.org>
-Pablo Lalloni <plalloni@gmail.com>
-Pablo Rozas Larraondo <pablo.larraondo@anu.edu.au>
-Pablo Santiago Blum de Aguiar <scorphus@gmail.com>
-Padraig Kitterick <padraigkitterick@gmail.com>
-Pallat Anchaleechamaikorn <yod.pallat@gmail.com>
-Palm Stone Games
-Paolo Giarrusso <p.giarrusso@gmail.com>
-Paolo Martini <mrtnpaolo@gmail.com>
-Parker Moore <parkrmoore@gmail.com>
-Pascal S. de Kloe <pascal@quies.net>
-Pat Moroney <pat@pat.email>
-Patrick Crosby <patrick@stathat.com>
-Patrick Gavlin <pgavlin@gmail.com>
-Patrick Higgins <patrick.allen.higgins@gmail.com>
-Patrick Lee <pattyshack101@gmail.com>
-Patrick Mézard <patrick@mezard.eu>
-Patrick Mylund Nielsen <patrick@patrickmn.com>
-Patrick Pelletier <pp.pelletier@gmail.com>
-Patrick Smith <pat42smith@gmail.com>
-Paul A Querna <paul.querna@gmail.com>
-Paul Boyd <boyd.paul2@gmail.com>
-Paul Hammond <paul@paulhammond.org>
-Paul Jolly <paul@myitcv.org.uk>
-Paul Lalonde <paul.a.lalonde@gmail.com>
-Paul Meyer <paul.meyer@microsoft.com>
-Paul PISCUC <paul.piscuc@gmail.com>
-Paul Querna <pquerna@apache.org>
-Paul Rosania <paul.rosania@gmail.com>
-Paul Ruest <pruest@gmail.com>
-Paul Sbarra <Sbarra.Paul@gmail.com>
-Paul Smith <paulsmith@pobox.com> <paulsmith@gmail.com>
-Paul Tyng <paul@paultyng.net>
-Paul van Brouwershaven <paul@vanbrouwershaven.com>
-Paulo Casaretto <pcasaretto@gmail.com>
-Pavel Paulau <pavel.paulau@gmail.com>
-Pavel Zinovkin <pavel.zinovkin@gmail.com>
-Pavlo Sumkin <ymkins@gmail.com>
-Pawel Knap <pawelknap88@gmail.com>
-Percy Wegmann <ox.to.a.cart@gmail.com>
-Perry Abbott <perry.j.abbott@gmail.com>
-Petar Maymounkov <petarm@gmail.com>
-Peter Armitage <peter.armitage@gmail.com>
-Peter Bourgon <peter@bourgon.org>
-Peter Conerly <pconerly@gmail.com>
-Peter Froehlich <peter.hans.froehlich@gmail.com>
-Peter Kleiweg <pkleiweg@xs4all.nl>
-Peter Moody <pmoody@uber.com>
-Peter Morjan <pmorjan@gmail.com>
-Peter Mundy <go.peter.90@gmail.com>
-Peter Nguyen <peter@mictis.com>
-Péter Surányi <speter.go1@gmail.com>
-Péter Szilágyi <peterke@gmail.com>
-Peter Teichman <pteichman@fastly.com>
-Peter Waldschmidt <peter@waldschmidt.com>
-Peter Waller <peter.waller@gmail.com>
-Peter Williams <pwil3058@gmail.com>
-Peter Zhang <i@ddatsh.com>
-Petrica Voicu <pvoicu@paypal.com>
-Phil Pearl <philip.j.r.pearl@gmail.com>
-Philip Børgesen <philip.borgesen@gmail.com>
-Philip Brown <phil@bolthole.com>
-Philip Hofer <phofer@umich.edu>
-Philip K. Warren <pkwarren@gmail.com>
-Philip Nelson <me@pnelson.ca>
-Pierre Durand <pierredurand@gmail.com>
-Pierre Prinetti <pierreprinetti@gmail.com>
-Pierre Roullon <pierre.roullon@gmail.com>
-Piers <google@hellopiers.pro>
-Pieter Droogendijk <pieter@binky.org.uk>
-Pietro Gagliardi <pietro10@mac.com>
-Piyush Mishra <piyush@codeitout.com>
-Platform.sh
-Pontus Leitzler <leitzler@gmail.com>
-Prasanga Siripala <pj@pjebs.com.au>
-Prashant Varanasi <prashant@prashantv.com>
-Pravendra Singh <hackpravj@gmail.com>
-Preetam Jinka <pj@preet.am>
-Qais Patankar <qaisjp@gmail.com>
-Qiuxuan Zhu <ilsh1022@gmail.com>
-Qualcomm Data Center, Inc.
-Quan Tran <qeed.quan@gmail.com>
-Quan Yong Zhai <qyzhai@gmail.com>
-Quentin Perez <qperez@ocs.online.net>
-Quentin Renard <contact@asticode.com>
-Quoc-Viet Nguyen <afelion@gmail.com>
-RackTop Systems Inc.
-Radek Sohlich <sohlich@gmail.com>
-Radu Berinde <radu@cockroachlabs.com>
-Rafal Jeczalik <rjeczalik@gmail.com>
-Raif S. Naffah <go@naffah-raif.name>
-RainTank
-Rajat Goel <rajat.goel2010@gmail.com>
-Rajath Agasthya <rajathagasthya@gmail.com>
-Rajender Reddy Kompally <rajenderreddykompally@gmail.com>
-Ralph Corderoy <ralph@inputplus.co.uk>
-Ramazan AYYILDIZ <rayyildiz@gmail.com>
-Raphael Geronimi <raphael.geronimi@gmail.com>
-Ravil Bikbulatov <weeellz12@gmail.com>
-RaviTeja Pothana <ravi.tezu@gmail.com>
-Ray Tung <rtung@thoughtworks.com>
-Raymond Kazlauskas <raima220@gmail.com>
-Red Hat, Inc.
-Reilly Watson <reillywatson@gmail.com>
-Reinaldo de Souza Jr <juniorz@gmail.com>
-Remi Gillig <remigillig@gmail.com>
-Rémy Oudompheng <oudomphe@phare.normalesup.org>
-Rens Rikkerink <Ikkerens@users.noreply.github.com>
-Ricardo Padilha <ricardospadilha@gmail.com>
-Richard Barnes <rlb@ipv.sx>
-Richard Crowley <r@rcrowley.org>
-Richard Dingwall <rdingwall@gmail.com>
-Richard Eric Gavaletz <gavaletz@gmail.com>
-Richard Gibson <richard.gibson@gmail.com>
-Richard Miller <miller.research@gmail.com>
-Richard Musiol <mail@richard-musiol.de>
-Rick Arnold <rickarnoldjr@gmail.com>
-Rick Sayre <whorfin@gmail.com>
-Risto Jaakko Saarelma <rsaarelm@gmail.com>
-Rob Norman <rob.norman@infinitycloud.com>
-Rob Phoenix <rob@robphoenix.com>
-Robert Daniel Kortschak <dan.kortschak@adelaide.edu.au> <dan@kortschak.io>
-Robert Dinu <r@varp.se>
-Robert Figueiredo <robfig@gmail.com>
-Robert Hencke <robert.hencke@gmail.com>
-Robert Obryk <robryk@gmail.com>
-Robert Stepanek <robert.stepanek@gmail.com>
-Robert-André Mauchin <zebob.m@gmail.com>
-Roberto Clapis <robclap8@gmail.com>
-Robin Eklind <r.eklind.87@gmail.com>
-Rodolfo Carvalho <rhcarvalho@gmail.com>
-Rodrigo Moraes de Oliveira <rodrigo.moraes@gmail.com>
-Rodrigo Rafael Monti Kochenburger <divoxx@gmail.com>
-Roger Pau Monné <royger@gmail.com>
-Roger Peppe <rogpeppe@gmail.com>
-Roland Shoemaker <rolandshoemaker@gmail.com>
-Roman Budnikov <romanyx90@yandex.ru>
-Ron Hashimoto <mail@h2so5.net>
-Ron Minnich <rminnich@gmail.com>
-Ross Chater <rdchater@gmail.com>
-Ross Light <rlight2@gmail.com>
-Rowan Marshall <rowanajmarshall@gmail.com>
-Rowan Worth <sqweek@gmail.com>
-Rudi Kramer <rudi.kramer@gmail.com>
-Russell Haering <russellhaering@gmail.com>
-Ryan Bagwell <ryanbagwell@outlook.com>
-Ryan Boehning <ryan.boehning@apcera.com>
-Ryan Canty <jrcanty@gmail.com>
-Ryan Hitchman <hitchmanr@gmail.com>
-Ryan Lower <rpjlower@gmail.com>
-Ryan Roden-Corrent <ryan@rcorre.net>
-Ryan Seys <ryan@ryanseys.com>
-Ryan Slade <ryanslade@gmail.com>
-Ryan Zhang <ryan.zhang@docker.com>
-Ryoichi KATO <ryo1kato@gmail.com>
-Ryuji Iwata <qt.luigi@gmail.com>
-Ryuma Yoshida <ryuma.y1117@gmail.com>
-Ryuzo Yamamoto <ryuzo.yamamoto@gmail.com>
-S.Çağlar Onur <caglar@10ur.org>
-Sabin Mihai Rapan <sabin.rapan@gmail.com>
-Sakeven Jiang <jc5930@sina.cn>
-Salmān Aljammāz <s@0x65.net>
-Sam Boyer <tech@samboyer.org>
-Sam Hug <samuel.b.hug@gmail.com>
-Sam Whited <sam@samwhited.com>
-Sami Pönkänen <sami.ponkanen@gmail.com>
-Samuele Pedroni <pedronis@lucediurna.net>
-Sanjay Menakuru <balasanjay@gmail.com>
-Sascha Brawer <sascha@brawer.ch>
-Sasha Sobol <sasha@scaledinference.com>
-Scott Barron <scott.barron@github.com>
-Scott Bell <scott@sctsm.com>
-Scott Crunkleton <crunk1@gmail.com>
-Scott Ferguson <scottwferg@gmail.com>
-Scott Lawrence <bytbox@gmail.com>
-Sean Rees <sean@erifax.org>
-Sebastien Binet <seb.binet@gmail.com>
-Sébastien Paolacci <sebastien.paolacci@gmail.com>
-Seiji Takahashi <timaki.st@gmail.com>
-Sergei Skorobogatov <skorobo@rambler.ru>
-Sergey 'SnakE' Gromov <snake.scaly@gmail.com>
-Sergey Lukjanov <me@slukjanov.name>
-Sergey Mishin <sergeymishine@gmail.com>
-Sergey Mudrik <sergey.mudrik@gmail.com>
-Sergey Semin <gray12511@gmail.com>
-Sergio Luis O. B. Correia <sergio@correia.cc>
-Sergiusz Bazanski <bazanski@gmail.com>
-Seth Hoenig <seth.a.hoenig@gmail.com>
-Seth Vargo <sethvargo@gmail.com>
-Shahar Kohanim <skohanim@gmail.com>
-Shamil Garatuev <garatuev@gmail.com>
-Shane Hansen <shanemhansen@gmail.com>
-Shaozhen Ding <dsz0111@gmail.com>
-Shaun Dunning <shaun.dunning@uservoice.com>
-Shawn Smith <shawn.p.smith@gmail.com>
-Shenghou Ma <minux.ma@gmail.com>
-Shengyu Zhang <shengyu.zhang@chaitin.com>
-Shi Han Ng <shihanng@gmail.com>
-Shinji Tanaka <shinji.tanaka@gmail.com>
-Shintaro Kaneko <kaneshin0120@gmail.com>
-Shivakumar GN <shivakumar.gn@gmail.com>
-Silvan Jegen <s.jegen@gmail.com>
-Simon Jefford <simon.jefford@gmail.com>
-Simon Rawet <simon@rawet.se>
-Simon Thulbourn <simon+github@thulbourn.com>
-Simon Whitehead <chemnova@gmail.com>
-Sina Siadat <siadat@gmail.com>
-Sokolov Yura <funny.falcon@gmail.com>
-Song Gao <song@gao.io>
-Sourcegraph Inc
-Spencer Nelson <s@spenczar.com>
-Spring Mc <heresy.mc@gmail.com>
-Square, Inc.
-Sridhar Venkatakrishnan <sridhar@laddoo.net>
-StalkR <stalkr@stalkr.net>
-Stan Schwertly <stan@schwertly.com>
-Stanislav Afanasev <php.progger@gmail.com>
-Steeve Morin <steeve.morin@gmail.com>
-Stefan Nilsson <snilsson@nada.kth.se> <trolleriprofessorn@gmail.com>
-Stéphane Travostino <stephane.travostino@gmail.com>
-Stephen Lewis <stephen@sock.org.uk>
-Stephen McQuay <stephen@mcquay.me>
-Stephen Searles <stephens2424@gmail.com>
-Stephen Weinberg <stephen@q5comm.com>
-Steve Gilbert <stevegilbert23@gmail.com>
-Steve McCoy <mccoyst@gmail.com>
-Steve Phillips <elimisteve@gmail.com>
-Steve Streeting <steve@stevestreeting.com>
-Steven Elliot Harris <seharris@gmail.com>
-Steven Erenst <stevenerenst@gmail.com>
-Steven Hartland <steven.hartland@multiplay.co.uk>
-Steven Wilkin <stevenwilkin@gmail.com>
-Stripe, Inc.
-Sukrit Handa <sukrit.handa@utoronto.ca>
-Sunny <me@darkowlzz.space>
-Suriyaa Sundararuban <suriyaasundararuban@gmail.com>
-Suyash <dextrous93@gmail.com>
-Sven Almgren <sven@tras.se>
-Sylvain Zimmer <sylvain@sylvainzimmer.com>
-Syohei YOSHIDA <syohex@gmail.com>
-Szabolcs Nagy <nsz@port70.net>
-Taavi Kivisik <taavi.kivisik@gmail.com>
-Tad Fisher <tadfisher@gmail.com>
-Tad Glines <tad.glines@gmail.com>
-Tailscale Inc.
-Taj Khattra <taj.khattra@gmail.com>
-Takayoshi Nishida <takayoshi.nishida@gmail.com>
-Takeshi YAMANASHI <9.nashi@gmail.com>
-Takuya Ueda <uedatakuya@gmail.com>
-Tal Shprecher <tshprecher@gmail.com>
-Tamir Duberstein <tamird@gmail.com>
-Tao Wang <twang2218@gmail.com>
-Tarmigan Casebolt <tarmigan@gmail.com>
-Taro Aoki <aizu.s1230022@gmail.com>
-Taru Karttunen <taruti@taruti.net>
-Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
-Teague Cole <tnc1443@gmail.com>
-Ted Kornish <golang@tedkornish.com>
-Tejasvi Nareddy <tejunareddy@gmail.com>
-Teleport Inc.
-Terin Stock <terinjokes@gmail.com>
-Terrel Shumway <gopher@shumway.us>
-Tetsuo Kiso <tetsuokiso9@gmail.com>
-Thanabodee Charoenpiriyakij <wingyminus@gmail.com>
-Thanatat Tamtan <acoshift@gmail.com>
-Thiago Avelino <t@avelino.xxx>
-Thiago Fransosi Farina <thiago.farina@gmail.com>
-Thomas Alan Copeland <talan.copeland@gmail.com>
-Thomas Bonfort <thomas.bonfort@gmail.com>
-Thomas Bruyelle <thomas.bruyelle@gmail.com>
-Thomas de Zeeuw <thomasdezeeuw@gmail.com>
-Thomas Desrosiers <thomasdesr@gmail.com>
-Thomas Kappler <tkappler@gmail.com>
-Thomas Meson <zllak@hycik.org>
-Thomas Wanielista <tomwans@gmail.com>
-Thorben Krueger <thorben.krueger@gmail.com>
-Thordur Bjornsson <thorduri@secnorth.net>
-Tiago Queiroz <contato@tiago.eti.br>
-Tilman Dilo <tilman.dilo@gmail.com>
-Tim Cooijmans <timcooijmans@gmail.com>
-Tim Cooper <tim.cooper@layeh.com>
-Tim Ebringer <tim.ebringer@gmail.com>
-Tim Heckman <t@heckman.io>
-Tim Henderson <tim.tadh@gmail.com>
-Tim Wright <tenortim@gmail.com>
-Timo Savola <timo.savola@gmail.com>
-Timo Truyts <alkaloid.btx@gmail.com>
-Timothy Studd <tim@timstudd.com>
-Tobias Assarsson <tobias.assarsson@gmail.com>
-Tobias Columbus <tobias.columbus@gmail.com>
-Tobias Klauser <tklauser@distanz.ch>
-Todd Neal <todd@tneal.org>
-Tom Heng <zhm20070928@gmail.com>
-Tom Levy <tomlevy93@gmail.com>
-Tom Limoncelli <tal@whatexit.org>
-Tom Linford <tomlinford@gmail.com>
-Tom Payne <twpayne@gmail.com>
-Tom Thorogood <me+google@tomthorogood.co.uk>
-Tommy Schaefer <tommy.schaefer@teecom.com>
-Tomoya Ishizaki <zaq1tomo@gmail.com>
-Tonis Tiigi <tonistiigi@gmail.com>
-Tony Walker <walkert.uk@gmail.com>
-Tor Andersson <tor.andersson@gmail.com>
-Tormod Erevik Lea <tormodlea@gmail.com>
-Toshiki Shima <hayabusa1419@gmail.com>
-Totoro W <tw19881113@gmail.com>
-Travis Bischel <travis.bischel@gmail.com>
-Travis Cline <travis.cline@gmail.com>
-Trey Lawrence <lawrence.trey@gmail.com>
-Trey Roessig <trey.roessig@gmail.com>
-Trey Tacon <ttacon@gmail.com>
-Tristan Colgate <tcolgate@gmail.com>
-Tristan Ooohry <ooohry@gmail.com>
-Tristan Rice <rice@fn.lc>
-Troels Thomsen <troels@thomsen.io>
-Trung Nguyen <trung.n.k@gmail.com>
-Tudor Golubenco <tudor.g@gmail.com>
-Tugdual Saunier <tugdual.saunier@gmail.com>
-Tuo Shan <sturbo89@gmail.com>
-Tyler Bunnell <tylerbunnell@gmail.com>
-Tyler Treat <ttreat31@gmail.com>
-Uber Technologies
-Ugorji Nwoke <ugorji@gmail.com>
-Ulf Holm Nielsen <doktor@dyregod.dk>
-Ulrich Kunitz <uli.kunitz@gmail.com>
-Upthere, Inc.
-Uriel Mangado <uriel@berlinblue.org>
-Vadim Grek <vadimprog@gmail.com>
-Vadim Vygonets <unixdj@gmail.com>
-Vee Zhang <veezhang@126.com> <vveezhang@gmail.com>
-Vendasta
-Veselkov Konstantin <kostozyb@gmail.com>
-Victor Vrantchan <vrancean+github@gmail.com>
-Vignesh Ramachandra <vickyramachandra@gmail.com>
-Vincent Ambo <tazjin@googlemail.com>
-Vincent Batts <vbatts@hashbangbash.com> <vbatts@gmail.com>
-Vincent Vanackere <vincent.vanackere@gmail.com>
-Vinu Rajashekhar <vinutheraj@gmail.com>
-Vishvananda Ishaya <vishvananda@gmail.com>
-Vitor De Mario <vitordemario@gmail.com>
-Vladimir Mihailenco <vladimir.webdev@gmail.com>
-Vladimir Nikishenko <vova616@gmail.com>
-Vladimir Stefanovic <vladimir.stefanovic@imgtec.com>
-Vladimir Varankin <nek.narqo@gmail.com>
-VMware, Inc.
-Volker Dobler <dr.volker.dobler@gmail.com>
-W. Trevor King <wking@tremily.us>
-Wade Simmons <wade@wades.im>
-Wander Lairson Costa <wcosta@mozilla.com>
-Wayne Ashley Berry <wayneashleyberry@gmail.com>
-Weaveworks
-Wèi Cōngruì <crvv.mail@gmail.com>
-Wei Fu <fhfuwei@163.com>
-Wei Guangjing <vcc.163@gmail.com>
-Weichao Tang <tevic.tt@gmail.com>
-Weixie Cui <cuiweixie@gmail.com> <523516579@qq.com>
-Wembley G. Leach, Jr <wembley.gl@gmail.com>
-Will Faught <will.faught@gmail.com>
-Will Storey <will@summercat.com>
-Willem van der Schyff <willemvds@gmail.com>
-William Chang <mr.williamchang@gmail.com>
-William Josephson <wjosephson@gmail.com>
-William Orr <will@worrbase.com> <ay1244@gmail.com>
-Wisdom Omuya <deafgoat@gmail.com>
-Wu Yunzhou <yunzhouwu@gmail.com>
-Xi Ruoyao <xry23333@gmail.com>
-Xia Bin <snyh@snyh.org>
-Xing Xing <mikespook@gmail.com>
-Xu Fei <badgangkiller@gmail.com>
-Xudong Zhang <felixmelon@gmail.com>
-Xudong Zheng <7pkvm5aw@slicealias.com>
-Xuyang Kang <xuyangkang@gmail.com>
-Yahoo Inc.
-Yamagishi Kazutoshi <ykzts@desire.sh>
-Yann Kerhervé <yann.kerherve@gmail.com>
-Yann Salaün <yannsalaun1@gmail.com>
-Yao Zhang <lunaria21@gmail.com>
-Yasha Bubnov <girokompass@gmail.com>
-Yasuharu Goto <matope.ono@gmail.com>
-Yasuhiro Matsumoto <mattn.jp@gmail.com>
-Yasuyuki Oka <yasuyk@gmail.com>
-Yazen Shunnar <yazen.shunnar@gmail.com>
-Yestin Sun <ylh@pdx.edu>
-Yissakhar Z. Beck <yissakhar.beck@gmail.com>
-Yo-An Lin <yoanlin93@gmail.com>
-Yongjian Xu <i3dmaster@gmail.com>
-Yorman Arias <cixtords@gmail.com>
-Yoshiyuki Kanno <nekotaroh@gmail.com> <yoshiyuki.kanno@stoic.co.jp>
-Yoshiyuki Mineo <yoshiyuki.mineo@gmail.com>
-Yosuke Akatsuka <yosuke.akatsuka@gmail.com>
-Yuji Yaginuma <yuuji.yaginuma@gmail.com>
-Yukihiro Nishinaka <6elpinal@gmail.com>
-Yury Smolsky <yury@smolsky.by>
-Yusuke Kagiwada <block.rxckin.beats@gmail.com>
-Yuusei Kuwana <kuwana@kumama.org>
-Yuval Pavel Zholkover <paulzhol@gmail.com>
-Zac Bergquist <zbergquist99@gmail.com>
-Zach Bintliff <zbintliff@gmail.com>
-Zach Gershman <zachgersh@gmail.com>
-Zachary Gershman <zgershman@pivotal.io>
-Zak <zrjknill@gmail.com>
-Zakatell Kanda <hi@zkanda.io>
-Zellyn Hunter <zellyn@gmail.com>
-Zemanta d.o.o.
-Zev Goldstein <zev.goldstein@gmail.com>
-Zheng Dayu <davidzheng23@gmail.com>
-Zhongtao Chen <chenzhongtao@126.com>
-Zhou Guangyuan <zhouguangyuan.xian@gmail.com>
-Zhou Peng <p@ctriple.cn>
-Ziad Hatahet <hatahet@gmail.com>
-Zizhao Zhang <btw515wolf2@gmail.com>
-Zorion Arrizabalaga <zorionk@gmail.com>
-Максим Федосеев <max.faceless.frei@gmail.com>
-Роман Хавроненко <hagen1778@gmail.com>
-Тарас Буник <tbunyk@gmail.com>
-Фахриддин Балтаев <faxriddinjon@gmail.com>
-张嵩 <zs349596@gmail.com>
-申习之 <bronze1man@gmail.com>
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
deleted file mode 100644
index 48567ee..0000000
--- a/CONTRIBUTORS
+++ /dev/null
@@ -1,2860 +0,0 @@
-# This is the official list of people who can contribute
-# (and typically have contributed) code to the Go repository.
-# The AUTHORS file lists the copyright holders; this file
-# lists people. For example, Google employees are listed here
-# but not in AUTHORS, because Google holds the copyright.
-#
-# Names should be added to this file only after verifying that
-# the individual or the individual's organization has agreed to
-# the appropriate Contributor License Agreement, found here:
-#
-# http://code.google.com/legal/individual-cla-v1.0.html
-# http://code.google.com/legal/corporate-cla-v1.0.html
-#
-# The agreement for individuals can be filled out on the web.
-
-# Names should be added to this file like so:
-# Individual's name <submission email address>
-# Individual's name <submission email address> <email2> <emailN>
-#
-# An entry with multiple email addresses specifies that the
-# first address should be used in the submit logs and
-# that the other addresses should be recognized as the
-# same person when interacting with Gerrit.
-
-# Please keep the list sorted.
-
-Aamir Khan <syst3m.w0rm@gmail.com>
-Aaron Beitch <aaronb@arista.com>
-Aaron Bieber <deftly@gmail.com>
-Aaron Cannon <cannona@fireantproductions.com>
-Aaron France <aaron.l.france@gmail.com>
-Aaron Jacobs <jacobsa@google.com>
-Aaron Jensen <jensen.aaro@gmail.com>
-Aaron Kemp <kemp.aaron@gmail.com>
-Aaron Patterson <tenderlove@ruby-lang.org>
-Aaron Sheah <aaronsheah@gmail.com>
-Aaron Stein <aaronstein12@gmail.com>
-Aaron Torres <tcboox@gmail.com>
-Aaron Zinman <aaron@azinman.com>
-Aarti Parikh <aarti.parikh@gmail.com>
-Abdullah Al Maruf <mymail.maruf@gmail.com>
-Abe Haskins <abeisgreat@abeisgreat.com>
-Abhinav Gupta <abhinav.g90@gmail.com>
-Adam Azarchs <adam.azarchs@10xgenomics.com>
-Adam Bender <abender@google.com>
-Adam Eijdenberg <adam@continusec.com>
-Adam Harvey <aharvey@php.net>
-Adam Kisala <adam.kisala@gmail.com>
-Adam Langley <agl@golang.org>
-Adam Medzinski <adam.medzinski@gmail.com>
-Adam Mitha <adam.mitha@gmail.com>
-Adam Shannon <adamkshannon@gmail.com>
-Adam Shelton <aashelt90@gmail.com>
-Adam Sindelar <adamsh@google.com>
-Adam Thomason <athomason@gmail.com>
-Adam Williams <pwnfactory@gmail.com>
-Adam Woodbeck <adam@woodbeck.net>
-Adarsh Ravichandran <adarshravichandran91@gmail.com>
-Adel Rodríguez <adel.rodriguez@leftfieldlabs.com>
-Adin Scannell <ascannell@google.com>
-Aditya Harindar <aditya.harindar@gmail.com>
-Aditya Mukerjee <dev@chimeracoder.net>
-Adrian Hesketh <adrianhesketh@hushmail.com>
-Adrian Nos <nos.adrian@gmail.com>
-Adrian O'Grady <elpollouk@gmail.com>
-Adrien Bustany <adrien-xx-google@bustany.org>
-Adrien Delorme <adrien.delorme@icloud.com>
-Adrien Petel <peteladrien@gmail.com>
-Aécio Júnior <aeciodantasjunior@gmail.com>
-Aeneas Rekkas (arekkas) <aeneas@ory.am>
-Afanasev Stanislav <phpprogger@gmail.com>
-Agis Anastasopoulos <agis.anast@gmail.com>
-Agniva De Sarker <agnivade@yahoo.co.in>
-Ahmed W. Mones <oneofone@gmail.com>
-Ahmet Aktürk <aakturk000@gmail.com>
-Ahmet Alp Balkan <ahmetb@google.com>
-Ahmet Soormally <ahmet@mangomm.co.uk>
-Ahmy Yulrizka <yulrizka@gmail.com>
-Ahsun Ahmed <ahmed.ahsun@gmail.com>
-Aidan Coyle <packrat386@gmail.com>
-Aiden Scandella <ai@uber.com>
-Ainar Garipov <gugl.zadolbal@gmail.com>
-Aishraj Dahal <aishraj@users.noreply.github.com>
-Ajanthan Balachandran <balaajanthan@gmail.com>
-Akhil Indurti <aindurti@gmail.com>
-Akihiro Suda <suda.kyoto@gmail.com>
-Akshat Kumar <seed@mail.nanosouffle.net>
-Al Cutter <al@google.com>
-Alan Braithwaite <alan@ipaddr.org>
-Alan Donovan <adonovan@google.com>
-Alan Shreve <alan@inconshreveable.com>
-Albert Nigmatzianov <albertnigma@gmail.com>
-Albert Strasheim <fullung@gmail.com>
-Albert Teoh <albert.teoh@gmail.com>
-Albert Yu <yukinying@gmail.com>
-Alberto Bertogli <albertito@blitiri.com.ar>
-Alberto Donizetti <alb.donizetti@gmail.com>
-Alberto García Hierro <alberto@garciahierro.com> <alberto.garcia.hierro@gmail.com>
-Alec Benzer <alec.benzer@gmail.com>
-Alejandro García Montoro <alejandro.garciamontoro@gmail.com>
-Aleksa Sarai <cyphar@cyphar.com>
-Aleksandar Dezelin <dezelin@gmail.com>
-Aleksandr Lukinykh <a.lukinykh@xsolla.com>
-Aleksandr Razumov <ar@cydev.ru>
-Alekseev Artem <a.artem060@gmail.com>
-Aleksei Tirman <aleksei.tirman@jetbrains.com>
-Alessandro Arzilli <alessandro.arzilli@gmail.com>
-Alessandro Baffa <alessandro.baffa@gmail.com>
-Alex A Skinner <alex@lx.lc>
-Alex Brainman <alex.brainman@gmail.com>
-Alex Bramley <abramley@google.com>
-Alex Browne <stephenalexbrowne@gmail.com>
-Alex Buchanan <buchanae@gmail.com>
-Alex Carol <alex.carol.c@gmail.com>
-Alex Gaynor <alex@alloy.us>
-Alex Harford <alex.harford@saucelabs.com>
-Alex Hays <alex.hays@leftfieldlabs.com>
-Alex Jin <toalexjin@gmail.com>
-Alex Kohler <alexjohnkohler@gmail.com>
-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>
-Alex Vaghin <crhyme@google.com>
-Alex Zhirov <azhirov@google.com>
-Alexander Demakin <alexander.demakin@gmail.com>
-Alexander Döring <email@alexd.ch>
-Alexander F Rødseth <alexander.rodseth@appeartv.com>
-Alexander Greim <alexxx@iltempo.de>
-Alexander Guz <kalimatas@gmail.com>
-Alexander Kauer <alexander@affine.space>
-Alexander Klauer <Alexander.Klauer@googlemail.com>
-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>
-Alexander Nohe <alex.nohe427@gmail.com>
-Alexander Orlov <alexander.orlov@loxal.net>
-Alexander Pantyukhin <apantykhin@gmail.com>
-Alexander Polcyn <apolcyn@google.com>
-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>
-Alexandr Mayorskiy <a.mayorskiy@corp.mail.ru>
-Alexandre Cesaro <alexandre.cesaro@gmail.com>
-Alexandre Fiori <fiorix@gmail.com>
-Alexandre Maari <draeron@gmail.com>
-Alexandre Normand <alexandre.normand@gmail.com>
-Alexandre Parentea <aubonbeurre@gmail.com>
-Alexandre Viau <alexandre@alexandreviau.net>
-Alexandru Moșoi <brtzsnr@gmail.com>
-Alexei Sholik <alcosholik@gmail.com>
-Alexey Alexandrov <aalexand@google.com>
-Alexey Borzenkov <snaury@gmail.com>
-Alexey Naidonov <alexey.naidyonov@gmail.com>
-Alexey Neganov <neganovalexey@gmail.com>
-Alexey Palazhchenko <alexey.palazhchenko@gmail.com>
-Alexey Semenyuk <alexsemenyuk88@gmail.com>
-Alexey Vilenskiy <bynovhack@gmail.com>
-Alexis Hildebrandt <surryhill@gmail.com>
-Alexis Hunt <lexer@google.com>
-Alexis Imperial-Legrand <ail@google.com>
-Ali Farooq <ali.farooq0@pm.me>
-Ali Rizvi-Santiago <arizvisa@gmail.com>
-Aliaksandr Valialkin <valyala@gmail.com>
-Alice Merrick <amerrick@google.com>
-Alif Rachmawadi <subosito@gmail.com>
-Allan Guwatudde <guwats10@gmail.com>
-Allan Simon <allan.simon@supinfo.com>
-Allen Li <ayatane@google.com>
-Alok Menghrajani <alok.menghrajani@gmail.com>
-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>
-Amrut Joshi <amrut.joshi@gmail.com>
-An Long <aisk1988@gmail.com>
-An Xiao <hac@zju.edu.cn>
-Anand K. Mistry <anand@mistry.ninja>
-Ananya Saxena <ananyasaxena1@gmail.com>
-Anatol Pomozov <anatol.pomozov@gmail.com>
-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>
-Andrea Simonini <andrea.simonini@gmail.com>
-Andrea Spadaccini <spadaccio@google.com>
-Andreas Auernhammer <aead@mail.de>
-Andreas Jellinghaus <andreas@ionisiert.de> <anj@google.com>
-Andreas Litt <andreas.litt@gmail.com>
-Andrei Enshin <b1os@bk.ru>
-Andrei Gherzan <andrei@resin.io>
-Andrei Korzhevskii <a.korzhevskiy@gmail.com>
-Andrei Matei <andrei@cockroachlabs.com>
-Andrei Tudor Călin <mail@acln.ro>
-Andrei Vagin <avagin@google.com>
-Andrei Vieru <euvieru@gmail.com>
-Andres Erbsen <andreser@google.com>
-Andres Lowrie <andres.lowrie@gmail.com>
-Andrew Austin <andrewaclt@gmail.com>
-Andrew Balholm <andybalholm@gmail.com>
-Andrew Benton <andrewmbenton@gmail.com>
-Andrew Bonventre <andybons@chromium.org>
-Andrew Braunstein <awbraunstein@gmail.com>
-Andrew Bursavich <abursavich@gmail.com>
-Andrew Ekstedt <andrew.ekstedt@gmail.com>
-Andrew Etter <andrew.etter@gmail.com>
-Andrew G. Morgan <agm@google.com>
-Andrew Gerrand <adg@golang.org>
-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>
-Andrew Pilloud <andrewpilloud@igneoussystems.com>
-Andrew Pogrebnoy <absourd.noise@gmail.com>
-Andrew Poydence <apoydence@pivotal.io>
-Andrew Pritchard <awpritchard@gmail.com>
-Andrew Radev <andrey.radev@gmail.com>
-Andrew Skiba <skibaa@gmail.com>
-Andrew Stormont <astormont@racktopsystems.com>
-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>
-Andrew Z Allen <me@andrewzallen.com>
-Andrey Bokhanko <andreybokhanko@gmail.com>
-Andrey Mirtchovski <mirtchovski@gmail.com>
-Andrey Petrov <andrey.petrov@shazow.net>
-Andrii Soldatenko <andrii.soldatenko@gmail.com>
-Andrii Soluk <isoluchok@gmail.com>
-Andriy Lytvynov <lytvynov.a.v@gmail.com>
-Andrzej Żeżel <andrii.zhezhel@gmail.com>
-Andy Balholm <andy@balholm.com>
-Andy Davis <andy@bigandian.com>
-Andy Finkenstadt <afinkenstadt@zynga.com>
-Andy Lindeman <andy@lindeman.io>
-Andy Maloney <asmaloney@gmail.com>
-Andy Pan <panjf2000@gmail.com> <panjf2000@golangcn.org> <i@andypan.me>
-Andy Walker <walkeraj@gmail.com>
-Andy Wang <cbeuw.andy@gmail.com>
-Andy Williams <andy@andy.xyz>
-Andy Zhao <andyzhao@google.com>
-Andzej Maciusovic <andzej.maciusovic@gmail.com>
-Anfernee Yongkun Gui <anfernee.gui@gmail.com>
-Angelo Bulfone <mbulfone@gmail.com>
-Anh Hai Trinh <anh.hai.trinh@gmail.com>
-Anit Gandhi <anitgandhi@gmail.com>
-Ankit Goyal <ankit3goyal@gmail.com>
-Anmol Sethi <anmol@aubble.com>
-Annirudh Prasad <annirudh@wandb.com>
-Anschel Schaffer-Cohen <anschelsc@gmail.com>
-Anthony Alves <cvballa3g0@gmail.com>
-Anthony Canino <anthony.canino1@gmail.com>
-Anthony Eufemio <anthony.eufemio@gmail.com>
-Anthony Fok <foka@debian.org>
-Anthony Martin <ality@pbrane.org>
-Anthony Sottile <asottile@umich.edu>
-Anthony Starks <ajstarks@gmail.com>
-Anthony Voutas <voutasaurus@gmail.com>
-Anthony Woods <awoods@raintank.io>
-Antoine GIRARD <sapk@sapk.fr>
-Antoine Martin <antoine97.martin@gmail.com>
-Anton Gyllenberg <anton@iki.fi>
-Anton Kuklin <anton.a.kuklin@gmail.com>
-Antonin Amand <antonin.amand@gmail.com>
-Antonio Antelo <aantelov87@gmail.com>
-Antonio Bibiano <antbbn@gmail.com>
-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>
-Apisak Darakananda <pongad@gmail.com>
-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>
-Arkadi Pyuro <arkadi@google.com>
-Arlo Breault <arlolra@gmail.com>
-Arnaud Ysmal <arnaud.ysmal@gmail.com>
-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>
-Arthur Fabre <arthur@arthurfabre.com>
-Arthur Khashaev <arthur@khashaev.ru>
-Artur M. Wolff <artur.m.wolff@gmail.com>
-Artyom Pervukhin <artyom.pervukhin@gmail.com>
-Arvindh Rajesh Tamilmani <art@a-30.net>
-Ashish Bhate <ab.listsubs@gmail.com>
-Ashish Gandhi <ag@ashishgandhi.org>
-Asim Shankar <asimshankar@gmail.com>
-Assel Meher <asselmeher@gmail.com>
-Atin Malaviya <amalaviy@akamai.com>
-Ato Araki <ato.araki@gmail.com>
-Atsushi Toyama <atsushi.tohyama.160.333@gmail.com>
-Audrey Lim <audreylh@gmail.com>
-Audrius Butkevicius <audrius.butkevicius@gmail.com>
-Augusto Roman <aroman@gmail.com>
-Aulus Egnatius Varialus <varialus@gmail.com>
-Aurélien Rainone <aurelien.rainone@gmail.com>
-Aurélio A. Heckert <aurium@gmail.com>
-Austin Clements <austin@google.com> <aclements@csail.mit.edu>
-Avi Flax <avi@timehop.com>
-Aviv Klasquin Komissar <avivklas@gmail.com>
-awaw fumin <awawfumin@gmail.com>
-Awn Umar <awn@cryptolosophy.io>
-Axel Wagner <axel.wagner.hh@googlemail.com>
-Ayan George <ayan@ayan.net>
-Ayanamist Yang <ayanamist@gmail.com>
-Ayke van Laethem <aykevanlaethem@gmail.com>
-Aymerick Jéhanne <aymerick@jehanne.org>
-Ayzat Sadykov <ayzat.ziko.93@gmail.com>
-Azat Kaumov <kaumov.a.r@gmail.com>
-Baiju Muthukadan <baiju.m.mail@gmail.com>
-Balaram Makam <bmakam.qdt@qualcommdatacenter.com>
-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>
-Bastian Ike <bastian.ike@gmail.com>
-Ben Burkert <ben@benburkert.com>
-Ben Cartwright-Cox <Ben@Benjojo.co.uk>
-Ben Eitzen <eitzenb@golang.org>
-Ben Fried <ben.fried@gmail.com>
-Ben Haines <bhainesva@gmail.com>
-Ben Hoyt <benhoyt@gmail.com>
-Ben Hutchings <ben.hutchings@essensium.com>
-Ben Kraft <benkraft@khanacademy.org>
-Ben Laurie <ben@links.org> <benl@google.com>
-Ben Lubar <ben.lubar@gmail.com>
-Ben Lynn <benlynn@gmail.com>
-Ben Olive <sionide21@gmail.com>
-Ben Schwartz <bemasc@google.com>
-Ben Shi <powerman1st@163.com>
-Ben Toews <mastahyeti@gmail.com>
-Benjamin Barenblat <bbaren@google.com>
-Benjamin Black <b@b3k.us>
-Benjamin Cable <cable.benjamin@gmail.com>
-Benjamin Hsieh <tanookiben@users.noreply.github.com>
-Benjamin Peterson <benjamin@python.org>
-Benjamin Prosnitz <bprosnitz@google.com>
-Benjamin Wester <bwester@squareup.com>
-Benjamin Wuethrich <benjamin.wuethrich@gmail.com>
-Benny Siegert <bsiegert@gmail.com>
-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>
-Bill Neubauer <wcn@golang.org> <wcn@google.com> <bill.neubauer@gmail.com>
-Bill O'Farrell <billo@ca.ibm.com>
-Bill Prin <waprin@google.com>
-Bill Thiede <couchmoney@gmail.com>
-Bill Zissimopoulos <billziss@navimatics.com>
-Billie Harold Cleek <bhcleek@gmail.com>
-Billy Lynch <wlynch@google.com>
-Billy Zaelani Malik <m.billyzaelani@gmail.com>
-Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
-Bjorn Tillenius <bjorn@tillenius.me>
-Bjorn Tipling <bjorn.tipling@gmail.com>
-Blain Smith <rebelgeek@blainsmith.com>
-Blake Gentry <blakesgentry@gmail.com>
-Blake Mesdag <blakemesdag@gmail.com>
-Blake Mizerany <blake.mizerany@gmail.com>
-Blixt <me@blixt.nyc>
-Bob Briski <rbriski@gmail.com>
-Bob McNaughton <bobmcn@gmail.com>
-Bob Potter <bobby.potter@gmail.com>
-Bobby DeSimone <bobbydesimone@gmail.com>
-Bobby Powers <bobbypowers@gmail.com>
-Boqin Qin <bobbqqin@gmail.com>
-Boris Nagaev <nagaev@google.com>
-Borja Clemente <borja.clemente@gmail.com>
-Boshi Lian <bolian@microsoft.com>
-Brad Burch <brad.burch@gmail.com>
-Brad Erickson <bderickson@gmail.com>
-Brad Fitzpatrick <bradfitz@golang.org> <bradfitz@gmail.com>
-Brad Garcia <bgarcia@golang.org>
-Brad Jones <rbjones@google.com>
-Brad Morgan <brad@morgabra.com>
-Brad Whitaker <bwhitaker@fastly.com>
-Braden Bassingthwaite <bbassingthwaite@vendasta.com>
-Bradford Lamson-Scribner <brad.lamson@gmail.com>
-Bradley Falzon <brad@teambrad.net>
-Brady Catherman <brady@gmail.com>
-Brady Sullivan <brady@bsull.com>
-Branden J. Brown <zephyrtronium@gmail.com>
-Brandon Bennett <bbennett@fb.com>
-Brandon Gilmore <varz@google.com>
-Brandon Philips <brandon@ifup.org>
-Brandon Ryan <bjryan19@gmail.com>
-Brave Cow <rsr715@gmail.com>
-Brayden Cloud <bcloud@google.com>
-Brendan Daniel Tracey <tracey.brendan@gmail.com>
-Brendan O'Dea <bod@golang.org>
-Brett Cannon <bcannon@gmail.com>
-Brett Merrill <brett.j.merrill94@gmail.com>
-Brian Dellisanti <briandellisanti@gmail.com>
-Brian Downs <brian.downs@gmail.com>
-Brian Falk <falk@logicparty.org>
-Brian G. Merrell <bgmerrell@gmail.com>
-Brian Gitonga Marete <marete@toshnix.com> <bgmarete@gmail.com> <bgm@google.com>
-Brian Kennedy <btkennedy@gmail.com>
-Brian Kessler <brian.m.kessler@gmail.com>
-Brian Ketelsen <bketelsen@gmail.com>
-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>
-Bryan Chan <bryan.chan@ca.ibm.com>
-Bryan Ford <brynosaurus@gmail.com>
-Bryan Heden <b.heden@gmail.com>
-Bulat Gaifullin <gaifullinbf@gmail.com>
-Burak Guven <bguven@gmail.com>
-Caine Tighe <arctanofyourface@gmail.com>
-Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
-Caleb Martinez <accounts@calebmartinez.com>
-Caleb Spare <cespare@gmail.com>
-Carl Chatfield <carlchatfield@gmail.com>
-Carl Henrik Lunde <chlunde@ifi.uio.no>
-Carl Jackson <carl@stripe.com>
-Carl Johnson <me@carlmjohnson.net>
-Carl Mastrangelo <notcarl@google.com>
-Carl Menezes <carleeto@gmail.com>
-Carl Shapiro <cshapiro@google.com> <cshapiro@golang.org>
-Carlisia Campos <carlisia@grokkingtech.io>
-Carlo Alberto Ferraris <cafxx@strayorange.com>
-Carlos Alexandro Becker <caarlos0@gmail.com>
-Carlos Amedee <carlos@golang.org>
-Carlos Castillo <cookieo9@gmail.com>
-Carlos Cirello <uldericofilho@gmail.com>
-Carlos Eduardo <me@carlosedp.com>
-Carlos Eduardo Seo <cseo@linux.vnet.ibm.com>
-Carlos Iriarte <ciriarte@gmail.com>
-Carlos Souza <carloshrsouza@gmail.com>
-Carolyn Van Slyck <me@carolynvanslyck.com>
-Carrie Bynon <cbynon@gmail.com>
-Carson Hoffman <c@rsonhoffman.com>
-Cary Hull <chull@google.com>
-Case Nelson <case.nelson@gmail.com>
-Casey Callendrello <squeed@gmail.com>
-Casey Marshall <casey.marshall@gmail.com>
-Catalin Nicutar <cnicutar@google.com>
-Catalin Patulea <catalinp@google.com>
-Cathal O'Callaghan <cathalsocallaghan@gmail.com>
-Cedric Staub <cs@squareup.com>
-Cezar Sá Espinola <cezarsa@gmail.com>
-Chad Rosier <mrosier.qdt@qualcommdatacenter.com>
-ChaiShushan <chaishushan@gmail.com>
-Changkun Ou <hi@changkun.us>
-Channing Kimble-Brown <channing@golang.org>
-Chao Xu <xuchao@google.com>
-Chaoqun Han <hanssccv@gmail.com>
-Charles Fenwick Elliott <Charles@FenwickElliott.io>
-Charles Kenney <charlesc.kenney@gmail.com>
-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>
-Chris Dollin <ehog.hedge@gmail.com>
-Chris Farmiloe <chrisfarms@gmail.com>
-Chris Hines <chris.cs.guy@gmail.com>
-Chris Howey <howeyc@gmail.com>
-Chris Hundt <hundt@google.com>
-Chris Jones <chris@cjones.org> <chris.jones.yar@gmail.com>
-Chris Kastorff <encryptio@gmail.com>
-Chris Le Roy <brompwnie@users.noreply.github.com>
-Chris Lennert <calennert@gmail.com>
-Chris Liles <caveryliles@gmail.com>
-Chris Manghane <cmang@golang.org>
-Chris Marchesi <chrism@vancluevertech.com>
-Chris McGee <sirnewton_01@yahoo.ca> <newton688@gmail.com>
-Chris Raynor <raynor@google.com>
-Chris Roche <rodaine@gmail.com>
-Chris Smith <chrsmith@users.noreply.github.com>
-Chris Stockton <chrisstocktonaz@gmail.com>
-Chris Taylor <taylorza@gmail.com>
-Chris Waldon <christopher.waldon.dev@gmail.com>
-Chris Zou <chriszou@ca.ibm.com>
-Christian Alexander <christian@linux.com>
-Christian Couder <chriscool@tuxfamily.org>
-Christian Himpel <chressie@googlemail.com> <chressie@gmail.com>
-Christian Muehlhaeuser <muesli@gmail.com>
-Christian Pellegrin <chri@evolware.org>
-Christian R. Petrin <christianpetrin@gmail.com>
-Christian Svensson <blue@cmd.nu>
-Christine Hansmann <chhansmann@gmail.com>
-Christoffer Buchholz <christoffer.buchholz@gmail.com>
-Christoph Blecker <admin@toph.ca>
-Christoph Hack <christoph@tux21b.org>
-Christopher Cahoon <chris.cahoon@gmail.com>
-Christopher Guiney <chris@guiney.net>
-Christopher Henderson <chris@chenderson.org>
-Christopher Hlubek <christopher.hlubek@networkteam.com>
-Christopher Koch <chrisko@google.com>
-Christopher Loessl <cloessl+github@gmail.com>
-Christopher Nelson <nadiasvertex@gmail.com>
-Christopher Nielsen <m4dh4tt3r@gmail.com>
-Christopher Redden <christopher.redden@gmail.com>
-Christopher Swenson <cswenson@google.com>
-Christopher Thomas <53317512+chrisssthomas@users.noreply.github.com>
-Christopher Wedgwood <cw@f00f.org>
-Christos Zoulas <christos@zoulas.com> <zoulasc@gmail.com>
-Christy Perez <christy@linux.vnet.ibm.com>
-CL Sung <clsung@gmail.com> <cl_sung@htc.com>
-Clément Chigot <clement.chigot@atos.net>
-Clement Skau <clementskau@gmail.com>
-Clint J. Edwards <clint.j.edwards@gmail.com>
-Cody Oss <the.cody.oss@gmail.com>
-Colby Ranger <cranger@google.com>
-Colin Arnott <colin@urandom.co.uk>
-Colin Cross <ccross@android.com>
-Colin Edwards <colin@recursivepenguin.com>
-Colin Kennedy <moshen.colin@gmail.com>
-Colin Nelson <colnnelson@google.com>
-Colin Rice <clr@google.com>
-Conrad Irwin <conrad.irwin@gmail.com>
-Conrad Meyer <cemeyer@cs.washington.edu>
-Conrado Gouvea <conradoplg@gmail.com>
-Constantin Konstantinidis <constantinkonstantinidis@gmail.com>
-Corey Thomasson <cthom.lists@gmail.com>
-Corne van der Plas <vdplas@gmail.com>
-Cosmos Nicolaou <cnicolaou@google.com>
-Costin Chirvasuta <ctin@google.com>
-Craig Citro <craigcitro@google.com>
-Cristian Staretu <unclejacksons@gmail.com>
-Cristo García <cgg.code@gmail.com>
-cui fliter <imcusg@gmail.com>
-Cuihtlauac ALVARADO <cuihtlauac.alvarado@orange.com>
-Cuong Manh Le <cuong@orijtech.com>
-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>
-Damian Gryski <dgryski@gmail.com>
-Damien Lespiau <damien.lespiau@gmail.com> <damien.lespiau@intel.com>
-Damien Mathieu <42@dmathieu.com>
-Damien Neil <dneil@google.com>
-Damien Tournoud <damien@platform.sh>
-Dan Ballard <dan@mindstab.net>
-Dan Caddigan <goldcaddy77@gmail.com>
-Dan Callahan <dan.callahan@gmail.com>
-Dan Harrington <harringtond@google.com>
-Dan Jacques <dnj@google.com>
-Dan Johnson <computerdruid@google.com>
-Dan McArdle <dmcardle@google.com>
-Dan Peterson <dpiddy@gmail.com>
-Dan Pupius <dan@medium.com>
-Dan Scales <danscales@google.com>
-Dan Sinclair <dan.sinclair@gmail.com>
-Daniel Cohen <dcohen@gatech.edu>
-Daniel Cormier <danielc@knowbe4.com>
-Daniël de Kok <me@danieldk.eu>
-Daniel Fleischman <danielfleischman@gmail.com>
-Daniel Ingram <ingramds@appstate.edu>
-Daniel Johansson <dajo2002@gmail.com>
-Daniel Kerwin <d.kerwin@gini.net>
-Daniel Kessler <dkess@google.com>
-Daniel Krech <eikeon@eikeon.com>
-Daniel Kumor <rdkumor@gmail.com>
-Daniel Langner <s8572327@gmail.com>
-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>
-Daniel Nadasi <dnadasi@google.com>
-Daniel Nephin <dnephin@gmail.com>
-Daniel Ortiz Pereira da Silva <daniel.particular@gmail.com>
-Daniel S. Fava <danielsfava@gmail.com>
-Daniel Skinner <daniel@dasa.cc>
-Daniel Speichert <daniel@speichert.pl>
-Daniel Theophanes <kardianos@gmail.com>
-Daniel Upton <daniel@floppy.co>
-Daniela Petruzalek <daniela.petruzalek@gmail.com>
-Danish Dua <danishdua@google.com>
-Danish Prakash <grafitykoncept@gmail.com>
-Danny Rosseau <daniel.rosseau@gmail.com>
-Daria Kolistratova <daria.kolistratova@intel.com>
-Darien Raymond <admin@v2ray.com>
-Darren Elwood <darren@textnode.com>
-Darren Grant <darren.e.grant@gmail.com>
-Darren McCleary <darren.rmc@gmail.com>
-Darshan Parajuli <parajulidarshan@gmail.com>
-Datong Sun <dndx@idndx.com>
-Dave Borowitz <dborowitz@google.com>
-Dave Bort <dbort@golang.org>
-Dave Cheney <dave@cheney.net>
-Dave Day <djd@golang.org>
-Dave Grijalva <dgrijalva@ngmoco.com>
-Dave MacFarlane <driusan@gmail.com>
-Dave Pifke <dave@pifke.org>
-Dave Russell <forfuncsake@gmail.com>
-David Anderson <danderson@google.com>
-David Barnett <dbarnett@google.com>
-David Benjamin <davidben@google.com>
-David Black <dblack@atlassian.com>
-David Bond <davidsbond93@gmail.com>
-David Brophy <dave@brophy.uk>
-David Bürgin <676c7473@gmail.com>
-David Calavera <david.calavera@gmail.com>
-David Carlier <devnexen@gmail.com>
-David Carter <fresco.raja@gmail.com>
-David Chase <drchase@google.com>
-David Covert <davidhcovert@gmail.com>
-David Crawshaw <david.crawshaw@zentus.com> <crawshaw@google.com> <crawshaw@golang.org>
-David du Colombier <0intro@gmail.com>
-David Finkel <david.finkel@gmail.com>
-David Forsythe <dforsythe@gmail.com>
-David G. Andersen <dave.andersen@gmail.com>
-David Glasser <glasser@meteor.com>
-David Golden <david@autopragmatic.com>
-David Heuschmann <heuschmann.d@gmail.com>
-David Howden <dhowden@gmail.com>
-David Hubbard <dsp@google.com>
-David Jakob Fritz <david.jakob.fritz@gmail.com>
-David Jones <dxjones@gmail.com>
-David Lazar <lazard@golang.org>
-David Leon Gil <coruus@gmail.com>
-David McLeish <davemc@google.com>
-David Ndungu <dnjuguna@gmail.com>
-David NewHamlet <david@newhamlet.com>
-David Presotto <presotto@gmail.com>
-David Qu <davidqu12345@gmail.com>
-David R. Jenni <david.r.jenni@gmail.com>
-David Sansome <me@davidsansome.com>
-David Stainton <dstainton415@gmail.com>
-David Symonds <dsymonds@golang.org>
-David Thomas <davidthomas426@gmail.com>
-David Timm <dtimm@pivotal.io>
-David Titarenco <david.titarenco@gmail.com>
-David Tolpin <david.tolpin@gmail.com>
-David Url <david@urld.io>
-David Volquartz Lebech <david@lebech.info>
-David Wimmer <davidlwimmer@gmail.com>
-Davies Liu <davies.liu@gmail.com>
-Davor Kapsa <davor.kapsa@gmail.com>
-Dean Eigenmann <7621705+decanus@users.noreply.github.com>
-Dean Prichard <dean.prichard@gmail.com>
-Deepak Jois <deepak.jois@gmail.com>
-Deepak S <deepakspavoodath@gmail.com>
-Denis Bernard <db047h@gmail.com>
-Denis Brandolini <denis.brandolini@gmail.com>
-Denis Isaev <idenx@yandex.com>
-Denis Nagorny <denis.nagorny@intel.com>
-Dennis Kuhnert <mail.kuhnert@gmail.com>
-Denys Honsiorovskyi <honsiorovskyi@gmail.com>
-Denys Smirnov <denis.smirnov.91@gmail.com>
-Derek Buitenhuis <derek.buitenhuis@gmail.com>
-Derek Che <drc@yahoo-inc.com>
-Derek McGowan <derek@mcgstyle.net>
-Derek Parker <parkerderek86@gmail.com>
-Derek Phan <derekphan94@gmail.com>
-Derek Shockey <derek.shockey@gmail.com>
-Dev Ojha <dojha12@gmail.com>
-Dev Zhoujun <dev.zhoujun@gmail.com>
-Devon H. O'Dell <devon.odell@gmail.com>
-Dhaivat Pandit <dhaivatpandit@gmail.com>
-Dhananjay Nakrani <dhananjayn@google.com>
-Dhiru Kholia <dhiru.kholia@gmail.com>
-Dhruvdutt Jadhav <dhruvdutt.jadhav@gmail.com>
-Di Xiao <dixiao@google.com>
-Didier Spezia <didier.06@gmail.com>
-Diego Medina <fmpwizard@gmail.com>
-Diego Siqueira <diego9889@gmail.com>
-Dieter Plaetinck <dieter@raintank.io>
-Dilyn Corner <dilyn.corner@gmail.com>
-Dimitri Sokolyuk <sokolyuk@gmail.com>
-Dimitri Tcaciuc <dtcaciuc@gmail.com>
-Dina Garmash <dgrmsh@gmail.com>
-Diogo Pinela <diogoid7400@gmail.com>
-Dirk Gadsden <dirk@esherido.com>
-Diwaker Gupta <diwakergupta@gmail.com>
-Dmitri Goutnik <dgoutnik@gmail.com>
-Dmitri Popov <operator@cv.dp-net.com>
-Dmitri Shuralyov <dmitshur@golang.org> <dmitri@shuralyov.com>
-Dmitrii Okunev <xaionaro@gmail.com>
-Dmitriy Cherchenko <dcherchenko@gmail.com>
-Dmitriy Dudkin <dudkin.dmitriy@gmail.com>
-Dmitriy Shelenin <deemok@googlemail.com> <deemok@gmail.com>
-Dmitriy Vyukov <dvyukov@google.com>
-Dmitry Chestnykh <dchest@gmail.com>
-Dmitry Doroginin <doroginin@gmail.com>
-Dmitry Mottl <dmitry.mottl@gmail.com>
-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>
-Dominic Della Valle <ddvpublic@Gmail.com>
-Dominic Green <dominicgreen1@gmail.com>
-Dominik Honnef <dominik.honnef@gmail.com>
-Dominik Vogt <vogt@linux.vnet.ibm.com>
-Don Byington <don@dbyington.com>
-Donald Huang <don.hcd@gmail.com>
-Dong-hee Na <donghee.na92@gmail.com>
-Donovan Hide <donovanhide@gmail.com>
-Doug Anderson <douga@google.com>
-Doug Fawley <dfawley@google.com>
-Douglas Danger Manley <doug.manley@gmail.com>
-Drew Flower <drewvanstone@gmail.com>
-Drew Hintz <adhintz@google.com>
-Drew Richardson <drewrichardson@gmail.com>
-Duco van Amstel <duco.vanamstel@gmail.com>
-Duncan Holm <mail@frou.org>
-Dustin Carlino <dcarlino@google.com>
-Dustin Herbison <djherbis@gmail.com>
-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>
-Edan Bedrik <3d4nb3@gmail.com>
-Eddie Scholtz <escholtz@google.com>
-Eden Li <eden.li@gmail.com>
-Eduard Urbach <e.urbach@gmail.com>
-Eduardo Ramalho <eduardo.ramalho@gmail.com>
-Eduardo Villaseñor <evillasrmx@gmail.com>
-Edward Muller <edwardam@interlix.com>
-Egon Elbre <egonelbre@gmail.com>
-Ehren Kret <ehren.kret@gmail.com>
-Eitan Adler <lists@eitanadler.com>
-Eivind Uggedal <eivind@uggedal.com>
-El Mostafa Idrassi <el.mostafa.idrassi@gmail.com>
-Elbert Fliek <efliek@gmail.com>
-Eldar Rakhimberdin <ibeono@gmail.com>
-Elena Grahovac <elena@grahovac.me>
-Eli Bendersky <eliben@google.com>
-Elias Naur <mail@eliasnaur.com> <elias.naur@gmail.com>
-Elliot Morrison-Reed <elliotmr@gmail.com>
-Ellison Leão <ellisonleao@gmail.com>
-Elvina Yakubova <elvinayakubova@gmail.com>
-Emerson Lin <linyintor@gmail.com>
-Emil Bektimirov <lefelys@gmail.com>
-Emil Hessman <emil@hessman.se>
-Emil Mursalimov <mursalimovemeel@gmail.com>
-Emilien Kenler <hello@emilienkenler.com>
-Emmanuel Odeke <emm.odeke@gmail.com> <odeke@ualberta.ca>
-Emrecan Bati <emrecanbati@gmail.com>
-Eno Compton <enocom@google.com>
-Eoghan Sherry <ejsherry@gmail.com>
-Eric Biggers <ebiggers@google.com>
-Eric Brown <browne@vmware.com>
-Eric Chiang <eric.chiang.m@gmail.com>
-Eric Clark <zerohp@gmail.com>
-Eric Daniels <eric@erdaniels.com>
-Eric Engestrom <eric@engestrom.ch>
-Eric Garrido <ekg@google.com>
-Eric Koleda <ekoleda+devrel@google.com>
-Eric Lagergren <ericscottlagergren@gmail.com>
-Eric Milliken <emilliken@gmail.com>
-Eric Pauley <eric@pauley.me>
-Eric Ponce <tricokun@gmail.com>
-Eric Rescorla <ekr@rtfm.com>
-Eric Roshan-Eisner <eric.d.eisner@gmail.com>
-Eric Rutherford <erutherford@gmail.com>
-Eric Rykwalder <e.rykwalder@gmail.com>
-Eric Wang <wangchaogo1990@gmail.com>
-Erick Tryzelaar <etryzelaar@google.com>
-Erik Aigner <aigner.erik@gmail.com>
-Erik Dubbelboer <erik@dubbelboer.com>
-Erik St. Martin <alakriti@gmail.com>
-Erik Staab <estaab@google.com>
-Erik Westrup <erik.westrup@gmail.com>
-Erin Masatsugu <erin.masatsugu@gmail.com>
-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>
-Evan Broder <evan@stripe.com>
-Evan Brown <evanbrown@google.com>
-Evan Digby <evandigby@gmail.com>
-Evan Hicks <evan.hicks2@gmail.com>
-Evan Jones <ej@evanjones.ca>
-Evan Klitzke <evan@eklitzke.org>
-Evan Kroske <evankroske@google.com>
-Evan Martin <evan.martin@gmail.com>
-Evan Phoenix <evan@phx.io>
-Evan Shaw <chickencha@gmail.com>
-Evgeniy Kulikov <tuxuls@gmail.com>
-Evgeniy Polyakov <zbr@ioremap.net>
-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>
-Fangming Fang <fangming.fang@arm.com>
-Fannie Zhang <fannie.zhang@arm.com>
-Fatih Arslan <fatih@arslan.io>
-Fazal Majid <majid@apsalar.com>
-Fazlul Shahriar <fshahriar@gmail.com>
-Federico Bond <federicobond@gmail.com>
-Federico Guerinoni <guerinoni.federico@gmail.com>
-Federico Simoncelli <fsimonce@redhat.com>
-Fedor Indutny <fedor@indutny.com>
-Fedor Korotkiy <dartslon@gmail.com>
-Felipe Oliveira <felipeweb.programador@gmail.com>
-Felix Bünemann <Felix.Buenemann@gmail.com>
-Felix Cornelius <9767036+fcornelius@users.noreply.github.com>
-Felix Geisendörfer <haimuiba@gmail.com>
-Felix Kollmann <fk@konsorten.de>
-Ferenc Szabo <frncmx@gmail.com>
-Fernandez Ludovic <lfernandez.dev@gmail.com>
-Filip Gruszczyński <gruszczy@gmail.com>
-Filip Haglund <drathier@users.noreply.github.com>
-Filip Stanis <fstanis@google.com>
-Filippo Valsorda <filippo@golang.org> <filippo@cloudflare.com> <hi@filippo.io>
-Firmansyah Adiputra <frm.adiputra@gmail.com>
-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>
-Frew Schmidt <github@frew.co>
-Frithjof Schulze <schulze@math.uni-hannover.de> <sfrithjof@gmail.com>
-Frits van Bommel <fvbommel@gmail.com>
-Fujimoto Kyosuke <kyoro.f@gmail.com>
-Fumitoshi Ukai <ukai@google.com>
-G. Hussain Chinoy <ghchinoy@gmail.com>
-Gaal Yahas <gaal@google.com>
-Gabríel Arthúr Pétursson <gabriel@system.is>
-Gabriel Aszalos <gabriel.aszalos@gmail.com>
-Gabriel Guzman <gabe.guzman@gmail.com>
-Gabriel Nelle <tehsphinx@web.de>
-Gabriel Nicolas Avellaneda <avellaneda.gabriel@gmail.com>
-Gabriel Rosenhouse <rosenhouse@gmail.com>
-Gabriel Russell <gabriel.russell@gmail.com>
-Gabriel Vasile <gabriel.vasile0793@gmail.com>
-Gareth Paul Jones <gpj@foursquare.com>
-Garret Kelly <gdk@google.com>
-Garrick Evans <garrick@google.com>
-Garry McNulty <garrmcnu@gmail.com>
-Gary Burd <gary@beagledreams.com> <gary.burd@gmail.com>
-Gary Elliott <garyelliott@google.com>
-Gaurav Singh <gaurav1086@gmail.com>
-Gaurish Sharma <contact@gaurishsharma.com>
-Gautham Thambidorai <gautham.dorai@gmail.com>
-Gauthier Jolly <gauthier.jolly@gmail.com>
-Gawen Arab <gawen.arab@c.zen.ly>
-Geert-Johan Riemer <gjr19912@gmail.com>
-Genevieve Luyt <genevieve.luyt@gmail.com>
-Gengliang Wang <ltnwgl@gmail.com>
-Geoff Berry <gberry.qdt@qualcommdatacenter.com>
-Geoffroy Lorieux <lorieux.g@gmail.com>
-Geon Kim <geon0250@gmail.com>
-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>
-Gerasimos Dimitriadis <gedimitr@gmail.com>
-Gergely Brautigam <skarlso777@gmail.com>
-Gernot Vormayr <gvormayr@gmail.com>
-Gert Cuykens <gert.cuykens@gmail.com>
-Getulio Sánchez <valentin2507@gmail.com>
-Ghazni Nattarshah <ghazni.nattarshah@gmail.com>
-Gianguido Sora` <g.sora4@gmail.com>
-Gideon Jan-Wessel Redelinghuys <gjredelinghuys@gmail.com>
-Giles Lean <giles.lean@pobox.com>
-Giovanni Bajo <rasky@develer.com>
-GitHub User @180909 (70465953) <734461790@qq.com>
-GitHub User @6543 (24977596) <6543@obermui.de>
-GitHub User @aca (50316549) <acadx0@gmail.com>
-GitHub User @ajnirp (1688456) <ajnirp@users.noreply.github.com>
-GitHub User @ajz01 (4744634) <ajzdenek@gmail.com>
-GitHub User @alkesh26 (1019076) <alkesh26@gmail.com>
-GitHub User @andig (184815) <cpuidle@gmx.de>
-GitHub User @andrius4669 (4699695) <andrius4669@gmail.com>
-GitHub User @as (8127015) <as.utf8@gmail.com>
-GitHub User @bakape (7851952) <bakape@gmail.com>
-GitHub User @bgadrian (830001) <aditza8@gmail.com>
-GitHub User @bontequero (2674999) <bontequero@gmail.com>
-GitHub User @cch123 (384546) <buaa.cch@gmail.com>
-GitHub User @chainhelen (7046329) <chainhelen@gmail.com>
-GitHub User @chanxuehong (3416908) <chanxuehong@gmail.com>
-GitHub User @Cluas (10056928) <Cluas@live.cn>
-GitHub User @cncal (23520240) <flycalvin@qq.com>
-GitHub User @DQNEO (188741) <dqneoo@gmail.com>
-GitHub User @Dreamacro (8615343) <chuainian@gmail.com>
-GitHub User @dupoxy (1143957) <dupoxy@users.noreply.github.com>
-GitHub User @EndlessCheng (7086966) <loli.con@qq.com>
-GitHub User @erifan (31343225) <eric.fang@arm.com>
-GitHub User @esell (9735165) <eujon.sellers@gmail.com>
-GitHub User @fatedier (7346661) <fatedier@gmail.com>
-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>
-GitHub User @markruler (38225900) <csu0414@gmail.com>
-GitHub User @Matts966 (28551465) <Matts966@users.noreply.github.com>
-GitHub User @micnncim (21333876) <micnncim@gmail.com>
-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>
-GitHub User @povsister (11040951) <pov@mahou-shoujo.moe>
-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>
-GitHub User @uhei (2116845) <uhei@users.noreply.github.com>
-GitHub User @uji (49834542) <ujiprog@gmail.com>
-GitHub User @unbyte (5772358) <i@shangyes.net>
-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>
-GitHub User @zikaeroh (48577114) <zikaeroh@gmail.com>
-GitHub User @ZZMarquis (7624583) <zhonglingjian3821@163.com>
-Giulio Iotti <dullgiulio@gmail.com>
-Giulio Micheloni <giulio.micheloni@gmail.com>
-Giuseppe Valente <gvalente@arista.com>
-Gleb Stepanov <glebstepanov1992@gmail.com>
-Glenn Brown <glennb@google.com>
-Glenn Lewis <gmlewis@google.com>
-Gordon Klaus <gordon.klaus@gmail.com>
-Gordon Tyler <gordon@doxxx.net>
-Grace Han <hgrace503@gmail.com>
-Graham King <graham4king@gmail.com>
-Graham Miller <graham.miller@gmail.com>
-Grant Griffiths <ggp493@gmail.com>
-Green Lightning <GreenLightning.git@googlemail.com>
-Greg Poirier <greg.istehbest@gmail.com>
-Greg Steuck <gnezdo+github@google.com>
-Greg Thelen <gthelen@google.com>
-Greg Ward <greg@gerg.ca>
-Grégoire Delattre <gregoire.delattre@gmail.com>
-Gregory Man <man.gregory@gmail.com>
-Gregory Petrosyan <gregory.petrosyan@gmail.com>
-Guilherme Caruso <gui.martinscaruso@gmail.com>
-Guilherme Garnier <guilherme.garnier@gmail.com>
-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>
-Gustavo Niemeyer <gustavo@niemeyer.net> <n13m3y3r@gmail.com>
-Gwenael Treguier <gwenn.kahz@gmail.com>
-Gyu-Ho Lee <gyuhox@gmail.com>
-H. İbrahim Güngör <igungor@gmail.com>
-Hajime Hoshi <hajimehoshi@gmail.com>
-Hallgrimur Gunnarsson <halg@google.com>
-HAMANO Tsukasa <hamano@osstech.co.jp>
-Han-Wen Nienhuys <hanwen@google.com>
-Hang Qian <hangqian90@gmail.com>
-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>
-Hari haran <hariharan.uno@gmail.com>
-Hariharan Srinath <srinathh@gmail.com>
-Harley Laue <losinggeneration@gmail.com>
-Harry Moreno <morenoh149@gmail.com>
-Harshavardhana <hrshvardhana@gmail.com>
-Hasan Ozgan <hasan@ozgan.net>
-Hasit Bhatt <hasit.p.bhatt@gmail.com>
-Hauke Löffler <hloeffler@users.noreply.github.com>
-Håvard Haugen <havard.haugen@gmail.com>
-He Liu <liulonnie@gmail.com>
-Hector Chu <hectorchu@gmail.com>
-Hector Martin Cantero <hector@marcansoft.com>
-Hein Khant Zaw <heinkhantzaw1@gmail.com>
-Henning Schmiedehausen <henning@schmiedehausen.org>
-Henrik Edwards <henrik.edwards@gmail.com>
-Henrik Hodne <henrik@hodne.io>
-Henrique Vicente <henriquevicente@gmail.com>
-Henry Adi Sumarto <henry.adisumarto@gmail.com>
-Henry Bubert <google@mindeco.de>
-Henry Chang <mr.changyuheng@gmail.com>
-Henry Clifford <h.a.clifford@gmail.com>
-Henry Wong <liushuai.wang@elastic.co>
-Herbert Georg Fischer <herbert.fischer@gmail.com>
-Herbie Ong <herbie@google.com>
-Heschi Kreinick <heschi@google.com>
-Hidetatsu Yaginuma <ygnmhdtt@gmail.com>
-Hilko Bengen <bengen@hilluzination.de>
-Himanshu Kishna Srivastava <28himanshu@gmail.com>
-Hiroaki Nakamura <hnakamur@gmail.com>
-Hiromichi Ema <ema.hiro@gmail.com>
-Hironao OTSUBO <motemen@gmail.com>
-Hiroshi Ioka <hirochachacha@gmail.com>
-Hitoshi Mitake <mitake.hitoshi@gmail.com>
-Holden Huang <ttyh061@gmail.com>
-Hong Ruiqi <hongruiqi@gmail.com>
-Hongfei Tan <feilengcui008@gmail.com>
-Horacio Duran <horacio.duran@gmail.com>
-Horst Rutter <hhrutter@gmail.com>
-Hossein Sheikh Attar <hattar@google.com>
-Hossein Zolfi <hossein.zolfi@gmail.com>
-Howard Zhang <howard.zhang@arm.com>
-Hsin Tsao <tsao@google.com>
-Hsin-Ho Yeh <yhh92u@gmail.com>
-Hu Keping <hukeping@huawei.com>
-Huan Du <i@huandu.me>
-Hugues Bruant <hugues.bruant@gmail.com>
-Huy Le <huy.dinh.le.89@gmail.com>
-Hyang-Ah Hana Kim <hakim@google.com> <hyangah@gmail.com>
-Hyoyoung Chang <hyoyoung@gmail.com>
-Ian Cottrell <iancottrell@google.com>
-Ian Davis <nospam@iandavis.com>
-Ian Gudger <ian@loosescre.ws>
-Ian Haken <ihaken@netflix.com>
-Ian Kent <iankent85@gmail.com>
-Ian Lance Taylor <iant@golang.org>
-Ian Leue <ian@appboy.com>
-Ian Mckay <iann0036@gmail.com>
-Ian Tay <iantay@google.com>
-Ian Zapolsky <ianzapolsky@gmail.com>
-Ibrahim AshShohail <ibra.sho@gmail.com>
-Icarus Sparry <golang@icarus.freeuk.com>
-Iccha Sethi <icchasethi@gmail.com>
-Ichinose Shogo <shogo82148@gmail.com>
-Idora Shinatose <idora.shinatose@gmail.com>
-Ignacio Hagopian <jsign.uy@gmail.com>
-Igor Bernstein <igorbernstein@google.com>
-Igor Bolotnikov <igor.v.bolotnikov@gmail.com>
-Igor Dolzhikov <bluesriverz@gmail.com>
-Igor Vashyst <ivashyst@gmail.com>
-Igor Zhilianin <igor.zhilianin@gmail.com>
-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>
-Inanc Gumus <m@inanc.io>
-Ingo Gottwald <in.gottwald@gmail.com>
-Ingo Krabbe <ikrabbe.ask@gmail.com>
-Ingo Oeser <nightlyone@googlemail.com> <nightlyone@gmail.com>
-Ioannis Georgoulas <geototti21@hotmail.com>
-Irbe Krumina <irbekrm@gmail.com>
-Irfan Sharif <irfanmahmoudsharif@gmail.com>
-Irieda Noboru <irieda@gmail.com>
-Isaac Ardis <isaac.ardis@gmail.com>
-Isaac Wagner <ibw@isaacwagner.me>
-Isfan Azhabil <isfanazhabil@gmail.com>
-Iskander Sharipov <iskander.sharipov@intel.com> <quasilyte@gmail.com>
-Issac Trotts <issactrotts@google.com>
-Ivan Babrou <ivan@cloudflare.com>
-Ivan Bertona <ivan.bertona@gmail.com>
-Ivan Krasin <krasin@golang.org>
-Ivan Kutuzov <arbrix@gmail.com>
-Ivan Markin <sw@nogoegst.net>
-Ivan Moscoso <moscoso@gmail.com>
-Ivan Osadchiy <ivan.osadchii@gmail.com>
-Ivan Sharavuev <shpiwan@gmail.com>
-Ivan Trubach <mr.trubach@icloud.com>
-Ivan Ukhov <ivan.ukhov@gmail.com>
-Ivy Evans <ivy@ivyevans.net>
-Jaana Burcu Dogan <jbd@google.com> <jbd@golang.org> <burcujdogan@gmail.com>
-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>
-Jacob Hoffman-Andrews <github@hoffman-andrews.com>
-Jacob Walker <jacobwalker0814@gmail.com>
-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>
-Jakub Kaczmarzyk <jakubk@mit.edu>
-Jakub Ryszard Czarnowicz <j.czarnowicz@gmail.com>
-Jakub Warczarek <jakub.warczarek@gmail.com>
-Jamal Carvalho <jamal.a.carvalho@gmail.com>
-James Aguilar <jaguilar@google.com>
-James Bardin <j.bardin@gmail.com>
-James Chacon <jchacon@google.com>
-James Clarke <jrtc27@jrtc27.com>
-James Cowgill <James.Cowgill@imgtec.com>
-James Craig Burley <james-github@burleyarch.com>
-James David Chalfant <james.chalfant@gmail.com>
-James Eady <jmeady@google.com>
-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>
-James Meneghello <rawrz0r@gmail.com>
-James Myers <jfmyers9@gmail.com>
-James Naftel <james.naftel@gmail.com>
-James Neve <jamesoneve@gmail.com>
-James Nugent <james@jen20.com>
-James P. Cooper <jamespcooper@gmail.com>
-James Robinson <jamesr@google.com> <jamesr.gatech@gmail.com>
-James Schofield <james@shoeboxapp.com>
-James Smith <jrs1995@icloud.com>
-James Sweet <james.sweet88@googlemail.com>
-James Toy <nil@opensesame.st>
-James Treanor <jtreanor3@gmail.com>
-James Tucker <raggi@google.com>
-James Whitehead <jnwhiteh@gmail.com>
-Jamie Beverly <jamie.r.beverly@gmail.com>
-Jamie Gennis <jgennis@google.com> <jgennis@gmail.com>
-Jamie Kerr <jkerr113@googlemail.com>
-Jamie Liu <jamieliu@google.com>
-Jamie Stackhouse <contin673@gmail.com>
-Jamie Turner <jamwt@dropbox.com>
-Jamie Wilkinson <jaq@spacepants.org>
-Jamil Djadala <djadala@gmail.com>
-Jan Berktold <jan@berktold.co>
-Jan H. Hosang <jan.hosang@gmail.com>
-Jan Kratochvil <jan.kratochvil@redhat.com>
-Jan Lehnardt <jan@apache.org>
-Jan Mercl <0xjnml@gmail.com> <befelemepeseveze@gmail.com>
-Jan Newmarch <jan.newmarch@gmail.com>
-Jan Pilzer <jan.pilzer@gmx.de>
-Jan Steinke <jan.steinke@gmail.com>
-Jan Ziak <0xe2.0x9a.0x9b@gmail.com>
-Jani Monoses <jani.monoses@ubuntu.com> <jani.monoses@gmail.com>
-Jannis Andrija Schnitzer <jannis@schnitzer.im>
-Jared Allard <jaredallard@users.noreply.github.com>
-Jared Culp <jculp14@gmail.com>
-Jaroslavas Počepko <jp@webmaster.ms>
-Jason A. Donenfeld <Jason@zx2c4.com>
-Jason Baker <jason-baker@users.noreply.github.com>
-Jason Barnett <jason.w.barnett@gmail.com>
-Jason Buberel <jbuberel@google.com>
-Jason Chu <jasonchujc@gmail.com>
-Jason Del Ponte <delpontej@gmail.com>
-Jason Hall <jasonhall@google.com>
-Jason Keene <jasonkeene@gmail.com>
-Jason LeBrun <jblebrun@gmail.com>
-Jason Smale <jsmale@zendesk.com>
-Jason Travis <infomaniac7@gmail.com>
-Jason Wangsadinata <jwangsadinata@gmail.com>
-Javier Kohen <jkohen@google.com>
-Javier Revillas <jrevillas@massivedynamic.io>
-Javier Segura <javism@gmail.com>
-Jay Chen <chenjie@chenjie.info>
-Jay Conrod <jayconrod@google.com>
-Jay Lee <BusyJayLee@gmail.com>
-Jay Taylor <outtatime@gmail.com>
-Jay Weisskopf <jay@jayschwa.net>
-Jean de Klerk <deklerk@google.com>
-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>
-Jędrzej Szczepaniak <jbszczepaniak@gmail.com>
-Jeet Parekh <jeetparekh96@gmail.com>
-Jeevanandam M <jeeva@myjeeva.com>
-Jeff (Zhefu) Jiang <jeffjiang@google.com>
-Jeff Craig <jeffcraig@google.com>
-Jeff Dupont <jeff.dupont@gmail.com>
-Jeff Hodges <jeff@somethingsimilar.com>
-Jeff Johnson <jrjohnson@google.com>
-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>
-Jens Frederich <jfrederich@gmail.com>
-Jeremiah Harmsen <jeremiah@google.com>
-Jeremy Banks <_@jeremy.ca>
-Jeremy Canady <jcanady@gmail.com>
-Jeremy Faller <jeremy@golang.org>
-Jeremy Jackins <jeremyjackins@gmail.com>
-Jeremy Jay <jeremy@pbnjay.com>
-Jeremy Schlatter <jeremy.schlatter@gmail.com>
-Jero Bado <tokidokitalkyou@gmail.com>
-Jeroen Bobbeldijk <jerbob92@gmail.com>
-Jeroen Simonetti <jeroen@simonetti.nl>
-Jérôme Doucet <jerdct@gmail.com>
-Jerrin Shaji George <jerrinsg@gmail.com>
-Jess Frazelle <me@jessfraz.com>
-Jesse Szwedko <jesse.szwedko@gmail.com>
-Jesús Espino <jespinog@gmail.com>
-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>
-Jie Ma <jienius@outlook.com>
-Jihyun Yu <yjh0502@gmail.com>
-Jim Cote <jfcote87@gmail.com>
-Jim Kingdon <jim@bolt.me>
-Jim McGrath <jimmc2@gmail.com>
-Jim Minter <jminter@redhat.com>
-Jimmy Frasche <soapboxcicero@gmail.com>
-Jimmy Zelinskie <jimmyzelinskie@gmail.com>
-Jin-wook Jeong <jeweljar@hanmail.net>
-Jingcheng Zhang <diogin@gmail.com>
-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>
-Joe Harrison <joehazzers@gmail.com>
-Joe Henke <joed.henke@gmail.com>
-Joe Kyo <xunianzu@gmail.com>
-Joe Poirier <jdpoirier@gmail.com>
-Joe Richey <joerichey@google.com>
-Joe Shaw <joe@joeshaw.org>
-Joe Sylve <joe.sylve@gmail.com>
-Joe Tsai <joetsai@digital-static.net>
-Joel Courtney <euphemize@gmail.com>
-Joel Ferrier <joelferrier@google.com>
-Joel Sing <joel@sing.id.au> <jsing@google.com>
-Joël Stemmer <jstemmer@google.com>
-Joel Stemmer <stemmertech@gmail.com>
-Joey Geiger <jgeiger@users.noreply.github.com>
-Johan Brandhorst <johan.brandhorst@gmail.com>
-Johan Euphrosine <proppy@google.com>
-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>
-John Beisley <huin@google.com>
-John C Barstow <jbowtie@amathaine.com>
-John DeNero <denero@google.com>
-John Dethridge <jcd@golang.org>
-John Gibb <johngibb@gmail.com>
-John Gilik <john@jgilik.com>
-John Graham-Cumming <jgc@jgc.org> <jgrahamc@gmail.com>
-John Howard Palevich <jack.palevich@gmail.com>
-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>
-John Schnake <schnake.john@gmail.com>
-John Shahid <jvshahid@gmail.com>
-John Tuley <john@tuley.org>
-John Weldon <johnweldon4@gmail.com>
-Johnny Luo <johnnyluo1980@gmail.com>
-Jon Chen <jchen@justin.tv>
-Jon Johnson <jonjohnson@google.com>
-Jonas Bernoulli <jonas@bernoul.li>
-Jonathan Albrecht <jonathan.albrecht@ibm.com>
-Jonathan Allie <jonallie@google.com>
-Jonathan Amsterdam <jba@google.com>
-Jonathan Boulle <jonathanboulle@gmail.com>
-Jonathan Chen <dijonkitchen@users.noreply.github.com>
-Jonathan Feinberg <feinberg@google.com>
-Jonathan Gold <jgold.bg@gmail.com>
-Jonathan Hseu <jhseu@google.com>
-Jonathan Mark <jhmark@xenops.com> <jhmark000@gmail.com>
-Jonathan Nieder <jrn@google.com>
-Jonathan Pentecost <pentecostjonathan@gmail.com>
-Jonathan Pittman <jmpittman@google.com> <jonathan.mark.pittman@gmail.com>
-Jonathan Rudenberg <jonathan@titanous.com>
-Jonathan Stacks <jonstacks13@gmail.com>
-Jonathan Swinney <jswinney@amazon.com>
-Jonathan Wills <runningwild@gmail.com>
-Jonathon Lacher <jonathon.lacher@gmail.com>
-Jongmin Kim <atomaths@gmail.com>
-Joonas Kuorilehto <joneskoo@derbian.fi>
-Joop Kiefte <ikojba@gmail.com> <joop@kiefte.net>
-Jordan Christiansen <xordspar0@gmail.com>
-Jordan Krage <jmank88@gmail.com>
-Jordan Lewis <jordanthelewis@gmail.com>
-Jordan Liggitt <liggitt@google.com>
-Jordan Rhee <jordanrh@microsoft.com>
-Jordan Rupprecht <rupprecht@google.com>
-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>
-Joseph Bonneau <jcb@google.com>
-Joseph Holsten <joseph@josephholsten.com>
-Joseph Morag <sefim96@gmail.com>
-Josh Baum <joshbaum@google.com>
-Josh Bleecher Snyder <josharian@gmail.com>
-Josh Chorlton <jchorlton@gmail.com>
-Josh Deprez <josh.deprez@gmail.com>
-Josh Goebel <dreamer3@gmail.com>
-Josh Hoak <jhoak@google.com>
-Josh Holland <jrh@joshh.co.uk>
-Josh Rickmar <jrick@companyzero.com>
-Josh Roppo <joshroppo@gmail.com>
-Josh Varga <josh.varga@gmail.com>
-Joshua Bezaleel Abednego <joshua.bezaleel@gmail.com>
-Joshua Boelter <joshua.boelter@intel.com>
-Joshua Chase <jcjoshuachase@gmail.com>
-Joshua Crowgey <jcrowgey@uw.edu>
-Joshua Harshman <joshgreyhat@gmail.com>
-Joshua M. Clulow <josh.clulow@joyent.com>
-Joshua Rubin <joshua@rubixconsulting.com>
-Josselin Costanzi <josselin@costanzi.fr>
-Jostein Stuhaug <js@solidsystem.no>
-JP Sugarbroad <jpsugar@google.com>
-JT Olds <jtolds@xnet5.com>
-JT Olio <hello@jtolio.com>
-Juan Carlos <juanjcsr@gmail.com>
-Juan Pablo Civile <elementohb@gmail.com>
-Jude Pereira <judebpereira@gmail.com>
-Jukka-Pekka Kekkonen <karatepekka@gmail.com>
-Julia Hansbrough <flowerhack@google.com>
-Julian Kornberger <jk+github@digineo.de>
-Julian Pastarmov <pastarmovj@google.com>
-Julian Phillips <julian@quantumfyre.co.uk>
-Julian Tibble <julian.tibble@gmail.com>
-Julie Qiu <julie@golang.org>
-Julien Kauffmann <julien.kauffmann@freelan.org>
-Julien Salleyron <julien.salleyron@gmail.com>
-Julien Schmidt <google@julienschmidt.com>
-Julien Tant <julien@craftyx.fr>
-Julio Montes <julio.montes@intel.com>
-Jun Zhang <jim.zoumo@gmail.com>
-Junchen Li <junchen.li@arm.com>
-Junda Liu <junda@celer.network>
-Jungho Ahn <jhahn@google.com>
-Junya Hayashi <ledmonster@gmail.com>
-Juraj Sukop <sukop@users.noreply.github.com>
-Jure Ham <jure.ham@zemanta.com>
-Justin Gracenin <jgracenin@gmail.com>
-Justin Li <git@justinli.net>
-Justin Nuß <nuss.justin@gmail.com>
-Justyn Temme <justyntemme@gmail.com>
-Kai Backman <kaib@golang.org>
-Kai Dong <dokia2357@gmail.com>
-Kai Lüke <kai@kinvolk.io>
-Kai Trukenmüller <ktye78@gmail.com>
-Kale Blankenship <kale@lemnisys.com>
-Kaleb Elwert <kelwert@atlassian.com>
-Kalman Bekesi <kalmanb@google.com>
-Kamal Aboul-Hosn <aboulhosn@google.com>
-Kamil Chmielewski <kamil.chm@gmail.com>
-Kamil Kisiel <kamil@kamilkisiel.net> <kamil.kisiel@gmail.com>
-Kamil Rytarowski <krytarowski@users.noreply.github.com>
-Kang Hu <hukangustc@gmail.com>
-Kanta Ebihara <kantaebihara@gmail.com>
-Karan Dhiman <karandhi@ca.ibm.com>
-Karel Pazdera <pazderak@gmail.com>
-Karoly Negyesi <chx1975@gmail.com>
-Karsten Köhler <karsten.koehler95@gmail.com>
-Karthik Nayak <karthik.188@gmail.com>
-Kashav Madan <kshvmdn@gmail.com>
-Kate Manson <kate.manson@izettle.com>
-Katharine Berry <ktbry@google.com>
-Katie Hockman <katie@golang.org>
-Kato Kazuyoshi <kato.kazuyoshi@gmail.com>
-Katrina Owen <katrina.owen@gmail.com>
-Kaviraj Kanagaraj <kavirajkanagaraj@gmail.com>
-Kay Zhu <kayzhu@google.com>
-Kazuhiro Sera <seratch@gmail.com>
-KB Sriram <kbsriram@google.com>
-Keegan Carruthers-Smith <keegan.csmith@gmail.com>
-Kei Son <hey.calmdown@gmail.com>
-Keiichi Hirobe <chalenge.akane@gmail.com>
-Keiji Yoshida <keijiyoshida.mail@gmail.com>
-Keisuke Kishimoto <keisuke.kishimoto@gmail.com>
-Keith Ball <inflatablewoman@gmail.com>
-Keith Randall <khr@golang.org>
-Keith Rarick <kr@xph.us>
-Kelly Heller <pestophagous@gmail.com>
-Kelsey Hightower <kelsey.hightower@gmail.com>
-Kelvin Foo Chuan Lyi <vmirage@gmail.com>
-Kemal Elmizan <kemalelmizan@gmail.com>
-Ken Friedenbach <kenliz@cruzio.com>
-Ken Rockot <ken@oz.gs> <ken.rockot@gmail.com>
-Ken Sedgwick <ken@bonsai.com>
-Ken Thompson <ken@golang.org>
-Kenichi Tsunokawa <kenichi.tsunokawa@gmail.com>
-Kenji Kaneda <kenji.kaneda@gmail.com>
-Kenji Yano <kenji.yano@gmail.com>
-Kenneth Shaw <kenshaw@gmail.com>
-Kenny Grant <kennygrant@gmail.com>
-Kensei Nakada <handbomusic@gmail.com>
-Kenta Mori <zoncoen@gmail.com>
-Kerollos Magdy <kerolloz@yahoo.com>
-Ketan Parmar <ketanbparmar@gmail.com>
-Kevan Swanberg <kevswanberg@gmail.com>
-Kevin Albertson <kevin.albertson@mongodb.com>
-Kevin Ballard <kevin@sb.org>
-Kevin Burke <kev@inburke.com>
-Kévin Dunglas <dunglas@gmail.com>
-Kevin Gillette <extemporalgenome@gmail.com>
-Kevin Herro <kevin109104@gmail.com>
-Kevin Kirsche <kev.kirsche@gmail.com>
-Kevin Klues <klueska@gmail.com> <klueska@google.com>
-Kevin Malachowski <chowski@google.com>
-Kevin Parsons <kevpar@microsoft.com>
-Kevin Ruffin <kruffin@gmail.com>
-Kevin Vu <kevin.m.vu@gmail.com>
-Kevin Zita <bleedgreenandgold@gmail.com>
-Keyan Pishdadian <kpishdadian@gmail.com>
-Keyuan Li <keyuanli123@gmail.com>
-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>
-Kirill Korotaev <kirillx@gmail.com>
-Kirill Motkov <Motkov.Kirill@gmail.com>
-Kirill Smelkov <kirr@nexedi.com>
-Kirill Tatchihin <kirabsuir@gmail.com>
-Kirk Han <kirk91.han@gmail.com>
-Kirklin McDonald <kirklin.mcdonald@gmail.com>
-KJ Tsanaktsidis <ktsanaktsidis@zendesk.com>
-Klaus Post <klauspost@gmail.com>
-Kodie Goodwin <kodiegoodwin@gmail.com>
-Koichi Shiraishi <zchee.io@gmail.com>
-Koki Ide <niconegoto@yahoo.co.jp>
-Koki Tomoshige <tomocy.dev@gmail.com>
-Komu Wairagu <komuw05@gmail.com>
-Konstantin <konstantin8105@gmail.com>
-Konstantin Shaposhnikov <k.shaposhnikov@gmail.com>
-Koya IWAMURA <kiwamura0314@gmail.com>
-Kris Kwiatkowski <kris@cloudflare.com>
-Kris Nova <kris@nivenly.com>
-Kris Rousey <krousey@google.com>
-Krishna Birla <krishnabirla16@gmail.com>
-Kristopher Watts <traetox@gmail.com>
-Krzysztof Dąbrowski <krzysdabro@live.com>
-Kshitij Saraogi <kshitijsaraogi@gmail.com>
-Kun Li <likunarmstrong@gmail.com>
-Kunpei Sakai <namusyaka@gmail.com>
-Kuntal Majumder <hellozee@disroot.org>
-Kush Patel <kush.patel@hootsuite.com>
-Kyle Consalus <consalus@gmail.com>
-Kyle Isom <kyle@gokyle.net>
-Kyle Jones <kyle@kyledj.com>
-Kyle Lemons <kyle@kylelemons.net> <kevlar@google.com>
-Kyle Nusbaum <kyle@datadog.com>
-Kyle Shannon <kyle@pobox.com>
-Kyle Spiers <eiais@google.com>
-Kyle Wood <kyle@kylewood.cc>
-Kyohei Kadota <lufia@lufia.org>
-Kyrylo Silin <silin@kyrylo.org>
-L Campbell <unpantsu@gmail.com>
-Lai Jiangshan <eag0628@gmail.com>
-Lajos Papp <lalyos@yahoo.com>
-Lakshay Garg <lakshay.garg.1996@gmail.com>
-Lann Martin <lannm@google.com>
-Lanre Adelowo <yo@lanre.wtf>
-Lapo Luchini <lapo@lapo.it>
-Larry Clapp <larry@theclapp.org>
-Larry Hosken <lahosken@golang.org>
-Lars Jeppesen <jeppesen.lars@gmail.com>
-Lars Lehtonen <lars.lehtonen@gmail.com>
-Lars Wiegman <lars@namsral.com>
-Larz Conwell <larzconwell@gmail.com>
-Laurent Voisin <lpvoisin@gmail.com>
-Laurie Clark-Michalek <laurie@qubit.com>
-LE Manh Cuong <cuong.manhle.vn@gmail.com>
-Lee Hinman <hinman@gmail.com>
-Lee Packham <lpackham@gmail.com>
-Lehner Florian <dev@der-flo.net>
-Leigh McCulloch <leighmcc@gmail.com>
-Leo Antunes <leo@costela.net>
-Leo Rudberg <ljr@google.com>
-Leon Klingele <git@leonklingele.de>
-Leonard Wang <wangdeyu0907@gmail.com> <wangdeyu@golangcn.org>
-Leonardo Comelli <leonardo.comelli@gmail.com>
-Leonel Quinteros <leonel.quinteros@gmail.com>
-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>
-Lion Yang <lion@aosc.xyz>
-Liz Rice <liz@lizrice.com>
-Lize Cai <lizzzcai1@gmail.com>
-Lloyd Dewolf <foolswisdom@gmail.com>
-Lluís Batlle i Rossell <viric@viric.name>
-Lorenz Bauer <lmb@cloudflare.com>
-Lorenz Brun <lorenz@brun.one>
-Lorenz Nickel <mail@lorenznickel.de>
-Lorenzo Masini <rugginoso@develer.com>
-Lorenzo Stoakes <lstoakes@gmail.com>
-Louis Kruger <louisk@google.com>
-Luan Santos <cfcluan@gmail.com>
-Lubomir I. Ivanov <neolit123@gmail.com>
-Luca Bruno <luca.bruno@coreos.com>
-Luca Greco <luca.greco@alcacoop.it>
-Luca Spiller <luca@stackednotion.com>
-Lucas Bremgartner <lucas.bremgartner@gmail.com>
-Lucas Clemente <lclemente@google.com>
-Lucien Stuker <lucien.stuker@gmail.com>
-Lucio De Re <lucio.dere@gmail.com>
-Ludi Rehak <ludi317@gmail.com>
-Luigi Riefolo <luigi.riefolo@gmail.com>
-Luit van Drongelen <luitvd@gmail.com>
-Luka Zakrajšek <tr00.g33k@gmail.com>
-Luka Zitnik <luka.zitnik@gmail.com>
-Lukasz Milewski <lmmilewski@gmail.com>
-Luke Champine <luke.champine@gmail.com>
-Luke Curley <qpingu@gmail.com>
-Luke Granger-Brown <git@lukegb.com>
-Luke Shumaker <lukeshu@datawire.io>
-Luke Young <bored-engineer@users.noreply.github.com>
-Luna Duclos <luna.duclos@palmstonegames.com>
-Luuk van Dijk <lvd@golang.org> <lvd@google.com>
-Lyle Franklin <lylejfranklin@gmail.com>
-Lynn Boger <laboger@linux.vnet.ibm.com>
-Ma Peiqi <mapeiqi2017@gmail.com>
-Maarten Bezemer <maarten.bezemer@gmail.com>
-Maciej Dębski <maciejd@google.com>
-Madhu Rajanna <madhupr007@gmail.com>
-Magnus Hiie <magnus.hiie@gmail.com>
-Mahdi Hosseini Moghaddam <seyed.mahdi.hosseini.moghaddam@ibm.com>
-Maia Lee <maia.lee@leftfieldlabs.com>
-Maicon Costa <maiconscosta@gmail.com>
-Mak Kolybabi <mak@kolybabi.com>
-Maksym Trykur <maksym.trykur@gmail.com>
-Mal Curtis <mal@mal.co.nz>
-Manfred Touron <m@42.am>
-Manigandan Dharmalingam <manigandan.jeff@gmail.com>
-Manish Goregaokar <manishsmail@gmail.com>
-Manlio Perillo <manlio.perillo@gmail.com>
-Manoj Dayaram <platform-dev@moovweb.com> <manoj.dayaram@moovweb.com>
-Mansour Rahimi <rahimi.mnr@gmail.com>
-Manu Garg <manugarg@google.com>
-Manu S Ajith <neo@codingarena.in>
-Manuel Mendez <mmendez534@gmail.com>
-Marat Khabibullin <marat.khabibullin@jetbrains.com>
-Marc Sanmiquel <marcsanmiquel@gmail.com>
-Marc Weistroff <marc@weistroff.net>
-Marc-Antoine Ruel <maruel@chromium.org>
-Marcel Edmund Franke <marcel.edmund.franke@gmail.com>
-Marcel van Lohuizen <mpvl@golang.org>
-Marcelo Cantos <marcelo.cantos@gmail.com>
-Marcelo E. Magallon <marcelo.magallon@gmail.com>
-Marco Gazerro <gazerro@open2b.com>
-Marco Hennings <marco.hennings@freiheit.com>
-Marcus Weiner <marcus.weiner@gmail.com>
-Marcus Willock <crazcalm@gmail.com>
-Marga Manterola <marga@google.com>
-Mariano Cano <mariano@smallstep.com>
-Marin Bašić <marin.basic02@gmail.com>
-Mario Arranz <marioarranzr@gmail.com>
-Marius A. Eriksen <marius@grailbio.com>
-Marius Nuennerich <mnu@google.com>
-Mark Adams <mark@markadams.me>
-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>
-Mark Ryan <mark.d.ryan@intel.com>
-Mark Severson <miquella@gmail.com>
-Mark Theunissen <mark.theunissen@gmail.com>
-Mark Villacampa <m@markvillacampa.com>
-Mark Wolfe <mark@wolfe.id.au>
-Mark Zavislak <zavislak@google.com>
-Marko Juhani Silokunnas <marko.silokunnas@gmail.com>
-Marko Kevac <marko@kevac.org>
-Marko Kungla <marko.kungla@gmail.com>
-Marko Mikulicic <mkm@google.com>
-Marko Mudrinic <mudrinic.mare@gmail.com>
-Marko Tiikkaja <marko@joh.to>
-Markus Duft <markus.duft@salomon.at>
-Markus Sonderegger <marraison@gmail.com>
-Markus Zimmermann <zimmski@gmail.com>
-Marten Seemann <martenseemann@gmail.com>
-Martin Asquino <martin.asquino@gmail.com>
-Martin Bertschler <mbertschler@gmail.com>
-Martin Garton <garton@gmail.com>
-Martin Habbecke <marhab@google.com>
-Martin Hamrle <martin.hamrle@gmail.com>
-Martin Hoefling <martin.hoefling@gmx.de>
-Martin Kreichgauer <martinkr@google.com>
-Martin Kunc <martinkunc@users.noreply.github.com>
-Martin Lindhe <martin.j.lindhe@gmail.com>
-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>
-Martin Probst <martin@probst.io>
-Martin Sucha <anty.sk+git@gmail.com>
-Martin Tournoij <martin@arp242.net>
-Martins Sipenko <martins.sipenko@gmail.com>
-Martynas Budriūnas <mabu@google.com>
-Marvin Stenger <marvin.stenger94@gmail.com>
-Marwan Sulaiman <marwan.sulaiman@work.co>
-Maryan Hratson <gmarik@gmail.com>
-Masahiro Furudate <masahiro.furudate@gmail.com>
-Masahiro Wakame <vvakame@gmail.com>
-Masaki Yoshida <yoshida.masaki@gmail.com>
-Masaya Watanabe <sfbgwm30@gmail.com>
-Mat Byczkowski <mbyczkowski@gmail.com>
-Mat Ryer <thatmatryer@gmail.com>
-Máté Gulyás <mgulyas86@gmail.com>
-Matej Baćo <matejbaco@gmail.com>
-Mateus Amin <mateus.amin@gmail.com>
-Mateusz Czapliński <czapkofan@gmail.com>
-Matheus Alcantara <matheusssilv97@gmail.com>
-Mathias Beke <git@denbeke.be>
-Mathias Hall-Andersen <mathias@hall-andersen.dk>
-Mathias Leppich <mleppich@muhqu.de>
-Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
-Mats Lidell <mats.lidell@cag.se> <mats.lidell@gmail.com>
-Matt Aimonetti <mattaimonetti@gmail.com>
-Matt Blair <me@matthewblair.net>
-Matt Bostock <matt@mattbostock.com>
-Matt Brown <mdbrown@google.com>
-Matt Dee <mdee@hioscar.com>
-Matt Drollette <matt@drollette.com>
-Matt Harden <matt.harden@gmail.com>
-Matt Jibson <matt.jibson@gmail.com>
-Matt Joiner <anacrolix@gmail.com>
-Matt Jones <mrjones@google.com>
-Matt Juran <thepciet@gmail.com>
-Matt Layher <mdlayher@gmail.com>
-Matt Masurka <masurka@google.com>
-Matt Pearring <broskies@google.com>
-Matt Reiferson <mreiferson@gmail.com>
-Matt Robenolt <matt@ydekproductions.com>
-Matt Strong <mstrong1341@gmail.com>
-Matt T. Proud <matt.proud@gmail.com>
-Matt Williams <gh@mattyw.net> <mattyjwilliams@gmail.com>
-Matthew Brennan <matty.brennan@gmail.com>
-Matthew Broberg <matthewbbroberg@gmail.com>
-Matthew Cottingham <mattcottingham@gmail.com>
-Matthew Dempsky <mdempsky@google.com>
-Matthew Denton <mdenton@skyportsystems.com>
-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>
-Matthijs Kooijman <matthijs@stdin.nl>
-Mattias Appelgren <mattias@ppelgren.se>
-Mauricio Alvarado <mauricio.alvarado@leftfieldlabs.com>
-Max Drosdo.www <g1ran1q@gmail.com>
-Max Riveiro <kavu13@gmail.com>
-Max Schmitt <max@schmitt.mx>
-Max Semenik <maxsem.wiki@gmail.com>
-Max Ushakov <ushmax@gmail.com>
-Maxim Eryomenko <moeryomenko@gmail.com>
-Maxim Khitrov <max@mxcrypt.com>
-Maxim Pimenov <mpimenov@google.com>
-Maxim Pugachev <pugachev.mm@gmail.com>
-Maxim Ushakov <ushakov@google.com>
-Maxime de Roucy <maxime.deroucy@gmail.com>
-Máximo Cuadros Ortiz <mcuadros@gmail.com>
-Maxwell Krohn <themax@gmail.com>
-Maya Rashish <maya@NetBSD.org>
-Mayank Kumar <krmayankk@gmail.com>
-Mehrad Sadeghi <2012.linkinpark@gmail.com>
-Meir Fischer <meirfischer@gmail.com>
-Meng Zhuo <mengzhuo1203@gmail.com> <mzh@golangcn.org>
-Mhd Sulhan <m.shulhan@gmail.com>
-Mia Zhu <CrystalZhu1025getu@gmail.com>
-Micah Stetson <micah.stetson@gmail.com>
-Michael Anthony Knyszek <mknyszek@google.com>
-Michael Brandenburg <mbrandenburg@bolste.com>
-Michael Chaten <mchaten@gmail.com>
-Michael Cook <code@mdcook.net>
-Michael Darakananda <pongad@google.com>
-Michael Dorner <mail@michaeldorner.de>
-Michael Edwards <medwards@walledcity.ca>
-Michael Elkins <michael.elkins@gmail.com>
-Michael Ellis <micellis@justin.tv>
-Michael Fraenkel <michael.fraenkel@gmail.com>
-Michael Fromberger <michael.j.fromberger@gmail.com>
-Michael Gehring <mg@ebfe.org> <gnirheg.leahcim@gmail.com>
-Michael Henderson <mdhender@users.noreply.github.com>
-Michael Hendricks <michael@ndrix.org>
-Michael Hoisie <hoisie@gmail.com>
-Michael Hudson-Doyle <michael.hudson@linaro.org>
-Michael Kasch <michael.kasch@gmail.com>
-Michael Käufl <golang@c.michael-kaeufl.de>
-Michael Kelly <mjk@google.com>
-Michaël Lévesque-Dion <mlevesquedion@google.com>
-Michael Lewis <mikelikespie@gmail.com>
-Michael MacInnis <Michael.P.MacInnis@gmail.com>
-Michael Marineau <michael.marineau@coreos.com>
-Michael Matloob <matloob@google.com>
-Michael McConville <momcconville@gmail.com>
-Michael McGreevy <mcgreevy@golang.org>
-Michael McLoughlin <mmcloughlin@gmail.com>
-Michael Munday <mike.munday@ibm.com>
-Michael Pearson <mipearson@gmail.com>
-Michael Piatek <piatek@google.com>
-Michael Pratt <mpratt@google.com>
-Michael Schaller <michael@5challer.de>
-Michael Schurter <michael.schurter@gmail.com>
-Michael Shields <mshields@google.com>
-Michael Stapelberg <michael@stapelberg.de> <mstplbrg@googlemail.com>
-Michael Steinert <mike.steinert@gmail.com>
-Michael T. Jones <mtj@google.com> <michael.jones@gmail.com>
-Michael Teichgräber <mteichgraeber@gmx.de> <mt4swm@googlemail.com>
-Michael Traver <mtraver@google.com>
-Michael Vetter <g.bluehut@gmail.com>
-Michael Vogt <mvo@ubuntu.com>
-Michail Kargakis <mkargaki@redhat.com>
-Michal Bohuslávek <mbohuslavek@gmail.com>
-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>
-Michal Stokluska <mstoklus@redhat.com>
-Michalis Kargakis <michaliskargakis@gmail.com>
-Michel Lespinasse <walken@google.com>
-Michel Levieux <mlevieux42@gmail.com>
-Michele Di Pede <michele.di.pede@gmail.com>
-Mickael Kerjean <mickael.kerjean@gmail.com>
-Mickey Reiss <mickeyreiss@gmail.com>
-Miek Gieben <miek@miek.nl> <remigius.gieben@gmail.com>
-Miguel Acero <acero@google.com>
-Miguel Mendez <stxmendez@gmail.com>
-Miguel Molina <hi@mvader.me>
-Mihai Borobocea <MihaiBorobocea@gmail.com>
-Mihai Moldovan <ionic@ionic.de>
-Mihai Todor <todormihai@gmail.com>
-Mihail Minaev <minaev.mike@gmail.com>
-Mikael Tillenius <mikti42@gmail.com>
-Mike Andrews <mra@xoba.com>
-Mike Appleby <mike@app.leby.org>
-Mike Danese <mikedanese@google.com>
-Mike Houston <mike@kothar.net>
-Mike Kabischev <kabischev@gmail.com>
-Mike Rosset <mike.rosset@gmail.com>
-Mike Samuel <mikesamuel@gmail.com>
-Mike Solomon <msolo@gmail.com>
-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>
-Miki Tebeka <miki.tebeka@gmail.com>
-Mikio Hara <mikioh.mikioh@gmail.com>
-Mikkel Krautz <mikkel@krautz.dk> <krautz@gmail.com>
-Mikołaj Baranowski <mikolajb@gmail.com>
-Milan Knezevic <milan.knezevic@mips.com>
-Milan Patel <bicelot3@gmail.com>
-Milutin Jovanović <jovanovic.milutin@gmail.com>
-MinJae Kwon <mingrammer@gmail.com>
-Miquel Sabaté Solà <mikisabate@gmail.com>
-Mirko Hansen <baaazen@gmail.com>
-Miroslav Genov <mgenov@gmail.com>
-Misty De Meo <mistydemeo@gmail.com>
-Mohamed Attahri <mohamed@attahri.com>
-Mohit Agarwal <mohit@sdf.org>
-Mohit kumar Bajoria <mohitbajo36@gmail.com>
-Mohit Verma <vmohit.93@gmail.com>
-Momchil Velikov <momchil.velikov@gmail.com>
-Monis Khan <mkhan@redhat.com>
-Monty Taylor <mordred@inaugust.com>
-Moritz Fain <moritz@fain.io>
-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>
-Muhammad Hamza Farrukh <hamzafarrukh141@gmail.com>
-Muhammed Uluyol <uluyol0@gmail.com>
-Muir Manders <muir@mnd.rs>
-Mukesh Sharma <sharma.mukesh439@gmail.com>
-Mura Li <mura_li@castech.com.tw>
-Mykhailo Lesyk <mikhail@lesyk.org>
-Nahum Shalman <nahamu@gmail.com>
-Naman Aggarwal <aggarwal.nam@gmail.com>
-Naman Gera <namangera15@gmail.com>
-Nan Deng <monnand@gmail.com>
-Nao Yonashiro <owan.orisano@gmail.com>
-Naoki Kanatani <k12naoki@gmail.com>
-Natanael Copa <ncopa@mirantis.com>
-Nate Wilkinson <nathanwilk7@gmail.com>
-Nathan Cantelmo <n.cantelmo@gmail.com>
-Nathan Caza <mastercactapus@gmail.com>
-Nathan Dias <nathan.dias@orijtech.com>
-Nathan Fiscaletti <nathan.fiscaletti@vrazo.com>
-Nathan Humphreys <nkhumphreys@gmail.com>
-Nathan John Youngman <nj@nathany.com>
-Nathan Otterness <otternes@cs.unc.edu>
-Nathan P Finch <nate.finch@gmail.com>
-Nathan VanBenschoten <nvanbenschoten@gmail.com>
-Nathan Youngman <git@nathany.com>
-Nathan(yinian) Hu <nathanhu@google.com>
-Nathaniel Cook <nvcook42@gmail.com>
-Naveen Kumar Sangi <naveenkumarsangi@protonmail.com>
-Neeilan Selvalingam <neeilan96@gmail.com>
-Neelesh Chandola <neelesh.c98@gmail.com>
-Nehal J Wani <nehaljw.kkd1@gmail.com>
-Neil Alexander <neilalexander@neilalexander.dev>
-Neil Lyons <nwjlyons@googlemail.com>
-Neuman Vong <neuman.vong@gmail.com>
-Neven Sajko <nsajko@gmail.com>
-Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
-Niall Sheridan <nsheridan@gmail.com>
-Nic Day <nic.day@me.com>
-Nicholas Asimov <nicholas@asimov.me>
-Nicholas Katsaros <nick@nickkatsaros.com>
-Nicholas Maniscalco <nicholas@maniscalco.com>
-Nicholas Ng <nickng@nickng.io>
-Nicholas Presta <nick@nickpresta.ca> <nick1presta@gmail.com>
-Nicholas Sullivan <nicholas.sullivan@gmail.com>
-Nicholas Waples <nwaples@gmail.com>
-Nick Anthony <Liberatys@outlook.com>
-Nick Cooper <nmvc@google.com>
-Nick Craig-Wood <nick@craig-wood.com> <nickcw@gmail.com>
-Nick Harper <nharper@google.com>
-Nick Kubala <nkubala@google.com>
-Nick Leli <nicholasleli@gmail.com>
-Nick Miyake <nmiyake@users.noreply.github.com>
-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>
-Nicolas Owens <mischief@offblast.org>
-Nicolas S. Dade <nic.dade@gmail.com>
-Niek Sanders <niek.sanders@gmail.com>
-Niels Widger <niels.widger@gmail.com>
-Nigel Kerr <nigel.kerr@gmail.com>
-Nigel Tao <nigeltao@golang.org>
-Nik Nyby <nnyby@columbia.edu>
-Nikhil Benesch <nikhil.benesch@gmail.com>
-Nikita Gillmann <nikita@n0.is> <ng0@n0.is>
-Nikita Kryuchkov <nkryuchkov10@gmail.com>
-Nikita Melekhin <nimelehin@gmail.com>
-Nikita Vanyasin <nikita.vanyasin@gmail.com>
-Niklas Schnelle <niklas.schnelle@gmail.com>
-Niko Dziemba <niko@dziemba.com>
-Nikolay Turpitko <nikolay@turpitko.com>
-Nikson Kanti Paul <nikson.sust@gmail.com>
-Nils Larsgård <nilsmagnus@gmail.com>
-Nir Soffer <nirsof@gmail.com>
-Niranjan Godbole <niranjan8192@gmail.com>
-Nishanth Shanmugham <nishanth.gerrard@gmail.com>
-Noah Campbell <noahcampbell@gmail.com>
-Noah Goldman <noahg34@gmail.com>
-Noah Santschi-Cooney <noah@santschi-cooney.ch>
-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>
-Obei Sideg <obei.sideg@gmail.com>
-Obeyda Djeffal <djefobey@gmail.com>
-Odin Ugedal <odin@ugedal.com>
-Oleg Bulatov <dmage@yandex-team.ru>
-Oleg Vakheta <helginet@gmail.com>
-Oleku Konko <oleku.konko@gmail.com>
-Oling Cat <olingcat@gmail.com>
-Oliver Hookins <ohookins@gmail.com>
-Oliver Powell <oliverpowell84@gmail.com>
-Oliver Stenbom <ostenbom@pivotal.io>
-Oliver Tan <otan@cockroachlabs.com>
-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>
-Omar Jarjur <ojarjur@google.com>
-Onkar Jadhav <omjadhav2610@gmail.com>
-Ori Bernstein <ori@eigenstate.org>
-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>
-Pablo Rozas Larraondo <pablo.larraondo@anu.edu.au>
-Pablo Santiago Blum de Aguiar <scorphus@gmail.com>
-Padraig Kitterick <padraigkitterick@gmail.com>
-Pallat Anchaleechamaikorn <yod.pallat@gmail.com>
-Pan Chenglong <1004907659@qq.com>
-Panos Georgiadis <pgeorgiadis@suse.de>
-Pantelis Sampaziotis <psampaz@gmail.com>
-Paolo Giarrusso <p.giarrusso@gmail.com>
-Paolo Martini <mrtnpaolo@gmail.com>
-Parker Moore <parkrmoore@gmail.com>
-Parminder Singh <parmsingh101@gmail.com>
-Pascal Dierich <pascal@pascaldierich.com>
-Pascal S. de Kloe <pascal@quies.net>
-Paschalis Tsilias <paschalis.tsilias@gmail.com>
-Pasi Tähkäpää <pasi.tahkapaa@gmail.com>
-Pat Moroney <pat@pat.email>
-Patrick Barker <barkerp@vmware.com>
-Patrick Crosby <patrick@stathat.com>
-Patrick Gavlin <pgavlin@gmail.com>
-Patrick Gundlach <gundlach@speedata.de>
-Patrick Higgins <patrick.allen.higgins@gmail.com>
-Patrick Jones <ithuriel@google.com>
-Patrick Lee <pattyshack101@gmail.com>
-Patrick Mézard <patrick@mezard.eu>
-Patrick Mylund Nielsen <patrick@patrickmn.com>
-Patrick Pelletier <pp.pelletier@gmail.com>
-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>
-Paul Chang <paulchang@google.com>
-Paul D. Weber <x0bdev@gmail.com>
-Paul Davis <43160081+Pawls@users.noreply.github.com>
-Paul E. Murphy <murp@ibm.com>
-Paul Forgey <paulf@tessier-ashpool.net>
-Paul Hammond <paul@paulhammond.org>
-Paul Hankin <paulhankin@google.com>
-Paul Jolly <paul@myitcv.org.uk>
-Paul Lalonde <paul.a.lalonde@gmail.com>
-Paul M Furley <paul@paulfurley.com>
-Paul Marks <pmarks@google.com>
-Paul Meyer <paul.meyer@microsoft.com>
-Paul Nasrat <pnasrat@google.com>
-Paul PISCUC <paul.piscuc@gmail.com>
-Paul Querna <pquerna@apache.org>
-Paul Rosania <paul.rosania@gmail.com>
-Paul Ruest <pruest@gmail.com>
-Paul Sbarra <Sbarra.Paul@gmail.com>
-Paul Smith <paulsmith@pobox.com> <paulsmith@gmail.com>
-Paul Tyng <paul@paultyng.net>
-Paul van Brouwershaven <paul@vanbrouwershaven.com>
-Paul Wankadia <junyer@google.com>
-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>
-Pavlo Sumkin <ymkins@gmail.com>
-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>
-Peng Gao <peng.gao.dut@gmail.com>
-Percy Wegmann <ox.to.a.cart@gmail.com>
-Perry Abbott <perry.j.abbott@gmail.com>
-Petar Dambovaliev <petar.atanasov.1987@gmail.com>
-Petar Maymounkov <petarm@gmail.com>
-Peter Armitage <peter.armitage@gmail.com>
-Peter Bourgon <peter@bourgon.org>
-Peter Collingbourne <pcc@google.com>
-Peter Conerly <pconerly@gmail.com>
-Peter Dotchev <dotchev@gmail.com>
-Peter Froehlich <peter.hans.froehlich@gmail.com>
-Peter Gonda <pgonda@google.com>
-Peter Hoyes <pahoyes@gmail.com>
-Peter Kleiweg <pkleiweg@xs4all.nl>
-Peter McKenzie <petermck@google.com>
-Peter Moody <pmoody@uber.com>
-Peter Morjan <pmorjan@gmail.com>
-Peter Mundy <go.peter.90@gmail.com>
-Peter Nguyen <peter@mictis.com>
-Péter Surányi <speter.go1@gmail.com>
-Péter Szabó <pts@google.com>
-Péter Szilágyi <peterke@gmail.com>
-Peter Teichman <pteichman@fastly.com>
-Peter Tseng <ptseng@squareup.com>
-Peter Waldschmidt <peter@waldschmidt.com>
-Peter Waller <peter.waller@gmail.com>
-Peter Weinberger <pjw@golang.org>
-Peter Williams <pwil3058@gmail.com>
-Peter Wu <pwu@cloudflare.com>
-Peter Zhang <i@ddatsh.com>
-Petr Jediný <petr.jediny@gmail.com>
-Petrica Voicu <pvoicu@paypal.com>
-Phil Pearl <philip.j.r.pearl@gmail.com>
-Phil Pennock <pdp@golang.org>
-Philip Børgesen <philip.borgesen@gmail.com>
-Philip Brown <phil@bolthole.com>
-Philip Hofer <phofer@umich.edu>
-Philip K. Warren <pkwarren@gmail.com>
-Philip Nelson <me@pnelson.ca>
-Philipp Sauter <sauterp@protonmail.com>
-Philipp Stephani <phst@google.com>
-Phillip Campbell <15082+phillc@users.noreply.github.com>
-Pierre Carru <pierre.carru@eshard.com>
-Pierre Durand <pierredurand@gmail.com>
-Pierre Prinetti <pierreprinetti@gmail.com>
-Pierre Roullon <pierre.roullon@gmail.com>
-Piers <google@hellopiers.pro>
-Pieter Droogendijk <pieter@binky.org.uk>
-Pietro Gagliardi <pietro10@mac.com>
-Piyush Mishra <piyush@codeitout.com>
-Plekhanov Maxim <kishtatix@gmail.com>
-Poh Zi How <poh.zihow@gmail.com>
-Polina Osadcha <polliosa@google.com>
-Pontus Leitzler <leitzler@gmail.com>
-Povilas Versockas <p.versockas@gmail.com>
-Prajwal Koirala <16564273+Prajwal-Koirala@users.noreply.github.com>
-Prasanga Siripala <pj@pjebs.com.au>
-Prasanna Swaminathan <prasanna@mediamath.com>
-Prashant Agrawal <prashant.a.vjti@gmail.com>
-Prashant Varanasi <prashant@prashantv.com>
-Praveen Kumar <praveen+git@kumar.in>
-Pravendra Singh <hackpravj@gmail.com>
-Preetam Jinka <pj@preet.am>
-Pure White <wu.purewhite@gmail.com>
-Qais Patankar <qaisjp@gmail.com>
-Qiuxuan Zhu <ilsh1022@gmail.com>
-Quan Tran <qeed.quan@gmail.com>
-Quan Yong Zhai <qyzhai@gmail.com>
-Quentin Perez <qperez@ocs.online.net>
-Quentin Renard <contact@asticode.com>
-Quentin Smith <quentin@golang.org>
-Quey-Liang Kao <s101062801@m101.nthu.edu.tw>
-Quim Muntal <quimmuntal@gmail.com>
-Quinn Slack <sqs@sourcegraph.com>
-Quinten Yearsley <qyearsley@chromium.org>
-Quoc-Viet Nguyen <afelion@gmail.com>
-Rabin Gaire <rabingaire20@gmail.com>
-Radek Simko <radek.simko@gmail.com>
-Radek Sohlich <sohlich@gmail.com>
-Radu Berinde <radu@cockroachlabs.com>
-Rafal Jeczalik <rjeczalik@gmail.com>
-Raghavendra Nagaraj <jamdagni86@gmail.com>
-Rahul Bajaj <rahulrb0509@gmail.com>
-Rahul Chaudhry <rahulchaudhry@chromium.org>
-Rahul Wadhwani <rahulwadhwani21@gmail.com>
-Raif S. Naffah <go@naffah-raif.name>
-Rajat Goel <rajat.goel2010@gmail.com>
-Rajath Agasthya <rajathagasthya@gmail.com>
-Rajender Reddy Kompally <rajenderreddykompally@gmail.com>
-Ralph Corderoy <ralph@inputplus.co.uk>
-Ramazan AYYILDIZ <rayyildiz@gmail.com>
-Ramesh Dharan <dharan@google.com>
-Randy Reddig <randy@alta.software>
-Raph Levien <raph@google.com>
-Raphael Geronimi <raphael.geronimi@gmail.com>
-Raul Silvera <rsilvera@google.com>
-Ravil Bikbulatov <weeellz12@gmail.com>
-RaviTeja Pothana <ravi.tezu@gmail.com>
-Ray Tung <rtung@thoughtworks.com>
-Ray Wu <ray@liftoff.io>
-Raymond Kazlauskas <raima220@gmail.com>
-Rebecca Stambler <rstambler@golang.org>
-Reilly Watson <reillywatson@gmail.com>
-Reinaldo de Souza Jr <juniorz@gmail.com>
-Remi Gillig <remigillig@gmail.com>
-Rémy Oudompheng <oudomphe@phare.normalesup.org> <remyoudompheng@gmail.com>
-Ren Ogaki <re.yuz77777@gmail.com>
-Rens Rikkerink <Ikkerens@users.noreply.github.com>
-Rhys Hiltner <rhys@justin.tv>
-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>
-Richard Eric Gavaletz <gavaletz@gmail.com>
-Richard Gibson <richard.gibson@gmail.com>
-Richard Miller <miller.research@gmail.com>
-Richard Musiol <mail@richard-musiol.de> <neelance@gmail.com>
-Richard Pickering <richard.pickering@hotmail.co.uk>
-Richard Ulmer <codesoap@mailbox.org>
-Richard Wilkes <wilkes@me.com>
-Rick Arnold <rickarnoldjr@gmail.com>
-Rick Hudson <rlh@golang.org>
-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>
-Rob Norman <rob.norman@infinitycloud.com>
-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>
-Robert Iannucci <iannucci@google.com>
-Robert Kuska <rkuska@gmail.com>
-Robert Obryk <robryk@gmail.com>
-Robert Sesek <rsesek@google.com>
-Robert Snedegar <roberts@google.com>
-Robert Stepanek <robert.stepanek@gmail.com>
-Robert van Gent <rvangent@google.com>
-Robert-André Mauchin <zebob.m@gmail.com>
-Roberto Clapis <robclap8@gmail.com>
-Roberto Selbach <roberto@selbach.ca>
-Robin Eklind <r.eklind.87@gmail.com>
-Robin Zhong <robin@robinzhong.co>
-Rodolfo Carvalho <rhcarvalho@gmail.com>
-Rodolfo Rodriguez <rodolfobgibson@gmail.com>
-Rodrigo Moraes de Oliveira <rodrigo.moraes@gmail.com>
-Rodrigo Rafael Monti Kochenburger <divoxx@gmail.com>
-Roger Pau Monné <royger@gmail.com>
-Roger Peppe <rogpeppe@gmail.com>
-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>
-Roman Budnikov <romanyx90@yandex.ru>
-Roman Kollár <roman.kollar.0@gmail.com>
-Roman Shchekin <mrqtros@gmail.com>
-Ron Hashimoto <mail@h2so5.net>
-Ron Minnich <rminnich@gmail.com>
-Ronnie Ebrin <ebrin.ronnie@protonmail.com>
-Ross Chater <rdchater@gmail.com>
-Ross Kinsey <rossikinsey@gmail.com>
-Ross Light <light@google.com> <rlight2@gmail.com>
-Ross Smith II <ross@smithii.com>
-Rowan Marshall <rowanajmarshall@gmail.com>
-Rowan Worth <sqweek@gmail.com>
-Rudi Kramer <rudi.kramer@gmail.com>
-Rui Ueyama <ruiu@google.com>
-Ruixin Bao <ruixin.bao@ibm.com>
-Ruslan Andreev <ruslan.andreev@huawei.com>
-Ruslan Nigmatullin <elessar@dropbox.com>
-Russ Cox <rsc@golang.org>
-Russell Haering <russellhaering@gmail.com>
-Ryan Bagwell <ryanbagwell@outlook.com>
-Ryan Barrett <ryanb@google.com>
-Ryan Boehning <ryan.boehning@apcera.com>
-Ryan Brown <ribrdb@google.com>
-Ryan Canty <jrcanty@gmail.com>
-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>
-Ryan Slade <ryanslade@gmail.com>
-Ryan Zhang <ryan.zhang@docker.com>
-Ryoichi KATO <ryo1kato@gmail.com>
-Ryoya Sekino <ryoyasekino1993@gmail.com>
-Ryuji Iwata <qt.luigi@gmail.com>
-Ryuma Yoshida <ryuma.y1117@gmail.com>
-Ryuzo Yamamoto <ryuzo.yamamoto@gmail.com>
-S.Çağlar Onur <caglar@10ur.org>
-Sabin Mihai Rapan <sabin.rapan@gmail.com>
-Sad Pencil <qh06@qq.com>
-Sai Cheemalapati <saicheems@google.com>
-Sai Kiran Dasika <kirandasika30@gmail.com>
-Sakeven Jiang <jc5930@sina.cn>
-Salaheddin M. Mahmud <salah.mahmud@gmail.com>
-Salmān Aljammāz <s@0x65.net>
-Sam Arnold <sarnold64@bloomberg.net>
-Sam Boyer <tech@samboyer.org>
-Sam Chen <chenxsan@gmail.com>
-Sam Cross <samgcdev@gmail.com>
-Sam Ding <samding@ca.ibm.com>
-Sam Hug <samuel.b.hug@gmail.com>
-Sam Thorogood <thorogood@google.com> <sam.thorogood@gmail.com>
-Sam Whited <sam@samwhited.com>
-Sam Xie <xsambundy@gmail.com>
-Sameer Ajmani <sameer@golang.org> <ajmani@gmail.com>
-Sami Commerot <samic@google.com>
-Sami Pönkänen <sami.ponkanen@gmail.com>
-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>
-Santiago De la Cruz <51337247+xhit@users.noreply.github.com>
-Sarah Adams <shadams@google.com>
-Sardorbek Pulatov <sardorbek.pulatov@outlook.com>
-Sascha Brawer <sascha@brawer.ch>
-Sasha Lionheart <lionhearts@google.com>
-Sasha Sobol <sasha@scaledinference.com>
-Satoru Kitaguchi <rule.the.fate.myfirststory@gmail.com>
-Scott Barron <scott.barron@github.com>
-Scott Bell <scott@sctsm.com>
-Scott Cotton <scott@mindowl.com>
-Scott Crunkleton <crunk1@gmail.com>
-Scott Ferguson <scottwferg@gmail.com>
-Scott Lawrence <bytbox@gmail.com>
-Scott Mansfield <smansfield@netflix.com>
-Scott Ragan <ragansa@fb.com>
-Scott Schwartz <scotts@golang.org>
-Scott Van Woudenberg <scottvw@google.com>
-Sean Burford <sburford@google.com>
-Sean Chen <oohcode@gmail.com>
-Sean Chittenden <seanc@joyent.com>
-Sean Christopherson <sean.j.christopherson@intel.com>
-Sean Dolphin <Sean.Dolphin@kpcompass.com>
-Sean Harger <sharger@google.com>
-Sean Harrington <sean.harrington@leftfieldlabs.com>
-Sean Hildebrand <seanwhildebrand@gmail.com>
-Sean Liao <seankhliao@gmail.com>
-Sean Rees <sean@erifax.org>
-Sebastiaan van Stijn <github@gone.nl>
-Sebastian Chlopecki <sebsebmc@gmail.com>
-Sebastian Kinne <skinne@google.com>
-Sebastian Schmidt <yath@google.com>
-Sebastien Binet <seb.binet@gmail.com>
-Sébastien Paolacci <sebastien.paolacci@gmail.com>
-Sebastien Williams-Wynn <sebastien@cytora.com>
-Segev Finer <segev208@gmail.com>
-Seiji Takahashi <timaki.st@gmail.com>
-Sergei Lemeshkin <sergeilem@gmail.com>
-Sergei Skorobogatov <skorobo@rambler.ru>
-Sergei Zagurskii <gvozdoder@gmail.com>
-Sergey 'SnakE' Gromov <snake.scaly@gmail.com>
-Sergey Arseev <sergey.arseev@intel.com>
-Sergey Dobrodey <sergey.dobrodey@synesis.ru>
-Sergey Frolov <sfrolov@google.com>
-Sergey Glushchenko <gsserge@gmail.com>
-Sergey Ivanov <ser1325@gmail.com>
-Sergey Kacheev <S.Kacheev@gmail.com>
-Sergey Lukjanov <me@slukjanov.name>
-Sergey Mishin <sergeymishine@gmail.com>
-Sergey Mudrik <sergey.mudrik@gmail.com>
-Sergey Semin <gray12511@gmail.com>
-Sergey Yanykin <syanykin@ozon.ru>
-Sergio Luis O. B. Correia <sergio@correia.cc>
-Sergiusz Bazanski <bazanski@gmail.com>
-Serhat Giydiren <serhatgiydiren@gmail.com>
-Serhii Aheienko <serhii.aheienko@gmail.com>
-Seth Hoenig <seth.a.hoenig@gmail.com>
-Seth Vargo <sethvargo@gmail.com>
-Shaba Abhiram <shabarivas.abhiram@gmail.com>
-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>
-Shaquille Que <shaquille@golang.org>
-Shaquille Wyan Que <shaqqywyan@gmail.com>
-Shaun Dunning <shaun.dunning@uservoice.com>
-Shawn Elliott <selliott@microsoft.com>
-Shawn Ledbetter <sledbetter@google.com>
-Shawn Smith <shawn.p.smith@gmail.com>
-Shawn Walker-Salas <shawn.walker@oracle.com>
-Shenghou Ma <minux@golang.org> <minux.ma@gmail.com>
-Shengjing Zhu <zsj950618@gmail.com>
-Shengyu Zhang <shengyu.zhang@chaitin.com>
-Shi Han Ng <shihanng@gmail.com>
-ShihCheng Tu <mrtoastcheng@gmail.com>
-Shijie Hao <haormj@gmail.com>
-Shin Fan <shinfan@google.com>
-Shinji Tanaka <shinji.tanaka@gmail.com>
-Shinnosuke Sawada <6warashi9@gmail.com>
-Shintaro Kaneko <kaneshin0120@gmail.com>
-Shivakumar GN <shivakumar.gn@gmail.com>
-Shivani Singhal <shivani.singhal2804@gmail.com>
-Shivansh Rai <shivansh@freebsd.org>
-Shivashis Padhi <shivashispadhi@gmail.com>
-Shoshin Nikita <shoshin_nikita@fastmail.com>
-Shota Sugiura <s.shota.710.3506@gmail.com>
-Shubham Sharma <shubham.sha12@gmail.com>
-Shuhei Takahashi <nya@chromium.org>
-Shun Fan <sfan@google.com>
-Silvan Jegen <s.jegen@gmail.com>
-Simão Gomes Viana <simaogmv@gmail.com>
-Simarpreet Singh <simar@linux.com>
-Simon Drake <simondrake1990@gmail.com>
-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>
-Simon Thulbourn <simon+github@thulbourn.com>
-Simon Whitehead <chemnova@gmail.com>
-Sina Siadat <siadat@gmail.com>
-Sjoerd Siebinga <sjoerd.siebinga@gmail.com>
-Sokolov Yura <funny.falcon@gmail.com>
-Song Gao <song@gao.io>
-Song Lim <songlim327@gmail.com>
-Songjiayang <songjiayang1@gmail.com>
-Songlin Jiang <hollowman@hollowman.ml>
-Soojin Nam <jsunam@gmail.com>
-Søren L. Hansen <soren@linux2go.dk>
-Sparrow Li <liyuancylx@gmail.com>
-Spencer Kocot <spencerkocot@gmail.com>
-Spencer Nelson <s@spenczar.com>
-Spencer Tung <spencertung@google.com>
-Spenser Black <spenserblack01@gmail.com>
-Spring Mc <heresy.mc@gmail.com>
-Srdjan Petrovic <spetrovic@google.com>
-Sridhar Venkatakrishnan <sridhar@laddoo.net>
-Srinidhi Kaushik <shrinidhi.kaushik@gmail.com>
-StalkR <stalkr@stalkr.net>
-Stan Hu <stanhu@gmail.com>
-Stan Schwertly <stan@schwertly.com>
-Stanislav Afanasev <php.progger@gmail.com>
-Steeve Morin <steeve.morin@gmail.com>
-Stefan Baebler <sbaebler@outbrain.com>
-Stefan Nilsson <snilsson@nada.kth.se> <trolleriprofessorn@gmail.com>
-Stepan Shabalin <neverliberty@gmail.com>
-Stephan Klatt <stephan.klatt@gmail.com>
-Stephan Renatus <srenatus@chef.io>
-Stephan Zuercher <zuercher@gmail.com>
-Stéphane Travostino <stephane.travostino@gmail.com>
-Stephen Lewis <stephen@sock.org.uk>
-Stephen Lu <steuhs@users.noreply.github.com>
-Stephen Ma <stephenm@golang.org>
-Stephen McQuay <stephen@mcquay.me>
-Stephen Searles <stephens2424@gmail.com>
-Stephen Weinberg <stephen@q5comm.com>
-Steve Francia <spf@golang.org>
-Steve Gilbert <stevegilbert23@gmail.com>
-Steve LoFurno <slofurno@gmail.com>
-Steve McCoy <mccoyst@gmail.com>
-Steve Mynott <steve.mynott@gmail.com>
-Steve Newman <snewman@google.com>
-Steve Phillips <elimisteve@gmail.com>
-Steve Streeting <steve@stevestreeting.com>
-Steve Traut <straut@google.com>
-Steven Buss <sbuss@google.com>
-Steven Elliot Harris <seharris@gmail.com>
-Steven Erenst <stevenerenst@gmail.com>
-Steven Hartland <steven.hartland@multiplay.co.uk>
-Steven Littiebrant <imgroxx@gmail.com>
-Steven Maude <git@stevenmaude.co.uk>
-Steven Wilkin <stevenwilkin@gmail.com>
-Stuart Jansen <sjansen@buscaluz.org>
-Subham Sarkar <sarkar.subhams2@gmail.com>
-Sue Spence <virtuallysue@gmail.com>
-Sugu Sougoumarane <ssougou@gmail.com>
-Suharsh Sivakumar <suharshs@google.com>
-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>
-Sven Blumenstein <svbl@google.com>
-Sven Lee <lee1300394324@gmail.com>
-Sven Taute <sven.taute@gmail.com>
-Sylvain Zimmer <sylvain@sylvainzimmer.com>
-Syohei YOSHIDA <syohex@gmail.com>
-Szabolcs Nagy <nsz@port70.net>
-Taavi Kivisik <taavi.kivisik@gmail.com>
-Tad Fisher <tadfisher@gmail.com>
-Tad Glines <tad.glines@gmail.com>
-Tadas Valiukas <tadovas@gmail.com>
-Tadeo Kondrak <me@tadeo.ca>
-Taesu Pyo <pyotaesu@gmail.com>
-Tai Le <letientai299@gmail.com>
-Taj Khattra <taj.khattra@gmail.com>
-Takashi Matsuo <tmatsuo@google.com>
-Takashi Mima <tks.m1205@gmail.com>
-Takayoshi Nishida <takayoshi.nishida@gmail.com>
-Takeshi YAMANASHI <9.nashi@gmail.com>
-Takuto Ikuta <tikuta@google.com>
-Takuya Ueda <uedatakuya@gmail.com>
-Tal Shprecher <tshprecher@gmail.com>
-Tamás Gulácsi <tgulacsi78@gmail.com>
-Tamir Duberstein <tamird@gmail.com>
-Tao Qingyun <qingyunha@gmail.com>
-Tao Shen <shentaoskyking@gmail.com>
-Tao Wang <twang2218@gmail.com>
-Tarmigan Casebolt <tarmigan@gmail.com>
-Taro Aoki <aizu.s1230022@gmail.com>
-Taru Karttunen <taruti@taruti.net>
-Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
-Tatsuya Kaneko <m.ddotx.f@gmail.com>
-Taufiq Rahman <taufiqrx8@gmail.com>
-Teague Cole <tnc1443@gmail.com>
-Ted Kornish <golang@tedkornish.com>
-Tejasvi Nareddy <tejunareddy@gmail.com>
-Terin Stock <terinjokes@gmail.com>
-Terrel Shumway <gopher@shumway.us>
-Tetsuo Kiso <tetsuokiso9@gmail.com>
-Than McIntosh <thanm@google.com>
-Thanabodee Charoenpiriyakij <wingyminus@gmail.com>
-Thanatat Tamtan <acoshift@gmail.com>
-The Hatsune Daishi <nao20010128@gmail.com>
-Thiago Avelino <t@avelino.xxx>
-Thiago Fransosi Farina <thiago.farina@gmail.com> <tfarina@chromium.org>
-Thom Wiggers <thom@thomwiggers.nl>
-Thomas Alan Copeland <talan.copeland@gmail.com>
-Thomas Bonfort <thomas.bonfort@gmail.com>
-Thomas Bouldin <inlined@google.com>
-Thomas Bruyelle <thomas.bruyelle@gmail.com>
-Thomas Bushnell, BSG <tbushnell@google.com>
-Thomas de Zeeuw <thomasdezeeuw@gmail.com>
-Thomas Desrosiers <thomasdesr@gmail.com>
-Thomas Habets <habets@google.com>
-Thomas Kappler <tkappler@gmail.com>
-Thomas Meson <zllak@hycik.org>
-Thomas Symborski <thomas.symborski@gmail.com>
-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>
-Tilman Dilo <tilman.dilo@gmail.com>
-Tim Cooijmans <timcooijmans@gmail.com>
-Tim Cooper <tim.cooper@layeh.com>
-Tim Ebringer <tim.ebringer@gmail.com>
-Tim Heckman <t@heckman.io>
-Tim Henderson <tim.tadh@gmail.com>
-Tim Hockin <thockin@google.com>
-Tim King <taking@google.com>
-Tim Möhlmann <muhlemmer@gmail.com>
-Tim Swast <swast@google.com>
-Tim Wright <tenortim@gmail.com>
-Tim Xu <xiaoxubeii@gmail.com>
-Timmy Douglas <timmyd983@gmail.com>
-Timo Savola <timo.savola@gmail.com>
-Timo Truyts <alkaloid.btx@gmail.com>
-Timothy Gu <timothygu99@gmail.com>
-Timothy Studd <tim@timstudd.com>
-Tipp Moseley <tipp@google.com>
-Tiwei Bie <tiwei.btw@antgroup.com>
-Tobias Assarsson <tobias.assarsson@gmail.com>
-Tobias Columbus <tobias.columbus@gmail.com> <tobias.columbus@googlemail.com>
-Tobias Klauser <tklauser@distanz.ch>
-Tobias Kohlbau <tobias@kohlbau.de>
-Toby Burress <kurin@google.com>
-Todd Kulesza <tkulesza@google.com>
-Todd Neal <todd@tneal.org>
-Todd Wang <toddwang@gmail.com>
-Tom Anthony <git@tomanthony.co.uk>
-Tom Bergan <tombergan@google.com>
-Tom Freudenberg <tom.freudenberg@4commerce.de>
-Tom Heng <zhm20070928@gmail.com>
-Tom Lanyon <tomlanyon@google.com>
-Tom Levy <tomlevy93@gmail.com>
-Tom Limoncelli <tal@whatexit.org>
-Tom Linford <tomlinford@gmail.com>
-Tom Panton <tom@tomandtally.co.uk>
-Tom Parkin <tom.parkin@gmail.com>
-Tom Payne <twpayne@gmail.com>
-Tom Szymanski <tgs@google.com>
-Tom Thorogood <me+google@tomthorogood.co.uk>
-Tom Wilkie <tom@weave.works>
-Tom Zierbock <tomzierbock@gmail.com>
-Tomas Dabasinskas <tomas@dabasinskas.net>
-Tommy Schaefer <tommy.schaefer@teecom.com>
-Tomohiro Kusumoto <zabio1192@gmail.com>
-Tomoya Ishizaki <zaq1tomo@gmail.com>
-Tonis Tiigi <tonistiigi@gmail.com>
-Tony Reix <tony.reix@bull.net>
-Tony Walker <walkert.uk@gmail.com>
-Tooru Takahashi <tooru.takahashi134@gmail.com>
-Tor Andersson <tor.andersson@gmail.com>
-Torben Schinke <torben.schinke@neotos.de>
-Tormod Erevik Lea <tormodlea@gmail.com>
-Toshihiro Shiino <shiino.toshihiro@gmail.com>
-Toshiki Shima <hayabusa1419@gmail.com>
-Totoro W <tw19881113@gmail.com>
-Travis Bischel <travis.bischel@gmail.com>
-Travis Cline <travis.cline@gmail.com>
-Trevor Dixon <trevordixon@gmail.com>
-Trevor Strohman <trevor.strohman@gmail.com>
-Trey Lawrence <lawrence.trey@gmail.com>
-Trey Roessig <trey.roessig@gmail.com>
-Trey Tacon <ttacon@gmail.com>
-Tristan Amini <tamini01@ca.ibm.com>
-Tristan Colgate <tcolgate@gmail.com>
-Tristan Ooohry <ooohry@gmail.com>
-Tristan Rice <rice@fn.lc>
-Troels Thomsen <troels@thomsen.io>
-Trong Bui <trong.buiquoc@gmail.com>
-Trung Nguyen <trung.n.k@gmail.com>
-Tsuji Daishiro <dram.dt.shonan@gmail.com>
-Tudor Golubenco <tudor.g@gmail.com>
-Tugdual Saunier <tugdual.saunier@gmail.com>
-Tuo Shan <sturbo89@gmail.com> <shantuo@google.com>
-Tyler Bui-Palsulich <tpalsulich@google.com>
-Tyler Bunnell <tylerbunnell@gmail.com>
-Tyler Treat <ttreat31@gmail.com>
-Tyson Andre <tysonandre775@gmail.com>
-Tzach Shabtay <tzachshabtay@gmail.com>
-Tzu-Chiao Yeh <su3g4284zo6y7@gmail.com>
-Tzu-Jung Lee <roylee17@currant.com>
-Udalov Max <re.udalov@gmail.com>
-Uddeshya Singh <singhuddeshyaofficial@gmail.com>
-Ugorji Nwoke <ugorji@gmail.com>
-Ulf Holm Nielsen <doktor@dyregod.dk>
-Ulrich Kunitz <uli.kunitz@gmail.com>
-Umang Parmar <umangjparmar@gmail.com>
-Uriel Mangado <uriel@berlinblue.org>
-Urvil Patel <patelurvil38@gmail.com>
-Utkarsh Dixit <53217283+utkarsh-extc@users.noreply.github.com>
-Uttam C Pawar <uttam.c.pawar@intel.com>
-Vadim Grek <vadimprog@gmail.com>
-Vadim Vygonets <unixdj@gmail.com>
-Val Polouchkine <vpolouch@justin.tv>
-Valentin Vidic <vvidic@valentin-vidic.from.hr>
-Vaughn Iverson <vsivsi@yahoo.com>
-Vee Zhang <veezhang@126.com> <vveezhang@gmail.com>
-Vega Garcia Luis Alfonso <vegacom@gmail.com>
-Venil Noronha <veniln@vmware.com>
-Veselkov Konstantin <kostozyb@gmail.com>
-Viacheslav Poturaev <vearutop@gmail.com>
-Victor Chudnovsky <vchudnov@google.com>
-Victor Michel <victor@optimyze.cloud>
-Victor Vrantchan <vrancean+github@gmail.com>
-Vignesh Ramachandra <vickyramachandra@gmail.com>
-Vikas Kedia <vikask@google.com>
-Ville Skyttä <ville.skytta@iki.fi>
-Vincent Ambo <tazjin@googlemail.com>
-Vincent Batts <vbatts@hashbangbash.com> <vbatts@gmail.com>
-Vincent Vanackere <vincent.vanackere@gmail.com>
-Vinu Rajashekhar <vinutheraj@gmail.com>
-Vish Subramanian <vish@google.com>
-Vishal Dalwadi <dalwadivishal26@gmail.com>
-Vishvananda Ishaya <vishvananda@gmail.com>
-Visweswara R <r.visweswara@gmail.com>
-Vitaly Zdanevich <zdanevich.vitaly@ya.ru>
-Vitor De Mario <vitordemario@gmail.com>
-Vivek Sekhar <vsekhar@google.com>
-Vivek V <iamvivekv96@gmail.com>
-Vivian Liang <vliang88@gmail.com>
-Vlad Krasnov <vlad@cloudflare.com>
-Vladimir Evgrafov <evgrafov.vladimir@gmail.com>
-Vladimir Kovpak <cn007b@gmail.com>
-Vladimir Kuzmin <vkuzmin@uber.com>
-Vladimir Mihailenco <vladimir.webdev@gmail.com>
-Vladimir Nikishenko <vova616@gmail.com>
-Vladimir Stefanovic <vladimir.stefanovic@imgtec.com>
-Vladimir Varankin <nek.narqo@gmail.com>
-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>
-Walt Della <walt@javins.net>
-Walter Poupore <wpoupore@google.com>
-Wander Lairson Costa <wcosta@mozilla.com>
-Wang Xuerui <git@xen0n.name>
-Warren Fernandes <warren.f.fernandes@gmail.com>
-Wayne Ashley Berry <wayneashleyberry@gmail.com>
-Wedson Almeida Filho <wedsonaf@google.com>
-Weerasak Chongnguluam <singpor@gmail.com>
-Wèi Cōngruì <crvv.mail@gmail.com>
-Wei Fu <fhfuwei@163.com>
-Wei Guangjing <vcc.163@gmail.com>
-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>
-Wenzel Lowe <lowewenzel@gmail.com>
-Wil Selwood <wselwood@gmail.com>
-Wilfried Teiken <wteiken@google.com>
-Will Beason <willbeason@gmail.com>
-Will Chan <willchan@google.com>
-Will Faught <will.faught@gmail.com>
-Will Morrow <wmorrow.qdt@qualcommdatacenter.com>
-Will Norris <willnorris@google.com>
-Will Storey <will@summercat.com>
-Willem van der Schyff <willemvds@gmail.com>
-William Chan <willchan@chromium.org>
-William Chang <mr.williamchang@gmail.com>
-William Josephson <wjosephson@gmail.com>
-William Langford <wlangfor@gmail.com>
-William Orr <will@worrbase.com> <ay1244@gmail.com>
-William Poussier <william.poussier@gmail.com>
-Wisdom Omuya <deafgoat@gmail.com>
-Wu Yunzhou <yunzhouwu@gmail.com>
-Xi Ruoyao <xry23333@gmail.com>
-Xia Bin <snyh@snyh.org>
-Xiangdong Ji <xiangdong.ji@arm.com>
-Xiaodong Liu <teaofmoli@gmail.com>
-Xing Gao <18340825824@163.com>
-Xing Xing <mikespook@gmail.com>
-Xingqang Bai <bxq2011hust@qq.com>
-Xu Fei <badgangkiller@gmail.com>
-Xudong Zhang <felixmelon@gmail.com>
-Xudong Zheng <7pkvm5aw@slicealias.com>
-Xuyang Kang <xuyangkang@gmail.com>
-Yamagishi Kazutoshi <ykzts@desire.sh>
-Yan Zou <yzou@google.com>
-Yang Hau <vulxj0j8j8@gmail.com>
-Yang Tian <linuxty@gmail.com>
-Yann Hodique <yhodique@google.com>
-Yann Kerhervé <yann.kerherve@gmail.com>
-Yann Salaün <yannsalaun1@gmail.com>
-Yannic Bonenberger <contact@yannic-bonenberger.com>
-Yao Zhang <lunaria21@gmail.com>
-Yaron de Leeuw <jarondl@google.com>
-Yaroslav Vorobiov <yar.vorobiov@gmail.com>
-Yasha Bubnov <girokompass@gmail.com>
-Yasser Abdolmaleki <yasser@yasser.ca>
-Yasuharu Goto <matope.ono@gmail.com>
-Yasuhiro Matsumoto <mattn.jp@gmail.com>
-Yasutaka Shinzaki <shinzaki@yasu26.tech>
-Yasuyuki Oka <yasuyk@gmail.com>
-Yazen Shunnar <yazen.shunnar@gmail.com>
-Yestin Sun <ylh@pdx.edu>
-Yesudeep Mangalapilly <yesudeep@google.com>
-Yissakhar Z. Beck <yissakhar.beck@gmail.com>
-Yo-An Lin <yoanlin93@gmail.com>
-Yohei Takeda <yo.tak0812@gmail.com>
-Yongjian Xu <i3dmaster@gmail.com>
-Yorman Arias <cixtords@gmail.com>
-Yoshiyuki Kanno <nekotaroh@gmail.com> <yoshiyuki.kanno@stoic.co.jp>
-Yoshiyuki Mineo <yoshiyuki.mineo@gmail.com>
-Yosuke Akatsuka <yosuke.akatsuka@gmail.com>
-Youfu Zhang <zhangyoufu@gmail.com>
-Yu Heng Zhang <annita.zhang@cn.ibm.com>
-Yu Xuan Zhang <zyxsh@cn.ibm.com>
-Yu, Li-Yu <afg984@gmail.com>
-Yuichi Kishimoto <yk2220s@gmail.com>
-Yuichi Nishiwaki <yuichi.nishiwaki@gmail.com>
-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>
-Yuval Pavel Zholkover <paulzhol@gmail.com>
-Yves Junqueira <yvesj@google.com> <yves.junqueira@gmail.com>
-Zac Bergquist <zbergquist99@gmail.com>
-Zach Bintliff <zbintliff@gmail.com>
-Zach Gershman <zachgersh@gmail.com>
-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>
-Zev Goldstein <zev.goldstein@gmail.com>
-Zhang Boyang <zhangboyang.id@gmail.com>
-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>
-Zhou Guangyuan <zhouguangyuan.xian@gmail.com>
-Zhou Peng <p@ctriple.cn>
-Ziad Hatahet <hatahet@gmail.com>
-Ziheng Liu <lzhfromustc@gmail.com>
-Zizhao Zhang <btw515wolf2@gmail.com>
-Zorion Arrizabalaga <zorionk@gmail.com>
-Zvonimir Pavlinovic <zpavlinovic@google.com>
-Zyad A. Ali <zyad.ali.me@gmail.com>
-Максадбек Ахмедов <a.maksadbek@gmail.com>
-Максим Федосеев <max.faceless.frei@gmail.com>
-Роман Хавроненко <hagen1778@gmail.com>
-Тарас Буник <tbunyk@gmail.com>
-Фахриддин Балтаев <faxriddinjon@gmail.com>
-张嵩 <zs349596@gmail.com>
-申习之 <bronze1man@gmail.com>
diff --git a/README.md b/README.md
index 5aca958..e40f3aa 100644
--- a/README.md
+++ b/README.md
@@ -16,26 +16,26 @@
#### Binary Distributions
-Official binary distributions are available at https://golang.org/dl/.
+Official binary distributions are available at https://go.dev/dl/.
-After downloading a binary release, visit https://golang.org/doc/install
+After downloading a binary release, visit https://go.dev/doc/install
for installation instructions.
#### Install From Source
If a binary distribution is not available for your combination of
operating system and architecture, visit
-https://golang.org/doc/install/source
+https://go.dev/doc/install/source
for source installation instructions.
### Contributing
Go is the work of thousands of contributors. We appreciate your help!
-To contribute, please read the contribution guidelines at https://golang.org/doc/contribute.
+To contribute, please read the contribution guidelines at https://go.dev/doc/contribute.
Note that the Go project uses the issue tracker for bug reports and
-proposals only. See https://golang.org/wiki/Questions for a list of
+proposals only. See https://go.dev/wiki/Questions for a list of
places to ask questions about the Go language.
[rf]: https://reneefrench.blogspot.com/
diff --git a/SECURITY.md b/SECURITY.md
index 9e92e8b..ab608f3 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -2,12 +2,12 @@
## Supported Versions
-We support the past two Go releases (for example, Go 1.12.x and Go 1.13.x).
+We support the past two Go releases (for example, Go 1.17.x and Go 1.18.x when Go 1.18.x is the latest stable release).
-See https://golang.org/wiki/Go-Release-Cycle and in particular the
-[Release Maintenance](https://github.com/golang/go/wiki/Go-Release-Cycle#release-maintenance)
+See https://go.dev/wiki/Go-Release-Cycle and in particular the
+[Release Maintenance](https://go.dev/wiki/Go-Release-Cycle#release-maintenance)
part of that page.
## Reporting a Vulnerability
-See https://golang.org/security for how to report a vulnerability.
+See https://go.dev/security for how to report a vulnerability.
diff --git a/VERSION b/VERSION
index 497dca0..afd8ff7 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-go1.18.5
\ No newline at end of file
+go1.19
\ No newline at end of file
diff --git a/api/README b/api/README
index 76d0971..a5bc623 100644
--- a/api/README
+++ b/api/README
@@ -8,10 +8,20 @@
except.txt lists features that may disappear without breaking true
compatibility.
-next.txt is the only file intended to be mutated. It's a list of
-features that may be added to the next version. It only affects
-warning output from the go api tool.
-
fuchsia.txt lists Fuchsia specific features. This list can be regenerated with:
fx exec ${FUCHSIA_DIR}/third_party/go/regen-api
+
+Starting with go1.19.txt, each API feature line must end in "#nnnnn"
+giving the GitHub issue number of the proposal issue that accepted
+the new API. This helps with our end-of-cycle audit of new APIs.
+The same requirement applies to next/* (described below), which will
+become a go1.XX.txt for XX >= 19.
+
+The next/ directory contains the only files intended to be mutated.
+Each file in that directory contains a list of features that may be added
+to the next release of Go. The files in this directory only affect the
+warning output from the go api tool. Each file should be named
+nnnnn.txt, after the issue number for the accepted proposal.
+(The #nnnnn suffix must also appear at the end of each line in the file;
+that will be preserved when next/*.txt is concatenated into go1.XX.txt.)
diff --git a/api/except.txt b/api/except.txt
index b9972c1..2acd444 100644
--- a/api/except.txt
+++ b/api/except.txt
@@ -505,3 +505,5 @@
pkg unicode, const Version = "7.0.0"
pkg unicode, const Version = "8.0.0"
pkg unicode, const Version = "9.0.0"
+pkg html/template, method (*Template) Funcs(FuncMap) *Template
+pkg html/template, type FuncMap map[string]interface{}
diff --git a/api/go1.1.txt b/api/go1.1.txt
index bb00b3b..06291fa 100644
--- a/api/go1.1.txt
+++ b/api/go1.1.txt
@@ -371,7 +371,7 @@
pkg debug/elf, const ELFDATA2LSB = 1
pkg debug/elf, const ELFDATA2MSB = 2
pkg debug/elf, const ELFDATANONE = 0
-pkg debug/elf, const ELFMAG = "\u007fELF"
+pkg debug/elf, const ELFMAG = "\x7fELF"
pkg debug/elf, const ELFOSABI_86OPEN = 5
pkg debug/elf, const ELFOSABI_AIX = 7
pkg debug/elf, const ELFOSABI_ARM = 97
diff --git a/api/go1.19.txt b/api/go1.19.txt
new file mode 100644
index 0000000..523f752
--- /dev/null
+++ b/api/go1.19.txt
@@ -0,0 +1,292 @@
+pkg crypto/x509, func ParseRevocationList([]uint8) (*RevocationList, error) #50674
+pkg crypto/x509, method (*CertPool) Clone() *CertPool #35044
+pkg crypto/x509, method (*CertPool) Equal(*CertPool) bool #46057
+pkg crypto/x509, method (*RevocationList) CheckSignatureFrom(*Certificate) error #50674
+pkg crypto/x509, type RevocationList struct, AuthorityKeyId []uint8 #50674
+pkg crypto/x509, type RevocationList struct, Extensions []pkix.Extension #50674
+pkg crypto/x509, type RevocationList struct, Issuer pkix.Name #50674
+pkg crypto/x509, type RevocationList struct, Raw []uint8 #50674
+pkg crypto/x509, type RevocationList struct, RawIssuer []uint8 #50674
+pkg crypto/x509, type RevocationList struct, RawTBSRevocationList []uint8 #50674
+pkg crypto/x509, type RevocationList struct, Signature []uint8 #50674
+pkg debug/elf, const EM_LOONGARCH = 258 #46229
+pkg debug/elf, const EM_LOONGARCH Machine #46229
+pkg debug/elf, const R_LARCH_32 = 1 #46229
+pkg debug/elf, const R_LARCH_32 R_LARCH #46229
+pkg debug/elf, const R_LARCH_64 = 2 #46229
+pkg debug/elf, const R_LARCH_64 R_LARCH #46229
+pkg debug/elf, const R_LARCH_ADD16 = 48 #46229
+pkg debug/elf, const R_LARCH_ADD16 R_LARCH #46229
+pkg debug/elf, const R_LARCH_ADD24 = 49 #46229
+pkg debug/elf, const R_LARCH_ADD24 R_LARCH #46229
+pkg debug/elf, const R_LARCH_ADD32 = 50 #46229
+pkg debug/elf, const R_LARCH_ADD32 R_LARCH #46229
+pkg debug/elf, const R_LARCH_ADD64 = 51 #46229
+pkg debug/elf, const R_LARCH_ADD64 R_LARCH #46229
+pkg debug/elf, const R_LARCH_ADD8 = 47 #46229
+pkg debug/elf, const R_LARCH_ADD8 R_LARCH #46229
+pkg debug/elf, const R_LARCH_COPY = 4 #46229
+pkg debug/elf, const R_LARCH_COPY R_LARCH #46229
+pkg debug/elf, const R_LARCH_IRELATIVE = 12 #46229
+pkg debug/elf, const R_LARCH_IRELATIVE R_LARCH #46229
+pkg debug/elf, const R_LARCH_JUMP_SLOT = 5 #46229
+pkg debug/elf, const R_LARCH_JUMP_SLOT R_LARCH #46229
+pkg debug/elf, const R_LARCH_MARK_LA = 20 #46229
+pkg debug/elf, const R_LARCH_MARK_LA R_LARCH #46229
+pkg debug/elf, const R_LARCH_MARK_PCREL = 21 #46229
+pkg debug/elf, const R_LARCH_MARK_PCREL R_LARCH #46229
+pkg debug/elf, const R_LARCH_NONE = 0 #46229
+pkg debug/elf, const R_LARCH_NONE R_LARCH #46229
+pkg debug/elf, const R_LARCH_RELATIVE = 3 #46229
+pkg debug/elf, const R_LARCH_RELATIVE R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_ADD = 35 #46229
+pkg debug/elf, const R_LARCH_SOP_ADD R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_AND = 36 #46229
+pkg debug/elf, const R_LARCH_SOP_AND R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_ASSERT = 30 #46229
+pkg debug/elf, const R_LARCH_SOP_ASSERT R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_IF_ELSE = 37 #46229
+pkg debug/elf, const R_LARCH_SOP_IF_ELSE R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_NOT = 31 #46229
+pkg debug/elf, const R_LARCH_SOP_NOT R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_10_10_16_S2 = 45 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_10_10_16_S2 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_5_10_16_S2 = 44 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_0_5_10_16_S2 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_12 = 40 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_12 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16 = 41 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16_S2 = 42 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_16_S2 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_5 = 38 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_10_5 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_5_20 = 43 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_S_5_20 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_U = 46 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_U R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_U_10_12 = 39 #46229
+pkg debug/elf, const R_LARCH_SOP_POP_32_U_10_12 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_ABSOLUTE = 23 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_ABSOLUTE R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_DUP = 24 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_DUP R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_GPREL = 25 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_GPREL R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_PCREL = 22 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_PCREL R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_PLT_PCREL = 29 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_PLT_PCREL R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GD = 28 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GD R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GOT = 27 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_GOT R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_TPREL = 26 #46229
+pkg debug/elf, const R_LARCH_SOP_PUSH_TLS_TPREL R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_SL = 33 #46229
+pkg debug/elf, const R_LARCH_SOP_SL R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_SR = 34 #46229
+pkg debug/elf, const R_LARCH_SOP_SR R_LARCH #46229
+pkg debug/elf, const R_LARCH_SOP_SUB = 32 #46229
+pkg debug/elf, const R_LARCH_SOP_SUB R_LARCH #46229
+pkg debug/elf, const R_LARCH_SUB16 = 53 #46229
+pkg debug/elf, const R_LARCH_SUB16 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SUB24 = 54 #46229
+pkg debug/elf, const R_LARCH_SUB24 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SUB32 = 55 #46229
+pkg debug/elf, const R_LARCH_SUB32 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SUB64 = 56 #46229
+pkg debug/elf, const R_LARCH_SUB64 R_LARCH #46229
+pkg debug/elf, const R_LARCH_SUB8 = 52 #46229
+pkg debug/elf, const R_LARCH_SUB8 R_LARCH #46229
+pkg debug/elf, const R_LARCH_TLS_DTPMOD32 = 6 #46229
+pkg debug/elf, const R_LARCH_TLS_DTPMOD32 R_LARCH #46229
+pkg debug/elf, const R_LARCH_TLS_DTPMOD64 = 7 #46229
+pkg debug/elf, const R_LARCH_TLS_DTPMOD64 R_LARCH #46229
+pkg debug/elf, const R_LARCH_TLS_DTPREL32 = 8 #46229
+pkg debug/elf, const R_LARCH_TLS_DTPREL32 R_LARCH #46229
+pkg debug/elf, const R_LARCH_TLS_DTPREL64 = 9 #46229
+pkg debug/elf, const R_LARCH_TLS_DTPREL64 R_LARCH #46229
+pkg debug/elf, const R_LARCH_TLS_TPREL32 = 10 #46229
+pkg debug/elf, const R_LARCH_TLS_TPREL32 R_LARCH #46229
+pkg debug/elf, const R_LARCH_TLS_TPREL64 = 11 #46229
+pkg debug/elf, const R_LARCH_TLS_TPREL64 R_LARCH #46229
+pkg debug/elf, method (R_LARCH) GoString() string #46229
+pkg debug/elf, method (R_LARCH) String() string #46229
+pkg debug/elf, type R_LARCH int #46229
+pkg debug/pe, const IMAGE_COMDAT_SELECT_ANY = 2 #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_ANY ideal-int #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_ASSOCIATIVE = 5 #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_ASSOCIATIVE ideal-int #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_EXACT_MATCH = 4 #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_EXACT_MATCH ideal-int #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_LARGEST = 6 #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_LARGEST ideal-int #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_NODUPLICATES = 1 #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_NODUPLICATES ideal-int #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_SAME_SIZE = 3 #51868
+pkg debug/pe, const IMAGE_COMDAT_SELECT_SAME_SIZE ideal-int #51868
+pkg debug/pe, const IMAGE_FILE_MACHINE_LOONGARCH32 = 25138 #46229
+pkg debug/pe, const IMAGE_FILE_MACHINE_LOONGARCH32 ideal-int #46229
+pkg debug/pe, const IMAGE_FILE_MACHINE_LOONGARCH64 = 25188 #46229
+pkg debug/pe, const IMAGE_FILE_MACHINE_LOONGARCH64 ideal-int #46229
+pkg debug/pe, const IMAGE_SCN_CNT_CODE = 32 #51868
+pkg debug/pe, const IMAGE_SCN_CNT_CODE ideal-int #51868
+pkg debug/pe, const IMAGE_SCN_CNT_INITIALIZED_DATA = 64 #51868
+pkg debug/pe, const IMAGE_SCN_CNT_INITIALIZED_DATA ideal-int #51868
+pkg debug/pe, const IMAGE_SCN_CNT_UNINITIALIZED_DATA = 128 #51868
+pkg debug/pe, const IMAGE_SCN_CNT_UNINITIALIZED_DATA ideal-int #51868
+pkg debug/pe, const IMAGE_SCN_LNK_COMDAT = 4096 #51868
+pkg debug/pe, const IMAGE_SCN_LNK_COMDAT ideal-int #51868
+pkg debug/pe, const IMAGE_SCN_MEM_DISCARDABLE = 33554432 #51868
+pkg debug/pe, const IMAGE_SCN_MEM_DISCARDABLE ideal-int #51868
+pkg debug/pe, const IMAGE_SCN_MEM_EXECUTE = 536870912 #51868
+pkg debug/pe, const IMAGE_SCN_MEM_EXECUTE ideal-int #51868
+pkg debug/pe, const IMAGE_SCN_MEM_READ = 1073741824 #51868
+pkg debug/pe, const IMAGE_SCN_MEM_READ ideal-int #51868
+pkg debug/pe, const IMAGE_SCN_MEM_WRITE = 2147483648 #51868
+pkg debug/pe, const IMAGE_SCN_MEM_WRITE ideal-int #51868
+pkg debug/pe, method (*File) COFFSymbolReadSectionDefAux(int) (*COFFSymbolAuxFormat5, error) #51868
+pkg debug/pe, type COFFSymbolAuxFormat5 struct #51868
+pkg debug/pe, type COFFSymbolAuxFormat5 struct, Checksum uint32 #51868
+pkg debug/pe, type COFFSymbolAuxFormat5 struct, NumLineNumbers uint16 #51868
+pkg debug/pe, type COFFSymbolAuxFormat5 struct, NumRelocs uint16 #51868
+pkg debug/pe, type COFFSymbolAuxFormat5 struct, SecNum uint16 #51868
+pkg debug/pe, type COFFSymbolAuxFormat5 struct, Selection uint8 #51868
+pkg debug/pe, type COFFSymbolAuxFormat5 struct, Size uint32 #51868
+pkg encoding/binary, func AppendUvarint([]uint8, uint64) []uint8 #51644
+pkg encoding/binary, func AppendVarint([]uint8, int64) []uint8 #51644
+pkg encoding/binary, type AppendByteOrder interface { AppendUint16, AppendUint32, AppendUint64, String } #50601
+pkg encoding/binary, type AppendByteOrder interface, AppendUint16([]uint8, uint16) []uint8 #50601
+pkg encoding/binary, type AppendByteOrder interface, AppendUint32([]uint8, uint32) []uint8 #50601
+pkg encoding/binary, type AppendByteOrder interface, AppendUint64([]uint8, uint64) []uint8 #50601
+pkg encoding/binary, type AppendByteOrder interface, String() string #50601
+pkg encoding/csv, method (*Reader) InputOffset() int64 #43401
+pkg encoding/xml, method (*Decoder) InputPos() (int, int) #45628
+pkg flag, func TextVar(encoding.TextUnmarshaler, string, encoding.TextMarshaler, string) #45754
+pkg flag, method (*FlagSet) TextVar(encoding.TextUnmarshaler, string, encoding.TextMarshaler, string) #45754
+pkg fmt, func Append([]uint8, ...interface{}) []uint8 #47579
+pkg fmt, func Appendf([]uint8, string, ...interface{}) []uint8 #47579
+pkg fmt, func Appendln([]uint8, ...interface{}) []uint8 #47579
+pkg go/doc, method (*Package) HTML(string) []uint8 #51082
+pkg go/doc, method (*Package) Markdown(string) []uint8 #51082
+pkg go/doc, method (*Package) Parser() *comment.Parser #51082
+pkg go/doc, method (*Package) Printer() *comment.Printer #51082
+pkg go/doc, method (*Package) Synopsis(string) string #51082
+pkg go/doc, method (*Package) Text(string) []uint8 #51082
+pkg go/doc/comment, func DefaultLookupPackage(string) (string, bool) #51082
+pkg go/doc/comment, method (*DocLink) DefaultURL(string) string #51082
+pkg go/doc/comment, method (*Heading) DefaultID() string #51082
+pkg go/doc/comment, method (*List) BlankBefore() bool #51082
+pkg go/doc/comment, method (*List) BlankBetween() bool #51082
+pkg go/doc/comment, method (*Parser) Parse(string) *Doc #51082
+pkg go/doc/comment, method (*Printer) Comment(*Doc) []uint8 #51082
+pkg go/doc/comment, method (*Printer) HTML(*Doc) []uint8 #51082
+pkg go/doc/comment, method (*Printer) Markdown(*Doc) []uint8 #51082
+pkg go/doc/comment, method (*Printer) Text(*Doc) []uint8 #51082
+pkg go/doc/comment, type Block interface, unexported methods #51082
+pkg go/doc/comment, type Code struct #51082
+pkg go/doc/comment, type Code struct, Text string #51082
+pkg go/doc/comment, type Doc struct #51082
+pkg go/doc/comment, type Doc struct, Content []Block #51082
+pkg go/doc/comment, type Doc struct, Links []*LinkDef #51082
+pkg go/doc/comment, type DocLink struct #51082
+pkg go/doc/comment, type DocLink struct, ImportPath string #51082
+pkg go/doc/comment, type DocLink struct, Name string #51082
+pkg go/doc/comment, type DocLink struct, Recv string #51082
+pkg go/doc/comment, type DocLink struct, Text []Text #51082
+pkg go/doc/comment, type Heading struct #51082
+pkg go/doc/comment, type Heading struct, Text []Text #51082
+pkg go/doc/comment, type Italic string #51082
+pkg go/doc/comment, type Link struct #51082
+pkg go/doc/comment, type Link struct, Auto bool #51082
+pkg go/doc/comment, type Link struct, Text []Text #51082
+pkg go/doc/comment, type Link struct, URL string #51082
+pkg go/doc/comment, type LinkDef struct #51082
+pkg go/doc/comment, type LinkDef struct, Text string #51082
+pkg go/doc/comment, type LinkDef struct, URL string #51082
+pkg go/doc/comment, type LinkDef struct, Used bool #51082
+pkg go/doc/comment, type List struct #51082
+pkg go/doc/comment, type List struct, ForceBlankBefore bool #51082
+pkg go/doc/comment, type List struct, ForceBlankBetween bool #51082
+pkg go/doc/comment, type List struct, Items []*ListItem #51082
+pkg go/doc/comment, type ListItem struct #51082
+pkg go/doc/comment, type ListItem struct, Content []Block #51082
+pkg go/doc/comment, type ListItem struct, Number string #51082
+pkg go/doc/comment, type Paragraph struct #51082
+pkg go/doc/comment, type Paragraph struct, Text []Text #51082
+pkg go/doc/comment, type Parser struct #51082
+pkg go/doc/comment, type Parser struct, LookupPackage func(string) (string, bool) #51082
+pkg go/doc/comment, type Parser struct, LookupSym func(string, string) bool #51082
+pkg go/doc/comment, type Parser struct, Words map[string]string #51082
+pkg go/doc/comment, type Plain string #51082
+pkg go/doc/comment, type Printer struct #51082
+pkg go/doc/comment, type Printer struct, DocLinkBaseURL string #51082
+pkg go/doc/comment, type Printer struct, DocLinkURL func(*DocLink) string #51082
+pkg go/doc/comment, type Printer struct, HeadingID func(*Heading) string #51082
+pkg go/doc/comment, type Printer struct, HeadingLevel int #51082
+pkg go/doc/comment, type Printer struct, TextCodePrefix string #51082
+pkg go/doc/comment, type Printer struct, TextPrefix string #51082
+pkg go/doc/comment, type Printer struct, TextWidth int #51082
+pkg go/doc/comment, type Text interface, unexported methods #51082
+pkg go/types, method (*Func) Origin() *Func #51682
+pkg go/types, method (*Var) Origin() *Var #51682
+pkg hash/maphash, func Bytes(Seed, []uint8) uint64 #42710
+pkg hash/maphash, func String(Seed, string) uint64 #42710
+pkg html/template, method (*Template) Funcs(template.FuncMap) *Template #46121
+pkg html/template, type FuncMap = template.FuncMap #46121
+pkg net/http, method (*MaxBytesError) Error() string #30715
+pkg net/http, type MaxBytesError struct #30715
+pkg net/http, type MaxBytesError struct, Limit int64 #30715
+pkg net/url, func JoinPath(string, ...string) (string, error) #47005
+pkg net/url, method (*URL) JoinPath(...string) *URL #47005
+pkg net/url, type URL struct, OmitHost bool #46059
+pkg os/exec, method (*Cmd) Environ() []string #50599
+pkg os/exec, type Cmd struct, Err error #43724
+pkg os/exec, var ErrDot error #43724
+pkg regexp/syntax, const ErrNestingDepth = "expression nests too deeply" #51684
+pkg regexp/syntax, const ErrNestingDepth ErrorCode #51684
+pkg runtime/debug, func SetMemoryLimit(int64) int64 #48409
+pkg sort, func Find(int, func(int) int) (int, bool) #50340
+pkg sync/atomic, method (*Bool) CompareAndSwap(bool, bool) bool #50860
+pkg sync/atomic, method (*Bool) Load() bool #50860
+pkg sync/atomic, method (*Bool) Store(bool) #50860
+pkg sync/atomic, method (*Bool) Swap(bool) bool #50860
+pkg sync/atomic, method (*Int32) Add(int32) int32 #50860
+pkg sync/atomic, method (*Int32) CompareAndSwap(int32, int32) bool #50860
+pkg sync/atomic, method (*Int32) Load() int32 #50860
+pkg sync/atomic, method (*Int32) Store(int32) #50860
+pkg sync/atomic, method (*Int32) Swap(int32) int32 #50860
+pkg sync/atomic, method (*Int64) Add(int64) int64 #50860
+pkg sync/atomic, method (*Int64) CompareAndSwap(int64, int64) bool #50860
+pkg sync/atomic, method (*Int64) Load() int64 #50860
+pkg sync/atomic, method (*Int64) Store(int64) #50860
+pkg sync/atomic, method (*Int64) Swap(int64) int64 #50860
+pkg sync/atomic, method (*Pointer[$0]) CompareAndSwap(*$0, *$0) bool #50860
+pkg sync/atomic, method (*Pointer[$0]) Load() *$0 #50860
+pkg sync/atomic, method (*Pointer[$0]) Store(*$0) #50860
+pkg sync/atomic, method (*Pointer[$0]) Swap(*$0) *$0 #50860
+pkg sync/atomic, method (*Uint32) Add(uint32) uint32 #50860
+pkg sync/atomic, method (*Uint32) CompareAndSwap(uint32, uint32) bool #50860
+pkg sync/atomic, method (*Uint32) Load() uint32 #50860
+pkg sync/atomic, method (*Uint32) Store(uint32) #50860
+pkg sync/atomic, method (*Uint32) Swap(uint32) uint32 #50860
+pkg sync/atomic, method (*Uint64) Add(uint64) uint64 #50860
+pkg sync/atomic, method (*Uint64) CompareAndSwap(uint64, uint64) bool #50860
+pkg sync/atomic, method (*Uint64) Load() uint64 #50860
+pkg sync/atomic, method (*Uint64) Store(uint64) #50860
+pkg sync/atomic, method (*Uint64) Swap(uint64) uint64 #50860
+pkg sync/atomic, method (*Uintptr) Add(uintptr) uintptr #50860
+pkg sync/atomic, method (*Uintptr) CompareAndSwap(uintptr, uintptr) bool #50860
+pkg sync/atomic, method (*Uintptr) Load() uintptr #50860
+pkg sync/atomic, method (*Uintptr) Store(uintptr) #50860
+pkg sync/atomic, method (*Uintptr) Swap(uintptr) uintptr #50860
+pkg sync/atomic, type Bool struct #50860
+pkg sync/atomic, type Int32 struct #50860
+pkg sync/atomic, type Int64 struct #50860
+pkg sync/atomic, type Pointer[$0 interface{}] struct #50860
+pkg sync/atomic, type Uint32 struct #50860
+pkg sync/atomic, type Uint64 struct #50860
+pkg sync/atomic, type Uintptr struct #50860
+pkg time, method (Duration) Abs() Duration #51414
+pkg time, method (Time) ZoneBounds() (Time, Time) #50062
diff --git a/api/next.txt b/api/next.txt
deleted file mode 100644
index e69de29..0000000
--- a/api/next.txt
+++ /dev/null
diff --git a/codereview.cfg b/codereview.cfg
index ff39018..5541320 100644
--- a/codereview.cfg
+++ b/codereview.cfg
@@ -1,2 +1,2 @@
-branch: release-branch.go1.18
+branch: release-branch.go1.19
parent-branch: master
diff --git a/doc/go1.18.html b/doc/go1.18.html
deleted file mode 100644
index b320579..0000000
--- a/doc/go1.18.html
+++ /dev/null
@@ -1,1338 +0,0 @@
-<!--{
- "Title": "Go 1.18 Release Notes",
- "Path": "/doc/go1.18"
-}-->
-
-<!--
-NOTE: In this document and others in this directory, the convention is to
-set fixed-width phrases with non-fixed-width spaces, as in
-<code>hello</code> <code>world</code>.
-Do not send CLs removing the interior tags from such phrases.
--->
-
-<style>
- main ul li { margin: 0.5em 0; }
-</style>
-
-<h2 id="introduction">DRAFT RELEASE NOTES — Introduction to Go 1.18</h2>
-
-<p>
- <strong>
- Go 1.18 is not yet released. These are work-in-progress
- release notes. Go 1.18 is expected to be released in February 2022.
- </strong>
-</p>
-
-<h2 id="language">Changes to the language</h2>
-
-<h3 id="generics">Generics</h3>
-
-<p><!-- https://golang.org/issue/43651, https://golang.org/issue/45346 -->
- Go 1.18 includes an implementation of generic features as described by the
- <a href="https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md">Type
- Parameters Proposal</a>.
- This includes major - but fully backward-compatible - changes to the language.
-</p>
-
-<p>
- These new language changes required a large amount of new code that
- has not had significant testing in production settings. That will
- only happen as more people write and use generic code. We believe
- that this feature is well implemented and high quality. However,
- unlike most aspects of Go, we can't back up that belief with real
- world experience. Therefore, while we encourage the use of generics
- where it makes sense, please use appropriate caution when deploying
- generic code in production.
-</p>
-
-<p>
- The following is a list of the most visible changes. For a more comprehensive overview, see the
- <a href="https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md">proposal</a>.
- For details see the <a href="/ref/spec">language spec</a>.
-</p>
-
-<ul>
- <li>
- The syntax for
- <a href="/ref/spec#Function_declarations">function</a> and
- <a href="/ref/spec#Type_declarations">type declarations</a>
- now accepts
- <a href="/ref/spec#Type_parameters">type parameters</a>.
- </li>
- <li>
- Parameterized functions and types can be instantiated by following them with a list of
- type arguments in square brackets.
- </li>
- <li>
- The new token <code>~</code> has been added to the set of
- <a href="/ref/spec#Operators_and_punctuation">operators and punctuation</a>.
- </li>
- <li>
- The syntax for
- <a href="/ref/spec#Interface_types">Interface types</a>
- now permits the embedding of arbitrary types (not just type names of interfaces)
- as well as union and <code>~T</code> type elements. Such interfaces may only be used
- as type constraints.
- An interface now defines a set of types as well as a set of methods.
- </li>
- <li>
- The new
- <a href="/ref/spec#Predeclared_identifiers">predeclared identifier</a>
- <code>any</code> is an alias for the empty interface. It may be used instead of
- <code>interface{}</code>.
- </li>
- <li>
- The new
- <a href="/ref/spec#Predeclared_identifiers">predeclared identifier</a>
- <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>
-</ul>
-
-<p>
- There are three experimental packages using generics that may be
- useful.
- These packages are in x/exp repository; their API is not covered by
- the Go 1 guarantee and may change as we gain more experience with
- generics.
- <dl>
- <dt><a href="https://pkg.go.dev/golang.org/x/exp/constraints"><code>golang.org/x/exp/constraints</code></a></dt>
- <dd>
- <p>
- Constraints that are useful for generic code, such as
- <a href="https://pkg.go.dev/golang.org/x/exp/constraints#Ordered"><code>constraints.Ordered</code></a>.
- </p>
- </dd>
-
- <dt><a href="https://pkg.go.dev/golang.org/x/exp/slices"><code>golang.org/x/exp/slices</code></a></dt>
- <dd>
- <p>
- A collection of generic functions that operate on slices of
- any element type.
- </p>
- </dd>
-
- <dt><a href="https://pkg.go.dev/golang.org/x/exp/maps"><code>golang.org/x/exp/maps</code></a></dt>
- <dd>
- <p>
- A collection of generic functions that operate on maps of
- any key or element type.
- </p>
- </dd>
- </dl>
-</p>
-
-<p>
- The current generics implementation has the following limitations:
- <ul>
- <li><!-- https://golang.org/issue/47631 -->
- The Go compiler cannot currently handle type declarations inside generic functions
- or methods. We hope to provide support for this feature in Go 1.19.
- </li>
- <li><!-- https://golang.org/issue/50937 -->
- The Go compiler currently does not accept arguments of type parameter type with
- 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,
- embedding a type parameter in an interface type is not permitted.
- Whether these will ever be permitted is unclear at present.
- </li>
- <li>
- A union element with more than one term may not contain an
- interface type with a non-empty method set. Whether this will
- ever be permitted is unclear at present.
- </li>
- </ul>
-</p>
-
-<h3 id="bug_fixes">Bug fixes</h3>
-
-<p>
- The Go 1.18 compiler now correctly reports <code>declared but not used</code> errors
- for variables that are set inside a function literal but are never used. Before Go 1.18,
- the compiler did not report an error in such cases. This fixes long-outstanding compiler
- issue <a href="https://golang.org/issue/8560">#8560</a>. As a result of this change,
- (possibly incorrect) programs may not compile anymore. The necessary fix is
- straightforward: fix the program if it was in fact incorrect, or use the offending
- variable, for instance by assigning it to the blank identifier <code>_</code>.
- Since <code>go vet</code> always pointed out this error, the number of affected
- programs is likely very small.
-</p>
-
-<p>
- The Go 1.18 compiler now reports an overflow when passing a rune constant expression
- such as <code>'1' << 32</code> as an argument to the predeclared functions
- <code>print</code> and <code>println</code>, consistent with the behavior of
- user-defined functions. Before Go 1.18, the compiler did not report an error
- in such cases but silently accepted such constant arguments if they fit into an
- <code>int64</code>. As a result of this change, (possibly incorrect) programs
- may not compile anymore. The necessary fix is straightforward: fix the program if it
- was in fact incorrect, or explicitly convert the offending argument to the correct type.
- Since <code>go vet</code> always pointed out this error, the number of affected
- programs is likely very small.
-</p>
-
-<h2 id="ports">Ports</h2>
-
-<h3 id="amd64">AMD64</h3>
-
-<p><!-- CL 349595 -->
- Go 1.18 introduces the new <code>GOAMD64</code> environment variable, which selects at compile time
- 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
- <a href="https://golang.org/wiki/MinimumRequirements#amd64">here</a>.
-</p>
-<p>
- The <code>GOAMD64</code> environment variable defaults to <code>v1</code>.
-</p>
-
-<h3 id="riscv">RISC-V</h3>
-
-<p><!-- golang.org/issue/47100, CL 334872 -->
- The 64-bit RISC-V architecture on Linux (the <code>linux/riscv64</code> port)
- 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 -->
- The <code>windows/arm</code> and <code>windows/arm64</code> ports now support
- non-cooperative preemption, bringing that capability to all four Windows
- ports, which should hopefully address subtle bugs encountered when calling
- into Win32 functions that block for extended periods of time.
-</p>
-
-<h3 id="ios">iOS</h3>
-
-<p><!-- golang.org/issue/48076, golang.org/issue/49616 -->
- On iOS (the <code>ios/arm64</code> port)
- and iOS simulator running on AMD64-based macOS (the <code>ios/amd64</code> port),
- Go 1.18 now requires iOS 12 or later; support for previous versions has been discontinued.
-</p>
-
-<h3 id="freebsd">FreeBSD</h3>
-
-<p>
- Go 1.18 is the last release that is supported on FreeBSD 11.x, which has
- already reached end-of-life. Go 1.19 will require FreeBSD 12.2+ or FreeBSD
- 13.0+.
- FreeBSD 13.0+ will require a kernel with the COMPAT_FREEBSD12 option set (this is the default).
-</p>
-
-<h2 id="tools">Tools</h2>
-
-<h3 id="fuzzing">Fuzzing</h3>
-
-<p>
- Go 1.18 includes an implementation of fuzzing as described by
- <a href="https://golang.org/issue/44551">the fuzzing proposal</a>.
-</p>
-
-<p>
- See the <a href="https://go.dev/doc/fuzz">fuzzing landing page</a> to get
- started.
-</p>
-
-<p>
- Please be aware that fuzzing can consume a lot of memory and may impact your
- machine’s performance while it runs. Also be aware that the fuzzing engine
- writes values that expand test coverage to a fuzz cache directory within
- <code>$GOCACHE/fuzz</code> while it runs. There is currently no limit to the
- number of files or total bytes that may be written to the fuzz cache, so it
- may occupy a large amount of storage (possibly several GBs).
-</p>
-
-<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
- adjusting dependencies in <code>go.mod</code>. Effectively, the
- <code>-d</code> flag is always enabled. To install the latest version
- of an executable outside the context of the current module, use
- <a href="https://golang.org/ref/mod#go-install"><code>go</code>
- <code>install</code> <code>example.com/cmd@latest</code></a>. Any
- <a href="https://golang.org/ref/mod#version-queries">version query</a>
- may be used instead of <code>latest</code>. This form of <code>go</code>
- <code>install</code> was added in Go 1.16, so projects supporting older
- versions may need to provide install instructions for both <code>go</code>
- <code>install</code> and <code>go</code> <code>get</code>. <code>go</code>
- <code>get</code> now reports an error when used outside a module, since there
- is no <code>go.mod</code> file to update. In GOPATH mode (with
- <code>GO111MODULE=off</code>), <code>go</code> <code>get</code> still builds
- 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. 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
- <code>main</code> package and its containing main module are in the same
- repository. This information may be omitted using the flag
- <code>-buildvcs=false</code>.
-</p>
-
-<p><!-- golang.org/issue/37475 -->
- 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
- (like <code>CGO_CFLAGS</code>).
- Both VCS and build information may be read together with module
- information using
- <code>go</code> <code>version</code> <code>-m</code> <code>file</code> or
- <code>runtime/debug.ReadBuildInfo</code> (for the currently running binary)
- or the new <a href="#debug/buildinfo"><code>debug/buildinfo</code></a>
- package.
-</p>
-
-<p><!-- CL 369977 -->
- The underlying data format of the embedded build information can change with
- new go releases, so an older version of <code>go</code> may not handle the
- build information produced with a newer version of <code>go</code>.
- To read the version information from a binary built with <code>go</code> 1.18,
- use the <code>go</code> <code>version</code> command and the
- <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>
- or higher, <code>go</code> <code>mod</code> <code>download</code> without
- arguments now downloads source code for only the modules
- explicitly <a href="/ref/mod#go-mod-file-require">required</a> in the main
- module's <code>go.mod</code> file. (In a <code>go</code> <code>1.17</code> or
- higher module, that set already includes all dependencies needed to build the
- packages and tests in the main module.)
- To also download source code for transitive dependencies, use
- <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.
- (Other <code>go</code> commands still read from the <code>vendor</code>
- directory at the module root when loading packages
- with <code>-mod=vendor</code>, so the main use for this flag is for
- third-party tools that need to collect package source 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
- additional checksums in the <code>go.sum</code> file for modules whose source
- code is needed to verify that each imported package is provided by only one
- module in the <a href="/ref/mod#glos-build-list">build list</a>. Because this
- condition is rare and failure to apply it results in a build error, this
- change is <em>not</em> conditioned on the <code>go</code> version in the main
- 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
- parent directory, or one is specified using the <code>GOWORK</code>
- environment variable, it will put the <code>go</code> command into workspace mode.
- In workspace mode, the <code>go.work</code> file will be used to
- determine the set of main modules used as the roots for module
- resolution, instead of using the normally-found <code>go.mod</code>
- file to specify the single main module. For more information see the
- <a href="/pkg/cmd/go#hdr-Workspace_maintenance"><code>go work</code></a>
- 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
- above</a>:
- <ul>
- <li>
- <code>go test</code> supports
- <code>-fuzz</code>, <code>-fuzztime</code>, and
- <code>-fuzzminimizetime</code> options.
- For documentation on these see
- <a href="/pkg/cmd/go#hdr-Testing_flags"><code>go help testflag</code></a>.
- </li>
- <li>
- <code>go clean</code> supports a <code>-fuzzcache</code>
- option.
- For documentation see
- <a href="/pkg/cmd/go#hdr-Remove_object_files_and_cached_files"><code>go help clean</code></a>.
- </li>
- </ul>
-</p>
-
-<h4 id="go-build-lines"><code>//go:build</code> lines</h4>
-
-<p><!-- CL 240611 -->
-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>
-
-<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
- memory limit proportional to <code>GOMAXPROCS</code>. On a machine with
- multiple CPUs, <code>gofmt</code> should now be significantly faster.
-</p>
-
-<h3 id="vet">Vet</h3>
-
-<h4 id="vet-generics">Updates for Generics</h4>
-
-<p><!-- https://golang.org/issue/48704 -->
- The <code>vet</code> tool is updated to support generic code. In most cases,
- it reports an error in generic code whenever it would report an error in the
- equivalent non-generic code after substituting for type parameters with a
- type from their
- <a href="https://golang.org/ref/spec#Interface_types">type set</a>.
-
- For example, <code>vet</code> reports a format error in
- <pre>func Print[T ~int|~string](t T) {
- fmt.Printf("%d", t)
-}</pre>
- because it would report a format error in the non-generic equivalent of
- <code>Print[string]</code>:
- <pre>func PrintString(x string) {
- fmt.Printf("%d", x)
-}</pre>
-</p>
-
-<h4 id="vet-precision">Precision improvements for existing checkers</h4>
-
-<p><!-- CL 323589 356830 319689 355730 351553 338529 -->
- The <code>cmd/vet</code> checkers <code>copylock</code>, <code>printf</code>,
- <code>sortslice</code>, <code>testinggoroutine</code>, and <code>tests</code>
- have all had moderate precision improvements to handle additional code patterns.
- This may lead to newly reported errors in existing packages. For example, the
- <code>printf</code> checker now tracks formatting strings created by
- concatenating string constants. So <code>vet</code> will report an error in:
-<pre>
- // fmt.Printf formatting directive %d is being passed to Println.
- fmt.Println("%d"+` ≡ x (mod 2)`+"\n", x%2)
-</pre>
-</p>
-
-<h2 id="runtime">Runtime</h2>
-
-<p><!-- https://golang.org/issue/44167 -->
- The garbage collector now includes non-heap sources of garbage collector work
- (e.g., stack scanning) when determining how frequently to run. As a result,
- garbage collector overhead is more predictable when these sources are
- significant. For most applications these changes will be negligible; however,
- some Go applications may now use less memory and spend more time on garbage
- collection, or vice versa, than before. The intended workaround is to tweak
- <code>GOGC</code> where necessary.
-</p>
-
-<p><!-- CL 358675, CL 353975, CL 353974 -->
- The runtime now returns memory to the operating system more efficiently and has
- been tuned to work more aggressively as a result.
-</p>
-
-<p><!-- CL 352057, https://golang.org/issue/45728 -->
- Go 1.17 generally improved the formatting of arguments in stack traces,
- but could print inaccurate values for arguments passed in registers.
- This is improved in Go 1.18 by printing a question mark (<code>?</code>)
- after each value that may be inaccurate.
-</p>
-
-<h2 id="compiler">Compiler</h2>
-
-<p><!-- https://golang.org/issue/40724 -->
- Go 1.17 <a href="go1.17#compiler">implemented</a> a new way of passing
- function arguments and results using registers instead of the stack
- on 64-bit x86 architecture on selected operating systems.
- Go 1.18 expands the supported platforms to include 64-bit ARM (<code>GOARCH=arm64</code>),
- big- and little-endian 64-bit PowerPC (<code>GOARCH=ppc64</code>, <code>ppc64le</code>),
- as well as 64-bit x86 architecture (<code>GOARCH=amd64</code>)
- on all operating systems.
- On 64-bit ARM and 64-bit PowerPC systems, benchmarking shows
- typical performance improvements of 10% or more.
-</p>
-
-<p>
- As <a href="go1.17#compiler">mentioned</a> in the Go 1.17 release notes,
- this change does not affect the functionality of any safe Go code and
- is designed to have no impact on most assembly code. See the
- <a href="go1.17#compiler">Go 1.17 release notes</a> for more details.
-</p>
-
-<p><!-- CL 355497, CL 356869 -->
- The compiler now can inline functions that contain range loops or
- labeled for loops.
-</p>
-
-<p><!-- CL 298611 -->
- The new <code>-asan</code> compiler option supports the
- new <code>go</code> command <code>-asan</code> option.
-</p>
-
-<p><!-- https://golang.org/issue/50954 -->
- Because the compiler's type checker was replaced in its entirety to
- support generics, some error messages now may use different wording
- than before. In some cases, pre-Go 1.18 error messages provided more
- detail or were phrased in a more helpful way.
- We intend to address these cases in Go 1.19.
-</p>
-
-<p> <!-- https://github.com/golang/go/issues/49569 -->
- Because of changes in the compiler related to supporting generics, the
- Go 1.18 compile speed can be roughly 15% slower than the Go 1.17 compile speed.
- The execution time of the compiled code is not affected. We
- intend to improve the speed of the compiler in Go 1.19.
-</p>
-
-<h2 id="linker">Linker</h2>
-
-<p>
- The linker emits <a href="https://tailscale.com/blog/go-linker/">far fewer relocations</a>.
- As a result, most codebases will link faster, require less memory to link,
- and generate smaller binaries.
- Tools that process Go binaries should use Go 1.18's <code>debug/gosym</code> package
- to transparently handle both old and new binaries.
-</p>
-
-<p><!-- CL 298610 -->
- The new <code>-asan</code> linker option supports the
- new <code>go</code> command <code>-asan</code> option.
-</p>
-
-<h2 id="bootstrap">Bootstrap</h2>
-
-<p><!-- CL 369914, CL 370274 -->
-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>
-
-<h3 id="debug/buildinfo">New <code>debug/buildinfo</code> package</h3>
-
-<p><!-- golang.org/issue/39301 -->
- The new <a href="/pkg/debug/buildinfo"><code>debug/buildinfo</code></a> package
- provides access to module versions, version control information, and build
- flags embedded in executable files built by the <code>go</code> command.
- The same information is also available via
- <a href="/pkg/runtime/debug#ReadBuildInfo"><code>runtime/debug.ReadBuildInfo</code></a>
- for the currently running binary and via <code>go</code>
- <code>version</code> <code>-m</code> on the command line.
-</p>
-
-<h3 id="netip">New <code>net/netip</code> package</h3>
-
-<p>
- The new <a href="/pkg/net/netip/"><code>net/netip</code></a>
- package defines a new IP address type, <a href="/pkg/net/netip/#Addr"><code>Addr</code></a>.
- Compared to the existing
- <a href="/pkg/net/#IP"><code>net.IP</code></a> type, the <code>netip.Addr</code> type takes less
- memory, is immutable, and is comparable so it supports <code>==</code>
- and can be used as a map key.
-</p>
-<p>
- In addition to <code>Addr</code>, the package defines
- <a href="/pkg/net/netip/#AddrPort"><code>AddrPort</code></a>, representing
- an IP and port, and
- <a href="/pkg/net/netip/#Prefix"><code>Prefix</code></a>, representing
- a network CIDR prefix.
-</p>
-<p>
- The package also defines several functions to create and examine
- these new types:
- <a href="/pkg/net/netip#AddrFrom4"><code>AddrFrom4</code></a>,
- <a href="/pkg/net/netip#AddrFrom16"><code>AddrFrom16</code></a>,
- <a href="/pkg/net/netip#AddrFromSlice"><code>AddrFromSlice</code></a>,
- <a href="/pkg/net/netip#AddrPortFrom"><code>AddrPortFrom</code></a>,
- <a href="/pkg/net/netip#IPv4Unspecified"><code>IPv4Unspecified</code></a>,
- <a href="/pkg/net/netip#IPv6LinkLocalAllNodes"><code>IPv6LinkLocalAllNodes</code></a>,
- <a href="/pkg/net/netip#IPv6Unspecified"><code>IPv6Unspecified</code></a>,
- <a href="/pkg/net/netip#MustParseAddr"><code>MustParseAddr</code></a>,
- <a href="/pkg/net/netip#MustParseAddrPort"><code>MustParseAddrPort</code></a>,
- <a href="/pkg/net/netip#MustParsePrefix"><code>MustParsePrefix</code></a>,
- <a href="/pkg/net/netip#ParseAddr"><code>ParseAddr</code></a>,
- <a href="/pkg/net/netip#ParseAddrPort"><code>ParseAddrPort</code></a>,
- <a href="/pkg/net/netip#ParsePrefix"><code>ParsePrefix</code></a>,
- <a href="/pkg/net/netip#PrefixFrom"><code>PrefixFrom</code></a>.
-</p>
-<p>
- The <a href="/pkg/net/"><code>net</code></a> package includes new
- methods that parallel existing methods, but
- return <code>netip.AddrPort</code> instead of the
- heavier-weight <a href="/pkg/net/#IP"><code>net.IP</code></a> or
- <a href="/pkg/net/#UDPAddr"><code>*net.UDPAddr</code></a> types:
- <a href="/pkg/net/#Resolver.LookupNetIP"><code>Resolver.LookupNetIP</code></a>,
- <a href="/pkg/net/#UDPConn.ReadFromUDPAddrPort"><code>UDPConn.ReadFromUDPAddrPort</code></a>,
- <a href="/pkg/net/#UDPConn.ReadMsgUDPAddrPort"><code>UDPConn.ReadMsgUDPAddrPort</code></a>,
- <a href="/pkg/net/#UDPConn.WriteToUDPAddrPort"><code>UDPConn.WriteToUDPAddrPort</code></a>,
- <a href="/pkg/net/#UDPConn.WriteMsgUDPAddrPort"><code>UDPConn.WriteMsgUDPAddrPort</code></a>.
- The new <code>UDPConn</code> methods support allocation-free I/O.
-</p>
-<p>
- The <code>net</code> package also now includes functions and methods
- to convert between the existing
- <a href="/pkg/net/#TCPAddr"><code>TCPAddr</code></a>/<a href="/pkg/net/#UDPAddr"><code>UDPAddr</code></a>
- types and <code>netip.AddrPort</code>:
- <a href="/pkg/net/#TCPAddrFromAddrPort"><code>TCPAddrFromAddrPort</code></a>,
- <a href="/pkg/net/#UDPAddrFromAddrPort"><code>UDPAddrFromAddrPort</code></a>,
- <a href="/pkg/net/#TCPAddr.AddrPort"><code>TCPAddr.AddrPort</code></a>,
- <a href="/pkg/net/#UDPAddr.AddrPort"><code>UDPAddr.AddrPort</code></a>.
-</p>
-
-<h3 id="tls10">TLS 1.0 and 1.1 disabled by default client-side</h3>
-
-<p><!-- CL 359779, golang.org/issue/45428 -->
- If <a href="/pkg/crypto/tls/#Config.MinVersion"><code>Config.MinVersion</code></a>
- is not set, it now defaults to TLS 1.2 for client connections. Any safely
- up-to-date server is expected to support TLS 1.2, and browsers have required
- it since 2020. TLS 1.0 and 1.1 are still supported by setting
- <code>Config.MinVersion</code> to <code>VersionTLS10</code>.
- The server-side default is unchanged at TLS 1.0.
-</p>
-
-<p>
- The default can be temporarily reverted to TLS 1.0 by setting the
- <code>GODEBUG=tls10default=1</code> environment variable.
- This option will be removed in Go 1.19.
-</p>
-
-<h3 id="sha1">Rejecting SHA-1 certificates</h3>
-
-<p><!-- CL 359777, golang.org/issue/41682 -->
- <code>crypto/x509</code> will now
- reject certificates signed with the SHA-1 hash function. This doesn't
- apply to self-signed root certificates. Practical attacks against SHA-1
- <a href="https://shattered.io/">have been demonstrated since 2017</a> and publicly
- trusted Certificate Authorities have not issued SHA-1 certificates since 2015.
-</p>
-
-<p>
- This can be temporarily reverted by setting the
- <code>GODEBUG=x509sha1=1</code> environment variable.
- This option will be removed in Go 1.19.
-</p>
-
-<h3 id="minor_library_changes">Minor changes to the library</h3>
-
-<p>
- As always, there are various minor changes and updates to the library,
- made with the Go 1 <a href="/doc/go1compat">promise of compatibility</a>
- in mind.
-</p>
-
-<dl id="bufio"><dt><a href="/pkg/bufio/">bufio</a></dt>
- <dd>
- <p><!-- CL 345569 -->
- The new <a href="/pkg/bufio#Writer.AvailableBuffer"><code>Writer.AvailableBuffer</code></a>
- method returns an empty buffer with a possibly non-empty capacity for use
- with append-like APIs. After appending, the buffer can be provided to a
- succeeding <code>Write</code> call and possibly avoid any copying.
- </p>
-
- <p><!-- CL 345570 -->
- 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>
- </dd>
-</dl><!-- bufio -->
-
-<dl id="bytes"><dt><a href="/pkg/bytes/">bytes</a></dt>
- <dd>
- <p><!-- CL 351710 -->
- The new <a href="/pkg/bytes/#Cut"><code>Cut</code></a> function
- slices a <code>[]byte</code> around a separator. It can replace
- and simplify many common uses of
- <a href="/pkg/bytes/#Index"><code>Index</code></a>,
- <a href="/pkg/bytes/#IndexByte"><code>IndexByte</code></a>,
- <a href="/pkg/bytes/#IndexRune"><code>IndexRune</code></a>,
- and <a href="/pkg/bytes/#SplitN"><code>SplitN</code></a>.
- </p>
-
- <p><!-- CL 323318, CL 332771 -->
- <a href="/pkg/bytes/#Trim"><code>Trim</code></a>, <a href="/pkg/bytes/#TrimLeft"><code>TrimLeft</code></a>,
- and <a href="/pkg/bytes/#TrimRight"><code>TrimRight</code></a> are now allocation free and, especially for
- small ASCII cutsets, up to 10 times faster.
- </p>
-
- <p><!-- CL 359485 -->
- The <a href="/pkg/bytes/#Title"><code>Title</code></a> function is now deprecated. It doesn't
- handle Unicode punctuation and language-specific capitalization rules, and is superseded by the
- <a href="https://golang.org/x/text/cases">golang.org/x/text/cases</a> package.
- </p>
- </dd>
-</dl><!-- bytes -->
-
-<dl id="crypto/elliptic"><dt><a href="/pkg/crypto/elliptic/">crypto/elliptic</a></dt>
- <dd>
- <p><!-- CL 320071, CL 320072, CL 320074, CL 361402, CL 360014 -->
- The <a href="/pkg/crypto/elliptic#P224"><code>P224</code></a>,
- <a href="/pkg/crypto/elliptic#P384"><code>P384</code></a>, and
- <a href="/pkg/crypto/elliptic#P521"><code>P521</code></a> curve
- implementations are now all backed by code generated by the
- <a href="https://github.com/mmcloughlin/addchain">addchain</a> and
- <a href="https://github.com/mit-plv/fiat-crypto">fiat-crypto</a>
- projects, the latter of which is based on a formally-verified model
- of the arithmetic operations. They now use safer complete formulas
- and internal APIs. P-224 and P-384 are now approximately four times
- faster. All specific curve implementations are now constant-time.
- </p>
-
- <p>
- Operating on invalid curve points (those for which the
- <code>IsOnCurve</code> method returns false, and which are never returned
- by <a href="/pkg/crypto/elliptic#Unmarshal"><code>Unmarshal</code></a> or
- a <code>Curve</code> method operating on a valid point) has always been
- undefined behavior, can lead to key recovery attacks, and is now
- unsupported by the new backend. If an invalid point is supplied to a
- <code>P224</code>, <code>P384</code>, or <code>P521</code> method, that
- method will now return a random point. The behavior might change to an
- explicit panic in a future release.
- </p>
- </dd>
-</dl><!-- crypto/elliptic -->
-
-<dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt>
- <dd>
- <p><!-- CL 325250 -->
- The new <a href="/pkg/crypto/tls/#Conn.NetConn"><code>Conn.NetConn</code></a>
- method allows access to the underlying
- <a href="/pkg/net#Conn"><code>net.Conn</code></a>.
- </p>
- </dd>
-</dl><!-- crypto/tls -->
-
-<dl id="crypto/x509"><dt><a href="/pkg/crypto/x509">crypto/x509</a></dt>
- <dd>
- <p><!-- CL 353132, CL 353403 -->
- <a href="/pkg/crypto/x509/#Certificate.Verify"><code>Certificate.Verify</code></a>
- now uses platform APIs to verify certificate validity on macOS and iOS when it
- is called with a nil
- <a href="/pkg/crypto/x509/#VerifyOpts.Roots"><code>VerifyOpts.Roots</code></a>
- or when using the root pool returned from
- <a href="/pkg/crypto/x509/#SystemCertPool"><code>SystemCertPool</code></a>.
- </p>
-
- <p><!-- CL 353589 -->
- <a href="/pkg/crypto/x509/#SystemCertPool"><code>SystemCertPool</code></a>
- is now available on Windows.
- </p>
-
- <p>
- On Windows, macOS, and iOS, when a
- <a href="/pkg/crypto/x509/#CertPool"><code>CertPool</code></a> returned by
- <a href="/pkg/crypto/x509/#SystemCertPool"><code>SystemCertPool</code></a>
- has additional certificates added to it,
- <a href="/pkg/crypto/x509/#Certificate.Verify"><code>Certificate.Verify</code></a>
- will do two verifications: one using the platform verifier APIs and the
- system roots, and one using the Go verifier and the additional roots.
- Chains returned by the platform verifier APIs will be prioritized.
- </p>
-
- <p>
- <a href="/pkg/crypto/x509/#CertPool.Subjects"><code>CertPool.Subjects</code></a>
- is deprecated. On Windows, macOS, and iOS the
- <a href="/pkg/crypto/x509/#CertPool"><code>CertPool</code></a> returned by
- <a href="/pkg/crypto/x509/#SystemCertPool"><code>SystemCertPool</code></a>
- will return a pool which does not include system roots in the slice
- returned by <code>Subjects</code>, as a static list can't appropriately
- represent the platform policies and might not be available at all from the
- platform APIs.
- </p>
- </dd>
-</dl>
-
-<dl id="debug/dwarf"><dt><a href="/pkg/debug/dwarf/">debug/dwarf</a></dt>
- <dd>
- <p><!-- CL 380714 -->
- The <a href="/pkg/debug/dwarf#StructField"><code>StructField</code></a>
- and <a href="/pkg/debug/dwarf#BasicType"><code>BasicType</code></a>
- structs both now have a <code>DataBitOffset</code> field, which
- holds the value of the <code>DW_AT_data_bit_offset</code>
- attribute if present.
- </dd>
-</dl>
-
-<dl id="debug/elf"><dt><a href="/pkg/debug/elf/">debug/elf</a></dt>
- <dd>
- <p><!-- CL 352829 -->
- The <a href="/pkg/debug/elf/#R_PPC64_RELATIVE"><code>R_PPC64_RELATIVE</code></a>
- constant has been added.
- </p>
- </dd>
-</dl><!-- debug/elf -->
-
-<dl id="debug/plan9obj"><dt><a href="/pkg/debug/plan9obj/">debug/plan9obj</a></dt>
- <dd>
- <p><!-- CL 350229 -->
- The <a href="/pkg/debug/plan9obj#File.Symbols">File.Symbols</a>
- method now returns the new exported error
- value <a href="/pkg/debug/plan9obj#ErrNoSymbols">ErrNoSymbols</a>
- if the file has no symbol section.
- </p>
- </dd>
-</dl><!-- debug/plan9obj -->
-
-<dl id="go/ast"><dt><a href="/pkg/go/ast/">go/ast</a></dt>
- <dd>
- <p><!-- https://golang.org/issue/47781, CL 325689, CL 327149, CL 348375, CL 348609 -->
- Per the proposal
- <a href="https://go.googlesource.com/proposal/+/master/design/47781-parameterized-go-ast.md">
- Additions to go/ast and go/token to support parameterized functions and types
- </a>
- the following additions are made to the <a href="/pkg/go/ast"><code>go/ast</code></a> package:
- <ul>
- <li>
- the <a href="/pkg/go/ast/#FuncType"><code>FuncType</code></a>
- and <a href="/pkg/go/ast/#TypeSpec"><code>TypeSpec</code></a>
- nodes have a new field <code>TypeParams</code> to hold type parameters, if any.
- </li>
- <li>
- The new expression node <a href="/pkg/go/ast/#IndexListExpr"><code>IndexListExpr</code></a>
- represents index expressions with multiple indices, used for function and type instantiations
- with more than one explicit type argument.
- </li>
- </ul>
- </p>
- </dd>
-</dl>
-
-<dl id="go/constant"><dt><a href="/pkg/go/constant/">go/constant</a></dt>
- <dd>
- <p><!-- https://golang.org/issue/46211, CL 320491 -->
- The new <a href="/pkg/go/constant/#Kind.String"><code>Kind.String</code></a>
- method returns a human-readable name for the receiver kind.
- </p>
- </dd>
-</dl>
-
-<dl id="go/token"><dt><a href="/pkg/go/token/">go/token</a></dt>
- <dd>
- <p><!-- https://golang.org/issue/47781, CL 324992 -->
- The new constant <a href="/pkg/go/token/#TILDE"><code>TILDE</code></a>
- represents the <code>~</code> token per the proposal
- <a href="https://go.googlesource.com/proposal/+/master/design/47781-parameterized-go-ast.md">
- Additions to go/ast and go/token to support parameterized functions and types
- </a>.
- </p>
- </dd>
-</dl>
-
-<dl id="go/types"><dt><a href="/pkg/go/types/">go/types</a></dt>
- <dd>
- <p><!-- https://golang.org/issue/46648 -->
- The new <a href="/pkg/go/types/#Config.GoVersion"><code>Config.GoVersion</code></a>
- field sets the accepted Go language version.
- </p>
-
- <p><!-- https://golang.org/issue/47916 -->
- Per the proposal
- <a href="https://go.googlesource.com/proposal/+/master/design/47916-parameterized-go-types.md">
- Additions to go/types to support type parameters
- </a>
- the following additions are made to the <a href="/pkg/go/types"><code>go/types</code></a> package:
- </p>
- <ul>
- <li>
- The new type
- <a href="/pkg/go/types/#TypeParam"><code>TypeParam</code></a>, factory function
- <a href="/pkg/go/types/#NewTypeParam"><code>NewTypeParam</code></a>,
- and associated methods are added to represent a type parameter.
- </li>
- <li>
- The new type
- <a href="/pkg/go/types/#TypeParamList"><code>TypeParamList</code></a> holds a list of
- type parameters.
- </li>
- <li>
- The new type
- <a href="/pkg/go/types/#TypeList"><code>TypeList</code></a> holds a list of types.
- </li>
- <li>
- The new factory function
- <a href="/pkg/go/types/#NewSignatureType"><code>NewSignatureType</code></a> allocates a
- <a href="/pkg/go/types/#Signature"><code>Signature</code></a> with
- (receiver or function) type parameters.
- To access those type parameters, the <code>Signature</code> type has two new methods
- <a href="/pkg/go/types/#Signature.RecvTypeParams"><code>Signature.RecvTypeParams</code></a> and
- <a href="/pkg/go/types/#Signature.TypeParams"><code>Signature.TypeParams</code></a>.
- </li>
- <li>
- <a href="/pkg/go/types/#Named"><code>Named</code></a> types have four new methods:
- <a href="/pkg/go/types/#Named.Origin"><code>Named.Origin</code></a> to get the original
- parameterized types of instantiated types,
- <a href="/pkg/go/types/#Named.TypeArgs"><code>Named.TypeArgs</code></a> and
- <a href="/pkg/go/types/#Named.TypeParams"><code>Named.TypeParams</code></a> to get the
- type arguments or type parameters of an instantiated or parameterized type, and
- <a href="/pkg/go/types/#Named.TypeParams"><code>Named.SetTypeParams</code></a> to set the
- type parameters (for instance, when importing a named type where allocation of the named
- type and setting of type parameters cannot be done simultaneously due to possible cycles).
- </li>
- <li>
- The <a href="/pkg/go/types/#Interface"><code>Interface</code></a> type has four new methods:
- <a href="/pkg/go/types/#Interface.IsComparable"><code>Interface.IsComparable</code></a> and
- <a href="/pkg/go/types/#Interface.IsMethodSet"><code>Interface.IsMethodSet</code></a> to
- query properties of the type set defined by the interface, and
- <a href="/pkg/go/types/#Interface.MarkImplicit"><code>Interface.MarkImplicit</code></a> and
- <a href="/pkg/go/types/#Interface.IsImplicit"><code>Interface.IsImplicit</code></a> to set
- and test whether the interface is an implicit interface around a type constraint literal.
- </li>
- <li>
- The new types
- <a href="/pkg/go/types/#Union"><code>Union</code></a> and
- <a href="/pkg/go/types/#Term"><code>Term</code></a>, factory functions
- <a href="/pkg/go/types/#NewUnion"><code>NewUnion</code></a> and
- <a href="/pkg/go/types/#NewTerm"><code>NewTerm</code></a>, and associated
- methods are added to represent type sets in interfaces.
- </li>
- <li>
- The new function
- <a href="/pkg/go/types/#Instantiate"><code>Instantiate</code></a>
- instantiates a parameterized type.
- </li>
- <li>
- The new <a href="/pkg/go/types/#Info.Instances"><code>Info.Instances</code></a>
- map records function and type instantiations through the new
- <a href="/pkg/go/types/#Instance"><code>Instance</code></a> type.
- </li>
- <li><!-- CL 342671 -->
- The new type <a href="/pkg/go/types/#ArgumentError"><code>ArgumentError</code></a>
- and associated methods are added to represent an error related to a type argument.
- </li>
- <li><!-- CL 353089 -->
- The new type <a href="/pkg/go/types/#Context"><code>Context</code></a> and factory function
- <a href="/pkg/go/types/#NewContext"><code>NewContext</code></a>
- are added to facilitate sharing of identical type instances
- across type-checked packages, via the new
- <a href="/pkg/go/types/#Config.Context"><code>Config.Context</code></a>
- field.
- </li>
- </ul>
- <p>
- The predicates
- <a href="/pkg/go/types/#AssignableTo"><code>AssignableTo</code></a>,
- <a href="/pkg/go/types/#ConvertibleTo"><code>ConvertibleTo</code></a>,
- <a href="/pkg/go/types/#Implements"><code>Implements</code></a>,
- <a href="/pkg/go/types/#Identical"><code>Identical</code></a>,
- <a href="/pkg/go/types/#IdenticalIgnoreTags"><code>IdenticalIgnoreTags</code></a>, and
- <a href="/pkg/go/types/#AssertableTo"><code>AssertableTo</code></a>
- now also work with arguments that are or contain generalized interfaces, i.e. interfaces
- that may only be used as type constraints in Go code.
- Note that the behavior of <code>AssertableTo</code> is undefined if the first argument
- is a generalized interface.
- </p>
- </dd>
-</dl>
-
-<dl id="html/template"><dt><a href="/pkg/html/template/">html/template</a></dt>
- <dd>
- <p><!-- CL 321491 -->
- Within a <code>range</code> pipeline the new
- <code>{{break}}</code> command will end the loop early and the
- new <code>{{continue}}</code> command will immediately start the
- next loop iteration.
- </p>
-
- <p><!-- CL 321490 -->
- The <code>and</code> function no longer always evaluates all arguments; it
- stops evaluating arguments after the first argument that evaluates to
- false. Similarly, the <code>or</code> function now stops evaluating
- arguments after the first argument that evaluates to true. This makes a
- difference if any of the arguments is a function call.
- </p>
- </dd>
-</dl><!-- html/template -->
-
-<dl id="image/draw"><dt><a href="/pkg/image/draw/">image/draw</a></dt>
- <dd>
- <p><!-- CL 340049 -->
- The <code>Draw</code> and <code>DrawMask</code> fallback implementations
- (used when the arguments are not the most common image types) are now
- faster when those arguments implement the optional
- <a href="/pkg/image/draw/#RGBA64Image"><code>draw.RGBA64Image</code></a>
- and <a href="/pkg/image/#RGBA64Image"><code>image.RGBA64Image</code></a>
- interfaces that were added in Go 1.17.
- </p>
- </dd>
-</dl><!-- image/draw -->
-
-<dl id="net"><dt><a href="/pkg/net/">net</a></dt>
- <dd>
- <p><!-- CL 340261 -->
- <a href="/pkg/net#Error"><code>net.Error.Temporary</code></a> has been deprecated.
- </p>
- </dd>
-</dl><!-- net -->
-
-<dl id="net/http"><dt><a href="/pkg/net/http/">net/http</a></dt>
- <dd>
- <p><!-- CL 330852 -->
- On WebAssembly targets, the <code>Dial</code>, <code>DialContext</code>,
- <code>DialTLS</code> and <code>DialTLSContext</code> method fields in
- <a href="/pkg/net/http/#Transport"><code>Transport</code></a>
- will now be correctly used, if specified, for making HTTP requests.
- </p>
-
- <p><!-- CL 338590 -->
- The new
- <a href="/pkg/net/http#Cookie.Valid"><code>Cookie.Valid</code></a>
- method reports whether the cookie is valid.
- </p>
-
- <p><!-- CL 346569 -->
- The new
- <a href="/pkg/net/http#MaxBytesHandler"><code>MaxBytesHandler</code></a>
- function creates a <code>Handler</code> that wraps its
- <code>ResponseWriter</code> and <code>Request.Body</code> with a
- <a href="/pkg/net/http#MaxBytesReader"><code>MaxBytesReader</code></a>.
- </p>
- </dd>
-</dl><!-- net/http -->
-
-<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>
- now uses a Go native implementation when cgo is not available.
- </p>
- </dd>
-</dl><!-- os/user -->
-
-<dl id="reflect"><dt><a href="/pkg/reflect/">reflect</a></dt>
- <dd>
- <p><!-- CL 356049, CL 320929 -->
- The new
- <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
- do fewer allocations.
- </p>
-
- <p><!-- CL 350691 -->
- The new
- <a href="/pkg/reflect/#Value.UnsafePointer"><code>Value.UnsafePointer</code></a>
- method returns the Value's value as an <a href="/pkg/unsafe/#Pointer"><code>unsafe.Pointer</code></a>.
- This allows callers to migrate from <a href="/pkg/reflect/#Value.UnsafeAddr"><code>Value.UnsafeAddr</code></a>
- and <a href="/pkg/reflect/#Value.Pointer"><code>Value.Pointer</code></a>
- to eliminate the need to perform uintptr to unsafe.Pointer conversions at the callsite (as unsafe.Pointer rules require).
- </p>
-
- <p><!-- CL 321891 -->
- The new
- <a href="/pkg/reflect/#MapIter.Reset"><code>MapIter.Reset</code></a>
- method changes its receiver to iterate over a
- different map. The use of
- <a href="/pkg/reflect/#MapIter.Reset"><code>MapIter.Reset</code></a>
- allows allocation-free iteration
- over many maps.
- </p>
-
- <p><!-- CL 352131 -->
- A number of methods (
- <a href="/pkg/reflect#Value.CanInt"><code>Value.CanInt</code></a>,
- <a href="/pkg/reflect#Value.CanUint"><code>Value.CanUint</code></a>,
- <a href="/pkg/reflect#Value.CanFloat"><code>Value.CanFloat</code></a>,
- <a href="/pkg/reflect#Value.CanComplex"><code>Value.CanComplex</code></a>
- )
- have been added to
- <a href="/pkg/reflect#Value"><code>Value</code></a>
- to test if a conversion is safe.
- </p>
-
- <p><!-- CL 357962 -->
- <a href="/pkg/reflect#Value.FieldByIndexErr"><code>Value.FieldByIndexErr</code></a>
- has been added to avoid the panic that occurs in
- <a href="/pkg/reflect#Value.FieldByIndex"><code>Value.FieldByIndex</code></a>
- when stepping through a nil pointer to an embedded struct.
- </p>
-
- <p><!-- CL 341333 -->
- <a href="/pkg/reflect#Ptr"><code>reflect.Ptr</code></a> and
- <a href="/pkg/reflect#PtrTo"><code>reflect.PtrTo</code></a>
- have been renamed to
- <a href="/pkg/reflect#Pointer"><code>reflect.Pointer</code></a> and
- <a href="/pkg/reflect#PointerTo"><code>reflect.PointerTo</code></a>,
- respectively, for consistency with the rest of the reflect package.
- The old names will continue to work, but will be deprecated in a
- future Go release.
- </p>
- </dd><!-- CL 321889 and CL 345486 are optimizations, no need to mention. -->
-</dl><!-- reflect -->
-
-<dl id="regexp"><dt><a href="/pkg/regexp/">regexp</a></dt>
- <dd>
- <p><!-- CL 354569 -->
- <a href="/pkg/regexp/"><code>regexp</code></a>
- now treats each invalid byte of a UTF-8 string as <code>U+FFFD</code>.
- </p>
- </dd>
-</dl><!-- regexp -->
-
-<dl id="runtime/debug"><dt><a href="/pkg/runtime/debug/">runtime/debug</a></dt>
- <dd>
- <p><!-- CL 354569 -->
- The <a href="/pkg/runtime/debug#BuildInfo"><code>BuildInfo</code></a>
- struct has two new fields, containing additional information
- about how the binary was built:
- <ul>
- <li><a href="/pkg/runtime/debug#BuildInfo.GoVersion"><code>GoVersion</code></a>
- holds the version of Go used to build the binary.
- </li>
- <li>
- <a href="/pkg/runtime/debug#BuildInfo.Settings"><code>Settings</code></a>
- is a slice of
- <a href="/pkg/runtime/debug#BuildSettings"><code>BuildSettings</code></a>
- structs holding key/value pairs describing the build.
- </li>
- </ul>
- </p>
- </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 -->
- <a href="/pkg/strconv/#strconv.Unquote"><code>strconv.Unquote</code></a>
- now rejects Unicode surrogate halves.
- </p>
- </dd>
-</dl><!-- strconv -->
-
-<dl id="strings"><dt><a href="/pkg/strings/">strings</a></dt>
- <dd>
- <p><!-- CL 351710 -->
- The new <a href="/pkg/strings/#Cut"><code>Cut</code></a> function
- slices a <code>string</code> around a separator. It can replace
- and simplify many common uses of
- <a href="/pkg/strings/#Index"><code>Index</code></a>,
- <a href="/pkg/strings/#IndexByte"><code>IndexByte</code></a>,
- <a href="/pkg/strings/#IndexRune"><code>IndexRune</code></a>,
- and <a href="/pkg/strings/#SplitN"><code>SplitN</code></a>.
- </p>
-
- <p><!-- CL 345849 -->
- The new <a href="/pkg/strings/#Clone"><code>Clone</code></a> function copies the input
- <code>string</code> without the returned cloned <code>string</code> referencing
- the input string's memory.
- </p>
-
- <p><!-- CL 323318, CL 332771 -->
- <a href="/pkg/strings/#Trim"><code>Trim</code></a>, <a href="/pkg/strings/#TrimLeft"><code>TrimLeft</code></a>,
- and <a href="/pkg/strings/#TrimRight"><code>TrimRight</code></a> are now allocation free and, especially for
- small ASCII cutsets, up to 10 times faster.
- </p>
-
- <p><!-- CL 359485 -->
- The <a href="/pkg/strings/#Title"><code>Title</code></a> function is now deprecated. It doesn't
- handle Unicode punctuation and language-specific capitalization rules, and is superseded by the
- <a href="https://golang.org/x/text/cases">golang.org/x/text/cases</a> package.
- </p>
- </dd>
-</dl><!-- strings -->
-
-<dl id="sync"><dt><a href="/pkg/sync/">sync</a></dt>
- <dd>
- <p><!-- CL 319769 -->
- The new methods
- <a href="/pkg/sync#Mutex.TryLock"><code>Mutex.TryLock</code></a>,
- <a href="/pkg/sync#RWMutex.TryLock"><code>RWMutex.TryLock</code></a>, and
- <a href="/pkg/sync#RWMutex.TryRLock"><code>RWMutex.TryRLock</code></a>,
- will acquire the lock if it is not currently held.
- </p>
- </dd>
-</dl><!-- sync -->
-
-<dl id="syscall"><dt><a href="/pkg/syscall/">syscall</a></dt>
- <dd>
- <p><!-- CL 336550 -->
- The new function <a href="/pkg/syscall/?GOOS=windows#SyscallN"><code>SyscallN</code></a>
- has been introduced for Windows, allowing for calls with arbitrary number
- of arguments. As a result,
- <a href="/pkg/syscall/?GOOS=windows#Syscall"><code>Syscall</code></a>,
- <a href="/pkg/syscall/?GOOS=windows#Syscall6"><code>Syscall6</code></a>,
- <a href="/pkg/syscall/?GOOS=windows#Syscall9"><code>Syscall9</code></a>,
- <a href="/pkg/syscall/?GOOS=windows#Syscall12"><code>Syscall12</code></a>,
- <a href="/pkg/syscall/?GOOS=windows#Syscall15"><code>Syscall15</code></a>, and
- <a href="/pkg/syscall/?GOOS=windows#Syscall18"><code>Syscall18</code></a> are
- deprecated in favor of <a href="/pkg/syscall/?GOOS=windows#SyscallN"><code>SyscallN</code></a>.
- </p>
-
- <p><!-- CL 355570 -->
- <a href="/pkg/syscall/?GOOS=freebsd#SysProcAttr.Pdeathsig"><code>SysProcAttr.Pdeathsig</code></a>
- is now supported in FreeBSD.
- </p>
- </dd>
-</dl><!-- syscall -->
-
-<dl id="syscall/js"><dt><a href="/pkg/syscall/js/">syscall/js</a></dt>
- <dd>
- <p><!-- CL 356430 -->
- The <code>Wrapper</code> interface has been removed.
- </p>
- </dd>
-</dl><!-- syscall/js -->
-
-<dl id="testing"><dt><a href="/pkg/testing/">testing</a></dt>
- <dd>
- <p><!-- CL 343883 -->
- The precedence of <code>/</code> in the argument for <code>-run</code> and
- <code>-bench</code> has been increased. <code>A/B|C/D</code> used to be
- treated as <code>A/(B|C)/D</code> and is now treated as
- <code>(A/B)|(C/D)</code>.
- </p>
-
- <p><!-- CL 356669 -->
- If the <code>-run</code> option does not select any tests, the
- <code>-count</code> option is ignored. This could change the behavior of
- existing tests in the unlikely case that a test changes the set of subtests
- that are run each time the test function itself is run.
- </p>
-
- <p><!-- CL 251441 -->
- The new <a href="/pkg/testing#F"><code>testing.F</code></a> type
- is used by the new <a href="#fuzzing">fuzzing support described
- above</a>. Tests also now support the command line
- options <code>-test.fuzz</code>, <code>-test.fuzztime</code>, and
- <code>-test.fuzzminimizetime</code>.
- </p>
- </dd>
-</dl><!-- testing -->
-
-<dl id="text/template"><dt><a href="/pkg/text/template/">text/template</a></dt>
- <dd>
- <p><!-- CL 321491 -->
- Within a <code>range</code> pipeline the new
- <code>{{break}}</code> command will end the loop early and the
- new <code>{{continue}}</code> command will immediately start the
- next loop iteration.
- </p>
-
- <p><!-- CL 321490 -->
- The <code>and</code> function no longer always evaluates all arguments; it
- stops evaluating arguments after the first argument that evaluates to
- false. Similarly, the <code>or</code> function now stops evaluating
- arguments after the first argument that evaluates to true. This makes a
- difference if any of the arguments is a function call.
- </p>
- </dd>
-</dl><!-- text/template -->
-
-<dl id="text/template/parse"><dt><a href="/pkg/text/template/parse/">text/template/parse</a></dt>
- <dd>
- <p><!-- CL 321491 -->
- The package supports the new
- <a href="/pkg/text/template/">text/template</a> and
- <a href="/pkg/html/template/">html/template</a>
- <code>{{break}}</code> command via the new constant
- <a href="/pkg/text/template/parse#NodeBreak"><code>NodeBreak</code></a>
- and the new type
- <a href="/pkg/text/template/parse#BreakNode"><code>BreakNode</code></a>,
- and similarly supports the new <code>{{continue}}</code> command
- via the new constant
- <a href="/pkg/text/template/parse#NodeContinue"><code>NodeContinue</code></a>
- and the new type
- <a href="/pkg/text/template/parse#ContinueNode"><code>ContinueNode</code></a>.
- </p>
- </dd>
-</dl><!-- text/template -->
-
-<dl id="unicode/utf8"><dt><a href="/pkg/unicode/utf8/">unicode/utf8</a></dt>
- <dd>
- <p><!-- CL 345571 -->
- 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>
-</dl><!-- unicode/utf8 -->
diff --git a/doc/go_mem.html b/doc/go_mem.html
index 5f1eb68..661e1e7 100644
--- a/doc/go_mem.html
+++ b/doc/go_mem.html
@@ -1,6 +1,6 @@
<!--{
"Title": "The Go Memory Model",
- "Subtitle": "Version of May 31, 2014",
+ "Subtitle": "Version of June 6, 2022",
"Path": "/ref/mem"
}-->
@@ -8,12 +8,9 @@
p.rule {
font-style: italic;
}
-span.event {
- font-style: italic;
-}
</style>
-<h2>Introduction</h2>
+<h2 id="introduction">Introduction</h2>
<p>
The Go memory model specifies the conditions under which
@@ -22,7 +19,7 @@
</p>
-<h2>Advice</h2>
+<h3 id="advice">Advice</h3>
<p>
Programs that modify data being simultaneously accessed by multiple goroutines
@@ -44,90 +41,237 @@
Don't be clever.
</p>
-<h2>Happens Before</h2>
+<h3 id="overview">Informal Overview</h3>
<p>
-Within a single goroutine, reads and writes must behave
-as if they executed in the order specified by the program.
-That is, compilers and processors may reorder the reads and writes
-executed within a single goroutine only when the reordering
-does not change the behavior within that goroutine
-as defined by the language specification.
-Because of this reordering, the execution order observed
-by one goroutine may differ from the order perceived
-by another. For example, if one goroutine
-executes <code>a = 1; b = 2;</code>, another might observe
-the updated value of <code>b</code> before the updated value of <code>a</code>.
+Go approaches its memory model in much the same way as the rest of the language,
+aiming to keep the semantics simple, understandable, and useful.
+This section gives a general overview of the approach and should suffice for most programmers.
+The memory model is specified more formally in the next section.
</p>
<p>
-To specify the requirements of reads and writes, we define
-<i>happens before</i>, a partial order on the execution
-of memory operations in a Go program. If event <span class="event">e<sub>1</sub></span> happens
-before event <span class="event">e<sub>2</sub></span>, then we say that <span class="event">e<sub>2</sub></span> happens after <span class="event">e<sub>1</sub></span>.
-Also, if <span class="event">e<sub>1</sub></span> does not happen before <span class="event">e<sub>2</sub></span> and does not happen
-after <span class="event">e<sub>2</sub></span>, then we say that <span class="event">e<sub>1</sub></span> and <span class="event">e<sub>2</sub></span> happen concurrently.
-</p>
-
-<p class="rule">
-Within a single goroutine, the happens-before order is the
-order expressed by the program.
+A <em>data race</em> is defined as
+a write to a memory location happening concurrently with another read or write to that same location,
+unless all the accesses involved are atomic data accesses as provided by the <code>sync/atomic</code> package.
+As noted already, programmers are strongly encouraged to use appropriate synchronization
+to avoid data races.
+In the absence of data races, Go programs behave as if all the goroutines
+were multiplexed onto a single processor.
+This property is sometimes referred to as DRF-SC: data-race-free programs
+execute in a sequentially consistent manner.
</p>
<p>
-A read <span class="event">r</span> of a variable <code>v</code> is <i>allowed</i> to observe a write <span class="event">w</span> to <code>v</code>
-if both of the following hold:
+While programmers should write Go programs without data races,
+there are limitations to what a Go implementation can do in response to a data race.
+An implementation may always react to a data race by reporting the race and terminating the program.
+Otherwise, each read of a single-word-sized or sub-word-sized memory location
+must observe a value actually written to that location (perhaps by a concurrent executing goroutine)
+and not yet overwritten.
+These implementation constraints make Go more like Java or JavaScript,
+in that most races have a limited number of outcomes,
+and less like C and C++, where the meaning of any program with a race
+is entirely undefined, and the compiler may do anything at all.
+Go's approach aims to make errant programs more reliable and easier to debug,
+while still insisting that races are errors and that tools can diagnose and report them.
</p>
+<h2 id="model">Memory Model</h2>
+
+<p>
+The following formal definition of Go's memory model closely follows
+the approach presented by Hans-J. Boehm and Sarita V. Adve in
+“<a href="https://www.hpl.hp.com/techreports/2008/HPL-2008-56.pdf">Foundations of the C++ Concurrency Memory Model</a>”,
+published in PLDI 2008.
+The definition of data-race-free programs and the guarantee of sequential consistency
+for race-free programs are equivalent to the ones in that work.
+</p>
+
+<p>
+The memory model describes the requirements on program executions,
+which are made up of goroutine executions,
+which in turn are made up of memory operations.
+</p>
+
+<p>
+A <i>memory operation</i> is modeled by four details:
+</p>
+<ul>
+<li>its kind, indicating whether it is an ordinary data read, an ordinary data write,
+or a <i>synchronizing operation</i> such as an atomic data access,
+a mutex operation, or a channel operation,
+<li>its location in the program,
+<li>the memory location or variable being accessed, and
+<li>the values read or written by the operation.
+</ul>
+<p>
+Some memory operations are <i>read-like</i>, including read, atomic read, mutex lock, and channel receive.
+Other memory operations are <i>write-like</i>, including write, atomic write, mutex unlock, channel send, and channel close.
+Some, such as atomic compare-and-swap, are both read-like and write-like.
+</p>
+
+<p>
+A <i>goroutine execution</i> is modeled as a set of memory operations executed by a single goroutine.
+</p>
+
+<p>
+<b>Requirement 1</b>:
+The memory operations in each goroutine must correspond to a correct sequential execution of that goroutine,
+given the values read from and written to memory.
+That execution must be consistent with the <i>sequenced before</i> relation,
+defined as the partial order requirements set out by the <a href="/ref/spec">Go language specification</a>
+for Go's control flow constructs as well as the <a href="/ref/spec#Order_of_evaluation">order of evaluation for expressions</a>.
+</p>
+
+<p>
+A Go <i>program execution</i> is modeled as a set of goroutine executions,
+together with a mapping <i>W</i> that specifies the write-like operation that each read-like operation reads from.
+(Multiple executions of the same program can have different program executions.)
+</p>
+
+<p>
+<b>Requirement 2</b>:
+For a given program execution, the mapping <i>W</i>, when limited to synchronizing operations,
+must be explainable by some implicit total order of the synchronizing operations
+that is consistent with sequencing and the values read and written by those operations.
+</p>
+
+<p>
+The <i>synchronized before</i> relation is a partial order on synchronizing memory operations,
+derived from <i>W</i>.
+If a synchronizing read-like memory operation <i>r</i>
+observes a synchronizing write-like memory operation <i>w</i>
+(that is, if <i>W</i>(<i>r</i>) = <i>w</i>),
+then <i>w</i> is synchronized before <i>r</i>.
+Informally, the synchronized before relation is a subset of the implied total order
+mentioned in the previous paragraph,
+limited to the information that <i>W</i> directly observes.
+</p>
+
+<p>
+The <i>happens before</i> relation is defined as the transitive closure of the
+union of the sequenced before and synchronized before relations.
+</p>
+
+<p>
+<b>Requirement 3</b>:
+For an ordinary (non-synchronizing) data read <i>r</i> on a memory location <i>x</i>,
+<i>W</i>(<i>r</i>) must be a write <i>w</i> that is <i>visible</i> to <i>r</i>,
+where visible means that both of the following hold:
+
<ol>
-<li><span class="event">r</span> does not happen before <span class="event">w</span>.</li>
-<li>There is no other write <span class="event">w'</span> to <code>v</code> that happens
- after <span class="event">w</span> but before <span class="event">r</span>.</li>
+<li><i>w</i> happens before <i>r</i>.
+<li><i>w</i> does not happen before any other write <i>w'</i> (to <i>x</i>) that happens before <i>r</i>.
</ol>
<p>
-To guarantee that a read <span class="event">r</span> of a variable <code>v</code> observes a
-particular write <span class="event">w</span> to <code>v</code>, ensure that <span class="event">w</span> is the only
-write <span class="event">r</span> is allowed to observe.
-That is, <span class="event">r</span> is <i>guaranteed</i> to observe <span class="event">w</span> if both of the following hold:
-</p>
-
-<ol>
-<li><span class="event">w</span> happens before <span class="event">r</span>.</li>
-<li>Any other write to the shared variable <code>v</code>
-either happens before <span class="event">w</span> or after <span class="event">r</span>.</li>
-</ol>
-
-<p>
-This pair of conditions is stronger than the first pair;
-it requires that there are no other writes happening
-concurrently with <span class="event">w</span> or <span class="event">r</span>.
+A <i>read-write data race</i> on memory location <i>x</i>
+consists of a read-like memory operation <i>r</i> on <i>x</i>
+and a write-like memory operation <i>w</i> on <i>x</i>,
+at least one of which is non-synchronizing,
+which are unordered by happens before
+(that is, neither <i>r</i> happens before <i>w</i>
+nor <i>w</i> happens before <i>r</i>).
</p>
<p>
-Within a single goroutine,
-there is no concurrency, so the two definitions are equivalent:
-a read <span class="event">r</span> observes the value written by the most recent write <span class="event">w</span> to <code>v</code>.
-When multiple goroutines access a shared variable <code>v</code>,
-they must use synchronization events to establish
-happens-before conditions that ensure reads observe the
-desired writes.
+A <i>write-write data race</i> on memory location <i>x</i>
+consists of two write-like memory operations <i>w</i> and <i>w'</i> on <i>x</i>,
+at least one of which is non-synchronizing,
+which are unordered by happens before.
</p>
<p>
-The initialization of variable <code>v</code> with the zero value
-for <code>v</code>'s type behaves as a write in the memory model.
+Note that if there are no read-write or write-write data races on memory location <i>x</i>,
+then any read <i>r</i> on <i>x</i> has only one possible <i>W</i>(<i>r</i>):
+the single <i>w</i> that immediately precedes it in the happens before order.
</p>
<p>
-Reads and writes of values larger than a single machine word
-behave as multiple machine-word-sized operations in an
-unspecified order.
+More generally, it can be shown that any Go program that is data-race-free,
+meaning it has no program executions with read-write or write-write data races,
+can only have outcomes explained by some sequentially consistent interleaving
+of the goroutine executions.
+(The proof is the same as Section 7 of Boehm and Adve's paper cited above.)
+This property is called DRF-SC.
</p>
-<h2>Synchronization</h2>
+<p>
+The intent of the formal definition is to match
+the DRF-SC guarantee provided to race-free programs
+by other languages, including C, C++, Java, JavaScript, Rust, and Swift.
+</p>
-<h3>Initialization</h3>
+<p>
+Certain Go language operations such as goroutine creation and memory allocation
+act as synchronization operations.
+The effect of these operations on the synchronized-before partial order
+is documented in the “Synchronization” section below.
+Individual packages are responsible for providing similar documentation
+for their own operations.
+</p>
+
+<h2 id="restrictions">Implementation Restrictions for Programs Containing Data Races</h2>
+
+<p>
+The preceding section gave a formal definition of data-race-free program execution.
+This section informally describes the semantics that implementations must provide
+for programs that do contain races.
+</p>
+
+<p>
+First, any implementation can, upon detecting a data race,
+report the race and halt execution of the program.
+Implementations using ThreadSanitizer
+(accessed with “<code>go</code> <code>build</code> <code>-race</code>”)
+do exactly this.
+</p>
+
+<p>
+Otherwise, a read <i>r</i> of a memory location <i>x</i>
+that is not larger than a machine word must observe
+some write <i>w</i> such that <i>r</i> does not happen before <i>w</i>
+and there is no write <i>w'</i> such that <i>w</i> happens before <i>w'</i>
+and <i>w'</i> happens before <i>r</i>.
+That is, each read must observe a value written by a preceding or concurrent write.
+</p>
+
+<p>
+Additionally, observation of acausal and “out of thin air” writes is disallowed.
+</p>
+
+<p>
+Reads of memory locations larger than a single machine word
+are encouraged but not required to meet the same semantics
+as word-sized memory locations,
+observing a single allowed write <i>w</i>.
+For performance reasons,
+implementations may instead treat larger operations
+as a set of individual machine-word-sized operations
+in an unspecified order.
+This means that races on multiword data structures
+can lead to inconsistent values not corresponding to a single write.
+When the values depend on the consistency
+of internal (pointer, length) or (pointer, type) pairs,
+as can be the case for interface values, maps,
+slices, and strings in most Go implementations,
+such races can in turn lead to arbitrary memory corruption.
+</p>
+
+<p>
+Examples of incorrect synchronization are given in the
+“Incorrect synchronization” section below.
+</p>
+
+<p>
+Examples of the limitations on implementations are given in the
+“Incorrect compilation” section below.
+</p>
+
+<h2 id="synchronization">Synchronization</h2>
+
+<h3 id="init">Initialization</h3>
<p>
Program initialization runs in a single goroutine,
@@ -141,15 +285,15 @@
</p>
<p class="rule">
-The start of the function <code>main.main</code> happens after
-all <code>init</code> functions have finished.
+The completion of all <code>init</code> functions is synchronized before
+the start of the function <code>main.main</code>.
</p>
-<h3>Goroutine creation</h3>
+<h3 id="go">Goroutine creation</h3>
<p class="rule">
The <code>go</code> statement that starts a new goroutine
-happens before the goroutine's execution begins.
+is synchronized before the start of the goroutine's execution.
</p>
<p>
@@ -174,11 +318,12 @@
at some point in the future (perhaps after <code>hello</code> has returned).
</p>
-<h3>Goroutine destruction</h3>
+<h3 id="goexit">Goroutine destruction</h3>
<p>
-The exit of a goroutine is not guaranteed to happen before
-any event in the program. For example, in this program:
+The exit of a goroutine is not guaranteed to be synchronized before
+any event in the program.
+For example, in this program:
</p>
<pre>
@@ -203,7 +348,7 @@
communication to establish a relative ordering.
</p>
-<h3>Channel communication</h3>
+<h3 id="chan">Channel communication</h3>
<p>
Channel communication is the main method of synchronization
@@ -213,8 +358,8 @@
</p>
<p class="rule">
-A send on a channel happens before the corresponding
-receive from that channel completes.
+A send on a channel is synchronized before the completion of the
+corresponding receive from that channel.
</p>
<p>
@@ -239,13 +384,13 @@
<p>
is guaranteed to print <code>"hello, world"</code>. The write to <code>a</code>
-happens before the send on <code>c</code>, which happens before
-the corresponding receive on <code>c</code> completes, which happens before
+is sequenced before the send on <code>c</code>, which is synchronized before
+the corresponding receive on <code>c</code> completes, which is sequenced before
the <code>print</code>.
</p>
<p class="rule">
-The closing of a channel happens before a receive that returns a zero value
+The closing of a channel is synchronized before a receive that returns a zero value
because the channel is closed.
</p>
@@ -256,8 +401,8 @@
</p>
<p class="rule">
-A receive from an unbuffered channel happens before
-the send on that channel completes.
+A receive from an unbuffered channel is synchronized before the completion of
+the corresponding send on that channel.
</p>
<p>
@@ -283,8 +428,8 @@
<p>
is also guaranteed to print <code>"hello, world"</code>. The write to <code>a</code>
-happens before the receive on <code>c</code>, which happens before
-the corresponding send on <code>c</code> completes, which happens
+is sequenced before the receive on <code>c</code>, which is synchronized before
+the corresponding send on <code>c</code> completes, which is sequenced
before the <code>print</code>.
</p>
@@ -296,7 +441,7 @@
</p>
<p class="rule">
-The <i>k</i>th receive on a channel with capacity <i>C</i> happens before the <i>k</i>+<i>C</i>th send from that channel completes.
+The <i>k</i>th receive on a channel with capacity <i>C</i> is synchronized before the completion of the <i>k</i>+<i>C</i>th send from that channel completes.
</p>
<p>
@@ -330,7 +475,7 @@
}
</pre>
-<h3>Locks</h3>
+<h3 id="locks">Locks</h3>
<p>
The <code>sync</code> package implements two lock data types,
@@ -339,7 +484,7 @@
<p class="rule">
For any <code>sync.Mutex</code> or <code>sync.RWMutex</code> variable <code>l</code> and <i>n</i> < <i>m</i>,
-call <i>n</i> of <code>l.Unlock()</code> happens before call <i>m</i> of <code>l.Lock()</code> returns.
+call <i>n</i> of <code>l.Unlock()</code> is synchronized before call <i>m</i> of <code>l.Lock()</code> returns.
</p>
<p>
@@ -365,19 +510,29 @@
<p>
is guaranteed to print <code>"hello, world"</code>.
-The first call to <code>l.Unlock()</code> (in <code>f</code>) happens
+The first call to <code>l.Unlock()</code> (in <code>f</code>) is synchronized
before the second call to <code>l.Lock()</code> (in <code>main</code>) returns,
-which happens before the <code>print</code>.
+which is sequenced before the <code>print</code>.
</p>
<p class="rule">
For any call to <code>l.RLock</code> on a <code>sync.RWMutex</code> variable <code>l</code>,
-there is an <i>n</i> such that the <code>l.RLock</code> happens (returns) after call <i>n</i> to
-<code>l.Unlock</code> and the matching <code>l.RUnlock</code> happens
-before call <i>n</i>+1 to <code>l.Lock</code>.
+there is an <i>n</i> such that the <i>n</i>th call to <code>l.Unlock</code>
+is synchronized before the return from <code>l.RLock</code>,
+and the matching call to <code>l.RUnlock</code> is synchronized before the return from call <i>n</i>+1 to <code>l.Lock</code>.
</p>
-<h3>Once</h3>
+<p class="rule">
+A successful call to <code>l.TryLock</code> (or <code>l.TryRLock</code>)
+is equivalent to a call to <code>l.Lock</code> (or <code>l.RLock</code>).
+An unsuccessful call has no synchronizing effect at all.
+As far as the memory model is concerned,
+<code>l.TryLock</code> (or <code>l.TryRLock</code>)
+may be considered to be able to return false
+even when the mutex <i>l</i> is unlocked.
+</p>
+
+<h3 id="once">Once</h3>
<p>
The <code>sync</code> package provides a safe mechanism for
@@ -389,7 +544,8 @@
</p>
<p class="rule">
-A single call of <code>f()</code> from <code>once.Do(f)</code> happens (returns) before any call of <code>once.Do(f)</code> returns.
+The completion of a single call of <code>f()</code> from <code>once.Do(f)</code>
+is synchronized before the return of any call of <code>once.Do(f)</code>.
</p>
<p>
@@ -424,13 +580,60 @@
twice.
</p>
-<h2>Incorrect synchronization</h2>
+<h3 id="atomic">Atomic Values</h3>
<p>
-Note that a read <span class="event">r</span> may observe the value written by a write <span class="event">w</span>
-that happens concurrently with <span class="event">r</span>.
-Even if this occurs, it does not imply that reads happening after <span class="event">r</span>
-will observe writes that happened before <span class="event">w</span>.
+The APIs in the <a href="/pkg/sync/atomic/"><code>sync/atomic</code></a>
+package are collectively “atomic operations”
+that can be used to synchronize the execution of different goroutines.
+If the effect of an atomic operation <i>A</i> is observed by atomic operation <i>B</i>,
+then <i>A</i> is synchronized before <i>B</i>.
+All the atomic operations executed in a program behave as though executed
+in some sequentially consistent order.
+</p>
+
+<p>
+The preceding definition has the same semantics as C++’s sequentially consistent atomics
+and Java’s <code>volatile</code> variables.
+</p>
+
+<h3 id="finalizer">Finalizers</h3>
+
+<p>
+The <a href="/pkg/runtime/"><code>runtime</code></a> package provides
+a <code>SetFinalizer</code> function that adds a finalizer to be called when
+a particular object is no longer reachable by the program.
+A call to <code>SetFinalizer(x, f)</code> is synchronized before the finalization call <code>f(x)</code>.
+</p>
+
+<h3 id="more">Additional Mechanisms</h3>
+
+<p>
+The <code>sync</code> package provides additional synchronization abstractions,
+including <a href="/pkg/sync/#Cond">condition variables</a>,
+<a href="/pkg/sync/#Map">lock-free maps</a>,
+<a href="/pkg/sync/#Pool">allocation pools</a>,
+and
+<a href="/pkg/sync/#WaitGroup">wait groups</a>.
+The documentation for each of these specifies the guarantees it
+makes concerning synchronization.
+</p>
+
+<p>
+Other packages that provide synchronization abstractions
+should document the guarantees they make too.
+</p>
+
+
+<h2 id="badsync">Incorrect synchronization</h2>
+
+<p>
+Programs with races are incorrect and
+can exhibit non-sequentially consistent executions.
+In particular, note that a read <i>r</i> may observe the value written by any write <i>w</i>
+that executes concurrently with <i>r</i>.
+Even if this occurs, it does not imply that reads happening after <i>r</i>
+will observe writes that happened before <i>w</i>.
</p>
<p>
@@ -566,3 +769,197 @@
In all these examples, the solution is the same:
use explicit synchronization.
</p>
+
+<h2 id="badcompiler">Incorrect compilation</h2>
+
+<p>
+The Go memory model restricts compiler optimizations as much as it does Go programs.
+Some compiler optimizations that would be valid in single-threaded programs are not valid in all Go programs.
+In particular, a compiler must not introduce writes that do not exist in the original program,
+it must not allow a single read to observe multiple values,
+and it must not allow a single write to write multiple values.
+</p>
+
+<p>
+All the following examples assume that `*p` and `*q` refer to
+memory locations accessible to multiple goroutines.
+</p>
+
+<p>
+Not introducing data races into race-free programs means not moving
+writes out of conditional statements in which they appear.
+For example, a compiler must not invert the conditional in this program:
+</p>
+
+<pre>
+*p = 1
+if cond {
+ *p = 2
+}
+</pre>
+
+<p>
+That is, the compiler must not rewrite the program into this one:
+</p>
+
+<pre>
+*p = 2
+if !cond {
+ *p = 1
+}
+</pre>
+
+<p>
+If <code>cond</code> is false and another goroutine is reading <code>*p</code>,
+then in the original program, the other goroutine can only observe any prior value of <code>*p</code> and <code>1</code>.
+In the rewritten program, the other goroutine can observe <code>2</code>, which was previously impossible.
+</p>
+
+<p>
+Not introducing data races also means not assuming that loops terminate.
+For example, a compiler must in general not move the accesses to <code>*p</code> or <code>*q</code>
+ahead of the loop in this program:
+</p>
+
+<pre>
+n := 0
+for e := list; e != nil; e = e.next {
+ n++
+}
+i := *p
+*q = 1
+</pre>
+
+<p>
+If <code>list</code> pointed to a cyclic list,
+then the original program would never access <code>*p</code> or <code>*q</code>,
+but the rewritten program would.
+(Moving `*p` ahead would be safe if the compiler can prove `*p` will not panic;
+moving `*q` ahead would also require the compiler proving that no other
+goroutine can access `*q`.)
+</p>
+
+<p>
+Not introducing data races also means not assuming that called functions
+always return or are free of synchronization operations.
+For example, a compiler must not move the accesses to <code>*p</code> or <code>*q</code>
+ahead of the function call in this program
+(at least not without direct knowledge of the precise behavior of <code>f</code>):
+</p>
+
+<pre>
+f()
+i := *p
+*q = 1
+</pre>
+
+<p>
+If the call never returned, then once again the original program
+would never access <code>*p</code> or <code>*q</code>, but the rewritten program would.
+And if the call contained synchronizing operations, then the original program
+could establish happens before edges preceding the accesses
+to <code>*p</code> and <code>*q</code>, but the rewritten program would not.
+</p>
+
+<p>
+Not allowing a single read to observe multiple values means
+not reloading local variables from shared memory.
+For example, a compiler must not discard <code>i</code> and reload it
+a second time from <code>*p</code> in this program:
+</p>
+
+<pre>
+i := *p
+if i < 0 || i >= len(funcs) {
+ panic("invalid function index")
+}
+... complex code ...
+// compiler must NOT reload i = *p here
+funcs[i]()
+</pre>
+
+<p>
+If the complex code needs many registers, a compiler for single-threaded programs
+could discard <code>i</code> without saving a copy and then reload
+<code>i = *p</code> just before
+<code>funcs[i]()</code>.
+A Go compiler must not, because the value of <code>*p</code> may have changed.
+(Instead, the compiler could spill <code>i</code> to the stack.)
+</p>
+
+<p>
+Not allowing a single write to write multiple values also means not using
+the memory where a local variable will be written as temporary storage before the write.
+For example, a compiler must not use <code>*p</code> as temporary storage in this program:
+</p>
+
+<pre>
+*p = i + *p/2
+</pre>
+
+<p>
+That is, it must not rewrite the program into this one:
+</p>
+
+<pre>
+*p /= 2
+*p += i
+</pre>
+
+<p>
+If <code>i</code> and <code>*p</code> start equal to 2,
+the original code does <code>*p = 3</code>,
+so a racing thread can read only 2 or 3 from <code>*p</code>.
+The rewritten code does <code>*p = 1</code> and then <code>*p = 3</code>,
+allowing a racing thread to read 1 as well.
+</p>
+
+<p>
+Note that all these optimizations are permitted in C/C++ compilers:
+a Go compiler sharing a back end with a C/C++ compiler must take care
+to disable optimizations that are invalid for Go.
+</p>
+
+<p>
+Note that the prohibition on introducing data races
+does not apply if the compiler can prove that the races
+do not affect correct execution on the target platform.
+For example, on essentially all CPUs, it is valid to rewrite
+</p>
+
+<pre>
+n := 0
+for i := 0; i < m; i++ {
+ n += *shared
+}
+</pre>
+
+into:
+
+<pre>
+n := 0
+local := *shared
+for i := 0; i < m; i++ {
+ n += local
+}
+</pre>
+
+<p>
+provided it can be proved that <code>*shared</code> will not fault on access,
+because the potential added read will not affect any existing concurrent reads or writes.
+On the other hand, the rewrite would not be valid in a source-to-source translator.
+</p>
+
+<h2 id="conclusion">Conclusion</h2>
+
+<p>
+Go programmers writing data-race-free programs can rely on
+sequentially consistent execution of those programs,
+just as in essentially all other modern programming languages.
+</p>
+
+<p>
+When it comes to programs with races,
+both programmers and compilers should remember the advice:
+don't be clever.
+</p>
diff --git a/doc/go_spec.html b/doc/go_spec.html
index ad12fcf..29109b6 100644
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1,6 +1,6 @@
<!--{
"Title": "The Go Programming Language Specification",
- "Subtitle": "Version of March 10, 2022",
+ "Subtitle": "Version of June 29, 2022",
"Path": "/ref/spec"
}-->
@@ -22,20 +22,23 @@
</p>
<p>
-The grammar is compact and simple to parse, allowing for easy analysis
+The syntax is compact and simple to parse, allowing for easy analysis
by automatic tools such as integrated development environments.
</p>
<h2 id="Notation">Notation</h2>
<p>
-The syntax is specified using Extended Backus-Naur Form (EBNF):
+The syntax is specified using a
+<a href="https://en.wikipedia.org/wiki/Wirth_syntax_notation">variant</a>
+of Extended Backus-Naur Form (EBNF):
</p>
<pre class="grammar">
+Syntax = { Production } .
Production = production_name "=" [ Expression ] "." .
-Expression = Alternative { "|" Alternative } .
-Alternative = Term { Term } .
-Term = production_name | token [ "…" token ] | Group | Option | Repetition .
+Expression = Term { "|" Term } .
+Term = Factor { Factor } .
+Factor = production_name | token [ "…" token ] | Group | Option | Repetition .
Group = "(" Expression ")" .
Option = "[" Expression "]" .
Repetition = "{" Expression "}" .
@@ -53,7 +56,7 @@
</pre>
<p>
-Lower-case production names are used to identify lexical tokens.
+Lowercase production names are used to identify lexical (terminal) tokens.
Non-terminals are in CamelCase. Lexical tokens are enclosed in
double quotes <code>""</code> or back quotes <code>``</code>.
</p>
@@ -79,7 +82,7 @@
in the source text.
</p>
<p>
-Each code point is distinct; for instance, upper and lower case letters
+Each code point is distinct; for instance, uppercase and lowercase letters
are different characters.
</p>
<p>
@@ -96,13 +99,13 @@
<h3 id="Characters">Characters</h3>
<p>
-The following terms are used to denote specific Unicode character classes:
+The following terms are used to denote specific Unicode character categories:
</p>
<pre class="ebnf">
newline = /* the Unicode code point U+000A */ .
unicode_char = /* an arbitrary Unicode code point except newline */ .
-unicode_letter = /* a Unicode code point classified as "Letter" */ .
-unicode_digit = /* a Unicode code point classified as "Number, decimal digit" */ .
+unicode_letter = /* a Unicode code point categorized as "Letter" */ .
+unicode_digit = /* a Unicode code point categorized as "Number, decimal digit" */ .
</pre>
<p>
@@ -115,7 +118,7 @@
<h3 id="Letters_and_digits">Letters and digits</h3>
<p>
-The underscore character <code>_</code> (U+005F) is considered a letter.
+The underscore character <code>_</code> (U+005F) is considered a lowercase letter.
</p>
<pre class="ebnf">
letter = unicode_letter | "_" .
@@ -170,7 +173,7 @@
<h3 id="Semicolons">Semicolons</h3>
<p>
-The formal grammar uses semicolons <code>";"</code> as terminators in
+The formal syntax uses semicolons <code>";"</code> as terminators in
a number of productions. Go programs may omit most of these semicolons
using the following two rules:
</p>
@@ -260,7 +263,7 @@
<p>
The following character sequences represent <a href="#Operators">operators</a>
-(including <a href="#Assignments">assignment operators</a>) and punctuation:
+(including <a href="#Assignment_statements">assignment operators</a>) and punctuation:
</p>
<pre class="grammar">
+ & += &= && == != ( )
@@ -406,7 +409,7 @@
<a href="#Constants">complex constant</a>.
It consists of an <a href="#Integer_literals">integer</a> or
<a href="#Floating-point_literals">floating-point</a> literal
-followed by the lower-case letter <code>i</code>.
+followed by the lowercase letter <code>i</code>.
The value of an imaginary literal is the value of the respective
integer or floating-point literal multiplied by the imaginary unit <i>i</i>.
</p>
@@ -499,8 +502,9 @@
</pre>
<p>
-All other sequences starting with a backslash are illegal inside rune literals.
+An unrecognized character following a backslash in a rune literal is illegal.
</p>
+
<pre class="ebnf">
rune_lit = "'" ( unicode_value | byte_value ) "'" .
unicode_value = unicode_char | little_u_value | big_u_value | escaped_char .
@@ -527,8 +531,10 @@
'\U00101234'
'\'' // rune literal containing single quote character
'aa' // illegal: too many characters
+'\k' // illegal: k is not recognized after a backslash
'\xa' // illegal: too few hexadecimal digits
'\0' // illegal: too few octal digits
+'\400' // illegal: octal value over 255
'\uDFFF' // illegal: surrogate half
'\U00110000' // illegal: invalid Unicode code point
</pre>
@@ -670,7 +676,7 @@
A constant may be given a type explicitly by a <a href="#Constant_declarations">constant declaration</a>
or <a href="#Conversions">conversion</a>, or implicitly when used in a
<a href="#Variable_declarations">variable declaration</a> or an
-<a href="#Assignments">assignment</a> or as an
+<a href="#Assignment_statements">assignment statement</a> or as an
operand in an <a href="#Expressions">expression</a>.
It is an error if the constant value
cannot be <a href="#Representability">represented</a> as a value of the respective type.
@@ -774,7 +780,7 @@
<p>
A variable's value is retrieved by referring to the variable in an
<a href="#Expressions">expression</a>; it is the most recent value
-<a href="#Assignments">assigned</a> to the variable.
+<a href="#Assignment_statements">assigned</a> to the variable.
If a variable has not yet been assigned a value, its value is the
<a href="#The_zero_value">zero value</a> for its type.
</p>
@@ -796,7 +802,7 @@
TypeArgs = "[" TypeList [ "," ] "]" .
TypeList = Type { "," Type } .
TypeLit = ArrayType | StructType | PointerType | FunctionType | InterfaceType |
- SliceType | MapType | ChannelType .
+ SliceType | MapType | ChannelType .
</pre>
<p>
@@ -1021,7 +1027,7 @@
<pre class="ebnf">
StructType = "struct" "{" { FieldDecl ";" } "}" .
FieldDecl = (IdentifierList Type | EmbeddedField) [ Tag ] .
-EmbeddedField = [ "*" ] TypeName .
+EmbeddedField = [ "*" ] TypeName [ TypeArgs ] .
Tag = string_lit .
</pre>
@@ -1085,7 +1091,7 @@
</p>
<p>
-Given a struct type <code>S</code> and a <a href="#Type_definitions">defined type</a>
+Given a struct type <code>S</code> and a <a href="#Types">named type</a>
<code>T</code>, promoted methods are included in the method set of the struct as follows:
</p>
<ul>
@@ -1277,7 +1283,8 @@
<p>
Every type that is a member of the type set of an interface implements that interface.
Any given type may implement several distinct interfaces.
-For instance, all types implement the <i>empty interface</i> which stands for the set of all types:
+For instance, all types implement the <i>empty interface</i> which stands for the set
+of all (non-interface) types:
</p>
<pre>
@@ -1379,7 +1386,7 @@
of its interface elements.
</li>
- <li>The type set of a method specification is the set of types
+ <li>The type set of a method specification is the set of all non-interface types
whose method sets include that method.
</li>
@@ -1388,7 +1395,7 @@
</li>
<li>The type set of a term of the form <code>~T</code>
- is the set of types whose underlying type is <code>T</code>.
+ is the set of all types whose underlying type is <code>T</code>.
</li>
<li>The type set of a <i>union</i> of terms
@@ -1398,6 +1405,15 @@
</ul>
<p>
+The quantification "the set of all non-interface types" refers not just to all (non-interface)
+types declared in the program at hand, but all possible types in all possible programs, and
+hence is infinite.
+Similarly, given the set of all non-interface types that implement a particular method, the
+intersection of the method sets of those types will contain exactly that method, even if all
+types in the program at hand always pair that method with another method.
+</p>
+
+<p>
By construction, an interface's type set never contains an interface type.
</p>
@@ -1454,7 +1470,8 @@
</pre>
<p>
-In a union, a term cannot be a <a href="#Type_parameter_declarations">type parameter</a>, and the type sets of all
+The type <code>T</code> in a term of the form <code>T</code> or <code>~T</code> 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>
@@ -1462,7 +1479,7 @@
<pre>
interface {
P // illegal: P is a type parameter
- int | 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
}
@@ -1574,7 +1591,7 @@
For a map <code>m</code>, it can be discovered using the
built-in function <a href="#Length_and_capacity"><code>len</code></a>
and may change during execution. Elements may be added during execution
-using <a href="#Assignments">assignments</a> and retrieved with
+using <a href="#Assignment_statements">assignments</a> and retrieved with
<a href="#Index_expressions">index expressions</a>; they may be removed with the
<a href="#Deletion_of_map_elements"><code>delete</code></a> built-in function.
</p>
@@ -1617,7 +1634,7 @@
<i>send</i> or <i>receive</i>. If a direction is given, the channel is <i>directional</i>,
otherwise it is <i>bidirectional</i>.
A channel may be constrained only to send or only to receive by
-<a href="#Assignments">assignment</a> or
+<a href="#Assignment_statements">assignment</a> or
explicit <a href="#Conversions">conversion</a>.
</p>
@@ -1794,6 +1811,31 @@
interface{ <-chan int | chan<- int } // directional channels have different directions
</pre>
+<p>
+Some operations (<a href="#Slice_expressions">slice expressions</a>,
+<a href="#Appending_and_copying_slices"><code>append</code> and <code>copy</code></a>)
+rely on a slightly more loose form of core types which accept byte slices and strings.
+Specifically, if there are exactly two types, <code>[]byte</code> and <code>string</code>,
+which are the underlying types of all types in the type set of interface <code>T</code>,
+the core type of <code>T</code> is called <code>bytestring</code>.
+</p>
+
+<p>
+Examples of interfaces with <code>bytestring</code> core types:
+</p>
+
+<pre>
+interface{ int } // int (same as ordinary core type)
+interface{ []byte | string } // bytestring
+interface{ ~[]byte | myString } // bytestring
+</pre>
+
+<p>
+Note that <code>bytestring</code> is not a real type; it cannot be used to declare
+variables are compose other types. It exists solely to describe the behavior of some
+operations that read from a sequence of bytes, which may be a byte slice or a string.
+</p>
+
<h3 id="Type_identity">Type identity</h3>
<p>
@@ -1878,7 +1920,7 @@
B0 and C0
D0[int, string] and E0
[]int and []int
-struct{ a, b *T5 } and struct{ a, b *T5 }
+struct{ a, b *B5 } and struct{ a, b *B5 }
func(x int, y float64) *[]string, func(int, float64) (result *[]string), and A5
</pre>
@@ -1908,7 +1950,8 @@
</li>
<li>
<code>V</code> and <code>T</code> have identical
-<a href="#Underlying_types">underlying types</a> and at least one of <code>V</code>
+<a href="#Underlying_types">underlying types</a>
+but are not type parameters and at least one of <code>V</code>
or <code>T</code> is not a <a href="#Types">named type</a>.
</li>
<li>
@@ -2146,9 +2189,8 @@
or result variable is the function body.</li>
<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>
+ or declared by a method receiver begins after the name of the function
+ and ends at the end of the function body.</li>
<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
@@ -2199,7 +2241,7 @@
The <i>blank identifier</i> is represented by the underscore character <code>_</code>.
It serves as an anonymous placeholder instead of a regular (non-blank)
identifier and has special meaning in <a href="#Declarations_and_scope">declarations</a>,
-as an <a href="#Operands">operand</a>, and in <a href="#Assignments">assignments</a>.
+as an <a href="#Operands">operand</a>, and in <a href="#Assignment_statements">assignment statements</a>.
</p>
@@ -2234,8 +2276,8 @@
An identifier is exported if both:
</p>
<ol>
- <li>the first character of the identifier's name is a Unicode upper case
- letter (Unicode class "Lu"); and</li>
+ <li>the first character of the identifier's name is a Unicode uppercase
+ letter (Unicode character category Lu); and</li>
<li>the identifier is declared in the <a href="#Blocks">package block</a>
or it is a <a href="#Struct_types">field name</a> or
<a href="#MethodName">method name</a>.</li>
@@ -2706,7 +2748,7 @@
<p>
If a list of expressions is given, the variables are initialized
-with the expressions following the rules for <a href="#Assignments">assignments</a>.
+with the expressions following the rules for <a href="#Assignment_statements">assignment statements</a>.
Otherwise, each variable is initialized to its <a href="#The_zero_value">zero value</a>.
</p>
@@ -2750,7 +2792,7 @@
</p>
<pre class="grammar">
-"var" IdentifierList = ExpressionList .
+"var" IdentifierList "=" ExpressionList .
</pre>
<pre>
@@ -2768,12 +2810,14 @@
and at least one of the non-<a href="#Blank_identifier">blank</a> variables is new.
As a consequence, redeclaration can only appear in a multi-variable short declaration.
Redeclaration does not introduce a new variable; it just assigns a new value to the original.
+The non-blank variable names on the left side of <code>:=</code>
+must be <a href="#Uniqueness_of_identifiers">unique</a>.
</p>
<pre>
field1, offset := nextField(str, 0)
field2, offset := nextField(str, offset) // redeclares offset
-a, a := 1, 2 // illegal: double declaration of a or no new variable if a was declared elsewhere
+x, y, x := 1, 2, 3 // illegal: x repeated on left side of :=
</pre>
<p>
@@ -2967,7 +3011,7 @@
<p>
The <a href="#Blank_identifier">blank identifier</a> may appear as an
-operand only on the left-hand side of an <a href="#Assignments">assignment</a>.
+operand only on the left-hand side of an <a href="#Assignment_statements">assignment statement</a>.
</p>
<p>
@@ -2998,7 +3042,7 @@
</p>
<pre>
-math.Sin // denotes the Sin function in package math
+math.Sin // denotes the Sin function in package math
</pre>
<h3 id="Composite_literals">Composite literals</h3>
@@ -3012,7 +3056,7 @@
<pre class="ebnf">
CompositeLit = LiteralType LiteralValue .
LiteralType = StructType | ArrayType | "[" "..." "]" ElementType |
- SliceType | MapType | TypeName .
+ SliceType | MapType | TypeName [ TypeArgs ] .
LiteralValue = "{" [ ElementList [ "," ] ] "}" .
ElementList = KeyedElement { "," KeyedElement } .
KeyedElement = [ Key ":" ] Element .
@@ -3024,7 +3068,7 @@
<p>
The LiteralType's <a href="#Core_types">core type</a> <code>T</code>
must be a struct, array, slice, or map type
-(the grammar enforces this constraint except when the type is given
+(the syntax enforces this constraint except when the type is given
as a TypeName).
The types of the elements and keys must be <a href="#Assignability">assignable</a>
to the respective field, element, and key types of type <code>T</code>;
@@ -3777,7 +3821,7 @@
<p>
An index expression on a map <code>a</code> of type <code>map[K]V</code>
-used in an <a href="#Assignments">assignment</a> or initialization of the special form
+used in an <a href="#Assignment_statements">assignment statement</a> or initialization of the special form
</p>
<pre>
@@ -3818,7 +3862,8 @@
<p>
constructs a substring or slice. The <a href="#Core_types">core type</a> of
-<code>a</code> must be a string, array, pointer to array, or slice.
+<code>a</code> must be a string, array, pointer to array, slice, or a
+<a href="#Core_types"><code>bytestring</code></a>.
The <i>indices</i> <code>low</code> and
<code>high</code> select which elements of operand <code>a</code> appear
in the result. The result has indices starting at 0 and length equal to
@@ -3992,7 +4037,7 @@
</pre>
<p>
-A type assertion used in an <a href="#Assignments">assignment</a> or initialization of the special form
+A type assertion used in an <a href="#Assignment_statements">assignment statement</a> or initialization of the special form
</p>
<pre>
@@ -4195,7 +4240,7 @@
<p>
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
+A generic function that 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.
A generic function that is called may provide a (possibly partial) type
@@ -4824,7 +4869,7 @@
</p>
<pre>
- x, q
+ x, q
int8 -128
int16 -32768
int32 -2147483648
@@ -5149,7 +5194,7 @@
</pre>
<p>
-A receive expression used in an <a href="#Assignments">assignment</a> or initialization of the special form
+A receive expression used in an <a href="#Assignment_statements">assignment statement</a> or initialization of the special form
</p>
<pre>
@@ -5228,7 +5273,7 @@
float64(-1e-1000) // 0.0 of type float64
string('x') // "x" of type string
string(0x266c) // "♬" of type string
-MyString("foo" + "bar") // "foobar" of type MyString
+myString("foo" + "bar") // "foobar" of type myString
string([]byte{'a'}) // not a constant: []byte{'a'} is not a constant
(*int)(nil) // not a constant: nil is not a constant, *int is not a boolean, numeric, or string type
int(1.2) // illegal: 1.2 cannot be represented as an int
@@ -5411,8 +5456,9 @@
string('a') // "a"
string(-1) // "\ufffd" == "\xef\xbf\xbd"
string(0xf8) // "\u00f8" == "ø" == "\xc3\xb8"
-type MyString string
-MyString(0x65e5) // "\u65e5" == "日" == "\xe6\x97\xa5"
+
+type myString string
+myString(0x65e5) // "\u65e5" == "日" == "\xe6\x97\xa5"
</pre>
</li>
@@ -5425,8 +5471,12 @@
string([]byte{}) // ""
string([]byte(nil)) // ""
-type MyBytes []byte
-string(MyBytes{'h', 'e', 'l', 'l', '\xc3', '\xb8'}) // "hellø"
+type bytes []byte
+string(bytes{'h', 'e', 'l', 'l', '\xc3', '\xb8'}) // "hellø"
+
+type myByte byte
+string([]myByte{'w', 'o', 'r', 'l', 'd', '!'}) // "world!"
+myString([]myByte{'\xf0', '\x9f', '\x8c', '\x8d'}) // "🌍"
</pre>
</li>
@@ -5440,8 +5490,12 @@
string([]rune{}) // ""
string([]rune(nil)) // ""
-type MyRunes []rune
-string(MyRunes{0x767d, 0x9d6c, 0x7fd4}) // "\u767d\u9d6c\u7fd4" == "白鵬翔"
+type runes []rune
+string(runes{0x767d, 0x9d6c, 0x7fd4}) // "\u767d\u9d6c\u7fd4" == "白鵬翔"
+
+type myRune rune
+string([]myRune{0x266b, 0x266c}) // "\u266b\u266c" == "♫♬"
+myString([]myRune{0x1f30e}) // "\U0001f30e" == "🌎"
</pre>
</li>
@@ -5450,10 +5504,13 @@
yields a slice whose successive elements are the bytes of the string.
<pre>
-[]byte("hellø") // []byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'}
-[]byte("") // []byte{}
+[]byte("hellø") // []byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'}
+[]byte("") // []byte{}
-MyBytes("hellø") // []byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'}
+bytes("hellø") // []byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'}
+
+[]myByte("world!") // []myByte{'w', 'o', 'r', 'l', 'd', '!'}
+[]myByte(myString("🌏")) // []myByte{'\xf0', '\x9f', '\x8c', '\x8f'}
</pre>
</li>
@@ -5462,10 +5519,13 @@
yields a slice containing the individual Unicode code points of the string.
<pre>
-[]rune(MyString("白鵬翔")) // []rune{0x767d, 0x9d6c, 0x7fd4}
-[]rune("") // []rune{}
+[]rune(myString("白鵬翔")) // []rune{0x767d, 0x9d6c, 0x7fd4}
+[]rune("") // []rune{}
-MyRunes("白鵬翔") // []rune{0x767d, 0x9d6c, 0x7fd4}
+runes("白鵬翔") // []rune{0x767d, 0x9d6c, 0x7fd4}
+
+[]myRune("♫♬") // []myRune{0x266b, 0x266c}
+[]myRune(myString("🌐")) // []myRune{0x1f310}
</pre>
</li>
</ol>
@@ -5882,7 +5942,7 @@
</pre>
<p>
-The following <a href="#Assignments">assignment statements</a> are semantically
+The following <a href="#Assignment_statements">assignment statements</a> are semantically
equivalent:
</p>
@@ -5893,7 +5953,14 @@
</pre>
-<h3 id="Assignments">Assignments</h3>
+<h3 id="Assignment_statements">Assignment statements</h3>
+
+<p>
+An <i>assignment</i> replaces the current value stored in a <a href="#Variables">variable</a>
+with a new value specified by an <a href="#Expressions">expression</a>.
+An assignment statement may assign a single value to a single variable, or multiple values to a
+matching number of variables.
+</p>
<pre class="ebnf">
Assignment = ExpressionList assign_op ExpressionList .
@@ -6462,7 +6529,7 @@
<p>
The iteration values are assigned to the respective
-iteration variables as in an <a href="#Assignments">assignment statement</a>.
+iteration variables as in an <a href="#Assignment_statements">assignment statement</a>.
</p>
<p>
@@ -6797,7 +6864,8 @@
<p>
A "continue" statement begins the next iteration of the
-innermost <a href="#For_statements">"for" loop</a> at its post statement.
+innermost enclosing <a href="#For_statements">"for" loop</a>
+by advancing control to the end of the loop block.
The "for" loop must be within the same function.
</p>
@@ -7123,7 +7191,7 @@
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
<code>n</code> must be no larger than <code>m</code>.
-If <code>n</code> is negative or larger than <code>m</code> at run time,
+For slices and channels, if <code>n</code> is negative or larger than <code>m</code> at run time,
a <a href="#Run_time_panics">run-time panic</a> occurs.
</p>
@@ -7162,8 +7230,9 @@
and the respective <a href="#Passing_arguments_to_..._parameters">parameter
passing rules</a> apply.
As a special case, if the core type of <code>s</code> is <code>[]byte</code>,
-<code>append</code> also accepts a second argument with core type <code>string</code>
-followed by <code>...</code>. This form appends the bytes of the string.
+<code>append</code> also accepts a second argument with core type
+<a href="#Core_types"><code>bytestring</code></a> followed by <code>...</code>.
+This form appends the bytes of the byte slice or string.
</p>
<pre class="grammar">
@@ -7200,8 +7269,9 @@
The number of elements copied is the minimum of
<code>len(src)</code> and <code>len(dst)</code>.
As a special case, if the destination's core type is <code>[]byte</code>,
-<code>copy</code> also accepts a source argument with core type <code>string</code>.
-This form copies the bytes from the string into the byte slice.
+<code>copy</code> also accepts a source argument with core type
+</a> <a href="#Core_types"><code>bytestring</code></a>.
+This form copies the bytes from the byte slice or string into the byte slice.
</p>
<pre class="grammar">
@@ -7515,7 +7585,7 @@
</p>
<p>
-Assume we have compiled a package containing the package clause
+Consider a compiled a package containing the package clause
<code>package math</code>, which exports function <code>Sin</code>, and
installed the compiled package in the file identified by
<code>"lib/math"</code>.
diff --git a/lib/time/update.bash b/lib/time/update.bash
index feb95e2..54b924a 100755
--- a/lib/time/update.bash
+++ b/lib/time/update.bash
@@ -8,8 +8,8 @@
# Consult https://www.iana.org/time-zones for the latest versions.
# Versions to use.
-CODE=2021e
-DATA=2021e
+CODE=2022a
+DATA=2022a
set -e
rm -rf work
diff --git a/lib/time/zoneinfo.zip b/lib/time/zoneinfo.zip
index a859b41..767e45b 100644
--- a/lib/time/zoneinfo.zip
+++ b/lib/time/zoneinfo.zip
Binary files differ
diff --git a/misc/cgo/errors/errors_test.go b/misc/cgo/errors/errors_test.go
index e90ed1e..9718b7f 100644
--- a/misc/cgo/errors/errors_test.go
+++ b/misc/cgo/errors/errors_test.go
@@ -112,6 +112,7 @@
"issue18889.go",
"issue28721.go",
"issue33061.go",
+ "issue50710.go",
} {
check(t, file)
}
diff --git a/misc/cgo/errors/testdata/issue50710.go b/misc/cgo/errors/testdata/issue50710.go
new file mode 100644
index 0000000..dffea22
--- /dev/null
+++ b/misc/cgo/errors/testdata/issue50710.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 main
+
+// size_t StrLen(_GoString_ s) {
+// return _GoStringLen(s);
+// }
+import "C"
+
+func main() {
+ C.StrLen1() // ERROR HERE
+}
diff --git a/misc/cgo/gmp/gmp.go b/misc/cgo/gmp/gmp.go
index 971a10a..0835fdc 100644
--- a/misc/cgo/gmp/gmp.go
+++ b/misc/cgo/gmp/gmp.go
@@ -333,10 +333,9 @@
// CmpInt compares x and y. The result is
//
-// -1 if x < y
-// 0 if x == y
-// +1 if x > y
-//
+// -1 if x < y
+// 0 if x == y
+// +1 if x > y
func CmpInt(x, y *Int) int {
x.doinit()
y.doinit()
diff --git a/misc/cgo/test/callback_c.c b/misc/cgo/test/callback_c.c
index 8921b73..8ecf70f 100644
--- a/misc/cgo/test/callback_c.c
+++ b/misc/cgo/test/callback_c.c
@@ -3,8 +3,7 @@
// license that can be found in the LICENSE file.
#include <string.h>
-#include <sys/types.h>
-#include <unistd.h>
+
#include "_cgo_export.h"
void
@@ -31,32 +30,10 @@
BackIntoGo();
}
-#ifdef WIN32
-#include <windows.h>
-long long
-mysleep(int seconds) {
- long long st = GetTickCount();
- Sleep(1000 * seconds);
- return st;
-}
-#else
-#include <sys/time.h>
-long long
-mysleep(int seconds) {
- long long st;
- struct timeval tv;
- gettimeofday(&tv, NULL);
- st = tv.tv_sec * 1000 + tv.tv_usec / 1000;
- sleep(seconds);
- return st;
-}
-#endif
-
-long long
-twoSleep(int n)
+void
+Issue1560InC(void)
{
- BackgroundSleep(n);
- return mysleep(n);
+ Issue1560FromC();
}
void
diff --git a/misc/cgo/test/cgo_linux_test.go b/misc/cgo/test/cgo_linux_test.go
index a9746b5..7c4628c 100644
--- a/misc/cgo/test/cgo_linux_test.go
+++ b/misc/cgo/test/cgo_linux_test.go
@@ -15,6 +15,14 @@
}
testSetgid(t)
}
+
+func TestSetgidStress(t *testing.T) {
+ if runtime.GOOS == "android" {
+ t.Skip("unsupported on Android")
+ }
+ testSetgidStress(t)
+}
+
func Test1435(t *testing.T) { test1435(t) }
func Test6997(t *testing.T) { test6997(t) }
func TestBuildID(t *testing.T) { testBuildID(t) }
diff --git a/misc/cgo/test/cgo_test.go b/misc/cgo/test/cgo_test.go
index 774277e..dee6164 100644
--- a/misc/cgo/test/cgo_test.go
+++ b/misc/cgo/test/cgo_test.go
@@ -11,6 +11,7 @@
// These wrappers are here for gotest to find.
func Test1328(t *testing.T) { test1328(t) }
+func Test1560(t *testing.T) { test1560(t) }
func Test1635(t *testing.T) { test1635(t) }
func Test3250(t *testing.T) { test3250(t) }
func Test3729(t *testing.T) { test3729(t) }
@@ -89,7 +90,6 @@
func TestMultipleAssign(t *testing.T) { testMultipleAssign(t) }
func TestNaming(t *testing.T) { testNaming(t) }
func TestPanicFromC(t *testing.T) { testPanicFromC(t) }
-func TestParallelSleep(t *testing.T) { testParallelSleep(t) }
func TestPrintf(t *testing.T) { testPrintf(t) }
func TestReturnAfterGrow(t *testing.T) { testReturnAfterGrow(t) }
func TestReturnAfterGrowFromGo(t *testing.T) { testReturnAfterGrowFromGo(t) }
diff --git a/misc/cgo/test/setgid2_linux.go b/misc/cgo/test/setgid2_linux.go
new file mode 100644
index 0000000..438f5ae
--- /dev/null
+++ b/misc/cgo/test/setgid2_linux.go
@@ -0,0 +1,35 @@
+// 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.
+
+// Stress test setgid and thread creation. A thread
+// can get a SIGSETXID signal early on at thread
+// initialization, causing crash. See issue 53374.
+
+package cgotest
+
+/*
+#include <sys/types.h>
+#include <unistd.h>
+*/
+import "C"
+
+import (
+ "runtime"
+ "testing"
+)
+
+func testSetgidStress(t *testing.T) {
+ const N = 50
+ ch := make(chan int, N)
+ for i := 0; i < N; i++ {
+ go func() {
+ C.setgid(0)
+ ch <- 1
+ runtime.LockOSThread() // so every goroutine uses a new thread
+ }()
+ }
+ for i := 0; i < N; i++ {
+ <-ch
+ }
+}
diff --git a/misc/cgo/test/testdata/issue52611.go b/misc/cgo/test/testdata/issue52611.go
new file mode 100644
index 0000000..32d2240
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611.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.
+
+// Issue 52611: inconsistent compiler behaviour when compiling a C.struct.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import (
+ _ "cgotest/issue52611a"
+ _ "cgotest/issue52611b"
+)
diff --git a/misc/cgo/test/testdata/issue52611a/a.go b/misc/cgo/test/testdata/issue52611a/a.go
new file mode 100644
index 0000000..0764688
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611a/a.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 issue52611a
+
+/*
+typedef struct Foo {
+ int X;
+} Foo;
+*/
+import "C"
+
+func GetX1(foo *C.struct_Foo) int32 {
+ return int32(foo.X)
+}
diff --git a/misc/cgo/test/testdata/issue52611a/b.go b/misc/cgo/test/testdata/issue52611a/b.go
new file mode 100644
index 0000000..74a50c5
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611a/b.go
@@ -0,0 +1,11 @@
+// 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 issue52611a
+
+import "C"
+
+func GetX2(foo *C.struct_Foo) int32 {
+ return int32(foo.X)
+}
diff --git a/misc/cgo/test/testdata/issue52611b/a.go b/misc/cgo/test/testdata/issue52611b/a.go
new file mode 100644
index 0000000..730b52f5
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611b/a.go
@@ -0,0 +1,11 @@
+// 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 issue52611b
+
+import "C"
+
+func GetX1(bar *C.struct_Bar) int32 {
+ return int32(bar.X)
+}
diff --git a/misc/cgo/test/testdata/issue52611b/b.go b/misc/cgo/test/testdata/issue52611b/b.go
new file mode 100644
index 0000000..d304175
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611b/b.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 issue52611b
+
+/*
+typedef struct Bar {
+ int X;
+} Bar;
+*/
+import "C"
+
+func GetX2(bar *C.struct_Bar) int32 {
+ return int32(bar.X)
+}
diff --git a/misc/cgo/test/testdata/issue9400/asm_loong64.s b/misc/cgo/test/testdata/issue9400/asm_loong64.s
new file mode 100644
index 0000000..c242fc6
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400/asm_loong64.s
@@ -0,0 +1,28 @@
+// 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.
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+ // Rewind stack pointer so anything that happens on the stack
+ // will clobber the test pattern created by the caller
+ ADDV $(1024*8), R3
+
+ // Ask signaller to setgid
+ MOVW $1, R12
+ DBAR
+ MOVW R12, ·Baton(SB)
+ DBAR
+
+ // Wait for setgid completion
+loop:
+ DBAR
+ MOVW ·Baton(SB), R12
+ OR R13, R13, R13 // hint that we're in a spin loop
+ BNE R12, loop
+ DBAR
+
+ // Restore stack
+ ADDV $(-1024*8), R3
+ RET
diff --git a/misc/cgo/test/testx.go b/misc/cgo/test/testx.go
index 8ec84a8..6a8e97d 100644
--- a/misc/cgo/test/testx.go
+++ b/misc/cgo/test/testx.go
@@ -18,7 +18,6 @@
"sync"
"sync/atomic"
"testing"
- "time"
"unsafe"
)
@@ -30,8 +29,7 @@
void IntoC(void);
// issue 1560
-// mysleep returns the absolute start time in ms.
-long long mysleep(int seconds);
+extern void Issue1560InC(void);
// twoSleep returns the absolute start time of the first sleep
// in ms.
@@ -183,35 +181,40 @@
}
// issue 1560
+// Test that C functions and Go functions run in parallel.
-var sleepDone = make(chan int64)
+var (
+ issue1560 int32
-// parallelSleep returns the absolute difference between the start time
-// of the two sleeps.
-func parallelSleep(n int) int64 {
- t := int64(C.twoSleep(C.int(n))) - <-sleepDone
- if t < 0 {
- return -t
+ issue1560Ch = make(chan bool, 2)
+)
+
+//export Issue1560FromC
+func Issue1560FromC() {
+ for atomic.LoadInt32(&issue1560) != 1 {
+ runtime.Gosched()
}
- return t
+ atomic.AddInt32(&issue1560, 1)
+ for atomic.LoadInt32(&issue1560) != 3 {
+ runtime.Gosched()
+ }
+ issue1560Ch <- true
}
-//export BackgroundSleep
-func BackgroundSleep(n int32) {
- go func() {
- sleepDone <- int64(C.mysleep(C.int(n)))
- }()
+func Issue1560FromGo() {
+ atomic.AddInt32(&issue1560, 1)
+ for atomic.LoadInt32(&issue1560) != 2 {
+ runtime.Gosched()
+ }
+ atomic.AddInt32(&issue1560, 1)
+ issue1560Ch <- true
}
-func testParallelSleep(t *testing.T) {
- sleepSec := 1
- dt := time.Duration(parallelSleep(sleepSec)) * time.Millisecond
- t.Logf("difference in start time for two sleep(%d) is %v", sleepSec, dt)
- // bug used to run sleeps in serial, producing a 2*sleepSec-second delay.
- // we detect if the start times of those sleeps are > 0.5*sleepSec-second.
- if dt >= time.Duration(sleepSec)*time.Second/2 {
- t.Fatalf("parallel %d-second sleeps slept for %f seconds", sleepSec, dt.Seconds())
- }
+func test1560(t *testing.T) {
+ go Issue1560FromGo()
+ go C.Issue1560InC()
+ <-issue1560Ch
+ <-issue1560Ch
}
// issue 2462
diff --git a/misc/cgo/testcarchive/carchive_test.go b/misc/cgo/testcarchive/carchive_test.go
index d36b97b..c409c31 100644
--- a/misc/cgo/testcarchive/carchive_test.go
+++ b/misc/cgo/testcarchive/carchive_test.go
@@ -205,6 +205,7 @@
func testInstall(t *testing.T, exe, libgoa, libgoh string, buildcmd ...string) {
t.Helper()
cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
+ cmd.Env = append(cmd.Environ(), "GO111MODULE=off") // 'go install' only works in GOPATH mode
t.Log(buildcmd)
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
@@ -238,7 +239,7 @@
binArgs := append(cmdToRun(exe), "arg1", "arg2")
cmd = exec.Command(binArgs[0], binArgs[1:]...)
if runtime.Compiler == "gccgo" {
- cmd.Env = append(os.Environ(), "GCCGO=1")
+ cmd.Env = append(cmd.Environ(), "GCCGO=1")
}
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
@@ -822,9 +823,15 @@
t.Skipf("skipping PIE test on %s", GOOS)
}
+ libgoa := "libgo.a"
+ if runtime.Compiler == "gccgo" {
+ libgoa = "liblibgo.a"
+ }
+
if !testWork {
defer func() {
os.Remove("testp" + exeSuffix)
+ os.Remove(libgoa)
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
}()
}
@@ -837,18 +844,13 @@
// be running this test in a GOROOT owned by root.)
genHeader(t, "p.h", "./p")
- cmd := exec.Command("go", "install", "-buildmode=c-archive", "./libgo")
+ cmd := exec.Command("go", "build", "-buildmode=c-archive", "./libgo")
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
t.Fatal(err)
}
- libgoa := "libgo.a"
- if runtime.Compiler == "gccgo" {
- libgoa = "liblibgo.a"
- }
-
- ccArgs := append(cc, "-fPIE", "-pie", "-o", "testp"+exeSuffix, "main.c", "main_unix.c", filepath.Join(libgodir, libgoa))
+ ccArgs := append(cc, "-fPIE", "-pie", "-o", "testp"+exeSuffix, "main.c", "main_unix.c", libgoa)
if runtime.Compiler == "gccgo" {
ccArgs = append(ccArgs, "-lgo")
}
@@ -1035,6 +1037,7 @@
buildcmd := []string{"go", "install", "-buildmode=c-archive", "./libgo"}
cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
+ cmd.Env = append(cmd.Environ(), "GO111MODULE=off") // 'go install' only works in GOPATH mode
t.Log(buildcmd)
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
@@ -1050,6 +1053,7 @@
}
cmd = exec.Command(buildcmd[0], buildcmd[1:]...)
+ cmd.Env = append(cmd.Environ(), "GO111MODULE=off")
t.Log(buildcmd)
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
diff --git a/misc/cgo/testcshared/cshared_test.go b/misc/cgo/testcshared/cshared_test.go
index c9e9e5f..7fbcff2 100644
--- a/misc/cgo/testcshared/cshared_test.go
+++ b/misc/cgo/testcshared/cshared_test.go
@@ -5,6 +5,7 @@
package cshared_test
import (
+ "bufio"
"bytes"
"debug/elf"
"debug/pe"
@@ -150,16 +151,22 @@
// The installation directory format varies depending on the platform.
output, err := exec.Command("go", "list",
"-buildmode=c-shared",
- "-installsuffix", "testcshared",
"-f", "{{.Target}}",
- "./libgo").CombinedOutput()
+ "runtime/cgo").CombinedOutput()
if err != nil {
log.Panicf("go list failed: %v\n%s", err, output)
}
- target := string(bytes.TrimSpace(output))
- libgoname = filepath.Base(target)
- installdir = filepath.Dir(target)
- libSuffix = strings.TrimPrefix(filepath.Ext(target), ".")
+ runtimeCgoTarget := string(bytes.TrimSpace(output))
+ libSuffix = strings.TrimPrefix(filepath.Ext(runtimeCgoTarget), ".")
+
+ defer func() {
+ if installdir != "" {
+ err := os.RemoveAll(installdir)
+ if err != nil {
+ log.Panic(err)
+ }
+ }
+ }()
return m.Run()
}
@@ -283,8 +290,13 @@
}
// Generate a C header file for libgo itself.
- args = []string{"go", "install", "-buildmode=c-shared",
- "-installsuffix", "testcshared", "./libgo"}
+ installdir, err = os.MkdirTemp("", "testcshared")
+ if err != nil {
+ return err
+ }
+ libgoname = "libgo." + libSuffix
+
+ args = []string{"go", "build", "-buildmode=c-shared", "-o", filepath.Join(installdir, libgoname), "./libgo"}
cmd = exec.Command(args[0], args[1:]...)
out, err = cmd.CombinedOutput()
if err != nil {
@@ -372,6 +384,7 @@
headersErr = createHeaders()
})
if headersErr != nil {
+ t.Helper()
t.Fatal(headersErr)
}
}
@@ -704,12 +717,15 @@
copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "libgo", "libgo.go"), filepath.Join("libgo", "libgo.go"))
copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "p", "p.go"), filepath.Join("p", "p.go"))
- env := append(os.Environ(), "GOPATH="+tmpdir, "GOBIN="+filepath.Join(tmpdir, "bin"))
-
buildcmd := []string{"go", "install", "-x", "-buildmode=c-shared", "-installsuffix", "testcshared", "./libgo"}
cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
cmd.Dir = filepath.Join(tmpdir, "src", "testcshared")
+ env := append(cmd.Environ(),
+ "GOPATH="+tmpdir,
+ "GOBIN="+filepath.Join(tmpdir, "bin"),
+ "GO111MODULE=off", // 'go install' only works in GOPATH mode
+ )
cmd.Env = env
t.Log(buildcmd)
out, err := cmd.CombinedOutput()
@@ -838,3 +854,51 @@
run(t, goenv, "go", "build", "-o", bin, "./go2c2go/m2")
runExe(t, runenv, bin)
}
+
+func TestIssue36233(t *testing.T) {
+ t.Parallel()
+
+ // Test that the export header uses GoComplex64 and GoComplex128
+ // for complex types.
+
+ tmpdir, err := os.MkdirTemp("", "cshared-TestIssue36233")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(tmpdir)
+
+ const exportHeader = "issue36233.h"
+
+ run(t, nil, "go", "tool", "cgo", "-exportheader", exportHeader, "-objdir", tmpdir, "./issue36233/issue36233.go")
+ data, err := os.ReadFile(exportHeader)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ funcs := []struct{ name, signature string }{
+ {"exportComplex64", "GoComplex64 exportComplex64(GoComplex64 v)"},
+ {"exportComplex128", "GoComplex128 exportComplex128(GoComplex128 v)"},
+ {"exportComplexfloat", "GoComplex64 exportComplexfloat(GoComplex64 v)"},
+ {"exportComplexdouble", "GoComplex128 exportComplexdouble(GoComplex128 v)"},
+ }
+
+ scanner := bufio.NewScanner(bytes.NewReader(data))
+ var found int
+ for scanner.Scan() {
+ b := scanner.Bytes()
+ for _, fn := range funcs {
+ if bytes.Contains(b, []byte(fn.name)) {
+ found++
+ if !bytes.Contains(b, []byte(fn.signature)) {
+ t.Errorf("function signature mismatch; got %q, want %q", b, fn.signature)
+ }
+ }
+ }
+ }
+ if err = scanner.Err(); err != nil {
+ t.Errorf("scanner encountered error: %v", err)
+ }
+ if found != len(funcs) {
+ t.Error("missing functions")
+ }
+}
diff --git a/misc/cgo/testcshared/testdata/issue36233/issue36233.go b/misc/cgo/testcshared/testdata/issue36233/issue36233.go
new file mode 100644
index 0000000..d0d1e5d
--- /dev/null
+++ b/misc/cgo/testcshared/testdata/issue36233/issue36233.go
@@ -0,0 +1,29 @@
+// 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
+
+// #include <complex.h>
+import "C"
+
+//export exportComplex64
+func exportComplex64(v complex64) complex64 {
+ return v
+}
+
+//export exportComplex128
+func exportComplex128(v complex128) complex128 {
+ return v
+}
+
+//export exportComplexfloat
+func exportComplexfloat(v C.complexfloat) C.complexfloat {
+ return v
+}
+
+//export exportComplexdouble
+func exportComplexdouble(v C.complexdouble) C.complexdouble {
+ return v
+}
+
+func main() {}
diff --git a/misc/cgo/testgodefs/testgodefs_test.go b/misc/cgo/testgodefs/testgodefs_test.go
index 7628ffc..d03769e 100644
--- a/misc/cgo/testgodefs/testgodefs_test.go
+++ b/misc/cgo/testgodefs/testgodefs_test.go
@@ -9,6 +9,7 @@
"os"
"os/exec"
"path/filepath"
+ "runtime"
"strings"
"testing"
)
@@ -58,9 +59,32 @@
t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
}
- if err := os.WriteFile(filepath.Join(dir, fp+"_defs.go"), out, 0644); err != nil {
+ fn := fp + "_defs.go"
+ if err := os.WriteFile(filepath.Join(dir, fn), out, 0644); err != nil {
t.Fatal(err)
}
+
+ // Verify that command line arguments are not rewritten in the generated comment,
+ // see go.dev/issue/52063
+ hasGeneratedByComment := false
+ for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") {
+ cgoExe := "cgo"
+ if runtime.GOOS == "windows" {
+ cgoExe = "cgo.exe"
+ }
+ if !strings.HasPrefix(line, "// "+cgoExe+" -godefs") {
+ continue
+ }
+ if want := "// " + cgoExe + " " + strings.Join(cmd.Args[3:], " "); line != want {
+ t.Errorf("%s: got generated comment %q, want %q", fn, line, want)
+ }
+ hasGeneratedByComment = true
+ break
+ }
+
+ if !hasGeneratedByComment {
+ t.Errorf("%s: comment with generating cgo -godefs command not found", fn)
+ }
}
main, err := os.ReadFile(filepath.Join("testdata", "main.go"))
diff --git a/misc/cgo/testplugin/plugin_test.go b/misc/cgo/testplugin/plugin_test.go
index 53e79a4..2856810 100644
--- a/misc/cgo/testplugin/plugin_test.go
+++ b/misc/cgo/testplugin/plugin_test.go
@@ -19,6 +19,7 @@
)
var gcflags string = os.Getenv("GO_GCFLAGS")
+var goroot string
func TestMain(m *testing.M) {
flag.Parse()
@@ -43,6 +44,12 @@
}
func testMain(m *testing.M) int {
+ cwd, err := os.Getwd()
+ if err != nil {
+ log.Fatal(err)
+ }
+ goroot = filepath.Join(cwd, "../../..")
+
// Copy testdata into GOPATH/src/testplugin, along with a go.mod file
// declaring the same path.
@@ -113,7 +120,7 @@
if t != nil {
t.Helper()
}
- run(t, "go", append([]string{op, "-gcflags", gcflags}, args...)...)
+ run(t, filepath.Join(goroot, "bin", "go"), append([]string{op, "-gcflags", gcflags}, args...)...)
}
// escape converts a string to something suitable for a shell command line.
@@ -211,7 +218,7 @@
func TestIssue19534(t *testing.T) {
// Test that we can load a plugin built in a path with non-alpha characters.
- goCmd(t, "build", "-buildmode=plugin", "-ldflags='-pluginpath=issue.19534'", "-o", "plugin.so", "./issue19534/plugin.go")
+ goCmd(t, "build", "-buildmode=plugin", "-gcflags=-p=issue.19534", "-ldflags=-pluginpath=issue.19534", "-o", "plugin.so", "./issue19534/plugin.go")
goCmd(t, "build", "-o", "issue19534.exe", "./issue19534/main.go")
run(t, "./issue19534.exe")
}
@@ -296,6 +303,16 @@
run(t, "./issue44956.exe")
}
+func TestIssue52937(t *testing.T) {
+ goCmd(t, "build", "-buildmode=plugin", "-o", "issue52937.so", "./issue52937/main.go")
+}
+
+func TestIssue53989(t *testing.T) {
+ goCmd(t, "build", "-buildmode=plugin", "-o", "issue53989.so", "./issue53989/plugin.go")
+ goCmd(t, "build", "-o", "issue53989.exe", "./issue53989/main.go")
+ run(t, "./issue53989.exe")
+}
+
func TestForkExec(t *testing.T) {
// Issue 38824: importing the plugin package causes it hang in forkExec on darwin.
diff --git a/misc/cgo/testplugin/testdata/issue52937/main.go b/misc/cgo/testplugin/testdata/issue52937/main.go
new file mode 100644
index 0000000..66f09ef
--- /dev/null
+++ b/misc/cgo/testplugin/testdata/issue52937/main.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 main
+
+func main() {}
+func F[T any]() {}
+func G[T any](T) {}
diff --git a/misc/cgo/testplugin/testdata/issue53989/main.go b/misc/cgo/testplugin/testdata/issue53989/main.go
new file mode 100644
index 0000000..6907dfd
--- /dev/null
+++ b/misc/cgo/testplugin/testdata/issue53989/main.go
@@ -0,0 +1,32 @@
+// 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 53989: the use of jump table caused a function
+// from the plugin jumps in the middle of the function
+// to the function with the same name in the main
+// executable. As these two functions may be compiled
+// differently as plugin needs to be PIC, this causes
+// crash.
+
+package main
+
+import (
+ "plugin"
+
+ "testplugin/issue53989/p"
+)
+
+func main() {
+ p.Square(7) // call the function in main executable
+
+ p, err := plugin.Open("issue53989.so")
+ if err != nil {
+ panic(err)
+ }
+ f, err := p.Lookup("Square")
+ if err != nil {
+ panic(err)
+ }
+ f.(func(int))(7) // call the plugin one
+}
diff --git a/misc/cgo/testplugin/testdata/issue53989/p/p.go b/misc/cgo/testplugin/testdata/issue53989/p/p.go
new file mode 100644
index 0000000..02567c1
--- /dev/null
+++ b/misc/cgo/testplugin/testdata/issue53989/p/p.go
@@ -0,0 +1,52 @@
+// 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 (
+ "fmt"
+ "runtime"
+)
+
+var y int
+
+//go:noinline
+func Square(x int) {
+ var pc0, pc1 [1]uintptr
+ runtime.Callers(1, pc0[:]) // get PC at entry
+
+ // a switch using jump table
+ switch x {
+ case 1:
+ y = 1
+ case 2:
+ y = 4
+ case 3:
+ y = 9
+ case 4:
+ y = 16
+ case 5:
+ y = 25
+ case 6:
+ y = 36
+ case 7:
+ y = 49
+ case 8:
+ y = 64
+ default:
+ panic("too large")
+ }
+
+ // check PC is in the same function
+ runtime.Callers(1, pc1[:])
+ if pc1[0] < pc0[0] || pc1[0] > pc0[0]+1000000 {
+ fmt.Printf("jump across DSO boundary. pc0=%x, pc1=%x\n", pc0[0], pc1[0])
+ panic("FAIL")
+ }
+
+ if y != x*x {
+ fmt.Printf("x=%d y=%d!=%d\n", x, y, x*x)
+ panic("FAIL")
+ }
+}
diff --git a/misc/cgo/testplugin/testdata/issue53989/plugin.go b/misc/cgo/testplugin/testdata/issue53989/plugin.go
new file mode 100644
index 0000000..a753ee4
--- /dev/null
+++ b/misc/cgo/testplugin/testdata/issue53989/plugin.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 "testplugin/issue53989/p"
+
+func Square(x int) { // export Square for plugin
+ p.Square(x)
+}
+
+func main() {}
diff --git a/misc/cgo/testsanitizers/asan_test.go b/misc/cgo/testsanitizers/asan_test.go
index 22dcf23..dc1b5a1 100644
--- a/misc/cgo/testsanitizers/asan_test.go
+++ b/misc/cgo/testsanitizers/asan_test.go
@@ -22,6 +22,14 @@
if !aSanSupported(goos, goarch) {
t.Skipf("skipping on %s/%s; -asan option is not supported.", goos, goarch)
}
+ // The current implementation is only compatible with the ASan library from version
+ // v7 to v9 (See the description in src/runtime/asan/asan.go). Therefore, using the
+ // -asan option must use a compatible version of ASan library, which requires that
+ // the gcc version is not less than 7 and the clang version is not less than 9,
+ // otherwise a segmentation fault will occur.
+ if !compilerRequiredAsanVersion() {
+ t.Skipf("skipping: too old version of compiler")
+ }
t.Parallel()
requireOvercommit(t)
@@ -41,6 +49,14 @@
{src: "asan4_fail.go", memoryAccessError: "use-after-poison", errorLocation: "asan4_fail.go:13"},
{src: "asan5_fail.go", memoryAccessError: "use-after-poison", errorLocation: "asan5_fail.go:18"},
{src: "asan_useAfterReturn.go"},
+ {src: "asan_unsafe_fail1.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail1.go:25"},
+ {src: "asan_unsafe_fail2.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail2.go:25"},
+ {src: "asan_unsafe_fail3.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail3.go:18"},
+ {src: "asan_global1_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global1_fail.go:12"},
+ {src: "asan_global2_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global2_fail.go:19"},
+ {src: "asan_global3_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global3_fail.go:13"},
+ {src: "asan_global4_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global4_fail.go:21"},
+ {src: "asan_global5.go"},
}
for _, tc := range cases {
tc := tc
diff --git a/misc/cgo/testsanitizers/cc_test.go b/misc/cgo/testsanitizers/cc_test.go
index 05b7793..4f0252a 100644
--- a/misc/cgo/testsanitizers/cc_test.go
+++ b/misc/cgo/testsanitizers/cc_test.go
@@ -20,6 +20,7 @@
"sync"
"syscall"
"testing"
+ "time"
"unicode"
)
@@ -90,9 +91,26 @@
// mustRun executes t and fails cmd with a well-formatted message if it fails.
func mustRun(t *testing.T, cmd *exec.Cmd) {
t.Helper()
- out, err := cmd.CombinedOutput()
+ out := new(strings.Builder)
+ cmd.Stdout = out
+ cmd.Stderr = out
+
+ err := cmd.Start()
if err != nil {
- t.Fatalf("%#q exited with %v\n%s", strings.Join(cmd.Args, " "), err, out)
+ t.Fatalf("%v: %v", cmd, err)
+ }
+
+ if deadline, ok := t.Deadline(); ok {
+ timeout := time.Until(deadline)
+ timeout -= timeout / 10 // Leave 10% headroom for logging and cleanup.
+ timer := time.AfterFunc(timeout, func() {
+ cmd.Process.Signal(syscall.SIGQUIT)
+ })
+ defer timer.Stop()
+ }
+
+ if err := cmd.Wait(); err != nil {
+ t.Fatalf("%v exited with %v\n%s", cmd, err, out)
}
}
@@ -184,17 +202,16 @@
var match [][]byte
if bytes.HasPrefix(out, []byte("gcc")) {
compiler.name = "gcc"
-
- cmd, err := cc("-dumpversion")
+ cmd, err := cc("-v")
if err != nil {
return err
}
- out, err := cmd.Output()
+ out, err := cmd.CombinedOutput()
if err != nil {
- // gcc, but does not support gcc's "-dumpversion" flag?!
+ // gcc, but does not support gcc's "-v" flag?!
return err
}
- gccRE := regexp.MustCompile(`(\d+)\.(\d+)`)
+ gccRE := regexp.MustCompile(`gcc version (\d+)\.(\d+)`)
match = gccRE.FindSubmatch(out)
} else {
clangRE := regexp.MustCompile(`clang version (\d+)\.(\d+)`)
@@ -235,6 +252,22 @@
}
}
+// compilerRequiredAsanVersion reports whether the compiler is the version required by Asan.
+func compilerRequiredAsanVersion() bool {
+ compiler, err := compilerVersion()
+ if err != nil {
+ return false
+ }
+ switch compiler.name {
+ case "gcc":
+ return compiler.major >= 7
+ case "clang":
+ return compiler.major >= 9
+ default:
+ return false
+ }
+}
+
type compilerCheck struct {
once sync.Once
err error
@@ -478,7 +511,7 @@
func aSanSupported(goos, goarch string) bool {
switch goos {
case "linux":
- return goarch == "amd64" || goarch == "arm64"
+ return goarch == "amd64" || goarch == "arm64" || goarch == "riscv64"
default:
return false
}
diff --git a/misc/cgo/testsanitizers/testdata/asan_global1_fail.go b/misc/cgo/testsanitizers/testdata/asan_global1_fail.go
new file mode 100644
index 0000000..6cfc0b7
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_global1_fail.go
@@ -0,0 +1,25 @@
+// 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
+
+/*
+#include <stdlib.h>
+#include <stdio.h>
+
+int test(int *a) {
+ a[2] = 300; // BOOM
+ return a[2];
+}
+*/
+import "C"
+
+import "fmt"
+
+var cIntArray [2]C.int
+
+func main() {
+ r := C.test(&cIntArray[0])
+ fmt.Println("r value = ", r)
+}
diff --git a/misc/cgo/testsanitizers/testdata/asan_global2_fail.go b/misc/cgo/testsanitizers/testdata/asan_global2_fail.go
new file mode 100644
index 0000000..1932633
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_global2_fail.go
@@ -0,0 +1,31 @@
+// 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
+
+/*
+#include <stdlib.h>
+#include <stdio.h>
+
+struct ss {
+ int *p;
+ int len;
+ int cap;
+};
+
+int test(struct ss *a) {
+ struct ss *t = a + 1;
+ t->len = 100; // BOOM
+ return t->len;
+}
+*/
+import "C"
+import "fmt"
+
+var tt C.struct_ss
+
+func main() {
+ r := C.test(&tt)
+ fmt.Println("r value = ", r)
+}
diff --git a/misc/cgo/testsanitizers/testdata/asan_global3_fail.go b/misc/cgo/testsanitizers/testdata/asan_global3_fail.go
new file mode 100644
index 0000000..9ab026c
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_global3_fail.go
@@ -0,0 +1,28 @@
+// 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
+
+/*
+#include <stdlib.h>
+#include <stdio.h>
+
+int test(int *a) {
+ int* p = a+1;
+ *p = 10; // BOOM
+ return *p;
+}
+*/
+import "C"
+import (
+ "fmt"
+ "unsafe"
+)
+
+var cIntV C.int
+
+func main() {
+ r := C.test((*C.int)(unsafe.Pointer(&cIntV)))
+ fmt.Printf("r value is %d", r)
+}
diff --git a/misc/cgo/testsanitizers/testdata/asan_global4_fail.go b/misc/cgo/testsanitizers/testdata/asan_global4_fail.go
new file mode 100644
index 0000000..d593598
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_global4_fail.go
@@ -0,0 +1,25 @@
+// 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"
+ "unsafe"
+)
+
+var intGlo int
+
+func main() {
+ r := bar(&intGlo)
+ fmt.Printf("r value is %d", r)
+}
+
+func bar(a *int) int {
+ p := (*int)(unsafe.Add(unsafe.Pointer(a), 1*unsafe.Sizeof(int(1))))
+ if *p == 10 { // BOOM
+ fmt.Println("its value is 10")
+ }
+ return *p
+}
diff --git a/misc/cgo/testsanitizers/testdata/asan_global5.go b/misc/cgo/testsanitizers/testdata/asan_global5.go
new file mode 100644
index 0000000..0ed103d
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_global5.go
@@ -0,0 +1,22 @@
+// 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"
+)
+
+type Any struct {
+ s string
+ b int64
+}
+
+var Sg = []interface{}{
+ Any{"a", 10},
+}
+
+func main() {
+ fmt.Println(Sg[0])
+}
diff --git a/misc/cgo/testsanitizers/testdata/asan_unsafe_fail1.go b/misc/cgo/testsanitizers/testdata/asan_unsafe_fail1.go
new file mode 100644
index 0000000..ec54a66
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_unsafe_fail1.go
@@ -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 main
+
+import (
+ "fmt"
+ "unsafe"
+)
+
+func main() {
+ a := 1
+ b := 2
+ c := add(a, b)
+ d := a + b
+ fmt.Println(c, d)
+}
+
+//go:noinline
+func add(a1, b1 int) int {
+ // The arguments.
+ // When -asan is enabled, unsafe.Pointer(&a1) conversion is escaping.
+ var p *int = (*int)(unsafe.Add(unsafe.Pointer(&a1), 1*unsafe.Sizeof(int(1))))
+ *p = 10 // BOOM
+ return a1 + b1
+}
diff --git a/misc/cgo/testsanitizers/testdata/asan_unsafe_fail2.go b/misc/cgo/testsanitizers/testdata/asan_unsafe_fail2.go
new file mode 100644
index 0000000..70f2127
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_unsafe_fail2.go
@@ -0,0 +1,28 @@
+// 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"
+ "unsafe"
+)
+
+func main() {
+ a := 1
+ b := 2
+ c := add(a, b)
+ d := a + b
+ fmt.Println(c, d)
+}
+
+//go:noinline
+func add(a1, b1 int) (ret int) {
+ // The return value
+ // When -asan is enabled, the unsafe.Pointer(&ret) conversion is escaping.
+ var p *int = (*int)(unsafe.Add(unsafe.Pointer(&ret), 1*unsafe.Sizeof(int(1))))
+ *p = 123 // BOOM
+ ret = a1 + b1
+ return
+}
diff --git a/misc/cgo/testsanitizers/testdata/asan_unsafe_fail3.go b/misc/cgo/testsanitizers/testdata/asan_unsafe_fail3.go
new file mode 100644
index 0000000..47a8a07
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/asan_unsafe_fail3.go
@@ -0,0 +1,21 @@
+// 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"
+ "unsafe"
+)
+
+func main() {
+ a := 1
+ b := 2
+ // The local variables.
+ // When -asan is enabled, the unsafe.Pointer(&a) conversion is escaping.
+ var p *int = (*int)(unsafe.Add(unsafe.Pointer(&a), 1*unsafe.Sizeof(int(1))))
+ *p = 20 // BOOM
+ d := a + b
+ fmt.Println(d)
+}
diff --git a/misc/cgo/testshared/shared_test.go b/misc/cgo/testshared/shared_test.go
index b78083b..756c4ba 100644
--- a/misc/cgo/testshared/shared_test.go
+++ b/misc/cgo/testshared/shared_test.go
@@ -27,6 +27,7 @@
)
var gopathInstallDir, gorootInstallDir string
+var oldGOROOT string
// This is the smallest set of packages we can link into a shared
// library (runtime/cgo is built implicitly).
@@ -57,10 +58,10 @@
func goCmd(t *testing.T, args ...string) string {
newargs := []string{args[0]}
if *testX && args[0] != "env" {
- newargs = append(newargs, "-x")
+ newargs = append(newargs, "-x", "-ldflags=-v")
}
newargs = append(newargs, args[1:]...)
- c := exec.Command("go", newargs...)
+ c := exec.Command(filepath.Join(oldGOROOT, "bin", "go"), newargs...)
stderr := new(strings.Builder)
c.Stderr = stderr
@@ -90,6 +91,12 @@
// TestMain calls testMain so that the latter can use defer (TestMain exits with os.Exit).
func testMain(m *testing.M) (int, error) {
+ cwd, err := os.Getwd()
+ if err != nil {
+ log.Fatal(err)
+ }
+ oldGOROOT = filepath.Join(cwd, "../../..")
+
workDir, err := os.MkdirTemp("", "shared_test")
if err != nil {
return 0, err
@@ -101,6 +108,15 @@
defer os.RemoveAll(workDir)
}
+ // -buildmode=shared fundamentally does not work in module mode.
+ // (It tries to share package dependencies across builds, but in module mode
+ // each module has its own distinct set of dependency versions.)
+ // We would like to eliminate it (see https://go.dev/issue/47788),
+ // but first need to figure out a replacement that covers the small subset
+ // of use-cases where -buildmode=shared still works today.
+ // For now, run the tests in GOPATH mode only.
+ os.Setenv("GO111MODULE", "off")
+
// Some tests need to edit the source in GOPATH, so copy this directory to a
// temporary directory and chdir to that.
gopath := filepath.Join(workDir, "gopath")
@@ -187,11 +203,6 @@
// GOROOT/pkg relevant to this test into the given directory.
// It must be run from within the testdata module.
func cloneGOROOTDeps(goroot string) error {
- oldGOROOT := strings.TrimSpace(goCmd(nil, "env", "GOROOT"))
- if oldGOROOT == "" {
- return fmt.Errorf("go env GOROOT returned an empty string")
- }
-
// Before we clone GOROOT, figure out which packages we need to copy over.
listArgs := []string{
"list",
diff --git a/misc/ios/go_ios_exec.go b/misc/ios/go_ios_exec.go
index 34a734c..c275dd3 100644
--- a/misc/ios/go_ios_exec.go
+++ b/misc/ios/go_ios_exec.go
@@ -13,9 +13,11 @@
// binary.
//
// This script requires that three environment variables be set:
-// GOIOS_DEV_ID: The codesigning developer id or certificate identifier
-// GOIOS_APP_ID: The provisioning app id prefix. Must support wildcard app ids.
-// GOIOS_TEAM_ID: The team id that owns the app id prefix.
+//
+// GOIOS_DEV_ID: The codesigning developer id or certificate identifier
+// GOIOS_APP_ID: The provisioning app id prefix. Must support wildcard app ids.
+// GOIOS_TEAM_ID: The team id that owns the app id prefix.
+//
// $GOROOT/misc/ios contains a script, detect.go, that attempts to autodetect these.
package main
diff --git a/misc/trace/README.md b/misc/trace/README.md
deleted file mode 100644
index 218d728..0000000
--- a/misc/trace/README.md
+++ /dev/null
@@ -1,105 +0,0 @@
-## Resources for Go's trace viewer
-
-Go execution trace UI (`go tool trace`) embeds
-Chrome's trace viewer (Catapult) following the
-[instructions](
-https://chromium.googlesource.com/catapult/+/refs/heads/master/tracing/docs/embedding-trace-viewer.md). This directory contains
-the helper files to embed Chrome's trace viewer.
-
-The current resources were generated/copied from
-[`Catapult@9508452e18f130c98499cb4c4f1e1efaedee8962`](
-https://chromium.googlesource.com/catapult/+/9508452e18f130c98499cb4c4f1e1efaedee8962).
-
-### Updating `trace_viewer_full.html`
-
-The file was generated by catapult's `vulcanize_trace_viewer` command.
-```
-$ git clone https://chromium.googlesource.com/catapult
-$ cd catapult
-$ ./tracing/bin/vulcanize_trace_viewer --config=full
-$ cp tracing/bin/trace_viewer_full.html $GOROOT/misc/trace/trace_viewer_full.html
-```
-
-We are supposed to use --config=lean (produces smaller html),
-but it is broken at the moment:
-https://github.com/catapult-project/catapult/issues/2247
-
-### Updating `webcomponents.min.js`
-
-`webcomponents.min.js` is necessary to let the trace viewer page
-to import the `trace_viewer_full.html`.
-This is copied from the catapult repo.
-
-```
-$ cp third_party/polymer/components/webcomponentsjs/webcomponents.min.js $GOROOT/misc/trace/webcomponents.min.js
-```
-
-## Licenses
-
-The license for trace-viewer is as follows:
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-The license for webcomponents.min.js is as follows:
-
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-// Copyright (c) 2014 The Polymer Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/src/all.bat b/src/all.bat
index ae835d9..dfc83c8 100644
--- a/src/all.bat
+++ b/src/all.bat
@@ -13,9 +13,9 @@
:ok
set OLDPATH=%PATH%
-call make.bat --no-banner --no-local
+call .\make.bat --no-banner --no-local
if %GOBUILDFAIL%==1 goto end
-call run.bat --no-rebuild --no-local
+call .\run.bat --no-rebuild --no-local
if %GOBUILDFAIL%==1 goto end
:: we must restore %PATH% before running "dist banner" so that the latter
:: can get the original %PATH% and give suggestion to add %GOROOT%/bin
diff --git a/src/archive/tar/common.go b/src/archive/tar/common.go
index c99b5c1..f6d701d 100644
--- a/src/archive/tar/common.go
+++ b/src/archive/tar/common.go
@@ -221,9 +221,11 @@
// that the file has no data in it, which is rather odd.
//
// As an example, if the underlying raw file contains the 10-byte data:
+//
// var compactFile = "abcdefgh"
//
// And the sparse map has the following entries:
+//
// var spd sparseDatas = []sparseEntry{
// {Offset: 2, Length: 5}, // Data fragment for 2..6
// {Offset: 18, Length: 3}, // Data fragment for 18..20
@@ -235,6 +237,7 @@
// }
//
// Then the content of the resulting sparse file with a Header.Size of 25 is:
+//
// var sparseFile = "\x00"*2 + "abcde" + "\x00"*11 + "fgh" + "\x00"*4
type (
sparseDatas []sparseEntry
@@ -293,9 +296,9 @@
// The input must have been already validated.
//
// This function mutates src and returns a normalized map where:
-// * adjacent fragments are coalesced together
-// * only the last fragment may be empty
-// * the endOffset of the last fragment is the total size
+// - adjacent fragments are coalesced together
+// - only the last fragment may be empty
+// - the endOffset of the last fragment is the total size
func invertSparseEntries(src []sparseEntry, size int64) []sparseEntry {
dst := src[:0]
var pre sparseEntry
diff --git a/src/archive/tar/reader.go b/src/archive/tar/reader.go
index 4b11909..f1b35c3 100644
--- a/src/archive/tar/reader.go
+++ b/src/archive/tar/reader.go
@@ -336,9 +336,9 @@
// header in case further processing is required.
//
// The err will be set to io.EOF only when one of the following occurs:
-// * Exactly 0 bytes are read and EOF is hit.
-// * Exactly 1 block of zeros is read and EOF is hit.
-// * At least 2 blocks of zeros are read.
+// - Exactly 0 bytes are read and EOF is hit.
+// - Exactly 1 block of zeros is read and EOF is hit.
+// - At least 2 blocks of zeros are read.
func (tr *Reader) readHeader() (*Header, *block, error) {
// Two blocks of zero bytes marks the end of the archive.
if _, err := io.ReadFull(tr.r, tr.blk[:]); err != nil {
diff --git a/src/archive/tar/stat_unix.go b/src/archive/tar/stat_unix.go
index 717a0b3..0f3428b 100644
--- a/src/archive/tar/stat_unix.go
+++ b/src/archive/tar/stat_unix.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-//go:build aix || linux || darwin || dragonfly || freebsd || openbsd || netbsd || solaris
+//go:build unix
package tar
diff --git a/src/archive/tar/strconv.go b/src/archive/tar/strconv.go
index 275db6f..ac31963 100644
--- a/src/archive/tar/strconv.go
+++ b/src/archive/tar/strconv.go
@@ -306,6 +306,7 @@
// validPAXRecord reports whether the key-value pair is valid where each
// record is formatted as:
+//
// "%d %s=%s\n" % (size, key, value)
//
// Keys and values should be UTF-8, but the number of bad writers out there
diff --git a/src/archive/zip/reader.go b/src/archive/zip/reader.go
index 92fd6f6..d7fcff2 100644
--- a/src/archive/zip/reader.go
+++ b/src/archive/zip/reader.go
@@ -33,6 +33,10 @@
Comment string
decompressors map[uint16]Decompressor
+ // Some JAR files are zip files with a prefix that is a bash script.
+ // The baseOffset field is the start of the zip file proper.
+ baseOffset int64
+
// fileList is a list of files sorted by ename,
// for use by the Open method.
fileListOnce sync.Once
@@ -52,9 +56,8 @@
FileHeader
zip *Reader
zipr io.ReaderAt
- headerOffset int64
+ headerOffset int64 // includes overall ZIP archive baseOffset
zip64 bool // zip64 extended information extra field presence
- descErr error // error reading the data descriptor during init
}
// OpenReader will open the Zip file specified by name and return a ReadCloser.
@@ -91,11 +94,12 @@
}
func (z *Reader) init(r io.ReaderAt, size int64) error {
- end, err := readDirectoryEnd(r, size)
+ end, baseOffset, err := readDirectoryEnd(r, size)
if err != nil {
return err
}
z.r = r
+ z.baseOffset = baseOffset
// Since the number of directory records is not validated, it is not
// safe to preallocate z.File without first checking that the specified
// number of files is reasonable, since a malformed archive may
@@ -107,7 +111,7 @@
}
z.Comment = end.comment
rs := io.NewSectionReader(r, 0, size)
- if _, err = rs.Seek(int64(end.directoryOffset), io.SeekStart); err != nil {
+ if _, err = rs.Seek(z.baseOffset+int64(end.directoryOffset), io.SeekStart); err != nil {
return err
}
buf := bufio.NewReader(rs)
@@ -119,12 +123,27 @@
for {
f := &File{zip: z, zipr: r}
err = readDirectoryHeader(f, buf)
+
+ // For compatibility with other zip programs,
+ // if we have a non-zero base offset and can't read
+ // the first directory header, try again with a zero
+ // base offset.
+ if err == ErrFormat && z.baseOffset != 0 && len(z.File) == 0 {
+ z.baseOffset = 0
+ if _, err = rs.Seek(int64(end.directoryOffset), io.SeekStart); err != nil {
+ return err
+ }
+ buf.Reset(rs)
+ continue
+ }
+
if err == ErrFormat || err == io.ErrUnexpectedEOF {
break
}
if err != nil {
return err
}
+ f.headerOffset += z.baseOffset
z.File = append(z.File, f)
}
if uint16(len(z.File)) != uint16(end.directoryRecords) { // only compare 16 bits here
@@ -229,6 +248,9 @@
n, err = r.rc.Read(b)
r.hash.Write(b[:n])
r.nread += uint64(n)
+ if r.nread > r.f.UncompressedSize64 {
+ return 0, ErrFormat
+ }
if err == nil {
return
}
@@ -492,7 +514,7 @@
return nil
}
-func readDirectoryEnd(r io.ReaderAt, size int64) (dir *directoryEnd, err error) {
+func readDirectoryEnd(r io.ReaderAt, size int64) (dir *directoryEnd, baseOffset int64, err error) {
// look for directoryEndSignature in the last 1k, then in the last 65k
var buf []byte
var directoryEndOffset int64
@@ -502,7 +524,7 @@
}
buf = make([]byte, int(bLen))
if _, err := r.ReadAt(buf, size-bLen); err != nil && err != io.EOF {
- return nil, err
+ return nil, 0, err
}
if p := findSignatureInBlock(buf); p >= 0 {
buf = buf[p:]
@@ -510,7 +532,7 @@
break
}
if i == 1 || bLen == size {
- return nil, ErrFormat
+ return nil, 0, ErrFormat
}
}
@@ -527,7 +549,7 @@
}
l := int(d.commentLen)
if l > len(b) {
- return nil, errors.New("zip: invalid comment length")
+ return nil, 0, errors.New("zip: invalid comment length")
}
d.comment = string(b[:l])
@@ -535,17 +557,21 @@
if d.directoryRecords == 0xffff || d.directorySize == 0xffff || d.directoryOffset == 0xffffffff {
p, err := findDirectory64End(r, directoryEndOffset)
if err == nil && p >= 0 {
+ directoryEndOffset = p
err = readDirectory64End(r, p, d)
}
if err != nil {
- return nil, err
+ return nil, 0, err
}
}
+
+ baseOffset = directoryEndOffset - int64(d.directorySize) - int64(d.directoryOffset)
+
// Make sure directoryOffset points to somewhere in our file.
- if o := int64(d.directoryOffset); o < 0 || o >= size {
- return nil, ErrFormat
+ if o := baseOffset + int64(d.directoryOffset); o < 0 || o >= size {
+ return nil, 0, ErrFormat
}
- return d, nil
+ return d, baseOffset, nil
}
// findDirectory64End tries to read the zip64 locator just before the
@@ -650,6 +676,7 @@
name string
file *File
isDir bool
+ isDup bool
}
type fileInfoDirEntry interface {
@@ -657,11 +684,14 @@
fs.DirEntry
}
-func (e *fileListEntry) stat() fileInfoDirEntry {
- if !e.isDir {
- return headerFileInfo{&e.file.FileHeader}
+func (e *fileListEntry) stat() (fileInfoDirEntry, error) {
+ if e.isDup {
+ return nil, errors.New(e.name + ": duplicate entries in zip file")
}
- return e
+ if !e.isDir {
+ return headerFileInfo{&e.file.FileHeader}, nil
+ }
+ return e, nil
}
// Only used for directories.
@@ -696,17 +726,37 @@
func (r *Reader) initFileList() {
r.fileListOnce.Do(func() {
+ // files and knownDirs map from a file/directory name
+ // to an index into the r.fileList entry that we are
+ // building. They are used to mark duplicate entries.
+ files := make(map[string]int)
+ knownDirs := make(map[string]int)
+
+ // dirs[name] is true if name is known to be a directory,
+ // because it appears as a prefix in a path.
dirs := make(map[string]bool)
- knownDirs := make(map[string]bool)
+
for _, file := range r.File {
isDir := len(file.Name) > 0 && file.Name[len(file.Name)-1] == '/'
name := toValidName(file.Name)
if name == "" {
continue
}
+
+ if idx, ok := files[name]; ok {
+ r.fileList[idx].isDup = true
+ continue
+ }
+ if idx, ok := knownDirs[name]; ok {
+ r.fileList[idx].isDup = true
+ continue
+ }
+
for dir := path.Dir(name); dir != "."; dir = path.Dir(dir) {
dirs[dir] = true
}
+
+ idx := len(r.fileList)
entry := fileListEntry{
name: name,
file: file,
@@ -714,17 +764,23 @@
}
r.fileList = append(r.fileList, entry)
if isDir {
- knownDirs[name] = true
+ knownDirs[name] = idx
+ } else {
+ files[name] = idx
}
}
for dir := range dirs {
- if !knownDirs[dir] {
- entry := fileListEntry{
- name: dir,
- file: nil,
- isDir: true,
+ if _, ok := knownDirs[dir]; !ok {
+ if idx, ok := files[dir]; ok {
+ r.fileList[idx].isDup = true
+ } else {
+ entry := fileListEntry{
+ name: dir,
+ file: nil,
+ isDir: true,
+ }
+ r.fileList = append(r.fileList, entry)
}
- r.fileList = append(r.fileList, entry)
}
}
@@ -819,7 +875,7 @@
}
func (d *openDir) Close() error { return nil }
-func (d *openDir) Stat() (fs.FileInfo, error) { return d.e.stat(), nil }
+func (d *openDir) Stat() (fs.FileInfo, error) { return d.e.stat() }
func (d *openDir) Read([]byte) (int, error) {
return 0, &fs.PathError{Op: "read", Path: d.e.name, Err: errors.New("is a directory")}
@@ -838,7 +894,11 @@
}
list := make([]fs.DirEntry, n)
for i := range list {
- list[i] = d.files[d.offset+i].stat()
+ s, err := d.files[d.offset+i].stat()
+ if err != nil {
+ return nil, err
+ }
+ list[i] = s
}
d.offset += n
return list, nil
diff --git a/src/archive/zip/reader_test.go b/src/archive/zip/reader_test.go
index d1a9bdd..84742c7 100644
--- a/src/archive/zip/reader_test.go
+++ b/src/archive/zip/reader_test.go
@@ -91,6 +91,42 @@
},
},
{
+ Name: "test-prefix.zip",
+ Comment: "This is a zipfile comment.",
+ File: []ZipTestFile{
+ {
+ Name: "test.txt",
+ Content: []byte("This is a test text file.\n"),
+ Modified: time.Date(2010, 9, 5, 12, 12, 1, 0, timeZone(+10*time.Hour)),
+ Mode: 0644,
+ },
+ {
+ Name: "gophercolor16x16.png",
+ File: "gophercolor16x16.png",
+ Modified: time.Date(2010, 9, 5, 15, 52, 58, 0, timeZone(+10*time.Hour)),
+ Mode: 0644,
+ },
+ },
+ },
+ {
+ Name: "test-baddirsz.zip",
+ Comment: "This is a zipfile comment.",
+ File: []ZipTestFile{
+ {
+ Name: "test.txt",
+ Content: []byte("This is a test text file.\n"),
+ Modified: time.Date(2010, 9, 5, 12, 12, 1, 0, timeZone(+10*time.Hour)),
+ Mode: 0644,
+ },
+ {
+ Name: "gophercolor16x16.png",
+ File: "gophercolor16x16.png",
+ Modified: time.Date(2010, 9, 5, 15, 52, 58, 0, timeZone(+10*time.Hour)),
+ Mode: 0644,
+ },
+ },
+ },
+ {
Name: "r.zip",
Source: returnRecursiveZip,
File: []ZipTestFile{
@@ -487,6 +523,35 @@
},
},
},
+ {
+ Name: "dupdir.zip",
+ File: []ZipTestFile{
+ {
+ Name: "a/",
+ Content: []byte{},
+ Mode: fs.ModeDir | 0666,
+ Modified: time.Date(2021, 12, 29, 0, 0, 0, 0, timeZone(0)),
+ },
+ {
+ Name: "a/b",
+ Content: []byte{},
+ Mode: 0666,
+ Modified: time.Date(2021, 12, 29, 0, 0, 0, 0, timeZone(0)),
+ },
+ {
+ Name: "a/b/",
+ Content: []byte{},
+ Mode: fs.ModeDir | 0666,
+ Modified: time.Date(2021, 12, 29, 0, 0, 0, 0, timeZone(0)),
+ },
+ {
+ Name: "a/b/c",
+ Content: []byte{},
+ Mode: 0666,
+ Modified: time.Date(2021, 12, 29, 0, 0, 0, 0, timeZone(0)),
+ },
+ },
+ },
}
func TestReader(t *testing.T) {
@@ -865,7 +930,6 @@
//
// It's here in hex for the same reason as rZipBytes above: to avoid
// problems with on-disk virus scanners or other zip processors.
-//
func biggestZipBytes() []byte {
s := `
0000000 50 4b 03 04 14 00 08 00 08 00 00 00 00 00 00 00
@@ -1012,7 +1076,7 @@
"\x00\x00\x00\x00\x0000000000\x00\x00\x00\x00000" +
"00000000PK\x01\x0200000000" +
"0000000000000000\v\x00\x00\x00" +
- "\x00\x0000PK\x05\x06000000\x05\x000000" +
+ "\x00\x0000PK\x05\x06000000\x05\x00\xfd\x00\x00\x00" +
"\v\x00\x00\x00\x00\x00")
z, err := NewReader(bytes.NewReader(data), int64(len(data)))
if err != nil {
@@ -1057,7 +1121,7 @@
"0000000000000000PK\x01\x02" +
"0000\b0\b\x00000000000000" +
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000000PK\x05\x06\x00\x00" +
- "\x00\x0000\x01\x0000008\x00\x00\x00\x00\x00")
+ "\x00\x0000\x01\x00\x26\x00\x00\x008\x00\x00\x00\x00\x00")
z, err := NewReader(bytes.NewReader(data), int64(len(data)))
if err != nil {
t.Fatal(err)
@@ -1124,6 +1188,7 @@
[]string{"a/b/c"},
},
} {
+ test := test
t.Run(test.file, func(t *testing.T) {
t.Parallel()
z, err := OpenReader(test.file)
@@ -1138,6 +1203,60 @@
}
}
+func TestFSWalk(t *testing.T) {
+ for _, test := range []struct {
+ file string
+ want []string
+ wantErr bool
+ }{
+ {
+ file: "testdata/unix.zip",
+ want: []string{".", "dir", "dir/bar", "dir/empty", "hello", "readonly"},
+ },
+ {
+ file: "testdata/subdir.zip",
+ want: []string{".", "a", "a/b", "a/b/c"},
+ },
+ {
+ file: "testdata/dupdir.zip",
+ wantErr: true,
+ },
+ } {
+ test := test
+ t.Run(test.file, func(t *testing.T) {
+ t.Parallel()
+ z, err := OpenReader(test.file)
+ if err != nil {
+ t.Fatal(err)
+ }
+ var files []string
+ sawErr := false
+ err = fs.WalkDir(z, ".", func(path string, d fs.DirEntry, err error) error {
+ if err != nil {
+ if !test.wantErr {
+ t.Errorf("%s: %v", path, err)
+ }
+ sawErr = true
+ return nil
+ }
+ files = append(files, path)
+ return nil
+ })
+ if err != nil {
+ t.Errorf("fs.WalkDir error: %v", err)
+ }
+ if test.wantErr && !sawErr {
+ t.Error("succeeded but want error")
+ } else if !test.wantErr && sawErr {
+ t.Error("unexpected error")
+ }
+ if test.want != nil && !reflect.DeepEqual(files, test.want) {
+ t.Errorf("got %v want %v", files, test.want)
+ }
+ })
+ }
+}
+
func TestFSModTime(t *testing.T) {
t.Parallel()
z, err := OpenReader("testdata/subdir.zip")
@@ -1408,3 +1527,30 @@
t.Errorf("Inconsistent name in info entry: %v", name)
}
}
+
+func TestUnderSize(t *testing.T) {
+ z, err := OpenReader("testdata/readme.zip")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer z.Close()
+
+ for _, f := range z.File {
+ f.UncompressedSize64 = 1
+ }
+
+ for _, f := range z.File {
+ t.Run(f.Name, func(t *testing.T) {
+ rd, err := f.Open()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer rd.Close()
+
+ _, err = io.Copy(io.Discard, rd)
+ if err != ErrFormat {
+ t.Fatalf("Error mismatch\n\tGot: %v\n\tWant: %v", err, ErrFormat)
+ }
+ })
+ }
+}
diff --git a/src/archive/zip/testdata/dupdir.zip b/src/archive/zip/testdata/dupdir.zip
new file mode 100644
index 0000000..292720b
--- /dev/null
+++ b/src/archive/zip/testdata/dupdir.zip
Binary files differ
diff --git a/src/archive/zip/testdata/readme.notzip b/src/archive/zip/testdata/readme.notzip
index 8173727..79b1cb6 100644
--- a/src/archive/zip/testdata/readme.notzip
+++ b/src/archive/zip/testdata/readme.notzip
Binary files differ
diff --git a/src/archive/zip/testdata/test-baddirsz.zip b/src/archive/zip/testdata/test-baddirsz.zip
new file mode 100644
index 0000000..45b3314
--- /dev/null
+++ b/src/archive/zip/testdata/test-baddirsz.zip
Binary files differ
diff --git a/src/archive/zip/testdata/test-prefix.zip b/src/archive/zip/testdata/test-prefix.zip
new file mode 100644
index 0000000..1eabb48
--- /dev/null
+++ b/src/archive/zip/testdata/test-prefix.zip
Binary files differ
diff --git a/src/bootstrap.bash b/src/bootstrap.bash
index 88c080a..4038eaf 100755
--- a/src/bootstrap.bash
+++ b/src/bootstrap.bash
@@ -96,7 +96,7 @@
echo "Preparing to generate build system's ${OUTGZ}; cleaning ..."
rm -rf bin/gofmt
rm -rf src/runtime/race/race_*.syso
- rm -rf api test doc misc/cgo/test misc/trace
+ rm -rf api test doc misc/cgo/test
rm -rf pkg/tool/*_*/{addr2line,api,cgo,cover,doc,fix,nm,objdump,pack,pprof,test2json,trace,vet}
rm -rf pkg/*_*/{image,database,cmd}
rm -rf $(find . -type d -name testdata)
diff --git a/src/bufio/bufio.go b/src/bufio/bufio.go
index 7483946..1da8ffa 100644
--- a/src/bufio/bufio.go
+++ b/src/bufio/bufio.go
@@ -203,7 +203,8 @@
// The bytes are taken from at most one Read on the underlying Reader,
// hence n may be less than len(p).
// To read exactly len(p) bytes, use io.ReadFull(b, p).
-// At EOF, the count will be zero and err will be io.EOF.
+// If the underlying Reader can return a non-zero count with io.EOF,
+// then this Read method can do so as well; see the [io.Reader] docs.
func (b *Reader) Read(p []byte) (n int, err error) {
n = len(p)
if n == 0 {
@@ -731,13 +732,28 @@
// If the count is less than len(s), it also returns an error explaining
// why the write is short.
func (b *Writer) WriteString(s string) (int, error) {
+ var sw io.StringWriter
+ tryStringWriter := true
+
nn := 0
for len(s) > b.Available() && b.err == nil {
- n := copy(b.buf[b.n:], s)
- b.n += n
+ var n int
+ if b.Buffered() == 0 && sw == nil && tryStringWriter {
+ // Check at most once whether b.wr is a StringWriter.
+ sw, tryStringWriter = b.wr.(io.StringWriter)
+ }
+ if b.Buffered() == 0 && tryStringWriter {
+ // Large write, empty buffer, and the underlying writer supports
+ // WriteString: forward the write to the underlying StringWriter.
+ // This avoids an extra copy.
+ n, b.err = sw.WriteString(s)
+ } else {
+ n = copy(b.buf[b.n:], s)
+ b.n += n
+ b.Flush()
+ }
nn += n
s = s[n:]
- b.Flush()
}
if b.err != nil {
return nn, b.err
diff --git a/src/bufio/bufio_test.go b/src/bufio/bufio_test.go
index ff3396e..b3456d2 100644
--- a/src/bufio/bufio_test.go
+++ b/src/bufio/bufio_test.go
@@ -762,6 +762,67 @@
}
}
+func TestWriteStringStringWriter(t *testing.T) {
+ const BufSize = 8
+ {
+ tw := &teststringwriter{}
+ b := NewWriterSize(tw, BufSize)
+ b.WriteString("1234")
+ tw.check(t, "", "")
+ b.WriteString("56789012") // longer than BufSize
+ tw.check(t, "12345678", "") // but not enough (after filling the partially-filled buffer)
+ b.Flush()
+ tw.check(t, "123456789012", "")
+ }
+ {
+ tw := &teststringwriter{}
+ b := NewWriterSize(tw, BufSize)
+ b.WriteString("123456789") // long string, empty buffer:
+ tw.check(t, "", "123456789") // use WriteString
+ }
+ {
+ tw := &teststringwriter{}
+ b := NewWriterSize(tw, BufSize)
+ b.WriteString("abc")
+ tw.check(t, "", "")
+ b.WriteString("123456789012345") // long string, non-empty buffer
+ tw.check(t, "abc12345", "6789012345") // use Write and then WriteString since the remaining part is still longer than BufSize
+ }
+ {
+ tw := &teststringwriter{}
+ b := NewWriterSize(tw, BufSize)
+ b.Write([]byte("abc")) // same as above, but use Write instead of WriteString
+ tw.check(t, "", "")
+ b.WriteString("123456789012345")
+ tw.check(t, "abc12345", "6789012345") // same as above
+ }
+}
+
+type teststringwriter struct {
+ write string
+ writeString string
+}
+
+func (w *teststringwriter) Write(b []byte) (int, error) {
+ w.write += string(b)
+ return len(b), nil
+}
+
+func (w *teststringwriter) WriteString(s string) (int, error) {
+ w.writeString += s
+ return len(s), nil
+}
+
+func (w *teststringwriter) check(t *testing.T, write, writeString string) {
+ t.Helper()
+ if w.write != write {
+ t.Errorf("write: expected %q, got %q", write, w.write)
+ }
+ if w.writeString != writeString {
+ t.Errorf("writeString: expected %q, got %q", writeString, w.writeString)
+ }
+}
+
func TestBufferFull(t *testing.T) {
const longString = "And now, hello, world! It is the time for all good men to come to the aid of their party"
buf := NewReaderSize(strings.NewReader(longString), minReadBufferSize)
diff --git a/src/bufio/scan.go b/src/bufio/scan.go
index 4846d4f..e247cbc 100644
--- a/src/bufio/scan.go
+++ b/src/bufio/scan.go
@@ -26,7 +26,6 @@
// advanced arbitrarily far past the last token. Programs that need more
// control over error handling or large tokens, or must run sequential scans
// on a reader, should use bufio.Reader instead.
-//
type Scanner struct {
r io.Reader // The reader provided by the client.
split SplitFunc // The function to split the tokens.
diff --git a/src/builtin/builtin.go b/src/builtin/builtin.go
index 5657be4..7feb209 100644
--- a/src/builtin/builtin.go
+++ b/src/builtin/builtin.go
@@ -3,10 +3,10 @@
// license that can be found in the LICENSE file.
/*
- Package builtin provides documentation for Go's predeclared identifiers.
- The items documented here are not actually in package builtin
- but their descriptions here allow godoc to present documentation
- for the language's special identifiers.
+Package builtin provides documentation for Go's predeclared identifiers.
+The items documented here are not actually in package builtin
+but their descriptions here allow godoc to present documentation
+for the language's special identifiers.
*/
package builtin
@@ -137,9 +137,12 @@
// new elements. If it does not, a new underlying array will be allocated.
// Append returns the updated slice. It is therefore necessary to store the
// result of append, often in the variable holding the slice itself:
+//
// slice = append(slice, elem1, elem2)
// slice = append(slice, anotherSlice...)
+//
// As a special case, it is legal to append a string to a byte slice, like this:
+//
// slice = append([]byte("hello "), "world"...)
func append(slice []Type, elems ...Type) []Type
@@ -156,24 +159,28 @@
func delete(m map[Type]Type1, key Type)
// The len built-in function returns the length of v, according to its type:
+//
// Array: the number of elements in v.
// Pointer to array: the number of elements in *v (even if v is nil).
// Slice, or map: the number of elements in v; if v is nil, len(v) is zero.
// String: the number of bytes in v.
// Channel: the number of elements queued (unread) in the channel buffer;
// if v is nil, len(v) is zero.
+//
// For some arguments, such as a string literal or a simple array expression, the
// result can be a constant. See the Go language specification's "Length and
// capacity" section for details.
func len(v Type) int
// The cap built-in function returns the capacity of v, according to its type:
+//
// Array: the number of elements in v (same as len(v)).
// Pointer to array: the number of elements in *v (same as len(v)).
// Slice: the maximum length the slice can reach when resliced;
// if v is nil, cap(v) is zero.
// Channel: the channel buffer capacity, in units of elements;
// if v is nil, cap(v) is zero.
+//
// For some arguments, such as a simple array expression, the result can be a
// constant. See the Go language specification's "Length and capacity" section for
// details.
@@ -184,6 +191,7 @@
// value. Unlike new, make's return type is the same as the type of its
// argument, not a pointer to it. The specification of the result depends on
// the type:
+//
// Slice: The size specifies the length. The capacity of the slice is
// equal to its length. A second integer argument may be provided to
// specify a different capacity; it must be no smaller than the
@@ -225,8 +233,10 @@
// the last sent value is received. After the last value has been received
// from a closed channel c, any receive from c will succeed without
// blocking, returning the zero value for the channel element. The form
+//
// x, ok := <-c
-// will also set ok to false for a closed channel.
+//
+// will also set ok to false for a closed and empty channel.
func close(c chan<- Type)
// The panic built-in function stops normal execution of the current
diff --git a/src/bytes/buffer.go b/src/bytes/buffer.go
index 549b077..0bacbda 100644
--- a/src/bytes/buffer.go
+++ b/src/bytes/buffer.go
@@ -138,10 +138,8 @@
} else if c > maxInt-c-n {
panic(ErrTooLarge)
} else {
- // Not enough space anywhere, we need to allocate.
- buf := makeSlice(2*c + n)
- copy(buf, b.buf[b.off:])
- b.buf = buf
+ // Add b.off to account for b.buf[:b.off] being sliced off the front.
+ b.buf = growSlice(b.buf[b.off:], b.off+n)
}
// Restore b.off and len(b.buf).
b.off = 0
@@ -217,16 +215,31 @@
}
}
-// makeSlice allocates a slice of size n. If the allocation fails, it panics
-// with ErrTooLarge.
-func makeSlice(n int) []byte {
- // If the make fails, give a known error.
+// growSlice grows b by n, preserving the original content of b.
+// If the allocation fails, it panics with ErrTooLarge.
+func growSlice(b []byte, n int) []byte {
defer func() {
if recover() != nil {
panic(ErrTooLarge)
}
}()
- return make([]byte, n)
+ // TODO(http://golang.org/issue/51462): We should rely on the append-make
+ // pattern so that the compiler can call runtime.growslice. For example:
+ // return append(b, make([]byte, n)...)
+ // This avoids unnecessary zero-ing of the first len(b) bytes of the
+ // allocated slice, but this pattern causes b to escape onto the heap.
+ //
+ // Instead use the append-make pattern with a nil slice to ensure that
+ // we allocate buffers rounded up to the closest size class.
+ c := len(b) + n // ensure enough space for n elements
+ if c < 2*cap(b) {
+ // The growth rate has historically always been 2x. In the future,
+ // we could rely purely on append to determine the growth rate.
+ c = 2 * cap(b)
+ }
+ b2 := append([]byte(nil), make([]byte, c)...)
+ copy(b2, b)
+ return b2[:len(b)]
}
// WriteTo writes data to w until the buffer is drained or an error occurs.
diff --git a/src/bytes/buffer_test.go b/src/bytes/buffer_test.go
index 9c9b744..c085500 100644
--- a/src/bytes/buffer_test.go
+++ b/src/bytes/buffer_test.go
@@ -672,3 +672,18 @@
}
}
}
+
+func BenchmarkBufferWriteBlock(b *testing.B) {
+ block := make([]byte, 1024)
+ for _, n := range []int{1 << 12, 1 << 16, 1 << 20} {
+ b.Run(fmt.Sprintf("N%d", n), func(b *testing.B) {
+ b.ReportAllocs()
+ for i := 0; i < b.N; i++ {
+ var bb Buffer
+ for bb.Len() < n {
+ bb.Write(block)
+ }
+ }
+ })
+ }
+}
diff --git a/src/bytes/bytes.go b/src/bytes/bytes.go
index e3dab4d..659a82b 100644
--- a/src/bytes/bytes.go
+++ b/src/bytes/bytes.go
@@ -30,7 +30,7 @@
// explode splits s into a slice of UTF-8 sequences, one per Unicode code point (still slices of bytes),
// up to a maximum of n byte slices. Invalid UTF-8 sequences are chopped into individual bytes.
func explode(s []byte, n int) [][]byte {
- if n <= 0 {
+ if n <= 0 || n > len(s) {
n = len(s)
}
a := make([][]byte, n)
@@ -348,6 +348,9 @@
if n < 0 {
n = Count(s, sep) + 1
}
+ if n > len(s)+1 {
+ n = len(s) + 1
+ }
a := make([][]byte, n)
n--
@@ -369,9 +372,10 @@
// the subslices between those separators.
// If sep is empty, SplitN splits after each UTF-8 sequence.
// The count determines the number of subslices to return:
-// n > 0: at most n subslices; the last subslice will be the unsplit remainder.
-// n == 0: the result is nil (zero subslices)
-// n < 0: all subslices
+//
+// n > 0: at most n subslices; the last subslice will be the unsplit remainder.
+// n == 0: the result is nil (zero subslices)
+// n < 0: all subslices
//
// To split around the first instance of a separator, see Cut.
func SplitN(s, sep []byte, n int) [][]byte { return genSplit(s, sep, 0, n) }
@@ -380,9 +384,10 @@
// returns a slice of those subslices.
// If sep is empty, SplitAfterN splits after each UTF-8 sequence.
// The count determines the number of subslices to return:
-// n > 0: at most n subslices; the last subslice will be the unsplit remainder.
-// n == 0: the result is nil (zero subslices)
-// n < 0: all subslices
+//
+// n > 0: at most n subslices; the last subslice will be the unsplit remainder.
+// n == 0: the result is nil (zero subslices)
+// n < 0: all subslices
func SplitAfterN(s, sep []byte, n int) [][]byte {
return genSplit(s, sep, len(sep), n)
}
@@ -1139,7 +1144,7 @@
}
// EqualFold reports whether s and t, interpreted as UTF-8 strings,
-// are equal under Unicode case-folding, which is a more general
+// are equal under simple Unicode case-folding, which is a more general
// form of case-insensitivity.
func EqualFold(s, t []byte) bool {
for len(s) != 0 && len(t) != 0 {
diff --git a/src/bytes/bytes_test.go b/src/bytes/bytes_test.go
index 2e6ab31..985aa0b 100644
--- a/src/bytes/bytes_test.go
+++ b/src/bytes/bytes_test.go
@@ -8,6 +8,7 @@
. "bytes"
"fmt"
"internal/testenv"
+ "math"
"math/rand"
"reflect"
"strings"
@@ -139,6 +140,36 @@
{"abc", "c", 2},
{"abc", "x", -1},
{"barfoobarfooyyyzzzyyyzzzyyyzzzyyyxxxzzzyyy", "x", 33},
+ {"fofofofooofoboo", "oo", 7},
+ {"fofofofofofoboo", "ob", 11},
+ {"fofofofofofoboo", "boo", 12},
+ {"fofofofofofoboo", "oboo", 11},
+ {"fofofofofoooboo", "fooo", 8},
+ {"fofofofofofoboo", "foboo", 10},
+ {"fofofofofofoboo", "fofob", 8},
+ {"fofofofofofofoffofoobarfoo", "foffof", 12},
+ {"fofofofofoofofoffofoobarfoo", "foffof", 13},
+ {"fofofofofofofoffofoobarfoo", "foffofo", 12},
+ {"fofofofofoofofoffofoobarfoo", "foffofo", 13},
+ {"fofofofofoofofoffofoobarfoo", "foffofoo", 13},
+ {"fofofofofofofoffofoobarfoo", "foffofoo", 12},
+ {"fofofofofoofofoffofoobarfoo", "foffofoob", 13},
+ {"fofofofofofofoffofoobarfoo", "foffofoob", 12},
+ {"fofofofofoofofoffofoobarfoo", "foffofooba", 13},
+ {"fofofofofofofoffofoobarfoo", "foffofooba", 12},
+ {"fofofofofoofofoffofoobarfoo", "foffofoobar", 13},
+ {"fofofofofofofoffofoobarfoo", "foffofoobar", 12},
+ {"fofofofofoofofoffofoobarfoo", "foffofoobarf", 13},
+ {"fofofofofofofoffofoobarfoo", "foffofoobarf", 12},
+ {"fofofofofoofofoffofoobarfoo", "foffofoobarfo", 13},
+ {"fofofofofofofoffofoobarfoo", "foffofoobarfo", 12},
+ {"fofofofofoofofoffofoobarfoo", "foffofoobarfoo", 13},
+ {"fofofofofofofoffofoobarfoo", "foffofoobarfoo", 12},
+ {"fofofofofoofofoffofoobarfoo", "ofoffofoobarfoo", 12},
+ {"fofofofofofofoffofoobarfoo", "ofoffofoobarfoo", 11},
+ {"fofofofofoofofoffofoobarfoo", "fofoffofoobarfoo", 11},
+ {"fofofofofofofoffofoobarfoo", "fofoffofoobarfoo", 10},
+ {"fofofofofoofofoffofoobarfoo", "foobars", -1},
{"foofyfoobarfoobar", "y", 4},
{"oooooooooooooooooooooo", "r", -1},
{"oxoxoxoxoxoxoxoxoxoxoxoy", "oy", 22},
@@ -723,6 +754,7 @@
{"1 2", " ", 3, []string{"1", "2"}},
{"123", "", 2, []string{"1", "23"}},
{"123", "", 17, []string{"1", "2", "3"}},
+ {"bT", "T", math.MaxInt / 4, []string{"b", ""}},
}
func TestSplit(t *testing.T) {
diff --git a/src/bytes/reader.go b/src/bytes/reader.go
index 5946cf9..81c22aa 100644
--- a/src/bytes/reader.go
+++ b/src/bytes/reader.go
@@ -32,8 +32,7 @@
// Size returns the original length of the underlying byte slice.
// Size is the number of bytes available for reading via ReadAt.
-// The returned value is always the same and is not affected by calls
-// to any other method.
+// The result is unaffected by any method calls except Reset.
func (r *Reader) Size() int64 { return int64(len(r.s)) }
// Read implements the io.Reader interface.
diff --git a/src/clean.bat b/src/clean.bat
index c957353..6688b41 100644
--- a/src/clean.bat
+++ b/src/clean.bat
@@ -10,7 +10,7 @@
go tool dist env -w -p >env.bat
if errorlevel 1 goto fail
-call env.bat
+call .\env.bat
del env.bat
echo.
diff --git a/src/cmd/addr2line/main.go b/src/cmd/addr2line/main.go
index 0188029..6e005a8 100644
--- a/src/cmd/addr2line/main.go
+++ b/src/cmd/addr2line/main.go
@@ -6,6 +6,7 @@
// just enough to support pprof.
//
// Usage:
+//
// go tool addr2line binary
//
// Addr2line reads hexadecimal addresses, one per line and with optional 0x prefix,
diff --git a/src/cmd/api/goapi.go b/src/cmd/api/goapi.go
index 5ae059e..e6bf62d 100644
--- a/src/cmd/api/goapi.go
+++ b/src/cmd/api/goapi.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// Binary api computes the exported API of a set of Go packages.
+// Api computes the exported API of a set of Go packages.
package main
import (
@@ -16,14 +16,15 @@
"go/parser"
"go/token"
"go/types"
- exec "internal/execabs"
"io"
"log"
"os"
+ "os/exec"
"path/filepath"
"regexp"
"runtime"
"sort"
+ "strconv"
"strings"
"sync"
)
@@ -33,21 +34,24 @@
if runtime.GOOS == "windows" {
exeSuffix = ".exe"
}
- path := filepath.Join(runtime.GOROOT(), "bin", "go"+exeSuffix)
- if _, err := os.Stat(path); err == nil {
- return path
+ if goroot := build.Default.GOROOT; goroot != "" {
+ path := filepath.Join(goroot, "bin", "go"+exeSuffix)
+ if _, err := os.Stat(path); err == nil {
+ return path
+ }
}
return "go"
}
// Flags
var (
- checkFile = flag.String("c", "", "optional comma-separated filename(s) to check API against")
- allowNew = flag.Bool("allow_new", true, "allow API additions")
- exceptFile = flag.String("except", "", "optional filename of packages that are allowed to change without triggering a failure in the tool")
- nextFile = flag.String("next", "", "optional filename of tentative upcoming API features for the next release. This file can be lazily maintained. It only affects the delta warnings from the -c file printed on success.")
- verbose = flag.Bool("v", false, "verbose debugging")
- forceCtx = flag.String("contexts", "", "optional comma-separated list of <goos>-<goarch>[-cgo] to override default contexts.")
+ checkFiles = flag.String("c", "", "optional comma-separated filename(s) to check API against")
+ requireApproval = flag.String("approval", "", "require approvals in comma-separated list of `files`")
+ allowNew = flag.Bool("allow_new", true, "allow API additions")
+ exceptFile = flag.String("except", "", "optional filename of packages that are allowed to change without triggering a failure in the tool")
+ nextFiles = flag.String("next", "", "comma-separated list of `files` for upcoming API features for the next release. These files can be lazily maintained. They only affects the delta warnings from the -c file printed on success.")
+ verbose = flag.Bool("v", false, "verbose debugging")
+ forceCtx = flag.String("contexts", "", "optional comma-separated list of <goos>-<goarch>[-cgo] to override default contexts.")
)
// contexts are the default contexts which are scanned, unless
@@ -125,10 +129,14 @@
func main() {
flag.Parse()
+ if build.Default.GOROOT == "" {
+ log.Fatalf("GOROOT not found. (If binary was built with -trimpath, $GOROOT must be set.)")
+ }
+
if !strings.Contains(runtime.Version(), "weekly") && !strings.Contains(runtime.Version(), "devel") {
- if *nextFile != "" {
- fmt.Printf("Go version is %q, ignoring -next %s\n", runtime.Version(), *nextFile)
- *nextFile = ""
+ if *nextFiles != "" {
+ fmt.Printf("Go version is %q, ignoring -next %s\n", runtime.Version(), *nextFiles)
+ *nextFiles = ""
}
}
@@ -201,7 +209,7 @@
bw := bufio.NewWriter(os.Stdout)
defer bw.Flush()
- if *checkFile == "" {
+ if *checkFiles == "" {
sort.Strings(features)
for _, f := range features {
fmt.Fprintln(bw, f)
@@ -210,10 +218,15 @@
}
var required []string
- for _, file := range strings.Split(*checkFile, ",") {
+ for _, file := range strings.Split(*checkFiles, ",") {
required = append(required, fileFeatures(file)...)
}
- optional := fileFeatures(*nextFile)
+ var optional []string
+ if *nextFiles != "" {
+ for _, file := range strings.Split(*nextFiles, ",") {
+ optional = append(optional, fileFeatures(file)...)
+ }
+ }
exception := fileFeatures(*exceptFile)
fail = !compareAPI(bw, features, required, optional, exception, *allowNew)
}
@@ -340,6 +353,13 @@
if filename == "" {
return nil
}
+ needApproval := false
+ for _, name := range strings.Split(*requireApproval, ",") {
+ if filename == name {
+ needApproval = true
+ break
+ }
+ }
bs, err := os.ReadFile(filename)
if err != nil {
log.Fatalf("Error reading file %s: %v", filename, err)
@@ -348,11 +368,23 @@
s = aliasReplacer.Replace(s)
lines := strings.Split(s, "\n")
var nonblank []string
- for _, line := range lines {
+ for i, line := range lines {
line = strings.TrimSpace(line)
- if line != "" && !strings.HasPrefix(line, "#") {
- nonblank = append(nonblank, line)
+ if line == "" || strings.HasPrefix(line, "#") {
+ continue
}
+ if needApproval {
+ feature, approval, ok := strings.Cut(line, "#")
+ if !ok {
+ log.Fatalf("%s:%d: missing proposal approval\n", filename, i+1)
+ }
+ _, err := strconv.Atoi(approval)
+ if err != nil {
+ log.Fatalf("%s:%d: malformed proposal approval #%s\n", filename, i+1, approval)
+ }
+ line = strings.TrimSpace(feature)
+ }
+ nonblank = append(nonblank, line)
}
return nonblank
}
diff --git a/src/cmd/api/goapi_boring_test.go b/src/cmd/api/goapi_boring_test.go
new file mode 100644
index 0000000..f0e3575
--- /dev/null
+++ b/src/cmd/api/goapi_boring_test.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.
+
+//go:build boringcrypto
+
+package main
+
+import (
+ "fmt"
+ "os"
+)
+
+func init() {
+ fmt.Printf("SKIP with boringcrypto enabled\n")
+ os.Exit(0)
+}
diff --git a/src/cmd/api/goapi_test.go b/src/cmd/api/goapi_test.go
index 16e0058..862ab18 100644
--- a/src/cmd/api/goapi_test.go
+++ b/src/cmd/api/goapi_test.go
@@ -9,6 +9,7 @@
"flag"
"fmt"
"go/build"
+ "internal/testenv"
"os"
"path/filepath"
"sort"
@@ -22,6 +23,7 @@
for _, c := range contexts {
c.Compiler = build.Default.Compiler
}
+ build.Default.GOROOT = testenv.GOROOT(nil)
// Warm up the import cache in parallel.
var wg sync.WaitGroup
diff --git a/src/cmd/api/run.go b/src/cmd/api/run.go
index 903f157..89d1bf2 100644
--- a/src/cmd/api/run.go
+++ b/src/cmd/api/run.go
@@ -11,13 +11,14 @@
import (
"errors"
"fmt"
- exec "internal/execabs"
"internal/goversion"
"io/fs"
"log"
"os"
+ "os/exec"
"path/filepath"
"runtime"
+ "strconv"
"strings"
)
@@ -41,51 +42,69 @@
if goroot == "" {
log.Fatal("No $GOROOT set.")
}
+ if err := os.Chdir(filepath.Join(goroot, "api")); err != nil {
+ log.Fatal(err)
+ }
- apiDir := filepath.Join(goroot, "api")
- out, err := exec.Command(goCmd(), "tool", "api",
- "-c", findAPIDirFiles(apiDir),
- allowNew(apiDir),
- "-next", filepath.Join(apiDir, "next.txt"),
- "-except", filepath.Join(apiDir, "except.txt")).CombinedOutput()
+ files, err := filepath.Glob("go1*.txt")
+ if err != nil {
+ log.Fatal(err)
+ }
+ files = append(files, "fuchsia.txt")
+ next, err := filepath.Glob(filepath.Join("next", "*.txt"))
+ if err != nil {
+ log.Fatal(err)
+ }
+ cmd := exec.Command(goCmd(), "tool", "api",
+ "-c", strings.Join(files, ","),
+ "-approval", strings.Join(append(approvalNeeded(files), next...), ","),
+ allowNew(),
+ "-next", strings.Join(next, ","),
+ "-except", "except.txt",
+ )
+ out, err := cmd.CombinedOutput()
if err != nil {
log.Fatalf("Error running API checker: %v\n%s", err, out)
}
fmt.Print(string(out))
}
-// findAPIDirFiles returns a comma-separated list of Go API files
-// (go1.txt, go1.1.txt, etc.) located in apiDir.
-func findAPIDirFiles(apiDir string) string {
- dir, err := os.Open(apiDir)
- if err != nil {
- log.Fatal(err)
- }
- defer dir.Close()
- fs, err := dir.Readdirnames(-1)
- if err != nil {
- log.Fatal(err)
- }
- var apiFiles []string
- for _, fn := range fs {
- if strings.HasPrefix(fn, "go1") || strings.HasPrefix(fn, "fuchsia") {
- apiFiles = append(apiFiles, filepath.Join(apiDir, fn))
+func approvalNeeded(files []string) []string {
+ var out []string
+ for _, f := range files {
+ name := filepath.Base(f)
+ if name == "go1.txt" {
+ continue
+ }
+ if name == "fuchsia.txt" {
+ continue
+ }
+ minor := strings.TrimSuffix(strings.TrimPrefix(name, "go1."), ".txt")
+ n, err := strconv.Atoi(minor)
+ if err != nil {
+ log.Fatalf("unexpected api file: %v", f)
+ }
+ if n >= 19 { // approvals started being tracked in Go 1.19
+ out = append(out, f)
}
}
- return strings.Join(apiFiles, ",")
+ return out
}
// allowNew returns the -allow_new flag to use for the 'go tool api' invocation.
-func allowNew(apiDir string) string {
+func allowNew() string {
+ // Experiment for Go 1.19: always require api file updates.
+ return "-allow_new=false"
+
// Verify that the api/go1.n.txt for previous Go version exists.
// It definitely should, otherwise it's a signal that the logic below may be outdated.
- if _, err := os.Stat(filepath.Join(apiDir, fmt.Sprintf("go1.%d.txt", goversion.Version-1))); err != nil {
+ if _, err := os.Stat(fmt.Sprintf("go1.%d.txt", goversion.Version-1)); err != nil {
log.Fatalln("Problem with api file for previous release:", err)
}
// See whether the api/go1.n.txt for this Go version has been created.
// (As of April 2021, it gets created during the release of the first Beta.)
- _, err := os.Stat(filepath.Join(apiDir, fmt.Sprintf("go1.%d.txt", goversion.Version)))
+ _, err := os.Stat(fmt.Sprintf("go1.%d.txt", goversion.Version))
if errors.Is(err, fs.ErrNotExist) {
// It doesn't exist, so we're in development or before Beta 1.
// At this stage, unmentioned API additions are deemed okay.
diff --git a/src/cmd/asm/doc.go b/src/cmd/asm/doc.go
index 4a0c785..098f063 100644
--- a/src/cmd/asm/doc.go
+++ b/src/cmd/asm/doc.go
@@ -3,11 +3,11 @@
// license that can be found in the LICENSE file.
/*
-Asm, typically invoked as ``go tool asm'', assembles the source file into an object
+Asm, typically invoked as “go tool asm”, assembles the source file into an object
file named for the basename of the argument source file with a .o suffix. The
object file can then be combined with other objects into a package archive.
-Command Line
+# Command Line
Usage:
diff --git a/src/cmd/asm/internal/arch/arch.go b/src/cmd/asm/internal/arch/arch.go
index 4d374cb..a724a3b 100644
--- a/src/cmd/asm/internal/arch/arch.go
+++ b/src/cmd/asm/internal/arch/arch.go
@@ -9,6 +9,7 @@
"cmd/internal/obj"
"cmd/internal/obj/arm"
"cmd/internal/obj/arm64"
+ "cmd/internal/obj/loong64"
"cmd/internal/obj/mips"
"cmd/internal/obj/ppc64"
"cmd/internal/obj/riscv"
@@ -60,6 +61,8 @@
return archArm()
case "arm64":
return archArm64()
+ case "loong64":
+ return archLoong64(&loong64.Linkloong64)
case "mips":
return archMips(&mips.Linkmips)
case "mipsle":
@@ -278,46 +281,7 @@
}
register["LR"] = arm64.REGLINK
- register["DAIFSet"] = arm64.REG_DAIFSet
- register["DAIFClr"] = arm64.REG_DAIFClr
- register["PLDL1KEEP"] = arm64.REG_PLDL1KEEP
- register["PLDL1STRM"] = arm64.REG_PLDL1STRM
- register["PLDL2KEEP"] = arm64.REG_PLDL2KEEP
- register["PLDL2STRM"] = arm64.REG_PLDL2STRM
- register["PLDL3KEEP"] = arm64.REG_PLDL3KEEP
- register["PLDL3STRM"] = arm64.REG_PLDL3STRM
- register["PLIL1KEEP"] = arm64.REG_PLIL1KEEP
- register["PLIL1STRM"] = arm64.REG_PLIL1STRM
- register["PLIL2KEEP"] = arm64.REG_PLIL2KEEP
- register["PLIL2STRM"] = arm64.REG_PLIL2STRM
- register["PLIL3KEEP"] = arm64.REG_PLIL3KEEP
- register["PLIL3STRM"] = arm64.REG_PLIL3STRM
- register["PSTL1KEEP"] = arm64.REG_PSTL1KEEP
- register["PSTL1STRM"] = arm64.REG_PSTL1STRM
- register["PSTL2KEEP"] = arm64.REG_PSTL2KEEP
- register["PSTL2STRM"] = arm64.REG_PSTL2STRM
- register["PSTL3KEEP"] = arm64.REG_PSTL3KEEP
- register["PSTL3STRM"] = arm64.REG_PSTL3STRM
- // Conditional operators, like EQ, NE, etc.
- register["EQ"] = arm64.COND_EQ
- register["NE"] = arm64.COND_NE
- register["HS"] = arm64.COND_HS
- register["CS"] = arm64.COND_HS
- register["LO"] = arm64.COND_LO
- register["CC"] = arm64.COND_LO
- register["MI"] = arm64.COND_MI
- register["PL"] = arm64.COND_PL
- register["VS"] = arm64.COND_VS
- register["VC"] = arm64.COND_VC
- register["HI"] = arm64.COND_HI
- register["LS"] = arm64.COND_LS
- register["GE"] = arm64.COND_GE
- register["LT"] = arm64.COND_LT
- register["GT"] = arm64.COND_GT
- register["LE"] = arm64.COND_LE
- register["AL"] = arm64.COND_AL
- register["NV"] = arm64.COND_NV
// Pseudo-registers.
register["SB"] = RSB
register["FP"] = RFP
@@ -541,6 +505,59 @@
}
}
+func archLoong64(linkArch *obj.LinkArch) *Arch {
+ register := make(map[string]int16)
+ // Create maps for easy lookup of instruction names etc.
+ // Note that there is no list of names as there is for x86.
+ for i := loong64.REG_R0; i <= loong64.REG_R31; i++ {
+ register[obj.Rconv(i)] = int16(i)
+ }
+ for i := loong64.REG_F0; i <= loong64.REG_F31; i++ {
+ register[obj.Rconv(i)] = int16(i)
+ }
+ for i := loong64.REG_FCSR0; i <= loong64.REG_FCSR31; i++ {
+ register[obj.Rconv(i)] = int16(i)
+ }
+ for i := loong64.REG_FCC0; i <= loong64.REG_FCC31; i++ {
+ register[obj.Rconv(i)] = int16(i)
+ }
+ // Pseudo-registers.
+ register["SB"] = RSB
+ register["FP"] = RFP
+ register["PC"] = RPC
+ // Avoid unintentionally clobbering g using R22.
+ delete(register, "R22")
+ register["g"] = loong64.REG_R22
+ register["RSB"] = loong64.REG_R31
+ registerPrefix := map[string]bool{
+ "F": true,
+ "FCSR": true,
+ "FCC": true,
+ "R": true,
+ }
+
+ instructions := make(map[string]obj.As)
+ for i, s := range obj.Anames {
+ instructions[s] = obj.As(i)
+ }
+ for i, s := range loong64.Anames {
+ if obj.As(i) >= obj.A_ARCHSPECIFIC {
+ instructions[s] = obj.As(i) + obj.ABaseLoong64
+ }
+ }
+ // Annoying alias.
+ instructions["JAL"] = loong64.AJAL
+
+ return &Arch{
+ LinkArch: linkArch,
+ Instructions: instructions,
+ Register: register,
+ RegisterPrefix: registerPrefix,
+ RegisterNumber: loong64RegisterNumber,
+ IsJump: jumpLoong64,
+ }
+}
+
func archRISCV64(shared bool) *Arch {
register := make(map[string]int16)
diff --git a/src/cmd/asm/internal/arch/arm64.go b/src/cmd/asm/internal/arch/arm64.go
index 24689c5..936b894 100644
--- a/src/cmd/asm/internal/arch/arm64.go
+++ b/src/cmd/asm/internal/arch/arm64.go
@@ -12,6 +12,7 @@
"cmd/internal/obj"
"cmd/internal/obj/arm64"
"errors"
+ "fmt"
)
var arm64LS = map[string]uint8{
@@ -46,13 +47,56 @@
"JMP": true,
"TBNZ": true,
"TBZ": true,
+
+ // ADR isn't really a jump, but it takes a PC or label reference,
+ // which needs to patched like a jump.
+ "ADR": true,
+ "ADRP": true,
}
func jumpArm64(word string) bool {
return arm64Jump[word]
}
-// IsARM64CMP reports whether the op (as defined by an arm.A* constant) is
+var arm64SpecialOperand map[string]arm64.SpecialOperand
+
+// GetARM64SpecialOperand returns the internal representation of a special operand.
+func GetARM64SpecialOperand(name string) arm64.SpecialOperand {
+ if arm64SpecialOperand == nil {
+ // Generate the mapping automatically when the first time the function is called.
+ arm64SpecialOperand = map[string]arm64.SpecialOperand{}
+ for opd := arm64.SPOP_BEGIN; opd < arm64.SPOP_END; opd++ {
+ s := fmt.Sprintf("%s", opd)
+ arm64SpecialOperand[s] = opd
+ }
+
+ // Handle some special cases.
+ specialMapping := map[string]arm64.SpecialOperand{
+ // The internal representation of CS(CC) and HS(LO) are the same.
+ "CS": arm64.SPOP_HS,
+ "CC": arm64.SPOP_LO,
+ }
+ for s, opd := range specialMapping {
+ arm64SpecialOperand[s] = opd
+ }
+ }
+ if opd, ok := arm64SpecialOperand[name]; ok {
+ return opd
+ }
+ return arm64.SPOP_END
+}
+
+// IsARM64ADR reports whether the op (as defined by an arm64.A* constant) is
+// one of the comparison instructions that require special handling.
+func IsARM64ADR(op obj.As) bool {
+ switch op {
+ case arm64.AADR, arm64.AADRP:
+ return true
+ }
+ return false
+}
+
+// IsARM64CMP reports whether the op (as defined by an arm64.A* constant) is
// one of the comparison instructions that require special handling.
func IsARM64CMP(op obj.As) bool {
switch op {
diff --git a/src/cmd/asm/internal/arch/loong64.go b/src/cmd/asm/internal/arch/loong64.go
new file mode 100644
index 0000000..ebf842c
--- /dev/null
+++ b/src/cmd/asm/internal/arch/loong64.go
@@ -0,0 +1,67 @@
+// 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 encapsulates some of the odd characteristics of the
+// Loong64 (LoongArch64) instruction set, to minimize its interaction
+// with the core of the assembler.
+
+package arch
+
+import (
+ "cmd/internal/obj"
+ "cmd/internal/obj/loong64"
+)
+
+func jumpLoong64(word string) bool {
+ switch word {
+ case "BEQ", "BFPF", "BFPT", "BLTZ", "BGEZ", "BLEZ", "BGTZ", "BLT", "BLTU", "JIRL", "BNE", "BGE", "BGEU", "JMP", "JAL", "CALL":
+ return true
+ }
+ return false
+}
+
+// IsLoong64CMP reports whether the op (as defined by an loong64.A* constant) is
+// one of the CMP instructions that require special handling.
+func IsLoong64CMP(op obj.As) bool {
+ switch op {
+ case loong64.ACMPEQF, loong64.ACMPEQD, loong64.ACMPGEF, loong64.ACMPGED,
+ loong64.ACMPGTF, loong64.ACMPGTD:
+ return true
+ }
+ return false
+}
+
+// IsLoong64MUL reports whether the op (as defined by an loong64.A* constant) is
+// one of the MUL/DIV/REM instructions that require special handling.
+func IsLoong64MUL(op obj.As) bool {
+ switch op {
+ case loong64.AMUL, loong64.AMULU, loong64.AMULV, loong64.AMULVU,
+ loong64.ADIV, loong64.ADIVU, loong64.ADIVV, loong64.ADIVVU,
+ loong64.AREM, loong64.AREMU, loong64.AREMV, loong64.AREMVU:
+ return true
+ }
+ return false
+}
+
+func loong64RegisterNumber(name string, n int16) (int16, bool) {
+ switch name {
+ case "F":
+ if 0 <= n && n <= 31 {
+ return loong64.REG_F0 + n, true
+ }
+ case "FCSR":
+ if 0 <= n && n <= 31 {
+ return loong64.REG_FCSR0 + n, true
+ }
+ case "FCC":
+ if 0 <= n && n <= 31 {
+ return loong64.REG_FCC0 + n, true
+ }
+ case "R":
+ if 0 <= n && n <= 31 {
+ return loong64.REG_R0 + n, true
+ }
+ }
+ return 0, false
+}
diff --git a/src/cmd/asm/internal/arch/ppc64.go b/src/cmd/asm/internal/arch/ppc64.go
index 3139665..616e189 100644
--- a/src/cmd/asm/internal/arch/ppc64.go
+++ b/src/cmd/asm/internal/arch/ppc64.go
@@ -15,7 +15,7 @@
func jumpPPC64(word string) bool {
switch word {
- case "BC", "BCL", "BEQ", "BGE", "BGT", "BL", "BLE", "BLT", "BNE", "BR", "BVC", "BVS", "CALL", "JMP":
+ case "BC", "BCL", "BEQ", "BGE", "BGT", "BL", "BLE", "BLT", "BNE", "BR", "BVC", "BVS", "BDNZ", "BDZ", "CALL", "JMP":
return true
}
return false
diff --git a/src/cmd/asm/internal/asm/asm.go b/src/cmd/asm/internal/asm/asm.go
index d0cb632..cfd1f4c 100644
--- a/src/cmd/asm/internal/asm/asm.go
+++ b/src/cmd/asm/internal/asm/asm.go
@@ -14,6 +14,7 @@
"cmd/asm/internal/flags"
"cmd/asm/internal/lex"
"cmd/internal/obj"
+ "cmd/internal/obj/ppc64"
"cmd/internal/obj/x86"
"cmd/internal/objabi"
"cmd/internal/sys"
@@ -393,6 +394,7 @@
Pos: p.pos(),
As: op,
}
+ targetAddr := &prog.To
switch len(a) {
case 0:
if p.arch.Family == sys.Wasm {
@@ -405,24 +407,57 @@
target = &a[0]
case 2:
// Special 2-operand jumps.
- target = &a[1]
- prog.From = a[0]
+ if p.arch.Family == sys.ARM64 && arch.IsARM64ADR(op) {
+ // ADR label, R. Label is in From.
+ target = &a[0]
+ prog.To = a[1]
+ targetAddr = &prog.From
+ } else {
+ target = &a[1]
+ prog.From = a[0]
+ }
case 3:
if p.arch.Family == sys.PPC64 {
// Special 3-operand jumps.
- // First two must be constants; a[1] is a register number.
+ // a[1] is a register number expressed as a constant or register value
target = &a[2]
- prog.From = obj.Addr{
- Type: obj.TYPE_CONST,
- Offset: p.getConstant(prog, op, &a[0]),
+ prog.From = a[0]
+ if a[0].Type != obj.TYPE_CONST {
+ // Legacy code may use a plain constant, accept it, and coerce
+ // into a constant. E.g:
+ // BC 4,...
+ // into
+ // BC $4,...
+ prog.From = obj.Addr{
+ Type: obj.TYPE_CONST,
+ Offset: p.getConstant(prog, op, &a[0]),
+ }
+
}
- reg := int16(p.getConstant(prog, op, &a[1]))
- reg, ok := p.arch.RegisterNumber("R", reg)
- if !ok {
- p.errorf("bad register number %d", reg)
- return
+
+ // Likewise, fixup usage like:
+ // BC x,LT,...
+ // BC x,foo+2,...
+ // BC x,4
+ // BC x,$5
+ // into
+ // BC x,CR0LT,...
+ // BC x,CR0EQ,...
+ // BC x,CR1LT,...
+ // BC x,CR1GT,...
+ // The first and second case demonstrate a symbol name which is
+ // effectively discarded. In these cases, the offset determines
+ // the CR bit.
+ prog.Reg = a[1].Reg
+ if a[1].Type != obj.TYPE_REG {
+ // The CR bit is represented as a constant 0-31. Convert it to a Reg.
+ c := p.getConstant(prog, op, &a[1])
+ reg, success := ppc64.ConstantToCRbit(c)
+ if !success {
+ p.errorf("invalid CR bit register number %d", c)
+ }
+ prog.Reg = reg
}
- prog.Reg = reg
break
}
if p.arch.Family == sys.MIPS || p.arch.Family == sys.MIPS64 || p.arch.Family == sys.RISCV64 {
@@ -433,6 +468,14 @@
prog.Reg = p.getRegister(prog, op, &a[1])
break
}
+ if p.arch.Family == sys.Loong64 {
+ // 3-operand jumps.
+ // First two must be registers
+ target = &a[2]
+ prog.From = a[0]
+ prog.Reg = p.getRegister(prog, op, &a[1])
+ break
+ }
if p.arch.Family == sys.S390X {
// 3-operand jumps.
target = &a[2]
@@ -461,7 +504,7 @@
p.errorf("wrong number of arguments to %s instruction", op)
return
case 4:
- if p.arch.Family == sys.S390X {
+ if p.arch.Family == sys.S390X || p.arch.Family == sys.PPC64 {
// 4-operand compare-and-branch.
prog.From = a[0]
prog.Reg = p.getRegister(prog, op, &a[1])
@@ -478,20 +521,20 @@
switch {
case target.Type == obj.TYPE_BRANCH:
// JMP 4(PC)
- prog.To = obj.Addr{
+ *targetAddr = obj.Addr{
Type: obj.TYPE_BRANCH,
Offset: p.pc + 1 + target.Offset, // +1 because p.pc is incremented in append, below.
}
case target.Type == obj.TYPE_REG:
// JMP R1
- prog.To = *target
+ *targetAddr = *target
case target.Type == obj.TYPE_MEM && (target.Name == obj.NAME_EXTERN || target.Name == obj.NAME_STATIC):
// JMP main·morestack(SB)
- prog.To = *target
+ *targetAddr = *target
case target.Type == obj.TYPE_INDIR && (target.Name == obj.NAME_EXTERN || target.Name == obj.NAME_STATIC):
// JMP *main·morestack(SB)
- prog.To = *target
- prog.To.Type = obj.TYPE_INDIR
+ *targetAddr = *target
+ targetAddr.Type = obj.TYPE_INDIR
case target.Type == obj.TYPE_MEM && target.Reg == 0 && target.Offset == 0:
// JMP exit
if target.Sym == nil {
@@ -500,20 +543,20 @@
}
targetProg := p.labels[target.Sym.Name]
if targetProg == nil {
- p.toPatch = append(p.toPatch, Patch{prog, target.Sym.Name})
+ p.toPatch = append(p.toPatch, Patch{targetAddr, target.Sym.Name})
} else {
- p.branch(prog, targetProg)
+ p.branch(targetAddr, targetProg)
}
case target.Type == obj.TYPE_MEM && target.Name == obj.NAME_NONE:
// JMP 4(R0)
- prog.To = *target
+ *targetAddr = *target
// On the ppc64, 9a encodes BR (CTR) as BR CTR. We do the same.
if p.arch.Family == sys.PPC64 && target.Offset == 0 {
- prog.To.Type = obj.TYPE_REG
+ targetAddr.Type = obj.TYPE_REG
}
case target.Type == obj.TYPE_CONST:
// JMP $4
- prog.To = a[0]
+ *targetAddr = a[0]
case target.Type == obj.TYPE_NONE:
// JMP
default:
@@ -531,17 +574,17 @@
p.errorf("undefined label %s", patch.label)
return
}
- p.branch(patch.prog, targetProg)
+ p.branch(patch.addr, targetProg)
}
p.toPatch = p.toPatch[:0]
}
-func (p *Parser) branch(jmp, target *obj.Prog) {
- jmp.To = obj.Addr{
+func (p *Parser) branch(addr *obj.Addr, target *obj.Prog) {
+ *addr = obj.Addr{
Type: obj.TYPE_BRANCH,
Index: 0,
}
- jmp.To.Val = target
+ addr.Val = target
}
// asmInstruction assembles an instruction.
@@ -593,6 +636,12 @@
prog.Reg = p.getRegister(prog, op, &a[1])
break
}
+ } else if p.arch.Family == sys.Loong64 {
+ if arch.IsLoong64CMP(op) {
+ prog.From = a[0]
+ prog.Reg = p.getRegister(prog, op, &a[1])
+ break
+ }
}
prog.From = a[0]
prog.To = a[1]
@@ -602,6 +651,10 @@
prog.From = a[0]
prog.Reg = p.getRegister(prog, op, &a[1])
prog.To = a[2]
+ case sys.Loong64:
+ prog.From = a[0]
+ prog.Reg = p.getRegister(prog, op, &a[1])
+ prog.To = a[2]
case sys.ARM:
// Special cases.
if arch.IsARMSTREX(op) {
diff --git a/src/cmd/asm/internal/asm/endtoend_test.go b/src/cmd/asm/internal/asm/endtoend_test.go
index ead8b27..33a4465 100644
--- a/src/cmd/asm/internal/asm/endtoend_test.go
+++ b/src/cmd/asm/internal/asm/endtoend_test.go
@@ -447,6 +447,13 @@
testEndToEnd(t, "mips64", "mips64")
}
+func TestLOONG64Encoder(t *testing.T) {
+ testEndToEnd(t, "loong64", "loong64enc1")
+ testEndToEnd(t, "loong64", "loong64enc2")
+ testEndToEnd(t, "loong64", "loong64enc3")
+ testEndToEnd(t, "loong64", "loong64")
+}
+
func TestPPC64EndToEnd(t *testing.T) {
testEndToEnd(t, "ppc64", "ppc64")
}
diff --git a/src/cmd/asm/internal/asm/operand_test.go b/src/cmd/asm/internal/asm/operand_test.go
index c1295a0..b47c7e1 100644
--- a/src/cmd/asm/internal/asm/operand_test.go
+++ b/src/cmd/asm/internal/asm/operand_test.go
@@ -125,6 +125,11 @@
testOperandParser(t, parser, mips64OperandTests)
}
+func TestLOONG64OperandParser(t *testing.T) {
+ parser := newParser("loong64")
+ testOperandParser(t, parser, loong64OperandTests)
+}
+
func TestS390XOperandParser(t *testing.T) {
parser := newParser("s390x")
testOperandParser(t, parser, s390xOperandTests)
@@ -143,6 +148,7 @@
{"ppc64", ppc64OperandTests},
{"mips", mipsOperandTests},
{"mips64", mips64OperandTests},
+ {"loong64", loong64OperandTests},
{"s390x", s390xOperandTests},
} {
t.Run(sub.arch, func(t *testing.T) {
@@ -845,6 +851,88 @@
{"[):[o-FP", ""}, // Issue 12469 - asm hung parsing the o-FP range on non ARM platforms.
}
+var loong64OperandTests = []operandTest{
+ {"$((1<<63)-1)", "$9223372036854775807"},
+ {"$(-64*1024)", "$-65536"},
+ {"$(1024 * 8)", "$8192"},
+ {"$-1", "$-1"},
+ {"$-24(R4)", "$-24(R4)"},
+ {"$0", "$0"},
+ {"$0(R1)", "$(R1)"},
+ {"$0.5", "$(0.5)"},
+ {"$0x7000", "$28672"},
+ {"$0x88888eef", "$2290650863"},
+ {"$1", "$1"},
+ {"$_main<>(SB)", "$_main<>(SB)"},
+ {"$argframe(FP)", "$argframe(FP)"},
+ {"$~3", "$-4"},
+ {"(-288-3*8)(R1)", "-312(R1)"},
+ {"(16)(R7)", "16(R7)"},
+ {"(8)(g)", "8(g)"},
+ {"(R0)", "(R0)"},
+ {"(R3)", "(R3)"},
+ {"(R4)", "(R4)"},
+ {"(R5)", "(R5)"},
+ {"-1(R4)", "-1(R4)"},
+ {"-1(R5)", "-1(R5)"},
+ {"6(PC)", "6(PC)"},
+ {"F14", "F14"},
+ {"F15", "F15"},
+ {"F16", "F16"},
+ {"F17", "F17"},
+ {"F18", "F18"},
+ {"F19", "F19"},
+ {"F20", "F20"},
+ {"F21", "F21"},
+ {"F22", "F22"},
+ {"F23", "F23"},
+ {"F24", "F24"},
+ {"F25", "F25"},
+ {"F26", "F26"},
+ {"F27", "F27"},
+ {"F28", "F28"},
+ {"F29", "F29"},
+ {"F30", "F30"},
+ {"F31", "F31"},
+ {"R0", "R0"},
+ {"R1", "R1"},
+ {"R11", "R11"},
+ {"R12", "R12"},
+ {"R13", "R13"},
+ {"R14", "R14"},
+ {"R15", "R15"},
+ {"R16", "R16"},
+ {"R17", "R17"},
+ {"R18", "R18"},
+ {"R19", "R19"},
+ {"R2", "R2"},
+ {"R20", "R20"},
+ {"R21", "R21"},
+ {"R23", "R23"},
+ {"R24", "R24"},
+ {"R25", "R25"},
+ {"R26", "R26"},
+ {"R27", "R27"},
+ {"R28", "R28"},
+ {"R29", "R29"},
+ {"R30", "R30"},
+ {"R3", "R3"},
+ {"R4", "R4"},
+ {"R5", "R5"},
+ {"R6", "R6"},
+ {"R7", "R7"},
+ {"R8", "R8"},
+ {"R9", "R9"},
+ {"a(FP)", "a(FP)"},
+ {"g", "g"},
+ {"RSB", "R31"},
+ {"ret+8(FP)", "ret+8(FP)"},
+ {"runtime·abort(SB)", "runtime.abort(SB)"},
+ {"·AddUint32(SB)", "\"\".AddUint32(SB)"},
+ {"·trunc(SB)", "\"\".trunc(SB)"},
+ {"[):[o-FP", ""}, // Issue 12469 - asm hung parsing the o-FP range on non ARM platforms.
+}
+
var s390xOperandTests = []operandTest{
{"$((1<<63)-1)", "$9223372036854775807"},
{"$(-64*1024)", "$-65536"},
diff --git a/src/cmd/asm/internal/asm/parse.go b/src/cmd/asm/internal/asm/parse.go
index 4cddcf4..6445e01 100644
--- a/src/cmd/asm/internal/asm/parse.go
+++ b/src/cmd/asm/internal/asm/parse.go
@@ -19,6 +19,7 @@
"cmd/asm/internal/flags"
"cmd/asm/internal/lex"
"cmd/internal/obj"
+ "cmd/internal/obj/arm64"
"cmd/internal/obj/x86"
"cmd/internal/src"
"cmd/internal/sys"
@@ -48,7 +49,7 @@
}
type Patch struct {
- prog *obj.Prog
+ addr *obj.Addr
label string
}
@@ -161,7 +162,7 @@
// line consumes a single assembly line from p.lex of the form
//
-// {label:} WORD[.cond] [ arg {, arg} ] (';' | '\n')
+// {label:} WORD[.cond] [ arg {, arg} ] (';' | '\n')
//
// It adds any labels to p.pendingLabels and returns the word, cond,
// operand list, and true. If there is an error or EOF, it returns
@@ -389,8 +390,19 @@
tok := p.next()
name := tok.String()
if tok.ScanToken == scanner.Ident && !p.atStartOfRegister(name) {
- // We have a symbol. Parse $sym±offset(symkind)
- p.symbolReference(a, name, prefix)
+ switch p.arch.Family {
+ case sys.ARM64:
+ // arm64 special operands.
+ if opd := arch.GetARM64SpecialOperand(name); opd != arm64.SPOP_END {
+ a.Type = obj.TYPE_SPECIAL
+ a.Offset = int64(opd)
+ break
+ }
+ fallthrough
+ default:
+ // We have a symbol. Parse $sym±offset(symkind)
+ p.symbolReference(a, name, prefix)
+ }
// fmt.Printf("SYM %s\n", obj.Dconv(&emptyProg, 0, a))
if p.peek() == scanner.EOF {
return
@@ -843,7 +855,6 @@
//
// Anything else beginning with "<" logs an error if issueError is
// true, otherwise returns (false, obj.ABI0).
-//
func (p *Parser) symRefAttrs(name string, issueError bool) (bool, obj.ABI) {
abi := obj.ABI0
isStatic := false
@@ -880,7 +891,7 @@
// constrained form of the operand syntax that's always SB-based,
// non-static, and has at most a simple integer offset:
//
-// [$|*]sym[<abi>][+Int](SB)
+// [$|*]sym[<abi>][+Int](SB)
func (p *Parser) funcAddress() (string, obj.ABI, bool) {
switch p.peek() {
case '$', '*':
@@ -1030,9 +1041,13 @@
//
// For 386/AMD64 register list specifies 4VNNIW-style multi-source operand.
// For range of 4 elements, Intel manual uses "+3" notation, for example:
+//
// VP4DPWSSDS zmm1{k1}{z}, zmm2+3, m128
+//
// Given asm line:
+//
// VP4DPWSSDS Z5, [Z10-Z13], (AX)
+//
// zmm2 is Z10, and Z13 is the only valid value for it (Z10+3).
// Only simple ranges are accepted, like [Z0-Z3].
//
diff --git a/src/cmd/asm/internal/asm/testdata/arm.s b/src/cmd/asm/internal/asm/testdata/arm.s
index cc8e25e..2ba22c7 100644
--- a/src/cmd/asm/internal/asm/testdata/arm.s
+++ b/src/cmd/asm/internal/asm/testdata/arm.s
@@ -1042,7 +1042,7 @@
BFI $29, $2, R8 // 1881dee7
BFI $16, $8, R1, R2 // BFI $16, R1, $8, R2 // 1124d7e7
-// synthetic arithmatic
+// synthetic arithmetic
ADD $0xffffffaa, R2, R3 // ADD $4294967210, R2, R3 // 55b0e0e30b3082e0
ADD $0xffffff55, R5 // ADD $4294967125, R5 // aab0e0e30b5085e0
ADD.S $0xffffffab, R2, R3 // ADD.S $4294967211, R2, R3 // 54b0e0e30b3092e0
diff --git a/src/cmd/asm/internal/asm/testdata/arm64.s b/src/cmd/asm/internal/asm/testdata/arm64.s
index a4b56b0..4451338 100644
--- a/src/cmd/asm/internal/asm/testdata/arm64.s
+++ b/src/cmd/asm/internal/asm/testdata/arm64.s
@@ -10,7 +10,6 @@
TEXT foo(SB), DUPOK|NOSPLIT, $-8
-
// arithmetic operations
ADDW $1, R2, R3
ADDW R1, R2, R3
@@ -241,6 +240,10 @@
FADDS F2, F3, F4 // 6428221e
FADDD F1, F2 // 4228611e
VDUP V19.S[0], V17.S4 // 7106044e
+ VTRN1 V3.D2, V2.D2, V20.D2 // 5428c34e
+ VTRN2 V3.D2, V2.D2, V21.D2 // 5568c34e
+ VTRN1 V5.D2, V4.D2, V22.D2 // 9628c54e
+ VTRN2 V5.D2, V4.D2, V23.D2 // 9768c54e
// special
@@ -624,7 +627,8 @@
CSELW LT, R2, R3, R4 // 44b0831a
CSINC GT, R1, ZR, R3 // 23c49f9a
CSNEG MI, R1, R2, R3 // 234482da
- CSINV CS, R1, R2, R3 // CSINV HS, R1, R2, R3 // 232082da
+ CSINV CS, R1, R2, R3 // CSINV HS, R1, R2, R3 // 232082da
+ CSINV HS, R1, R2, R3 // 232082da
CSINVW MI, R2, ZR, R2 // 42409f5a
CINC EQ, R4, R9 // 8914849a
CINCW PL, R2, ZR // 5f44821a
@@ -846,6 +850,11 @@
JMP foo(SB)
CALL foo(SB)
+// ADR
+ ADR next, R11 // ADR R11 // 2b000010
+next:
+ NOP
+
// LDP/STP
LDP (R0), (R0, R1) // 000440a9
LDP (R0), (R1, R2) // 010840a9
@@ -1623,4 +1632,116 @@
MSR R13, ZCR_EL1 // 0d1218d5
MRS ZCR_EL1, R23 // 171238d5
MSR R17, ZCR_EL1 // 111218d5
+ SYS $32768, R1 // 018008d5
+ SYS $32768 // 1f8008d5
+
+// TLBI instruction
+ TLBI VMALLE1IS // 1f8308d5
+ TLBI VMALLE1 // 1f8708d5
+ TLBI ALLE2IS // 1f830cd5
+ TLBI ALLE1IS // 9f830cd5
+ TLBI VMALLS12E1IS // df830cd5
+ TLBI ALLE2 // 1f870cd5
+ TLBI ALLE1 // 9f870cd5
+ TLBI VMALLS12E1 // df870cd5
+ TLBI ALLE3IS // 1f830ed5
+ TLBI ALLE3 // 1f870ed5
+ TLBI VMALLE1OS // 1f8108d5
+ TLBI ALLE2OS // 1f810cd5
+ TLBI ALLE1OS // 9f810cd5
+ TLBI VMALLS12E1OS // df810cd5
+ TLBI ALLE3OS // 1f810ed5
+ TLBI VAE1IS, R0 // 208308d5
+ TLBI ASIDE1IS, R1 // 418308d5
+ TLBI VAAE1IS, R2 // 628308d5
+ TLBI VALE1IS, R3 // a38308d5
+ TLBI VAALE1IS, R4 // e48308d5
+ TLBI VAE1, R5 // 258708d5
+ TLBI ASIDE1, R6 // 468708d5
+ TLBI VAAE1, R7 // 678708d5
+ TLBI VALE1, R8 // a88708d5
+ TLBI VAALE1, R9 // e98708d5
+ TLBI IPAS2E1IS, R10 // 2a800cd5
+ TLBI IPAS2LE1IS, R11 // ab800cd5
+ TLBI VAE2IS, R12 // 2c830cd5
+ TLBI VALE2IS, R13 // ad830cd5
+ TLBI IPAS2E1, R14 // 2e840cd5
+ TLBI IPAS2LE1, R15 // af840cd5
+ TLBI VAE2, R16 // 30870cd5
+ TLBI VALE2, R17 // b1870cd5
+ TLBI VAE3IS, ZR // 3f830ed5
+ TLBI VALE3IS, R19 // b3830ed5
+ TLBI VAE3, R20 // 34870ed5
+ TLBI VALE3, R21 // b5870ed5
+ TLBI VAE1OS, R22 // 368108d5
+ TLBI ASIDE1OS, R23 // 578108d5
+ TLBI VAAE1OS, R24 // 788108d5
+ TLBI VALE1OS, R25 // b98108d5
+ TLBI VAALE1OS, R26 // fa8108d5
+ TLBI RVAE1IS, R27 // 3b8208d5
+ TLBI RVAAE1IS, ZR // 7f8208d5
+ TLBI RVALE1IS, R29 // bd8208d5
+ TLBI RVAALE1IS, R30 // fe8208d5
+ TLBI RVAE1OS, ZR // 3f8508d5
+ TLBI RVAAE1OS, R0 // 608508d5
+ TLBI RVALE1OS, R1 // a18508d5
+ TLBI RVAALE1OS, R2 // e28508d5
+ TLBI RVAE1, R3 // 238608d5
+ TLBI RVAAE1, R4 // 648608d5
+ TLBI RVALE1, R5 // a58608d5
+ TLBI RVAALE1, R6 // e68608d5
+ TLBI RIPAS2E1IS, R7 // 47800cd5
+ TLBI RIPAS2LE1IS, R8 // c8800cd5
+ TLBI VAE2OS, R9 // 29810cd5
+ TLBI VALE2OS, R10 // aa810cd5
+ TLBI RVAE2IS, R11 // 2b820cd5
+ TLBI RVALE2IS, R12 // ac820cd5
+ TLBI IPAS2E1OS, R13 // 0d840cd5
+ TLBI RIPAS2E1, R14 // 4e840cd5
+ TLBI RIPAS2E1OS, R15 // 6f840cd5
+ TLBI IPAS2LE1OS, R16 // 90840cd5
+ TLBI RIPAS2LE1, R17 // d1840cd5
+ TLBI RIPAS2LE1OS, ZR // ff840cd5
+ TLBI RVAE2OS, R19 // 33850cd5
+ TLBI RVALE2OS, R20 // b4850cd5
+ TLBI RVAE2, R21 // 35860cd5
+ TLBI RVALE2, R22 // b6860cd5
+ TLBI VAE3OS, R23 // 37810ed5
+ TLBI VALE3OS, R24 // b8810ed5
+ TLBI RVAE3IS, R25 // 39820ed5
+ TLBI RVALE3IS, R26 // ba820ed5
+ TLBI RVAE3OS, R27 // 3b850ed5
+ TLBI RVALE3OS, ZR // bf850ed5
+ TLBI RVAE3, R29 // 3d860ed5
+ TLBI RVALE3, R30 // be860ed5
+
+// DC instruction
+ DC IVAC, R0 // 207608d5
+ DC ISW, R1 // 417608d5
+ DC CSW, R2 // 427a08d5
+ DC CISW, R3 // 437e08d5
+ DC ZVA, R4 // 24740bd5
+ DC CVAC, R5 // 257a0bd5
+ DC CVAU, R6 // 267b0bd5
+ DC CIVAC, R7 // 277e0bd5
+ DC IGVAC, R8 // 687608d5
+ DC IGSW, R9 // 897608d5
+ DC IGDVAC, R10 // aa7608d5
+ DC IGDSW, R11 // cb7608d5
+ DC CGSW, R12 // 8c7a08d5
+ DC CGDSW, R13 // cd7a08d5
+ DC CIGSW, R14 // 8e7e08d5
+ DC CIGDSW, R15 // cf7e08d5
+ DC GVA, R16 // 70740bd5
+ DC GZVA, R17 // 91740bd5
+ DC CGVAC, ZR // 7f7a0bd5
+ DC CGDVAC, R19 // b37a0bd5
+ DC CGVAP, R20 // 747c0bd5
+ DC CGDVAP, R21 // b57c0bd5
+ DC CGVADP, R22 // 767d0bd5
+ DC CGDVADP, R23 // b77d0bd5
+ DC CIGVAC, R24 // 787e0bd5
+ DC CIGDVAC, R25 // b97e0bd5
+ DC CVAP, R26 // 3a7c0bd5
+ DC CVADP, R27 // 3b7d0bd5
END
diff --git a/src/cmd/asm/internal/asm/testdata/arm64enc.s b/src/cmd/asm/internal/asm/testdata/arm64enc.s
index a298628..eff48ae 100644
--- a/src/cmd/asm/internal/asm/testdata/arm64enc.s
+++ b/src/cmd/asm/internal/asm/testdata/arm64enc.s
@@ -134,7 +134,7 @@
CSINV LO, R2, R11, R14 // 4e308bda
CSNEGW HS, R16, R29, R10 // 0a269d5a
CSNEG NE, R21, R19, R11 // ab1693da
- //TODO DC
+ DC IVAC, R1 // 217608d5
DCPS1 $11378 // 418ea5d4
DCPS2 $10699 // 6239a5d4
DCPS3 $24415 // e3ebabd4
@@ -397,7 +397,7 @@
SXTH R17, R25 // 393e4093
SXTW R0, R27 // 1b7c4093
SYSL $285440, R12 // 0c5b2cd5
- //TODO TLBI
+ TLBI VAE1IS, R1 // 218308d5
TSTW $0x80000007, R9 // TSTW $2147483655, R9 // 3f0d0172
TST $0xfffffff0, LR // TST $4294967280, R30 // df6f7cf2
TSTW R10@>21, R2 // 5f54ca6a
diff --git a/src/cmd/asm/internal/asm/testdata/arm64error.s b/src/cmd/asm/internal/asm/testdata/arm64error.s
index 3d3de1d..52f01e1 100644
--- a/src/cmd/asm/internal/asm/testdata/arm64error.s
+++ b/src/cmd/asm/internal/asm/testdata/arm64error.s
@@ -417,8 +417,8 @@
CASPD (R2, R4), (R2), (R8, R9) // ERROR "source register pair must be contiguous"
CASPD (R2, R3), (R2), (R8, R10) // ERROR "destination register pair must be contiguous"
ADD R1>>2, RSP, R3 // ERROR "illegal combination"
- ADDS R2<<3, R3, RSP // ERROR "unexpected SP reference"
- CMP R1<<5, RSP // ERROR "the left shift amount out of range 0 to 4"
+ ADDS R2<<3, R3, RSP // ERROR "illegal destination register"
+ CMP R1<<5, RSP // ERROR "shift amount out of range 0 to 4"
MOVD.P y+8(FP), R1 // ERROR "illegal combination"
MOVD.W x-8(SP), R1 // ERROR "illegal combination"
LDP.P x+8(FP), (R0, R1) // ERROR "illegal combination"
@@ -432,4 +432,14 @@
STP (R26, R27), 700(R2) // ERROR "cannot use REGTMP as source"
MOVK $0, R10 // ERROR "zero shifts cannot be handled correctly"
MOVK $(0<<32), R10 // ERROR "zero shifts cannot be handled correctly"
+ TLBI PLDL1KEEP // ERROR "illegal argument"
+ TLBI VMALLE1IS, R0 // ERROR "extraneous register at operand 2"
+ TLBI ALLE3OS, ZR // ERROR "extraneous register at operand 2"
+ TLBI VAE1IS // ERROR "missing register at operand 2"
+ TLBI RVALE3 // ERROR "missing register at operand 2"
+ DC PLDL1KEEP // ERROR "illegal argument"
+ DC VMALLE1IS // ERROR "illegal argument"
+ DC VAE1IS // ERROR "illegal argument"
+ DC VAE1IS, R0 // ERROR "illegal argument"
+ DC IVAC // ERROR "missing register at operand 2"
RET
diff --git a/src/cmd/asm/internal/asm/testdata/loong64.s b/src/cmd/asm/internal/asm/testdata/loong64.s
new file mode 100644
index 0000000..133cf48
--- /dev/null
+++ b/src/cmd/asm/internal/asm/testdata/loong64.s
@@ -0,0 +1,11 @@
+// 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.
+
+#include "../../../../../runtime/textflag.h"
+// TODO: cover more instruction
+
+TEXT foo(SB),DUPOK|NOSPLIT,$0
+ JAL 1(PC) //CALL 1(PC) //000c0054
+ JAL (R4) //CALL (R4) //8100004c
+ JAL foo(SB) //CALL foo(SB) //00100054
diff --git a/src/cmd/asm/internal/asm/testdata/loong64enc1.s b/src/cmd/asm/internal/asm/testdata/loong64enc1.s
new file mode 100644
index 0000000..56eb244
--- /dev/null
+++ b/src/cmd/asm/internal/asm/testdata/loong64enc1.s
@@ -0,0 +1,209 @@
+// 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.
+
+#include "../../../../../runtime/textflag.h"
+
+TEXT asmtest(SB),DUPOK|NOSPLIT,$0
+lable1:
+ BFPT 1(PC) // 00050048
+ BFPT lable1 // BFPT 2 //1ffdff4b
+
+lable2:
+ BFPF 1(PC) // 00040048
+ BFPF lable2 // BFPF 4 // 1ffcff4b
+
+ JMP foo(SB) // 00100050
+ JMP (R4) // 8000004c
+ JMP 1(PC) // 00040058
+ MOVW $65536, R4 // 04020014
+ MOVW $4096, R4 // 24000014
+ MOVV $65536, R4 // 04020014
+ MOVV $4096, R4 // 24000014
+ MOVW R4, R5 // 85001700
+ MOVV R4, R5 // 85001500
+ MOVBU R4, R5 // 85fc4303
+ SUB R4, R5, R6 // a6101100
+ SUBV R4, R5, R6 // a6901100
+ ADD R4, R5, R6 // a6101000
+ ADDV R4, R5, R6 // a6901000
+ AND R4, R5, R6 // a6901400
+ SUB R4, R5 // a5101100
+ SUBV R4, R5 // a5901100
+ ADD R4, R5 // a5101000
+ ADDV R4, R5 // a5901000
+ AND R4, R5 // a5901400
+ NEGW R4, R5 // 05101100
+ NEGV R4, R5 // 05901100
+ SLL R4, R5 // a5101700
+ SLL R4, R5, R6 // a6101700
+ SRL R4, R5 // a5901700
+ SRL R4, R5, R6 // a6901700
+ SRA R4, R5 // a5101800
+ SRA R4, R5, R6 // a6101800
+ SLLV R4, R5 // a5901800
+ SLLV R4, R5, R6 // a6901800
+ CLO R4, R5 // 85100000
+ CLZ R4, R5 // 85140000
+ ADDF F4, F5 // a5900001
+ ADDF F4, R5, F6 // a6900001
+ CMPEQF F4, R5 // a010120c
+ ABSF F4, F5 // 85041401
+ MOVVF F4, F5 // 85181d01
+ MOVF F4, F5 // 85941401
+ MOVD F4, F5 // 85981401
+ MOVW R4, result+16(FP) // 64608029
+ MOVWU R4, result+16(FP) // 64608029
+ MOVV R4, result+16(FP) // 6460c029
+ MOVB R4, result+16(FP) // 64600029
+ MOVBU R4, result+16(FP) // 64600029
+ MOVWL R4, result+16(FP) // 6460002f
+ MOVVL R4, result+16(FP) // 6460802f
+ MOVW R4, 1(R5) // a4048029
+ MOVWU R4, 1(R5) // a4048029
+ MOVV R4, 1(R5) // a404c029
+ MOVB R4, 1(R5) // a4040029
+ MOVBU R4, 1(R5) // a4040029
+ MOVWL R4, 1(R5) // a404002f
+ MOVVL R4, 1(R5) // a404802f
+ SC R4, 1(R5) // a4040021
+ SCV R4, 1(R5) // a4040023
+ MOVW y+8(FP), R4 // 64408028
+ MOVWU y+8(FP), R4 // 6440802a
+ MOVV y+8(FP), R4 // 6440c028
+ MOVB y+8(FP), R4 // 64400028
+ MOVBU y+8(FP), R4 // 6440002a
+ MOVWL y+8(FP), R4 // 6440002e
+ MOVVL y+8(FP), R4 // 6440802e
+ MOVW 1(R5), R4 // a4048028
+ MOVWU 1(R5), R4 // a404802a
+ MOVV 1(R5), R4 // a404c028
+ MOVB 1(R5), R4 // a4040028
+ MOVBU 1(R5), R4 // a404002a
+ MOVWL 1(R5), R4 // a404002e
+ MOVVL 1(R5), R4 // a404802e
+ LL 1(R5), R4 // a4040020
+ LLV 1(R5), R4 // a4040022
+ MOVW $4(R4), R5 // 8510c002
+ MOVV $4(R4), R5 // 8510c002
+ MOVW $-1, R4 // 04fcff02
+ MOVV $-1, R4 // 04fcff02
+ MOVW $1, R4 // 0404c002
+ MOVV $1, R4 // 0404c002
+ ADD $-1, R4, R5 // 85fcbf02
+ ADD $-1, R4 // 84fcbf02
+ ADDV $-1, R4, R5 // 85fcff02
+ ADDV $-1, R4 // 84fcff02
+ AND $1, R4, R5 // 85044003
+ AND $1, R4 // 84044003
+ SLL $4, R4, R5 // 85904000
+ SLL $4, R4 // 84904000
+ SRL $4, R4, R5 // 85904400
+ SRL $4, R4 // 84904400
+ SRA $4, R4, R5 // 85904800
+ SRA $4, R4 // 84904800
+ SLLV $4, R4, R5 // 85104100
+ SLLV $4, R4 // 84104100
+ SYSCALL // 00002b00
+ BEQ R4, R5, 1(PC) // 85040058
+ BEQ R4, 1(PC) // 80040058
+ BLTU R4, 1(PC) // 80040068
+ MOVW y+8(FP), F4 // 6440002b
+ MOVF y+8(FP), F4 // 6440002b
+ MOVD y+8(FP), F4 // 6440802b
+ MOVW 1(F5), F4 // a404002b
+ MOVF 1(F5), F4 // a404002b
+ MOVD 1(F5), F4 // a404802b
+ MOVW F4, result+16(FP) // 6460402b
+ MOVF F4, result+16(FP) // 6460402b
+ MOVD F4, result+16(FP) // 6460c02b
+ MOVW F4, 1(F5) // a404402b
+ MOVF F4, 1(F5) // a404402b
+ MOVD F4, 1(F5) // a404c02b
+ MOVW R4, F5 // 85a41401
+ MOVW F4, R5 // 85b41401
+ MOVV R4, F5 // 85a81401
+ MOVV F4, R5 // 85b81401
+ WORD $74565 // 45230100
+ BREAK R4, result+16(FP) // 64600006
+ BREAK R4, 1(R5) // a4040006
+ BREAK // 00002a00
+ UNDEF // 00002a00
+
+ // mul
+ MUL R4, R5 // a5101c00
+ MUL R4, R5, R6 // a6101c00
+ MULV R4, R5 // a5901d00
+ MULV R4, R5, R6 // a6901d00
+ MULVU R4, R5 // a5901d00
+ MULVU R4, R5, R6 // a6901d00
+ MULHV R4, R5 // a5101e00
+ MULHV R4, R5, R6 // a6101e00
+ MULHVU R4, R5 // a5901e00
+ MULHVU R4, R5, R6 // a6901e00
+ REMV R4, R5 // a5902200
+ REMV R4, R5, R6 // a6902200
+ REMVU R4, R5 // a5902300
+ REMVU R4, R5, R6 // a6902300
+ DIVV R4, R5 // a5102200
+ DIVV R4, R5, R6 // a6102200
+ DIVVU R4, R5 // a5102300
+ DIVVU R4, R5, R6 // a6102300
+
+ MOVH R4, result+16(FP) // 64604029
+ MOVH R4, 1(R5) // a4044029
+ MOVH y+8(FP), R4 // 64404028
+ MOVH 1(R5), R4 // a4044028
+ MOVHU R4, R5 // 8500cf00
+ MOVHU R4, result+16(FP) // 64604029
+ MOVHU R4, 1(R5) // a4044029
+ MOVHU y+8(FP), R4 // 6440402a
+ MOVHU 1(R5), R4 // a404402a
+ MULU R4, R5 // a5101c00
+ MULU R4, R5, R6 // a6101c00
+ MULH R4, R5 // a5901c00
+ MULH R4, R5, R6 // a6901c00
+ MULHU R4, R5 // a5101d00
+ MULHU R4, R5, R6 // a6101d00
+ REM R4, R5 // a5902000
+ REM R4, R5, R6 // a6902000
+ REMU R4, R5 // a5902100
+ REMU R4, R5, R6 // a6902100
+ DIV R4, R5 // a5102000
+ DIV R4, R5, R6 // a6102000
+ DIVU R4, R5 // a5102100
+ DIVU R4, R5, R6 // a6102100
+ SRLV R4, R5 // a5101900
+ SRLV R4, R5, R6 // a6101900
+ SRLV $4, R4, R5 // 85104500
+ SRLV $4, R4 // 84104500
+ SRLV $32, R4, R5 // 85804500
+ SRLV $32, R4 // 84804500
+
+ MOVFD F4, F5 // 85241901
+ MOVDF F4, F5 // 85181901
+ MOVWF F4, F5 // 85101d01
+ MOVFW F4, F5 // 85041b01
+ MOVWD F4, F5 // 85201d01
+ MOVDW F4, F5 // 85081b01
+ NEGF F4, F5 // 85141401
+ NEGD F4, F5 // 85181401
+ ABSD F4, F5 // 85081401
+ TRUNCDW F4, F5 // 85881a01
+ TRUNCFW F4, F5 // 85841a01
+ SQRTF F4, F5 // 85441401
+ SQRTD F4, F5 // 85481401
+
+ DBAR // 00007238
+ NOOP // 00004003
+
+ MOVWR R4, result+16(FP) // 6460402f
+ MOVWR R4, 1(R5) // a404402f
+ MOVWR y+8(FP), R4 // 6440402e
+ MOVWR 1(R5), R4 // a404402e
+
+ CMPGTF F4, R5 // a090110c
+ CMPGTD F4, R5 // a090210c
+ CMPGEF F4, R5 // a090130c
+ CMPGED F4, R5 // a090230c
+ CMPEQD F4, R5 // a010220c
diff --git a/src/cmd/asm/internal/asm/testdata/loong64enc2.s b/src/cmd/asm/internal/asm/testdata/loong64enc2.s
new file mode 100644
index 0000000..3b5e3cb
--- /dev/null
+++ b/src/cmd/asm/internal/asm/testdata/loong64enc2.s
@@ -0,0 +1,82 @@
+// 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.
+
+#include "../../../../../runtime/textflag.h"
+
+TEXT asmtest(SB),DUPOK|NOSPLIT,$0
+ MOVB R4, R5 // 85e04000a5e04800
+ MOVWU R4, R5 // 85804100a5804500
+ MOVW $74565, R4 // 4402001484148d03
+ MOVW $4097, R4 // 2400001484048003
+ MOVV $74565, R4 // 4402001484148d03
+ MOVV $4097, R4 // 2400001484048003
+ AND $-1, R4, R5 // 1efcbf0285f81400
+ AND $-1, R4 // 1efcbf0284f81400
+ MOVW $-1, F4 // 1efcbf02c4a71401
+ MOVW $1, F4 // 1e048002c4a71401
+ TEQ $4, R4, R5 // 8508005c04002a00
+ TEQ $4, R4 // 0408005c04002a00
+ TNE $4, R4, R5 // 8508005804002a00
+ TNE $4, R4 // 0408005804002a00
+ ADD $65536, R4, R5 // 1e02001485781000
+ ADD $4096, R4, R5 // 3e00001485781000
+ ADD $65536, R4 // 1e02001484781000
+ ADD $4096, R4 // 3e00001484781000
+ ADDV $65536, R4, R5 // 1e02001485f81000
+ ADDV $4096, R4, R5 // 3e00001485f81000
+ ADDV $65536, R4 // 1e02001484f81000
+ ADDV $4096, R4 // 3e00001484f81000
+ AND $65536, R4, R5 // 1e02001485f81400
+ AND $4096, R4, R5 // 3e00001485f81400
+ AND $65536, R4 // 1e02001484f81400
+ AND $4096, R4 // 3e00001484f81400
+ SGT $65536, R4, R5 // 1e02001485781200
+ SGT $4096, R4, R5 // 3e00001485781200
+ SGT $65536, R4 // 1e02001484781200
+ SGT $4096, R4 // 3e00001484781200
+ SGTU $65536, R4, R5 // 1e02001485f81200
+ SGTU $4096, R4, R5 // 3e00001485f81200
+ SGTU $65536, R4 // 1e02001484f81200
+ SGTU $4096, R4 // 3e00001484f81200
+ ADDU $65536, R4, R5 // 1e02001485781000
+ ADDU $4096, R4, R5 // 3e00001485781000
+ ADDU $65536, R4 // 1e02001484781000
+ ADDU $4096, R4 // 3e00001484781000
+ ADDVU $65536, R4, R5 // 1e02001485f81000
+ ADDVU $4096, R4, R5 // 3e00001485f81000
+ ADDVU $65536, R4 // 1e02001484f81000
+ ADDVU $4096, R4 // 3e00001484f81000
+ OR $65536, R4, R5 // 1e02001485781500
+ OR $4096, R4, R5 // 3e00001485781500
+ OR $65536, R4 // 1e02001484781500
+ OR $4096, R4 // 3e00001484781500
+ OR $-1, R4, R5 // 1efcbf0285781500
+ OR $-1, R4 // 1efcbf0284781500
+ XOR $65536, R4, R5 // 1e02001485f81500
+ XOR $4096, R4, R5 // 3e00001485f81500
+ XOR $65536, R4 // 1e02001484f81500
+ XOR $4096, R4 // 3e00001484f81500
+ XOR $-1, R4, R5 // 1efcbf0285f81500
+ XOR $-1, R4 // 1efcbf0284f81500
+ MOVH R4, R5 // 85c04000a5c04800
+
+ // relocation instructions
+ MOVW R4, name(SB) // 1e00001cc4038029
+ MOVWU R4, name(SB) // 1e00001cc4038029
+ MOVV R4, name(SB) // 1e00001cc403c029
+ MOVB R4, name(SB) // 1e00001cc4030029
+ MOVBU R4, name(SB) // 1e00001cc4030029
+ MOVF F4, name(SB) // 1e00001cc403402b
+ MOVD F4, name(SB) // 1e00001cc403c02b
+ MOVW name(SB), R4 // 1e00001cc4038028
+ MOVWU name(SB), R4 // 1e00001cc403802a
+ MOVV name(SB), R4 // 1e00001cc403c028
+ MOVB name(SB), R4 // 1e00001cc4030028
+ MOVBU name(SB), R4 // 1e00001cc403002a
+ MOVF name(SB), F4 // 1e00001cc403002b
+ MOVD name(SB), F4 // 1e00001cc403802b
+ MOVH R4, name(SB) // 1e00001cc4034029
+ MOVH name(SB), R4 // 1e00001cc4034028
+ MOVHU R4, name(SB) // 1e00001cc4034029
+ MOVHU name(SB), R4 // 1e00001cc403402a
diff --git a/src/cmd/asm/internal/asm/testdata/loong64enc3.s b/src/cmd/asm/internal/asm/testdata/loong64enc3.s
new file mode 100644
index 0000000..eceb0d7
--- /dev/null
+++ b/src/cmd/asm/internal/asm/testdata/loong64enc3.s
@@ -0,0 +1,131 @@
+// 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.
+
+#include "../../../../../runtime/textflag.h"
+
+TEXT asmtest(SB),DUPOK|NOSPLIT,$0
+ MOVW $65536(R4), R5 // 1e020014de03800385f81000
+ MOVW $4096(R4), R5 // 3e000014de03800385f81000
+ MOVV $65536(R4), R5 // 1e020014de03800385f81000
+ MOVV $4096(R4), R5 // 3e000014de03800385f81000
+ ADD $74565, R4 // 5e020014de178d0384781000
+ ADD $4097, R4 // 3e000014de07800384781000
+ ADDV $74565, R4 // 5e020014de178d0384f81000
+ ADDV $4097, R4 // 3e000014de07800384f81000
+ AND $74565, R4 // 5e020014de178d0384f81400
+ AND $4097, R4 // 3e000014de07800384f81400
+ ADD $74565, R4, R5 // 5e020014de178d0385781000
+ ADD $4097, R4, R5 // 3e000014de07800385781000
+ ADDV $74565, R4, R5 // 5e020014de178d0385f81000
+ ADDV $4097, R4, R5 // 3e000014de07800385f81000
+ AND $74565, R4, R5 // 5e020014de178d0385f81400
+ AND $4097, R4, R5 // 3e000014de07800385f81400
+
+ MOVW R4, result+65540(FP) // 1e020014de8f1000c4338029
+ MOVW R4, result+4097(FP) // 3e000014de8f1000c4278029
+ MOVWU R4, result+65540(FP) // 1e020014de8f1000c4338029
+ MOVWU R4, result+4097(FP) // 3e000014de8f1000c4278029
+ MOVV R4, result+65540(FP) // 1e020014de8f1000c433c029
+ MOVV R4, result+4097(FP) // 3e000014de8f1000c427c029
+ MOVB R4, result+65540(FP) // 1e020014de8f1000c4330029
+ MOVB R4, result+4097(FP) // 3e000014de8f1000c4270029
+ MOVBU R4, result+65540(FP) // 1e020014de8f1000c4330029
+ MOVBU R4, result+4097(FP) // 3e000014de8f1000c4270029
+ MOVW R4, 65536(R5) // 1e020014de971000c4038029
+ MOVW R4, 4096(R5) // 3e000014de971000c4038029
+ MOVWU R4, 65536(R5) // 1e020014de971000c4038029
+ MOVWU R4, 4096(R5) // 3e000014de971000c4038029
+ MOVV R4, 65536(R5) // 1e020014de971000c403c029
+ MOVV R4, 4096(R5) // 3e000014de971000c403c029
+ MOVB R4, 65536(R5) // 1e020014de971000c4030029
+ MOVB R4, 4096(R5) // 3e000014de971000c4030029
+ MOVBU R4, 65536(R5) // 1e020014de971000c4030029
+ MOVBU R4, 4096(R5) // 3e000014de971000c4030029
+ SC R4, 65536(R5) // 1e020014de971000c4030021
+ SC R4, 4096(R5) // 3e000014de971000c4030021
+ MOVW y+65540(FP), R4 // 1e020014de8f1000c4338028
+ MOVWU y+65540(FP), R4 // 1e020014de8f1000c433802a
+ MOVV y+65540(FP), R4 // 1e020014de8f1000c433c028
+ MOVB y+65540(FP), R4 // 1e020014de8f1000c4330028
+ MOVBU y+65540(FP), R4 // 1e020014de8f1000c433002a
+ MOVW y+4097(FP), R4 // 3e000014de8f1000c4278028
+ MOVWU y+4097(FP), R4 // 3e000014de8f1000c427802a
+ MOVV y+4097(FP), R4 // 3e000014de8f1000c427c028
+ MOVB y+4097(FP), R4 // 3e000014de8f1000c4270028
+ MOVBU y+4097(FP), R4 // 3e000014de8f1000c427002a
+ MOVW 65536(R5), R4 // 1e020014de971000c4038028
+ MOVWU 65536(R5), R4 // 1e020014de971000c403802a
+ MOVV 65536(R5), R4 // 1e020014de971000c403c028
+ MOVB 65536(R5), R4 // 1e020014de971000c4030028
+ MOVBU 65536(R5), R4 // 1e020014de971000c403002a
+ MOVW 4096(R5), R4 // 3e000014de971000c4038028
+ MOVWU 4096(R5), R4 // 3e000014de971000c403802a
+ MOVV 4096(R5), R4 // 3e000014de971000c403c028
+ MOVB 4096(R5), R4 // 3e000014de971000c4030028
+ MOVBU 4096(R5), R4 // 3e000014de971000c403002a
+ MOVW y+65540(FP), F4 // 1e020014de8f1000c433002b
+ MOVF y+65540(FP), F4 // 1e020014de8f1000c433002b
+ MOVD y+65540(FP), F4 // 1e020014de8f1000c433802b
+ MOVW y+4097(FP), F4 // 3e000014de8f1000c427002b
+ MOVF y+4097(FP), F4 // 3e000014de8f1000c427002b
+ MOVD y+4097(FP), F4 // 3e000014de8f1000c427802b
+ MOVW 65536(R5), F4 // 1e020014de971000c403002b
+ MOVF 65536(R5), F4 // 1e020014de971000c403002b
+ MOVD 65536(R5), F4 // 1e020014de971000c403802b
+ MOVW 4096(R5), F4 // 3e000014de971000c403002b
+ MOVF 4096(R5), F4 // 3e000014de971000c403002b
+ MOVD 4096(R5), F4 // 3e000014de971000c403802b
+ MOVW F4, result+65540(FP) // 1e020014de8f1000c433402b
+ MOVF F4, result+65540(FP) // 1e020014de8f1000c433402b
+ MOVD F4, result+65540(FP) // 1e020014de8f1000c433c02b
+ MOVW F4, result+4097(FP) // 3e000014de8f1000c427402b
+ MOVF F4, result+4097(FP) // 3e000014de8f1000c427402b
+ MOVD F4, result+4097(FP) // 3e000014de8f1000c427c02b
+ MOVW F4, 65536(R5) // 1e020014de971000c403402b
+ MOVF F4, 65536(R5) // 1e020014de971000c403402b
+ MOVD F4, 65536(R5) // 1e020014de971000c403c02b
+ MOVW F4, 4096(R5) // 3e000014de971000c403402b
+ MOVF F4, 4096(R5) // 3e000014de971000c403402b
+ MOVD F4, 4096(R5) // 3e000014de971000c403c02b
+
+ MOVH R4, result+65540(FP) // 1e020014de8f1000c4334029
+ MOVH R4, 65536(R5) // 1e020014de971000c4034029
+ MOVH y+65540(FP), R4 // 1e020014de8f1000c4334028
+ MOVH 65536(R5), R4 // 1e020014de971000c4034028
+ MOVH R4, result+4097(FP) // 3e000014de8f1000c4274029
+ MOVH R4, 4096(R5) // 3e000014de971000c4034029
+ MOVH y+4097(FP), R4 // 3e000014de8f1000c4274028
+ MOVH 4096(R5), R4 // 3e000014de971000c4034028
+ MOVHU R4, result+65540(FP) // 1e020014de8f1000c4334029
+ MOVHU R4, 65536(R5) // 1e020014de971000c4034029
+ MOVHU y+65540(FP), R4 // 1e020014de8f1000c433402a
+ MOVHU 65536(R5), R4 // 1e020014de971000c403402a
+ MOVHU R4, result+4097(FP) // 3e000014de8f1000c4274029
+ MOVHU R4, 4096(R5) // 3e000014de971000c4034029
+ MOVHU y+4097(FP), R4 // 3e000014de8f1000c427402a
+ MOVHU 4096(R5), R4 // 3e000014de971000c403402a
+ SGT $74565, R4 // 5e020014de178d0384781200
+ SGT $74565, R4, R5 // 5e020014de178d0385781200
+ SGT $4097, R4 // 3e000014de07800384781200
+ SGT $4097, R4, R5 // 3e000014de07800385781200
+ SGTU $74565, R4 // 5e020014de178d0384f81200
+ SGTU $74565, R4, R5 // 5e020014de178d0385f81200
+ SGTU $4097, R4 // 3e000014de07800384f81200
+ SGTU $4097, R4, R5 // 3e000014de07800385f81200
+ ADDU $74565, R4 // 5e020014de178d0384781000
+ ADDU $74565, R4, R5 // 5e020014de178d0385781000
+ ADDU $4097, R4 // 3e000014de07800384781000
+ ADDU $4097, R4, R5 // 3e000014de07800385781000
+ ADDVU $4097, R4 // 3e000014de07800384f81000
+ ADDVU $4097, R4, R5 // 3e000014de07800385f81000
+ ADDVU $74565, R4 // 5e020014de178d0384f81000
+ ADDVU $74565, R4, R5 // 5e020014de178d0385f81000
+ OR $74565, R4 // 5e020014de178d0384781500
+ OR $74565, R4, R5 // 5e020014de178d0385781500
+ OR $4097, R4 // 3e000014de07800384781500
+ OR $4097, R4, R5 // 3e000014de07800385781500
+ XOR $74565, R4 // 5e020014de178d0384f81500
+ XOR $74565, R4, R5 // 5e020014de178d0385f81500
+ XOR $4097, R4 // 3e000014de07800384f81500
+ XOR $4097, R4, R5 // 3e000014de07800385f81500
diff --git a/src/cmd/asm/internal/asm/testdata/mips64.s b/src/cmd/asm/internal/asm/testdata/mips64.s
index 99044d8..8f628e2 100644
--- a/src/cmd/asm/internal/asm/testdata/mips64.s
+++ b/src/cmd/asm/internal/asm/testdata/mips64.s
@@ -21,9 +21,9 @@
BEQ R1, 2(PC)
JMP label0+0 // JMP 3 // 1000fffd
BEQ R1, 2(PC)
- JAL 1(PC) // CALL 1(PC) // 0c00000e
+ JAL 1(PC) // CALL 1(PC) // 0c00000f
BEQ R1, 2(PC)
- JAL label0+0 // CALL 3 // 0c000006
+ JAL label0+0 // CALL 3 // 0c000007
// LBRA addr
// {
@@ -32,11 +32,11 @@
BEQ R1, 2(PC)
JMP 0(R1) // JMP (R1) // 00200008
BEQ R1, 2(PC)
- JMP foo+0(SB) // JMP foo(SB) // 08000018
+ JMP foo+0(SB) // JMP foo(SB) // 08000019
BEQ R1, 2(PC)
JAL 0(R1) // CALL (R1) // 0020f809
BEQ R1, 2(PC)
- JAL foo+0(SB) // CALL foo(SB) // 0c000020
+ JAL foo+0(SB) // CALL foo(SB) // 0c000021
//
// BEQ/BNE
diff --git a/src/cmd/asm/internal/asm/testdata/ppc64.s b/src/cmd/asm/internal/asm/testdata/ppc64.s
index c140fd0..f307db3 100644
--- a/src/cmd/asm/internal/asm/testdata/ppc64.s
+++ b/src/cmd/asm/internal/asm/testdata/ppc64.s
@@ -24,7 +24,7 @@
MOVW $-32767, R5 // 38a08001
MOVW $-32768, R6 // 38c08000
MOVW $1234567, R5 // 6405001260a5d687
- MOVD 8(R3), R4 // e8830008
+ MOVD 8(R3), R4 // e8830008
MOVD (R3)(R4), R5 // 7ca4182a
MOVW 4(R3), R4 // e8830006
MOVW (R3)(R4), R5 // 7ca41aaa
@@ -41,7 +41,7 @@
MOVDBR (R3)(R4), R5 // 7ca41c28
MOVWBR (R3)(R4), R5 // 7ca41c2c
MOVHBR (R3)(R4), R5 // 7ca41e2c
- MOVD $foo+4009806848(FP), R5 // 3ca1ef0138a5cc20
+ MOVD $foo+4009806848(FP), R5 // 3ca1ef0138a5cc40
MOVD $foo(SB), R5 // 3ca0000038a50000
MOVDU 8(R3), R4 // e8830009
@@ -79,14 +79,14 @@
MOVBU R4, 1(R3) // 9c830001
MOVBU R5, (R3)(R4) // 7ca419ee
- MOVB $0, R4 // 38800000
- MOVBZ $0, R4 // 38800000
- MOVH $0, R4 // 38800000
- MOVHZ $0, R4 // 38800000
- MOVW $0, R4 // 38800000
- MOVWZ $0, R4 // 38800000
- MOVD $0, R4 // 38800000
- MOVD $0, R0 // 38000000
+ MOVB $0, R4 // 38800000
+ MOVBZ $0, R4 // 38800000
+ MOVH $0, R4 // 38800000
+ MOVHZ $0, R4 // 38800000
+ MOVW $0, R4 // 38800000
+ MOVWZ $0, R4 // 38800000
+ MOVD $0, R4 // 38800000
+ MOVD $0, R0 // 38000000
ADD $1, R3 // 38630001
ADD $1, R3, R4 // 38830001
@@ -351,11 +351,18 @@
CRORN CR0GT, CR0EQ, CR0SO // 4c620b42
CRXOR CR0GT, CR0EQ, CR0SO // 4c620982
- ISEL $1, R3, R4, R5 // 7ca3205e
ISEL $0, R3, R4, R5 // 7ca3201e
+ ISEL $1, R3, R4, R5 // 7ca3205e
ISEL $2, R3, R4, R5 // 7ca3209e
ISEL $3, R3, R4, R5 // 7ca320de
ISEL $4, R3, R4, R5 // 7ca3211e
+ ISEL $31, R3, R4, R5 // 7ca327de
+ ISEL CR0LT, R3, R4, R5 // 7ca3201e
+ ISEL CR0GT, R3, R4, R5 // 7ca3205e
+ ISEL CR0EQ, R3, R4, R5 // 7ca3209e
+ ISEL CR0SO, R3, R4, R5 // 7ca320de
+ ISEL CR1LT, R3, R4, R5 // 7ca3211e
+ ISEL CR7SO, R3, R4, R5 // 7ca327de
POPCNTB R3, R4 // 7c6400f4
POPCNTW R3, R4 // 7c6402f4
POPCNTD R3, R4 // 7c6403f4
@@ -751,17 +758,65 @@
MOVD XER, R3 // 7c6102a6
MOVFL CR3, CR1 // 4c8c0000
- MOVW CR0, R1 // 7c380026
- MOVW CR7, R1 // 7c301026
- MOVW CR, R1 // 7c200026
+ MOVW CR0, R1 // 7c380026
+ MOVW CR7, R1 // 7c301026
+ MOVW CR, R1 // 7c200026
- MOVW R1, CR // 7c2ff120
- MOVFL R1, CR // 7c2ff120
- MOVW R1, CR2 // 7c320120
- MOVFL R1, CR2 // 7c320120
- MOVFL R1, $255 // 7c2ff120
- MOVFL R1, $1 // 7c301120
- MOVFL R1, $128 // 7c380120
- MOVFL R1, $3 // 7c203120
+ MOVW R1, CR // 7c2ff120
+ MOVFL R1, CR // 7c2ff120
+ MOVW R1, CR2 // 7c320120
+ MOVFL R1, CR2 // 7c320120
+ MOVFL R1, $255 // 7c2ff120
+ MOVFL R1, $1 // 7c301120
+ MOVFL R1, $128 // 7c380120
+ MOVFL R1, $3 // 7c203120
+
+ // Verify supported bdnz/bdz encodings.
+ BC 16,0,0(PC) // BC $16, CR0LT, 0(PC) // 42000000
+ BDNZ 0(PC) // 42000000
+ BDZ 0(PC) // 42400000
+ BC 18,0,0(PC) // BC $18, CR0LT, 0(PC) // 42400000
+
+ // Verify the supported forms of bcclr[l]
+ BC $20,CR0LT,$1,LR // 4e800820
+ BC $20,CR0LT,$0,LR // 4e800020
+ BC $20,CR0LT,LR // 4e800020
+ BC $20,CR0GT,LR // 4e810020
+ BC 20,CR0LT,LR // BC $20,CR0LT,LR // 4e800020
+ BC 20,undefined_symbol,LR // BC $20,CR0LT,LR // 4e800020
+ BC 20,undefined_symbol+1,LR // BC $20,CR0GT,LR // 4e810020
+ JMP LR // 4e800020
+ BR LR // JMP LR // 4e800020
+ BCL $20,CR0LT,$1,LR // 4e800821
+ BCL $20,CR0LT,$0,LR // 4e800021
+ BCL $20,CR0LT,LR // 4e800021
+ BCL $20,CR0GT,LR // 4e810021
+ BCL 20,CR0LT,LR // BCL $20,CR0LT,LR // 4e800021
+ BCL 20,undefined_symbol,LR // BCL $20,CR0LT,LR // 4e800021
+ BCL 20,undefined_symbol+1,LR // BCL $20,CR0GT,LR // 4e810021
+
+ // Verify the supported forms of bcctr[l]
+ BC $20,CR0LT,CTR // 4e800420
+ BC $20,CR0GT,CTR // 4e810420
+ BC 20,CR0LT,CTR // BC $20,CR0LT,CTR // 4e800420
+ BC 20,undefined_symbol,CTR // BC $20,CR0LT,CTR // 4e800420
+ BC 20,undefined_symbol+1,CTR // BC $20,CR0GT,CTR // 4e810420
+ JMP CTR // 4e800420
+ BR CTR // JMP CTR // 4e800420
+ BCL $20,CR0LT,CTR // 4e800421
+ BCL $20,CR0GT,CTR // 4e810421
+ BCL 20,CR0LT,CTR // BCL $20,CR0LT,CTR // 4e800421
+ BCL 20,undefined_symbol,CTR // BCL $20,CR0LT,CTR // 4e800421
+ BCL 20,undefined_symbol+1,CTR // BCL $20,CR0GT,CTR // 4e810421
+
+ // Verify bc encoding (without pic enabled)
+ BC $16,CR0LT,0(PC) // 42000000
+ BCL $16,CR0LT,0(PC) // 42000001
+ BC $18,CR0LT,0(PC) // 42400000
+
+ MOVD SPR(3), 4(R1) // 7fe302a6fbe10004
+ MOVD XER, 4(R1) // 7fe102a6fbe10004
+ MOVD 4(R1), SPR(3) // ebe100047fe303a6
+ MOVD 4(R1), XER // ebe100047fe103a6
RET
diff --git a/src/cmd/asm/internal/asm/testdata/riscv64.s b/src/cmd/asm/internal/asm/testdata/riscv64.s
index fe911a7..79d6054 100644
--- a/src/cmd/asm/internal/asm/testdata/riscv64.s
+++ b/src/cmd/asm/internal/asm/testdata/riscv64.s
@@ -145,6 +145,19 @@
SRLW X5, X6, X7 // bb535300
SUBW X5, X6, X7 // bb035340
SRAW X5, X6, X7 // bb535340
+ ADDIW $1, X6 // 1b031300
+ SLLIW $1, X6 // 1b131300
+ SRLIW $1, X6 // 1b531300
+ SRAIW $1, X6 // 1b531340
+ ADDW X5, X7 // bb835300
+ SLLW X5, X7 // bb935300
+ SRLW X5, X7 // bbd35300
+ SUBW X5, X7 // bb835340
+ SRAW X5, X7 // bbd35340
+ ADDW $1, X6 // 1b031300
+ SLLW $1, X6 // 1b131300
+ SRLW $1, X6 // 1b531300
+ SRAW $1, X6 // 1b531340
// 5.3: Load and Store Instructions (RV64I)
LD (X5), X6 // 03b30200
diff --git a/src/cmd/asm/internal/asm/testdata/riscv64error.s b/src/cmd/asm/internal/asm/testdata/riscv64error.s
index 2385525..d3e43e7 100644
--- a/src/cmd/asm/internal/asm/testdata/riscv64error.s
+++ b/src/cmd/asm/internal/asm/testdata/riscv64error.s
@@ -22,5 +22,9 @@
MOVBU X5, (X6) // ERROR "unsupported unsigned store"
MOVHU X5, (X6) // ERROR "unsupported unsigned store"
MOVWU X5, (X6) // ERROR "unsupported unsigned store"
+ MOVF F0, F1, F2 // ERROR "illegal MOV instruction"
+ MOVD F0, F1, F2 // ERROR "illegal MOV instruction"
+ MOV X10, X11, X12 // ERROR "illegal MOV instruction"
+ MOVW X10, X11, X12 // ERROR "illegal MOV instruction"
RET
diff --git a/src/cmd/asm/internal/flags/flags.go b/src/cmd/asm/internal/flags/flags.go
index 607166e..1c8b908 100644
--- a/src/cmd/asm/internal/flags/flags.go
+++ b/src/cmd/asm/internal/flags/flags.go
@@ -6,6 +6,7 @@
package flags
import (
+ "cmd/internal/obj"
"cmd/internal/objabi"
"flag"
"fmt"
@@ -23,13 +24,14 @@
Linkshared = flag.Bool("linkshared", false, "generate code that will be linked against Go shared libraries")
AllErrors = flag.Bool("e", false, "no limit on number of errors reported")
SymABIs = flag.Bool("gensymabis", false, "write symbol ABI information to output file, don't assemble")
- Importpath = flag.String("p", "", "set expected package import to path")
+ Importpath = flag.String("p", obj.UnlinkablePkg, "set expected package import to path")
Spectre = flag.String("spectre", "", "enable spectre mitigations in `list` (all, ret)")
CompilingRuntime = flag.Bool("compiling-runtime", false, "source to be compiled is part of the Go runtime")
)
var DebugFlags struct {
MayMoreStack string `help:"call named function before all stack growth checks"`
+ PCTab string `help:"print named pc-value table\nOne of: pctospadj, pctofile, pctoline, pctoinline, pctopcdata"`
}
var (
diff --git a/src/cmd/asm/internal/lex/input.go b/src/cmd/asm/internal/lex/input.go
index e373ae8..276b4b0 100644
--- a/src/cmd/asm/internal/lex/input.go
+++ b/src/cmd/asm/internal/lex/input.go
@@ -50,7 +50,7 @@
// Set macros for GOEXPERIMENTs so we can easily switch
// runtime assembly code based on them.
if *flags.CompilingRuntime {
- for _, exp := range buildcfg.EnabledExperiments() {
+ for _, exp := range buildcfg.Experiment.Enabled() {
// Define macro.
name := "GOEXPERIMENT_" + exp
macros[name] = &Macro{
diff --git a/src/cmd/asm/internal/lex/tokenizer.go b/src/cmd/asm/internal/lex/tokenizer.go
index 861a2d4..4db88e2 100644
--- a/src/cmd/asm/internal/lex/tokenizer.go
+++ b/src/cmd/asm/internal/lex/tokenizer.go
@@ -109,7 +109,7 @@
}
text := s.TokenText()
t.line += strings.Count(text, "\n")
- // TODO: Use constraint.IsGoBuild once it exists.
+ // TODO: Use constraint.IsGoBuild once #44505 fixed.
if strings.HasPrefix(text, "//go:build") {
t.tok = BuildComment
break
diff --git a/src/cmd/asm/main.go b/src/cmd/asm/main.go
index 3683527..6a25fd4 100644
--- a/src/cmd/asm/main.go
+++ b/src/cmd/asm/main.go
@@ -43,6 +43,7 @@
ctxt.Flag_linkshared = *flags.Linkshared
ctxt.Flag_shared = *flags.Shared || *flags.Dynlink
ctxt.Flag_maymorestack = flags.DebugFlags.MayMoreStack
+ ctxt.Debugpcln = flags.DebugFlags.PCTab
ctxt.IsAsm = true
ctxt.Pkgpath = *flags.Importpath
switch *flags.Spectre {
diff --git a/src/cmd/buildid/buildid.go b/src/cmd/buildid/buildid.go
index 8e02a7a..72ad80d 100644
--- a/src/cmd/buildid/buildid.go
+++ b/src/cmd/buildid/buildid.go
@@ -53,6 +53,11 @@
log.Fatal(err)
}
+ // <= go 1.7 doesn't embed the contentID or actionID, so no slash is present
+ if !strings.Contains(id, "/") {
+ log.Fatalf("%s: build ID is a legacy format...binary too old for this tool", file)
+ }
+
newID := id[:strings.LastIndex(id, "/")] + "/" + buildid.HashToString(hash)
if len(newID) != len(id) {
log.Fatalf("%s: build ID length mismatch %q vs %q", file, id, newID)
diff --git a/src/cmd/buildid/doc.go b/src/cmd/buildid/doc.go
index d1ec155..a554d79 100644
--- a/src/cmd/buildid/doc.go
+++ b/src/cmd/buildid/doc.go
@@ -6,6 +6,7 @@
Buildid displays or updates the build ID stored in a Go package or binary.
Usage:
+
go tool buildid [-w] file
By default, buildid prints the build ID found in the named file.
diff --git a/src/cmd/cgo/doc.go b/src/cmd/cgo/doc.go
index a6787f6..7fb6179 100644
--- a/src/cmd/cgo/doc.go
+++ b/src/cmd/cgo/doc.go
@@ -3,10 +3,9 @@
// license that can be found in the LICENSE file.
/*
-
Cgo enables the creation of Go packages that call C code.
-Using cgo with the go command
+# Using cgo with the go command
To use cgo write normal Go code that imports a pseudo-package "C".
The Go code can then refer to types such as C.size_t, variables such
@@ -91,11 +90,11 @@
directory and linked properly.
For example if package foo is in the directory /go/src/foo:
- // #cgo LDFLAGS: -L${SRCDIR}/libs -lfoo
+ // #cgo LDFLAGS: -L${SRCDIR}/libs -lfoo
Will be expanded to:
- // #cgo LDFLAGS: -L/go/src/foo/libs -lfoo
+ // #cgo LDFLAGS: -L/go/src/foo/libs -lfoo
When the Go tool sees that one or more Go files use the special import
"C", it will look for other non-Go files in the directory and compile
@@ -139,7 +138,7 @@
The CXX_FOR_TARGET, CXX_FOR_${GOOS}_${GOARCH}, and CXX
environment variables work in a similar way for C++ code.
-Go references to C
+# Go references to C
Within the Go file, C's struct field names that are keywords in Go
can be accessed by prefixing them with an underscore: if x points at a C
@@ -291,7 +290,7 @@
of memory. Because C.malloc cannot fail, it has no two-result form
that returns errno.
-C references to Go
+# C references to Go
Go functions can be exported for use by C code in the following way:
@@ -327,7 +326,7 @@
duplicate symbols and the linker will fail. To avoid this, definitions
must be placed in preambles in other files, or in C source files.
-Passing pointers
+# Passing pointers
Go is a garbage collected language, and the garbage collector needs to
know the location of every pointer to Go memory. Because of this,
@@ -398,7 +397,7 @@
store pointer values in it. Zero out the memory in C before passing it
to Go.
-Special cases
+# Special cases
A few special C types which would normally be represented by a pointer
type in Go are instead represented by a uintptr. Those include:
@@ -449,9 +448,10 @@
go tool fix -r eglconf <pkg>
-Using cgo directly
+# Using cgo directly
Usage:
+
go tool cgo [cgo options] [-- compiler options] gofiles...
Cgo transforms the specified input Go source files into several output
@@ -753,6 +753,16 @@
_go_.o # gc-compiled object for _cgo_gotypes.go, _cgo_import.go, *.cgo1.go
_all.o # gcc-compiled object for _cgo_export.c, *.cgo2.c
+If there is an error generating the _cgo_import.go file, then, instead
+of adding _cgo_import.go to the package, the go tool adds an empty
+file named dynimportfail. The _cgo_import.go file is only needed when
+using internal linking mode, which is not the default when linking
+programs that use cgo (as described below). If the linker sees a file
+named dynimportfail it reports an error if it has been told to use
+internal linking mode. This approach is taken because generating
+_cgo_import.go requires doing a full C link of the package, which can
+fail for reasons that are irrelevant when using external linking mode.
+
The final program will be a dynamic executable, so that cmd/link can avoid
needing to process arbitrary .o files. It only needs to process the .o
files generated from C files that cgo writes, and those are much more
diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go
index 92d4780..d89bff2 100644
--- a/src/cmd/cgo/gcc.go
+++ b/src/cmd/cgo/gcc.go
@@ -114,12 +114,11 @@
//
// For example, the following string:
//
-// `a b:"c d" 'e''f' "g\""`
+// `a b:"c d" 'e''f' "g\""`
//
// Would be parsed as:
//
-// []string{"a", "b:c d", "ef", `g"`}
-//
+// []string{"a", "b:c d", "ef", `g"`}
func splitQuoted(s string) (r []string, err error) {
var args []string
arg := make([]rune, len(s))
@@ -489,7 +488,7 @@
// Check if compiling the preamble by itself causes any errors,
// because the messages we've printed out so far aren't helpful
// to users debugging preamble mistakes. See issue 8442.
- preambleErrors := p.gccErrors([]byte(f.Preamble))
+ preambleErrors := p.gccErrors([]byte(builtinProlog + f.Preamble))
if len(preambleErrors) > 0 {
error_(token.NoPos, "\n%s errors for preamble:\n%s", gccBaseCmd[0], preambleErrors)
}
@@ -827,6 +826,7 @@
params := name.FuncType.Params
args := call.Call.Args
+ end := call.Call.End()
// Avoid a crash if the number of arguments doesn't match
// the number of parameters.
@@ -974,7 +974,7 @@
if nu {
needsUnsafe = true
}
- sb.WriteString(gofmtLine(m))
+ sb.WriteString(gofmtPos(m, end))
sb.WriteString("(")
for i := range params {
@@ -1153,13 +1153,19 @@
// checkIndex checks whether arg has the form &a[i], possibly inside
// type conversions. If so, then in the general case it writes
-// _cgoIndexNN := a
-// _cgoNN := &cgoIndexNN[i] // with type conversions, if any
+//
+// _cgoIndexNN := a
+// _cgoNN := &cgoIndexNN[i] // with type conversions, if any
+//
// to sb, and writes
-// _cgoCheckPointer(_cgoNN, _cgoIndexNN)
+//
+// _cgoCheckPointer(_cgoNN, _cgoIndexNN)
+//
// to sbCheck, and returns true. If a is a simple variable or field reference,
// it writes
-// _cgoIndexNN := &a
+//
+// _cgoIndexNN := &a
+//
// and dereferences the uses of _cgoIndexNN. Taking the address avoids
// making a copy of an array.
//
@@ -1207,10 +1213,14 @@
// checkAddr checks whether arg has the form &x, possibly inside type
// conversions. If so, it writes
-// _cgoBaseNN := &x
-// _cgoNN := _cgoBaseNN // with type conversions, if any
+//
+// _cgoBaseNN := &x
+// _cgoNN := _cgoBaseNN // with type conversions, if any
+//
// to sb, and writes
-// _cgoCheckPointer(_cgoBaseNN, true)
+//
+// _cgoCheckPointer(_cgoBaseNN, true)
+//
// to sbCheck, and returns true. This tells _cgoCheckPointer to check
// just the contents of the pointer being passed, not any other part
// of the memory allocation. This is run after checkIndex, which looks
@@ -1628,6 +1638,8 @@
} else if gomips == "softfloat" {
return []string{"-mabi=32", "-msoft-float"}
}
+ case "loong64":
+ return []string{"-mabi=lp64d"}
}
return nil
}
@@ -1819,6 +1831,23 @@
bo := f.ByteOrder
symtab, err := f.Symbols()
if err == nil {
+ // Check for use of -fsanitize=hwaddress (issue 53285).
+ removeTag := func(v uint64) uint64 { return v }
+ if goarch == "arm64" {
+ for i := range symtab {
+ if symtab[i].Name == "__hwasan_init" {
+ // -fsanitize=hwaddress on ARM
+ // uses the upper byte of a
+ // memory address as a hardware
+ // tag. Remove it so that
+ // we can find the associated
+ // data.
+ removeTag = func(v uint64) uint64 { return v &^ (0xff << (64 - 8)) }
+ break
+ }
+ }
+ }
+
for i := range symtab {
s := &symtab[i]
switch {
@@ -1826,9 +1855,10 @@
// Found it. Now find data section.
if i := int(s.Section); 0 <= i && i < len(f.Sections) {
sect := f.Sections[i]
- if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
+ val := removeTag(s.Value)
+ if sect.Addr <= val && val < sect.Addr+sect.Size {
if sdat, err := sect.Data(); err == nil {
- data := sdat[s.Value-sect.Addr:]
+ data := sdat[val-sect.Addr:]
ints = make([]int64, len(data)/8)
for i := range ints {
ints[i] = int64(bo.Uint64(data[i*8:]))
@@ -1840,9 +1870,10 @@
// Found it. Now find data section.
if i := int(s.Section); 0 <= i && i < len(f.Sections) {
sect := f.Sections[i]
- if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
+ val := removeTag(s.Value)
+ if sect.Addr <= val && val < sect.Addr+sect.Size {
if sdat, err := sect.Data(); err == nil {
- data := sdat[s.Value-sect.Addr:]
+ data := sdat[val-sect.Addr:]
floats = make([]float64, len(data)/8)
for i := range floats {
floats[i] = math.Float64frombits(bo.Uint64(data[i*8:]))
@@ -1855,9 +1886,10 @@
// Found it. Now find data section.
if i := int(s.Section); 0 <= i && i < len(f.Sections) {
sect := f.Sections[i]
- if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
+ val := removeTag(s.Value)
+ if sect.Addr <= val && val < sect.Addr+sect.Size {
if sdat, err := sect.Data(); err == nil {
- data := sdat[s.Value-sect.Addr:]
+ data := sdat[val-sect.Addr:]
strdata[n] = string(data)
}
}
@@ -1868,9 +1900,10 @@
// Found it. Now find data section.
if i := int(s.Section); 0 <= i && i < len(f.Sections) {
sect := f.Sections[i]
- if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
+ val := removeTag(s.Value)
+ if sect.Addr <= val && val < sect.Addr+sect.Size {
if sdat, err := sect.Data(); err == nil {
- data := sdat[s.Value-sect.Addr:]
+ data := sdat[val-sect.Addr:]
strlen := bo.Uint64(data[:8])
if strlen > (1<<(uint(p.IntSize*8)-1) - 1) { // greater than MaxInt?
fatalf("string literal too big")
@@ -2230,6 +2263,8 @@
"long long unsigned int": "ulonglong",
"signed char": "schar",
"unsigned char": "uchar",
+ "unsigned long": "ulong", // Used by Clang 14; issue 53013.
+ "unsigned long long": "ulonglong", // Used by Clang 14; issue 53013.
}
const signedDelta = 64
@@ -2516,6 +2551,11 @@
t.Go = name // publish before recursive calls
goIdent[name.Name] = name
if dt.ByteSize < 0 {
+ // Don't override old type
+ if _, ok := typedef[name.Name]; ok {
+ break
+ }
+
// Size calculation in c.Struct/c.Opaque will die with size=-1 (unknown),
// so execute the basic things that the struct case would do
// other than try to determine a Go representation.
diff --git a/src/cmd/cgo/godefs.go b/src/cmd/cgo/godefs.go
index c0d59ae..3a27b31 100644
--- a/src/cmd/cgo/godefs.go
+++ b/src/cmd/cgo/godefs.go
@@ -16,11 +16,11 @@
)
// godefs returns the output for -godefs mode.
-func (p *Package) godefs(f *File) string {
+func (p *Package) godefs(f *File, args []string) string {
var buf bytes.Buffer
fmt.Fprintf(&buf, "// Code generated by cmd/cgo -godefs; DO NOT EDIT.\n")
- fmt.Fprintf(&buf, "// %s %s\n", filepath.Base(os.Args[0]), strings.Join(os.Args[1:], " "))
+ fmt.Fprintf(&buf, "// %s %s\n", filepath.Base(args[0]), strings.Join(args[1:], " "))
fmt.Fprintf(&buf, "\n")
override := make(map[string]string)
diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go
index 14642b7..e343459 100644
--- a/src/cmd/cgo/main.go
+++ b/src/cmd/cgo/main.go
@@ -11,7 +11,6 @@
package main
import (
- "crypto/md5"
"flag"
"fmt"
"go/ast"
@@ -28,6 +27,7 @@
"strings"
"cmd/internal/edit"
+ "cmd/internal/notsha256"
"cmd/internal/objabi"
)
@@ -175,6 +175,7 @@
"amd64": 8,
"arm": 4,
"arm64": 8,
+ "loong64": 8,
"m68k": 4,
"mips": 4,
"mipsle": 4,
@@ -200,6 +201,7 @@
"amd64": 8,
"arm": 4,
"arm64": 8,
+ "loong64": 8,
"m68k": 4,
"mips": 4,
"mipsle": 4,
@@ -291,6 +293,10 @@
usage()
}
+ // Save original command line arguments for the godefs generated comment. Relative file
+ // paths in os.Args will be rewritten to absolute file paths in the loop below.
+ osArgs := make([]string, len(os.Args))
+ copy(osArgs, os.Args[:])
goFiles := args[i:]
for _, arg := range args[:i] {
@@ -325,8 +331,8 @@
// we use to coordinate between gcc and ourselves.
// We already put _cgo_ at the beginning, so the main
// concern is other cgo wrappers for the same functions.
- // Use the beginning of the md5 of the input to disambiguate.
- h := md5.New()
+ // Use the beginning of the notsha256 of the input to disambiguate.
+ h := notsha256.New()
io.WriteString(h, *importPath)
fs := make([]*File, len(goFiles))
for i, input := range goFiles {
@@ -390,7 +396,7 @@
p.PackagePath = f.Package
p.Record(f)
if *godefs {
- os.Stdout.WriteString(p.godefs(f))
+ os.Stdout.WriteString(p.godefs(f, osArgs))
} else {
p.writeOutput(f, input)
}
diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go
index 4968f70..119eca2 100644
--- a/src/cmd/cgo/out.go
+++ b/src/cmd/cgo/out.go
@@ -14,10 +14,10 @@
"go/ast"
"go/printer"
"go/token"
- exec "internal/execabs"
"internal/xcoff"
"io"
"os"
+ "os/exec"
"path/filepath"
"regexp"
"sort"
@@ -57,18 +57,19 @@
fflg.Close()
// Write C main file for using gcc to resolve imports.
+ fmt.Fprintf(fm, "#include <stddef.h>\n") // For size_t below.
fmt.Fprintf(fm, "int main() { return 0; }\n")
if *importRuntimeCgo {
- fmt.Fprintf(fm, "void crosscall2(void(*fn)(void*) __attribute__((unused)), void *a __attribute__((unused)), int c __attribute__((unused)), __SIZE_TYPE__ ctxt __attribute__((unused))) { }\n")
- fmt.Fprintf(fm, "__SIZE_TYPE__ _cgo_wait_runtime_init_done(void) { return 0; }\n")
- fmt.Fprintf(fm, "void _cgo_release_context(__SIZE_TYPE__ ctxt __attribute__((unused))) { }\n")
+ fmt.Fprintf(fm, "void crosscall2(void(*fn)(void*) __attribute__((unused)), void *a __attribute__((unused)), int c __attribute__((unused)), size_t ctxt __attribute__((unused))) { }\n")
+ fmt.Fprintf(fm, "size_t _cgo_wait_runtime_init_done(void) { return 0; }\n")
+ fmt.Fprintf(fm, "void _cgo_release_context(size_t ctxt __attribute__((unused))) { }\n")
fmt.Fprintf(fm, "char* _cgo_topofstack(void) { return (char*)0; }\n")
} else {
// If we're not importing runtime/cgo, we *are* runtime/cgo,
// which provides these functions. We just need a prototype.
- fmt.Fprintf(fm, "void crosscall2(void(*fn)(void*), void *a, int c, __SIZE_TYPE__ ctxt);\n")
- fmt.Fprintf(fm, "__SIZE_TYPE__ _cgo_wait_runtime_init_done(void);\n")
- fmt.Fprintf(fm, "void _cgo_release_context(__SIZE_TYPE__);\n")
+ fmt.Fprintf(fm, "void crosscall2(void(*fn)(void*), void *a, int c, size_t ctxt);\n")
+ fmt.Fprintf(fm, "size_t _cgo_wait_runtime_init_done(void);\n")
+ fmt.Fprintf(fm, "void _cgo_release_context(size_t);\n")
}
fmt.Fprintf(fm, "void _cgo_allocate(void *a __attribute__((unused)), int c __attribute__((unused))) { }\n")
fmt.Fprintf(fm, "void _cgo_panic(void *a __attribute__((unused)), int c __attribute__((unused))) { }\n")
@@ -173,7 +174,7 @@
// the external linker will add DT_NEEDED
// entries as needed on ELF systems.
// Treat function variables differently
- // to avoid type confict errors from LTO
+ // to avoid type conflict errors from LTO
// (Link Time Optimization).
if n.Kind == "fpvar" {
fmt.Fprintf(fm, "extern void %s();\n", n.C)
@@ -886,9 +887,9 @@
fmt.Fprintf(fgcc, "#pragma GCC diagnostic ignored \"-Wpragmas\"\n")
fmt.Fprintf(fgcc, "#pragma GCC diagnostic ignored \"-Waddress-of-packed-member\"\n")
- fmt.Fprintf(fgcc, "extern void crosscall2(void (*fn)(void *), void *, int, __SIZE_TYPE__);\n")
- fmt.Fprintf(fgcc, "extern __SIZE_TYPE__ _cgo_wait_runtime_init_done(void);\n")
- fmt.Fprintf(fgcc, "extern void _cgo_release_context(__SIZE_TYPE__);\n\n")
+ fmt.Fprintf(fgcc, "extern void crosscall2(void (*fn)(void *), void *, int, size_t);\n")
+ fmt.Fprintf(fgcc, "extern size_t _cgo_wait_runtime_init_done(void);\n")
+ fmt.Fprintf(fgcc, "extern void _cgo_release_context(size_t);\n\n")
fmt.Fprintf(fgcc, "extern char* _cgo_topofstack(void);")
fmt.Fprintf(fgcc, "%s\n", tsanProlog)
fmt.Fprintf(fgcc, "%s\n", msanProlog)
@@ -992,7 +993,7 @@
fmt.Fprintf(fgcc, "\nCGO_NO_SANITIZE_THREAD")
fmt.Fprintf(fgcc, "\n%s\n", s)
fmt.Fprintf(fgcc, "{\n")
- fmt.Fprintf(fgcc, "\t__SIZE_TYPE__ _cgo_ctxt = _cgo_wait_runtime_init_done();\n")
+ fmt.Fprintf(fgcc, "\tsize_t _cgo_ctxt = _cgo_wait_runtime_init_done();\n")
// The results part of the argument structure must be
// initialized to 0 so the write barriers generated by
// the assignments to these fields in Go are safe.
@@ -1398,6 +1399,19 @@
case *ast.ChanType:
return &Type{Size: p.PtrSize, Align: p.PtrSize, C: c("GoChan")}
case *ast.Ident:
+ goTypesFixup := func(r *Type) *Type {
+ if r.Size == 0 { // int or uint
+ rr := new(Type)
+ *rr = *r
+ rr.Size = p.IntSize
+ rr.Align = p.IntSize
+ r = rr
+ }
+ if r.Align > p.PtrSize {
+ r.Align = p.PtrSize
+ }
+ return r
+ }
// Look up the type in the top level declarations.
// TODO: Handle types defined within a function.
for _, d := range p.Decl {
@@ -1416,6 +1430,17 @@
}
}
if def := typedef[t.Name]; def != nil {
+ if defgo, ok := def.Go.(*ast.Ident); ok {
+ switch defgo.Name {
+ case "complex64", "complex128":
+ // MSVC does not support the _Complex keyword
+ // nor the complex macro.
+ // Use GoComplex64 and GoComplex128 instead,
+ // which are typedef-ed to a compatible type.
+ // See go.dev/issues/36233.
+ return goTypesFixup(goTypes[defgo.Name])
+ }
+ }
return def
}
if t.Name == "uintptr" {
@@ -1429,17 +1454,7 @@
return &Type{Size: 2 * p.PtrSize, Align: p.PtrSize, C: c("GoInterface")}
}
if r, ok := goTypes[t.Name]; ok {
- if r.Size == 0 { // int or uint
- rr := new(Type)
- *rr = *r
- rr.Size = p.IntSize
- rr.Align = p.IntSize
- r = rr
- }
- if r.Align > p.PtrSize {
- r.Align = p.PtrSize
- }
- return r
+ return goTypesFixup(r)
}
error_(e.Pos(), "unrecognized Go type %s", t.Name)
return &Type{Size: 4, Align: 4, C: c("int")}
@@ -1561,7 +1576,7 @@
const builtinProlog = `
#line 1 "cgo-builtin-prolog"
-#include <stddef.h> /* for ptrdiff_t and size_t below */
+#include <stddef.h>
/* Define intgo when compiling with GCC. */
typedef ptrdiff_t intgo;
@@ -1604,6 +1619,7 @@
//go:linkname _cgo_runtime_gostring runtime.gostring
func _cgo_runtime_gostring(*_Ctype_char) string
+// GoString converts the C string p into a Go string.
func _Cfunc_GoString(p *_Ctype_char) string {
return _cgo_runtime_gostring(p)
}
@@ -1613,6 +1629,7 @@
//go:linkname _cgo_runtime_gostringn runtime.gostringn
func _cgo_runtime_gostringn(*_Ctype_char, int) string
+// GoStringN converts the C data p with explicit length l to a Go string.
func _Cfunc_GoStringN(p *_Ctype_char, l _Ctype_int) string {
return _cgo_runtime_gostringn(p, int(l))
}
@@ -1622,26 +1639,52 @@
//go:linkname _cgo_runtime_gobytes runtime.gobytes
func _cgo_runtime_gobytes(unsafe.Pointer, int) []byte
+// GoBytes converts the C data p with explicit length l to a Go []byte.
func _Cfunc_GoBytes(p unsafe.Pointer, l _Ctype_int) []byte {
return _cgo_runtime_gobytes(p, int(l))
}
`
const cStringDef = `
+// CString converts the Go string s to a C string.
+//
+// The C string is allocated in the C heap using malloc.
+// It is the caller's responsibility to arrange for it to be
+// freed, such as by calling C.free (be sure to include stdlib.h
+// if C.free is needed).
func _Cfunc_CString(s string) *_Ctype_char {
+ if len(s)+1 <= 0 {
+ panic("string too large")
+ }
p := _cgo_cmalloc(uint64(len(s)+1))
- pp := (*[1<<30]byte)(p)
- copy(pp[:], s)
- pp[len(s)] = 0
+ sliceHeader := struct {
+ p unsafe.Pointer
+ len int
+ cap int
+ }{p, len(s)+1, len(s)+1}
+ b := *(*[]byte)(unsafe.Pointer(&sliceHeader))
+ copy(b, s)
+ b[len(s)] = 0
return (*_Ctype_char)(p)
}
`
const cBytesDef = `
+// CBytes converts the Go []byte slice b to a C array.
+//
+// The C array is allocated in the C heap using malloc.
+// It is the caller's responsibility to arrange for it to be
+// freed, such as by calling C.free (be sure to include stdlib.h
+// if C.free is needed).
func _Cfunc_CBytes(b []byte) unsafe.Pointer {
p := _cgo_cmalloc(uint64(len(b)))
- pp := (*[1<<30]byte)(p)
- copy(pp[:], b)
+ sliceHeader := struct {
+ p unsafe.Pointer
+ len int
+ cap int
+ }{p, len(b), len(b)}
+ s := *(*[]byte)(unsafe.Pointer(&sliceHeader))
+ copy(s, b)
return p
}
`
@@ -1830,7 +1873,7 @@
const builtinExportProlog = `
#line 1 "cgo-builtin-export-prolog"
-#include <stddef.h> /* for ptrdiff_t below */
+#include <stddef.h>
#ifndef GO_CGO_EXPORT_PROLOGUE_H
#define GO_CGO_EXPORT_PROLOGUE_H
@@ -1876,11 +1919,17 @@
typedef unsigned long long GoUint64;
typedef GoIntGOINTBITS GoInt;
typedef GoUintGOINTBITS GoUint;
-typedef __SIZE_TYPE__ GoUintptr;
+typedef size_t GoUintptr;
typedef float GoFloat32;
typedef double GoFloat64;
+#ifdef _MSC_VER
+#include <complex.h>
+typedef _Fcomplex GoComplex64;
+typedef _Dcomplex GoComplex128;
+#else
typedef float _Complex GoComplex64;
typedef double _Complex GoComplex128;
+#endif
/*
static assertion to make sure the file is being used on architecture
@@ -1926,5 +1975,5 @@
runtime_iscgo = 1;
}
-extern __SIZE_TYPE__ _cgo_wait_runtime_init_done(void) __attribute__ ((weak));
+extern size_t _cgo_wait_runtime_init_done(void) __attribute__ ((weak));
`
diff --git a/src/cmd/cgo/util.go b/src/cmd/cgo/util.go
index 00d931b..779f7be 100644
--- a/src/cmd/cgo/util.go
+++ b/src/cmd/cgo/util.go
@@ -8,9 +8,9 @@
"bytes"
"fmt"
"go/token"
- exec "internal/execabs"
"io/ioutil"
"os"
+ "os/exec"
)
// run runs the command argv, feeding in stdin on standard input.
diff --git a/src/cmd/compile/README.md b/src/cmd/compile/README.md
index 25fa818..9c4eeeb 100644
--- a/src/cmd/compile/README.md
+++ b/src/cmd/compile/README.md
@@ -15,10 +15,12 @@
phases we are going to list here. A third term, "middle-end", often refers to
much of the work that happens in the second phase.
-Note that the `go/*` family of packages, such as `go/parser` and `go/types`,
-have no relation to the compiler. Since the compiler was initially written in C,
-the `go/*` packages were developed to enable writing tools working with Go code,
-such as `gofmt` and `vet`.
+Note that the `go/*` family of packages, such as `go/parser` and
+`go/types`, are mostly unused by the compiler. Since the compiler was
+initially written in C, the `go/*` packages were developed to enable
+writing tools working with Go code, such as `gofmt` and `vet`.
+However, over time the compiler's internal APIs have slowly evolved to
+be more familiar to users of the `go/*` packages.
It should be clarified that the name "gc" stands for "Go compiler", and has
little to do with uppercase "GC", which stands for garbage collection.
@@ -36,33 +38,71 @@
declarations, and statements. The syntax tree also includes position information
which is used for error reporting and the creation of debugging information.
-### 2. Type-checking and AST transformations
+### 2. Type checking
-* `cmd/compile/internal/gc` (create compiler AST, type checking, AST transformations)
+* `cmd/compile/internal/types2` (type checking)
-The gc package includes its own AST definition carried over from when it was written
-in C. All of its code is written in terms of this AST, so the first thing that the gc
-package must do is convert the syntax package's syntax tree to the compiler's
-AST representation. This extra step may be refactored away in the future.
+The types2 package is a port of `go/types` to use the syntax package's
+AST instead of `go/ast`.
-The gc AST is then type-checked. The first steps are name resolution and type
-inference, which determine which object belongs to which identifier, and what
-type each expression has. Type-checking includes certain extra checks, such as
-"declared and not used" as well as determining whether or not a function
-terminates.
+### 3. IR construction ("noding")
-Certain transformations are also done on the AST. Some nodes are refined based
-on type information, such as string additions being split from the arithmetic
-addition node type. Some other examples are dead code elimination, function call
+* `cmd/compile/internal/types` (compiler types)
+* `cmd/compile/internal/ir` (compiler AST)
+* `cmd/compile/internal/typecheck` (AST transformations)
+* `cmd/compile/internal/noder` (create compiler AST)
+
+The compiler middle end uses its own AST definition and representation of Go
+types carried over from when it was written in C. All of its code is written in
+terms of these, so the next step after type checking is to convert the syntax
+and types2 representations to ir and types. This process is referred to as
+"noding."
+
+There are currently two noding implementations:
+
+1. irgen (aka "-G=3" or sometimes "noder2") is the implementation used starting
+ with Go 1.18, and
+
+2. Unified IR is another, in-development implementation (enabled with
+ `GOEXPERIMENT=unified`), which also implements import/export and inlining.
+
+Up through Go 1.18, there was a third noding implementation (just
+"noder" or "-G=0"), which directly converted the pre-type-checked
+syntax representation into IR and then invoked package typecheck's
+type checker. This implementation was removed after Go 1.18, so now
+package typecheck is only used for IR transformations.
+
+### 4. Middle end
+
+* `cmd/compile/internal/deadcode` (dead code elimination)
+* `cmd/compile/internal/inline` (function call inlining)
+* `cmd/compile/internal/devirtualize` (devirtualization of known interface method calls)
+* `cmd/compile/internal/escape` (escape analysis)
+
+Several optimization passes are performed on the IR representation:
+dead code elimination, (early) devirtualization, function call
inlining, and escape analysis.
-### 3. Generic SSA
+### 5. Walk
-* `cmd/compile/internal/gc` (converting to SSA)
+* `cmd/compile/internal/walk` (order of evaluation, desugaring)
+
+The final pass over the IR representation is "walk," which serves two purposes:
+
+1. It decomposes complex statements into individual, simpler statements,
+ introducing temporary variables and respecting order of evaluation. This step
+ is also referred to as "order."
+
+2. It desugars higher-level Go constructs into more primitive ones. For example,
+ `switch` statements are turned into binary search or jump tables, and
+ operations on maps and channels are replaced with runtime calls.
+
+### 6. Generic SSA
+
* `cmd/compile/internal/ssa` (SSA passes and rules)
+* `cmd/compile/internal/ssagen` (converting IR to SSA)
-
-In this phase, the AST is converted into Static Single Assignment (SSA) form, a
+In this phase, IR is converted into Static Single Assignment (SSA) form, a
lower-level intermediate representation with specific properties that make it
easier to implement optimizations and to eventually generate machine code from
it.
@@ -84,7 +124,7 @@
mainly concern expressions, such as replacing some expressions with constant
values, and optimizing multiplications and float operations.
-### 4. Generating machine code
+### 7. Generating machine code
* `cmd/compile/internal/ssa` (SSA lowering and arch-specific passes)
* `cmd/internal/obj` (machine code generation)
diff --git a/src/cmd/compile/abi-internal.md b/src/cmd/compile/abi-internal.md
index 53eaa84..14464ed 100644
--- a/src/cmd/compile/abi-internal.md
+++ b/src/cmd/compile/abi-internal.md
@@ -1,5 +1,7 @@
# Go internal ABI specification
+Self-link: [go.dev/s/regabi](https://go.dev/s/regabi)
+
This document describes Go’s internal application binary interface
(ABI), known as ABIInternal.
Go's ABI defines the layout of data in memory and the conventions for
@@ -30,19 +32,19 @@
Those that aren't guaranteed may change in future versions of Go (for
example, we've considered changing the alignment of int64 on 32-bit).
-| Type | 64-bit | | 32-bit | |
-| --- | --- | --- | --- | --- |
-| | Size | Align | Size | Align |
-| bool, uint8, int8 | 1 | 1 | 1 | 1 |
-| uint16, int16 | 2 | 2 | 2 | 2 |
-| uint32, int32 | 4 | 4 | 4 | 4 |
-| uint64, int64 | 8 | 8 | 8 | 4 |
-| int, uint | 8 | 8 | 4 | 4 |
-| float32 | 4 | 4 | 4 | 4 |
-| float64 | 8 | 8 | 8 | 4 |
-| complex64 | 8 | 4 | 8 | 4 |
-| complex128 | 16 | 8 | 16 | 4 |
-| uintptr, *T, unsafe.Pointer | 8 | 8 | 4 | 4 |
+| Type | 64-bit | | 32-bit | |
+|-----------------------------|--------|-------|--------|-------|
+| | Size | Align | Size | Align |
+| bool, uint8, int8 | 1 | 1 | 1 | 1 |
+| uint16, int16 | 2 | 2 | 2 | 2 |
+| uint32, int32 | 4 | 4 | 4 | 4 |
+| uint64, int64 | 8 | 8 | 8 | 4 |
+| int, uint | 8 | 8 | 4 | 4 |
+| float32 | 4 | 4 | 4 | 4 |
+| float64 | 8 | 8 | 8 | 4 |
+| complex64 | 8 | 4 | 8 | 4 |
+| complex128 | 16 | 8 | 16 | 4 |
+| uintptr, *T, unsafe.Pointer | 8 | 8 | 4 | 4 |
The types `byte` and `rune` are aliases for `uint8` and `int32`,
respectively, and hence have the same size and alignment as these
@@ -730,6 +732,57 @@
to 0 by the kernel at startup of the Go program and not changed by
the Go generated code.
+### riscv64 architecture
+
+The riscv64 architecture uses X10 – X17, X8, X9, X18 – X23 for integer arguments
+and results.
+
+It uses F10 – F17, F8, F9, F18 – F23 for floating-point arguments and results.
+
+Special-purpose registers used within Go generated code and Go
+assembly code are as follows:
+
+| Register | Call meaning | Return meaning | Body meaning |
+| --- | --- | --- | --- |
+| X0 | Zero value | Same | Same |
+| X1 | Link register | Link register | Scratch |
+| X2 | Stack pointer | Same | Same |
+| X3 | Global pointer | Same | Used by dynamic linker |
+| X4 | TLS (thread pointer) | TLS | Scratch |
+| X24,X25 | Scratch | Scratch | Used by duffcopy, duffzero |
+| X26 | Closure context pointer | Scratch | Scratch |
+| X27 | Current goroutine | Same | Same |
+| X31 | Scratch | Scratch | Scratch |
+
+*Rationale*: These register meanings are compatible with Go’s
+stack-based calling convention. Context register X20 will change to X26,
+duffcopy, duffzero register will change to X24, X25 before this register ABI been adopted.
+X10 – X17, X8, X9, X18 – X23, is the same order as A0 – A7, S0 – S7 in platform ABI.
+F10 – F17, F8, F9, F18 – F23, is the same order as FA0 – FA7, FS0 – FS7 in platform ABI.
+X8 – X23, F8 – F15 are used for compressed instruction (RVC) which will benefit code size in the future.
+
+#### Stack layout
+
+The stack pointer, X2, grows down and is aligned to 8 bytes.
+
+A function's stack frame, after the frame is created, is laid out as
+follows:
+
+ +------------------------------+
+ | ... locals ... |
+ | ... outgoing arguments ... |
+ | return PC | ← X2 points to
+ +------------------------------+ ↓ lower addresses
+
+The "return PC" is loaded to the link register, X1, as part of the
+riscv64 `CALL` operation.
+
+#### Flags
+
+The riscv64 has Zicsr extension for control and status register (CSR) and
+treated as scratch register.
+All bits in CSR are system flags and are not modified by Go.
+
## Future directions
### Spill path improvements
diff --git a/src/cmd/compile/doc.go b/src/cmd/compile/doc.go
index ef7fa86..60e1263 100644
--- a/src/cmd/compile/doc.go
+++ b/src/cmd/compile/doc.go
@@ -68,9 +68,6 @@
-importcfg file
Read import configuration from file.
In the file, set importmap, packagefile to specify import resolution.
- -importmap old=new
- Interpret import "old" as import "new" during compilation.
- The option may be repeated to add multiple mappings.
-installsuffix suffix
Look for packages in $GOROOT/pkg/$GOOS_$GOARCH_suffix
instead of $GOROOT/pkg/$GOOS_$GOARCH.
@@ -219,11 +216,13 @@
//go:uintptrescapes
The //go:uintptrescapes directive must be followed by a function declaration.
-It specifies that the function's uintptr arguments may be pointer values
-that have been converted to uintptr and must be treated as such by the
-garbage collector. The conversion from pointer to uintptr must appear in
-the argument list of any call to this function. This directive is necessary
-for some low-level system call implementations and should be avoided otherwise.
+It specifies that the function's uintptr arguments may be pointer values that
+have been converted to uintptr and must be on the heap and kept alive for the
+duration of the call, even though from the types alone it would appear that the
+object is no longer needed during the call. The conversion from pointer to
+uintptr must appear in the argument list of any call to this function. This
+directive is necessary for some low-level system call implementations and
+should be avoided otherwise.
//go:noinline
diff --git a/src/cmd/compile/internal/abi/abiutils.go b/src/cmd/compile/internal/abi/abiutils.go
index 529150a..aa5063f 100644
--- a/src/cmd/compile/internal/abi/abiutils.go
+++ b/src/cmd/compile/internal/abi/abiutils.go
@@ -258,7 +258,7 @@
// by the ABI rules for parameter passing and result returning.
type ABIConfig struct {
// Do we need anything more than this?
- offsetForLocals int64 // e.g., obj.(*Link).FixedFrameSize() -- extra linkage information on some architectures.
+ offsetForLocals int64 // e.g., obj.(*Link).Arch.FixedFrameSize -- extra linkage information on some architectures.
regAmounts RegAmounts
regsForTypeCache map[*types.Type]int
}
@@ -788,12 +788,12 @@
// field. For things that are not structs (or structs without padding)
// it returns a list of zeros. Example:
//
-// type small struct {
-// x uint16
-// y uint8
-// z int32
-// w int32
-// }
+// type small struct {
+// x uint16
+// y uint8
+// z int32
+// w int32
+// }
//
// For this struct we would return a list [0, 1, 0, 0], meaning that
// we have one byte of padding after the second field, and no bytes of
diff --git a/src/cmd/compile/internal/abt/avlint32.go b/src/cmd/compile/internal/abt/avlint32.go
new file mode 100644
index 0000000..00bbccf
--- /dev/null
+++ b/src/cmd/compile/internal/abt/avlint32.go
@@ -0,0 +1,849 @@
+// 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 abt
+
+import (
+ "fmt"
+ "strconv"
+)
+
+const (
+ LEAF_HEIGHT = 1
+ ZERO_HEIGHT = 0
+ NOT_KEY32 = int32(-0x80000000)
+)
+
+// T is the exported applicative balanced tree data type.
+// A T can be used as a value; updates to one copy of the value
+// do not change other copies.
+type T struct {
+ root *node32
+ size int
+}
+
+// node32 is the internal tree node data type
+type node32 struct {
+ // Standard conventions hold for left = smaller, right = larger
+ left, right *node32
+ data interface{}
+ key int32
+ height_ int8
+}
+
+func makeNode(key int32) *node32 {
+ return &node32{key: key, height_: LEAF_HEIGHT}
+}
+
+// IsSingle returns true iff t is empty.
+func (t *T) IsEmpty() bool {
+ return t.root == nil
+}
+
+// IsSingle returns true iff t is a singleton (leaf).
+func (t *T) IsSingle() bool {
+ return t.root != nil && t.root.isLeaf()
+}
+
+// VisitInOrder applies f to the key and data pairs in t,
+// with keys ordered from smallest to largest.
+func (t *T) VisitInOrder(f func(int32, interface{})) {
+ if t.root == nil {
+ return
+ }
+ t.root.visitInOrder(f)
+}
+
+func (n *node32) nilOrData() interface{} {
+ if n == nil {
+ return nil
+ }
+ return n.data
+}
+
+func (n *node32) nilOrKeyAndData() (k int32, d interface{}) {
+ if n == nil {
+ k = NOT_KEY32
+ d = nil
+ } else {
+ k = n.key
+ d = n.data
+ }
+ return
+}
+
+func (n *node32) height() int8 {
+ if n == nil {
+ return 0
+ }
+ return n.height_
+}
+
+// Find returns the data associated with x in the tree, or
+// nil if x is not in the tree.
+func (t *T) Find(x int32) interface{} {
+ return t.root.find(x).nilOrData()
+}
+
+// Insert either adds x to the tree if x was not previously
+// a key in the tree, or updates the data for x in the tree if
+// x was already a key in the tree. The previous data associated
+// with x is returned, and is nil if x was not previously a
+// key in the tree.
+func (t *T) Insert(x int32, data interface{}) interface{} {
+ if x == NOT_KEY32 {
+ panic("Cannot use sentinel value -0x80000000 as key")
+ }
+ n := t.root
+ var newroot *node32
+ var o *node32
+ if n == nil {
+ n = makeNode(x)
+ newroot = n
+ } else {
+ newroot, n, o = n.aInsert(x)
+ }
+ var r interface{}
+ if o != nil {
+ r = o.data
+ } else {
+ t.size++
+ }
+ n.data = data
+ t.root = newroot
+ return r
+}
+
+func (t *T) Copy() *T {
+ u := *t
+ return &u
+}
+
+func (t *T) Delete(x int32) interface{} {
+ n := t.root
+ if n == nil {
+ return nil
+ }
+ d, s := n.aDelete(x)
+ if d == nil {
+ return nil
+ }
+ t.root = s
+ t.size--
+ return d.data
+}
+
+func (t *T) DeleteMin() (int32, interface{}) {
+ n := t.root
+ if n == nil {
+ return NOT_KEY32, nil
+ }
+ d, s := n.aDeleteMin()
+ if d == nil {
+ return NOT_KEY32, nil
+ }
+ t.root = s
+ t.size--
+ return d.key, d.data
+}
+
+func (t *T) DeleteMax() (int32, interface{}) {
+ n := t.root
+ if n == nil {
+ return NOT_KEY32, nil
+ }
+ d, s := n.aDeleteMax()
+ if d == nil {
+ return NOT_KEY32, nil
+ }
+ t.root = s
+ t.size--
+ return d.key, d.data
+}
+
+func (t *T) Size() int {
+ return t.size
+}
+
+// Intersection returns the intersection of t and u, where the result
+// data for any common keys is given by f(t's data, u's data) -- f need
+// not be symmetric. If f returns nil, then the key and data are not
+// added to the result. If f itself is nil, then whatever value was
+// already present in the smaller set is used.
+func (t *T) Intersection(u *T, f func(x, y interface{}) interface{}) *T {
+ if t.Size() == 0 || u.Size() == 0 {
+ return &T{}
+ }
+
+ // For faster execution and less allocation, prefer t smaller, iterate over t.
+ if t.Size() <= u.Size() {
+ v := t.Copy()
+ for it := t.Iterator(); !it.Done(); {
+ k, d := it.Next()
+ e := u.Find(k)
+ if e == nil {
+ v.Delete(k)
+ continue
+ }
+ if f == nil {
+ continue
+ }
+ if c := f(d, e); c != d {
+ if c == nil {
+ v.Delete(k)
+ } else {
+ v.Insert(k, c)
+ }
+ }
+ }
+ return v
+ }
+ v := u.Copy()
+ for it := u.Iterator(); !it.Done(); {
+ k, e := it.Next()
+ d := t.Find(k)
+ if d == nil {
+ v.Delete(k)
+ continue
+ }
+ if f == nil {
+ continue
+ }
+ if c := f(d, e); c != d {
+ if c == nil {
+ v.Delete(k)
+ } else {
+ v.Insert(k, c)
+ }
+ }
+ }
+
+ return v
+}
+
+// Union returns the union of t and u, where the result data for any common keys
+// is given by f(t's data, u's data) -- f need not be symmetric. If f returns nil,
+// then the key and data are not added to the result. If f itself is nil, then
+// whatever value was already present in the larger set is used.
+func (t *T) Union(u *T, f func(x, y interface{}) interface{}) *T {
+ if t.Size() == 0 {
+ return u
+ }
+ if u.Size() == 0 {
+ return t
+ }
+
+ if t.Size() >= u.Size() {
+ v := t.Copy()
+ for it := u.Iterator(); !it.Done(); {
+ k, e := it.Next()
+ d := t.Find(k)
+ if d == nil {
+ v.Insert(k, e)
+ continue
+ }
+ if f == nil {
+ continue
+ }
+ if c := f(d, e); c != d {
+ if c == nil {
+ v.Delete(k)
+ } else {
+ v.Insert(k, c)
+ }
+ }
+ }
+ return v
+ }
+
+ v := u.Copy()
+ for it := t.Iterator(); !it.Done(); {
+ k, d := it.Next()
+ e := u.Find(k)
+ if e == nil {
+ v.Insert(k, d)
+ continue
+ }
+ if f == nil {
+ continue
+ }
+ if c := f(d, e); c != d {
+ if c == nil {
+ v.Delete(k)
+ } else {
+ v.Insert(k, c)
+ }
+ }
+ }
+ return v
+}
+
+// Difference returns the difference of t and u, subject to the result
+// of f applied to data corresponding to equal keys. If f returns nil
+// (or if f is nil) then the key+data are excluded, as usual. If f
+// returns not-nil, then that key+data pair is inserted. instead.
+func (t *T) Difference(u *T, f func(x, y interface{}) interface{}) *T {
+ if t.Size() == 0 {
+ return &T{}
+ }
+ if u.Size() == 0 {
+ return t
+ }
+ v := t.Copy()
+ for it := t.Iterator(); !it.Done(); {
+ k, d := it.Next()
+ e := u.Find(k)
+ if e != nil {
+ if f == nil {
+ v.Delete(k)
+ continue
+ }
+ c := f(d, e)
+ if c == nil {
+ v.Delete(k)
+ continue
+ }
+ if c != d {
+ v.Insert(k, c)
+ }
+ }
+ }
+ return v
+}
+
+func (t *T) Iterator() Iterator {
+ return Iterator{it: t.root.iterator()}
+}
+
+func (t *T) Equals(u *T) bool {
+ if t == u {
+ return true
+ }
+ if t.Size() != u.Size() {
+ return false
+ }
+ return t.root.equals(u.root)
+}
+
+// This doesn't build with go1.4, sigh
+// func (t *T) String() string {
+// var b strings.Builder
+// first := true
+// for it := t.Iterator(); !it.IsEmpty(); {
+// k, v := it.Next()
+// if first {
+// first = false
+// } else {
+// b.WriteString("; ")
+// }
+// b.WriteString(strconv.FormatInt(int64(k), 10))
+// b.WriteString(":")
+// b.WriteString(v.String())
+// }
+// return b.String()
+// }
+
+func (t *T) String() string {
+ var b string
+ first := true
+ for it := t.Iterator(); !it.Done(); {
+ k, v := it.Next()
+ if first {
+ first = false
+ } else {
+ b += ("; ")
+ }
+ b += (strconv.FormatInt(int64(k), 10))
+ b += (":")
+ b += fmt.Sprint(v)
+ }
+ return b
+}
+
+func (t *node32) equals(u *node32) bool {
+ if t == u {
+ return true
+ }
+ it, iu := t.iterator(), u.iterator()
+ for !it.done() && !iu.done() {
+ nt := it.next()
+ nu := iu.next()
+ if nt == nu {
+ continue
+ }
+ if nt.key != nu.key {
+ return false
+ }
+ if nt.data != nu.data {
+ return false
+ }
+ }
+ return it.done() == iu.done()
+}
+
+func (t *T) Equiv(u *T, eqv func(x, y interface{}) bool) bool {
+ if t == u {
+ return true
+ }
+ if t.Size() != u.Size() {
+ return false
+ }
+ return t.root.equiv(u.root, eqv)
+}
+
+func (t *node32) equiv(u *node32, eqv func(x, y interface{}) bool) bool {
+ if t == u {
+ return true
+ }
+ it, iu := t.iterator(), u.iterator()
+ for !it.done() && !iu.done() {
+ nt := it.next()
+ nu := iu.next()
+ if nt == nu {
+ continue
+ }
+ if nt.key != nu.key {
+ return false
+ }
+ if !eqv(nt.data, nu.data) {
+ return false
+ }
+ }
+ return it.done() == iu.done()
+}
+
+type iterator struct {
+ parents []*node32
+}
+
+type Iterator struct {
+ it iterator
+}
+
+func (it *Iterator) Next() (int32, interface{}) {
+ x := it.it.next()
+ if x == nil {
+ return NOT_KEY32, nil
+ }
+ return x.key, x.data
+}
+
+func (it *Iterator) Done() bool {
+ return len(it.it.parents) == 0
+}
+
+func (t *node32) iterator() iterator {
+ if t == nil {
+ return iterator{}
+ }
+ it := iterator{parents: make([]*node32, 0, int(t.height()))}
+ it.leftmost(t)
+ return it
+}
+
+func (it *iterator) leftmost(t *node32) {
+ for t != nil {
+ it.parents = append(it.parents, t)
+ t = t.left
+ }
+}
+
+func (it *iterator) done() bool {
+ return len(it.parents) == 0
+}
+
+func (it *iterator) next() *node32 {
+ l := len(it.parents)
+ if l == 0 {
+ return nil
+ }
+ x := it.parents[l-1] // return value
+ if x.right != nil {
+ it.leftmost(x.right)
+ return x
+ }
+ // discard visited top of parents
+ l--
+ it.parents = it.parents[:l]
+ y := x // y is known visited/returned
+ for l > 0 && y == it.parents[l-1].right {
+ y = it.parents[l-1]
+ l--
+ it.parents = it.parents[:l]
+ }
+
+ return x
+}
+
+// Min returns the minimum element of t.
+// If t is empty, then (NOT_KEY32, nil) is returned.
+func (t *T) Min() (k int32, d interface{}) {
+ return t.root.min().nilOrKeyAndData()
+}
+
+// Max returns the maximum element of t.
+// If t is empty, then (NOT_KEY32, nil) is returned.
+func (t *T) Max() (k int32, d interface{}) {
+ return t.root.max().nilOrKeyAndData()
+}
+
+// Glb returns the greatest-lower-bound-exclusive of x and the associated
+// data. If x has no glb in the tree, then (NOT_KEY32, nil) is returned.
+func (t *T) Glb(x int32) (k int32, d interface{}) {
+ return t.root.glb(x, false).nilOrKeyAndData()
+}
+
+// GlbEq returns the greatest-lower-bound-inclusive of x and the associated
+// data. If x has no glbEQ in the tree, then (NOT_KEY32, nil) is returned.
+func (t *T) GlbEq(x int32) (k int32, d interface{}) {
+ return t.root.glb(x, true).nilOrKeyAndData()
+}
+
+// Lub returns the least-upper-bound-exclusive of x and the associated
+// data. If x has no lub in the tree, then (NOT_KEY32, nil) is returned.
+func (t *T) Lub(x int32) (k int32, d interface{}) {
+ return t.root.lub(x, false).nilOrKeyAndData()
+}
+
+// LubEq returns the least-upper-bound-inclusive of x and the associated
+// data. If x has no lubEq in the tree, then (NOT_KEY32, nil) is returned.
+func (t *T) LubEq(x int32) (k int32, d interface{}) {
+ return t.root.lub(x, true).nilOrKeyAndData()
+}
+
+func (t *node32) isLeaf() bool {
+ return t.left == nil && t.right == nil && t.height_ == LEAF_HEIGHT
+}
+
+func (t *node32) visitInOrder(f func(int32, interface{})) {
+ if t.left != nil {
+ t.left.visitInOrder(f)
+ }
+ f(t.key, t.data)
+ if t.right != nil {
+ t.right.visitInOrder(f)
+ }
+}
+
+func (t *node32) find(key int32) *node32 {
+ for t != nil {
+ if key < t.key {
+ t = t.left
+ } else if key > t.key {
+ t = t.right
+ } else {
+ return t
+ }
+ }
+ return nil
+}
+
+func (t *node32) min() *node32 {
+ if t == nil {
+ return t
+ }
+ for t.left != nil {
+ t = t.left
+ }
+ return t
+}
+
+func (t *node32) max() *node32 {
+ if t == nil {
+ return t
+ }
+ for t.right != nil {
+ t = t.right
+ }
+ return t
+}
+
+func (t *node32) glb(key int32, allow_eq bool) *node32 {
+ var best *node32 = nil
+ for t != nil {
+ if key <= t.key {
+ if allow_eq && key == t.key {
+ return t
+ }
+ // t is too big, glb is to left.
+ t = t.left
+ } else {
+ // t is a lower bound, record it and seek a better one.
+ best = t
+ t = t.right
+ }
+ }
+ return best
+}
+
+func (t *node32) lub(key int32, allow_eq bool) *node32 {
+ var best *node32 = nil
+ for t != nil {
+ if key >= t.key {
+ if allow_eq && key == t.key {
+ return t
+ }
+ // t is too small, lub is to right.
+ t = t.right
+ } else {
+ // t is a upper bound, record it and seek a better one.
+ best = t
+ t = t.left
+ }
+ }
+ return best
+}
+
+func (t *node32) aInsert(x int32) (newroot, newnode, oldnode *node32) {
+ // oldnode default of nil is good, others should be assigned.
+ if x == t.key {
+ oldnode = t
+ newt := *t
+ newnode = &newt
+ newroot = newnode
+ return
+ }
+ if x < t.key {
+ if t.left == nil {
+ t = t.copy()
+ n := makeNode(x)
+ t.left = n
+ newnode = n
+ newroot = t
+ t.height_ = 2 // was balanced w/ 0, sibling is height 0 or 1
+ return
+ }
+ var new_l *node32
+ new_l, newnode, oldnode = t.left.aInsert(x)
+ t = t.copy()
+ t.left = new_l
+ if new_l.height() > 1+t.right.height() {
+ newroot = t.aLeftIsHigh(newnode)
+ } else {
+ t.height_ = 1 + max(t.left.height(), t.right.height())
+ newroot = t
+ }
+ } else { // x > t.key
+ if t.right == nil {
+ t = t.copy()
+ n := makeNode(x)
+ t.right = n
+ newnode = n
+ newroot = t
+ t.height_ = 2 // was balanced w/ 0, sibling is height 0 or 1
+ return
+ }
+ var new_r *node32
+ new_r, newnode, oldnode = t.right.aInsert(x)
+ t = t.copy()
+ t.right = new_r
+ if new_r.height() > 1+t.left.height() {
+ newroot = t.aRightIsHigh(newnode)
+ } else {
+ t.height_ = 1 + max(t.left.height(), t.right.height())
+ newroot = t
+ }
+ }
+ return
+}
+
+func (t *node32) aDelete(key int32) (deleted, newSubTree *node32) {
+ if t == nil {
+ return nil, nil
+ }
+
+ if key < t.key {
+ oh := t.left.height()
+ d, tleft := t.left.aDelete(key)
+ if tleft == t.left {
+ return d, t
+ }
+ return d, t.copy().aRebalanceAfterLeftDeletion(oh, tleft)
+ } else if key > t.key {
+ oh := t.right.height()
+ d, tright := t.right.aDelete(key)
+ if tright == t.right {
+ return d, t
+ }
+ return d, t.copy().aRebalanceAfterRightDeletion(oh, tright)
+ }
+
+ if t.height() == LEAF_HEIGHT {
+ return t, nil
+ }
+
+ // Interior delete by removing left.Max or right.Min,
+ // then swapping contents
+ if t.left.height() > t.right.height() {
+ oh := t.left.height()
+ d, tleft := t.left.aDeleteMax()
+ r := t
+ t = t.copy()
+ t.data, t.key = d.data, d.key
+ return r, t.aRebalanceAfterLeftDeletion(oh, tleft)
+ }
+
+ oh := t.right.height()
+ d, tright := t.right.aDeleteMin()
+ r := t
+ t = t.copy()
+ t.data, t.key = d.data, d.key
+ return r, t.aRebalanceAfterRightDeletion(oh, tright)
+}
+
+func (t *node32) aDeleteMin() (deleted, newSubTree *node32) {
+ if t == nil {
+ return nil, nil
+ }
+ if t.left == nil { // leaf or left-most
+ return t, t.right
+ }
+ oh := t.left.height()
+ d, tleft := t.left.aDeleteMin()
+ if tleft == t.left {
+ return d, t
+ }
+ return d, t.copy().aRebalanceAfterLeftDeletion(oh, tleft)
+}
+
+func (t *node32) aDeleteMax() (deleted, newSubTree *node32) {
+ if t == nil {
+ return nil, nil
+ }
+
+ if t.right == nil { // leaf or right-most
+ return t, t.left
+ }
+
+ oh := t.right.height()
+ d, tright := t.right.aDeleteMax()
+ if tright == t.right {
+ return d, t
+ }
+ return d, t.copy().aRebalanceAfterRightDeletion(oh, tright)
+}
+
+func (t *node32) aRebalanceAfterLeftDeletion(oldLeftHeight int8, tleft *node32) *node32 {
+ t.left = tleft
+
+ if oldLeftHeight == tleft.height() || oldLeftHeight == t.right.height() {
+ // this node is still balanced and its height is unchanged
+ return t
+ }
+
+ if oldLeftHeight > t.right.height() {
+ // left was larger
+ t.height_--
+ return t
+ }
+
+ // left height fell by 1 and it was already less than right height
+ t.right = t.right.copy()
+ return t.aRightIsHigh(nil)
+}
+
+func (t *node32) aRebalanceAfterRightDeletion(oldRightHeight int8, tright *node32) *node32 {
+ t.right = tright
+
+ if oldRightHeight == tright.height() || oldRightHeight == t.left.height() {
+ // this node is still balanced and its height is unchanged
+ return t
+ }
+
+ if oldRightHeight > t.left.height() {
+ // left was larger
+ t.height_--
+ return t
+ }
+
+ // right height fell by 1 and it was already less than left height
+ t.left = t.left.copy()
+ return t.aLeftIsHigh(nil)
+}
+
+// aRightIsHigh does rotations necessary to fix a high right child