]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: always nil check before interface call
authorKeith Randall <khr@golang.org>
Tue, 14 Nov 2017 03:03:31 +0000 (19:03 -0800)
committerKeith Randall <khr@golang.org>
Tue, 14 Nov 2017 05:39:45 +0000 (05:39 +0000)
Fixes #22703

The fix was already done by Cherry for defer/go of an interface call (CL 23820).
We just need to do it everywhere.

Change-Id: I0115d22e443931fe1bcce44c93c4d0770b5fd268
Reviewed-on: https://go-review.googlesource.com/77450
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/compile/internal/gc/asm_test.go
src/cmd/compile/internal/gc/ssa.go

index 78c6c5e2b763bb47f715074309e4b1c1b82497a6..a7b817da257e0fbd75f7e51086eba5ace7d61096 100644 (file)
@@ -1221,6 +1221,537 @@ var linuxAMD64Tests = []*asmTest{
                `,
                neg: []string{"memmove"},
        },
+       // Nil checks before calling interface methods
+       {
+               fn: `
+               type I interface {
+                       foo000()
+                       foo001()
+                       foo002()
+                       foo003()
+                       foo004()
+                       foo005()
+                       foo006()
+                       foo007()
+                       foo008()
+                       foo009()
+                       foo010()
+                       foo011()
+                       foo012()
+                       foo013()
+                       foo014()
+                       foo015()
+                       foo016()
+                       foo017()
+                       foo018()
+                       foo019()
+                       foo020()
+                       foo021()
+                       foo022()
+                       foo023()
+                       foo024()
+                       foo025()
+                       foo026()
+                       foo027()
+                       foo028()
+                       foo029()
+                       foo030()
+                       foo031()
+                       foo032()
+                       foo033()
+                       foo034()
+                       foo035()
+                       foo036()
+                       foo037()
+                       foo038()
+                       foo039()
+                       foo040()
+                       foo041()
+                       foo042()
+                       foo043()
+                       foo044()
+                       foo045()
+                       foo046()
+                       foo047()
+                       foo048()
+                       foo049()
+                       foo050()
+                       foo051()
+                       foo052()
+                       foo053()
+                       foo054()
+                       foo055()
+                       foo056()
+                       foo057()
+                       foo058()
+                       foo059()
+                       foo060()
+                       foo061()
+                       foo062()
+                       foo063()
+                       foo064()
+                       foo065()
+                       foo066()
+                       foo067()
+                       foo068()
+                       foo069()
+                       foo070()
+                       foo071()
+                       foo072()
+                       foo073()
+                       foo074()
+                       foo075()
+                       foo076()
+                       foo077()
+                       foo078()
+                       foo079()
+                       foo080()
+                       foo081()
+                       foo082()
+                       foo083()
+                       foo084()
+                       foo085()
+                       foo086()
+                       foo087()
+                       foo088()
+                       foo089()
+                       foo090()
+                       foo091()
+                       foo092()
+                       foo093()
+                       foo094()
+                       foo095()
+                       foo096()
+                       foo097()
+                       foo098()
+                       foo099()
+                       foo100()
+                       foo101()
+                       foo102()
+                       foo103()
+                       foo104()
+                       foo105()
+                       foo106()
+                       foo107()
+                       foo108()
+                       foo109()
+                       foo110()
+                       foo111()
+                       foo112()
+                       foo113()
+                       foo114()
+                       foo115()
+                       foo116()
+                       foo117()
+                       foo118()
+                       foo119()
+                       foo120()
+                       foo121()
+                       foo122()
+                       foo123()
+                       foo124()
+                       foo125()
+                       foo126()
+                       foo127()
+                       foo128()
+                       foo129()
+                       foo130()
+                       foo131()
+                       foo132()
+                       foo133()
+                       foo134()
+                       foo135()
+                       foo136()
+                       foo137()
+                       foo138()
+                       foo139()
+                       foo140()
+                       foo141()
+                       foo142()
+                       foo143()
+                       foo144()
+                       foo145()
+                       foo146()
+                       foo147()
+                       foo148()
+                       foo149()
+                       foo150()
+                       foo151()
+                       foo152()
+                       foo153()
+                       foo154()
+                       foo155()
+                       foo156()
+                       foo157()
+                       foo158()
+                       foo159()
+                       foo160()
+                       foo161()
+                       foo162()
+                       foo163()
+                       foo164()
+                       foo165()
+                       foo166()
+                       foo167()
+                       foo168()
+                       foo169()
+                       foo170()
+                       foo171()
+                       foo172()
+                       foo173()
+                       foo174()
+                       foo175()
+                       foo176()
+                       foo177()
+                       foo178()
+                       foo179()
+                       foo180()
+                       foo181()
+                       foo182()
+                       foo183()
+                       foo184()
+                       foo185()
+                       foo186()
+                       foo187()
+                       foo188()
+                       foo189()
+                       foo190()
+                       foo191()
+                       foo192()
+                       foo193()
+                       foo194()
+                       foo195()
+                       foo196()
+                       foo197()
+                       foo198()
+                       foo199()
+                       foo200()
+                       foo201()
+                       foo202()
+                       foo203()
+                       foo204()
+                       foo205()
+                       foo206()
+                       foo207()
+                       foo208()
+                       foo209()
+                       foo210()
+                       foo211()
+                       foo212()
+                       foo213()
+                       foo214()
+                       foo215()
+                       foo216()
+                       foo217()
+                       foo218()
+                       foo219()
+                       foo220()
+                       foo221()
+                       foo222()
+                       foo223()
+                       foo224()
+                       foo225()
+                       foo226()
+                       foo227()
+                       foo228()
+                       foo229()
+                       foo230()
+                       foo231()
+                       foo232()
+                       foo233()
+                       foo234()
+                       foo235()
+                       foo236()
+                       foo237()
+                       foo238()
+                       foo239()
+                       foo240()
+                       foo241()
+                       foo242()
+                       foo243()
+                       foo244()
+                       foo245()
+                       foo246()
+                       foo247()
+                       foo248()
+                       foo249()
+                       foo250()
+                       foo251()
+                       foo252()
+                       foo253()
+                       foo254()
+                       foo255()
+                       foo256()
+                       foo257()
+                       foo258()
+                       foo259()
+                       foo260()
+                       foo261()
+                       foo262()
+                       foo263()
+                       foo264()
+                       foo265()
+                       foo266()
+                       foo267()
+                       foo268()
+                       foo269()
+                       foo270()
+                       foo271()
+                       foo272()
+                       foo273()
+                       foo274()
+                       foo275()
+                       foo276()
+                       foo277()
+                       foo278()
+                       foo279()
+                       foo280()
+                       foo281()
+                       foo282()
+                       foo283()
+                       foo284()
+                       foo285()
+                       foo286()
+                       foo287()
+                       foo288()
+                       foo289()
+                       foo290()
+                       foo291()
+                       foo292()
+                       foo293()
+                       foo294()
+                       foo295()
+                       foo296()
+                       foo297()
+                       foo298()
+                       foo299()
+                       foo300()
+                       foo301()
+                       foo302()
+                       foo303()
+                       foo304()
+                       foo305()
+                       foo306()
+                       foo307()
+                       foo308()
+                       foo309()
+                       foo310()
+                       foo311()
+                       foo312()
+                       foo313()
+                       foo314()
+                       foo315()
+                       foo316()
+                       foo317()
+                       foo318()
+                       foo319()
+                       foo320()
+                       foo321()
+                       foo322()
+                       foo323()
+                       foo324()
+                       foo325()
+                       foo326()
+                       foo327()
+                       foo328()
+                       foo329()
+                       foo330()
+                       foo331()
+                       foo332()
+                       foo333()
+                       foo334()
+                       foo335()
+                       foo336()
+                       foo337()
+                       foo338()
+                       foo339()
+                       foo340()
+                       foo341()
+                       foo342()
+                       foo343()
+                       foo344()
+                       foo345()
+                       foo346()
+                       foo347()
+                       foo348()
+                       foo349()
+                       foo350()
+                       foo351()
+                       foo352()
+                       foo353()
+                       foo354()
+                       foo355()
+                       foo356()
+                       foo357()
+                       foo358()
+                       foo359()
+                       foo360()
+                       foo361()
+                       foo362()
+                       foo363()
+                       foo364()
+                       foo365()
+                       foo366()
+                       foo367()
+                       foo368()
+                       foo369()
+                       foo370()
+                       foo371()
+                       foo372()
+                       foo373()
+                       foo374()
+                       foo375()
+                       foo376()
+                       foo377()
+                       foo378()
+                       foo379()
+                       foo380()
+                       foo381()
+                       foo382()
+                       foo383()
+                       foo384()
+                       foo385()
+                       foo386()
+                       foo387()
+                       foo388()
+                       foo389()
+                       foo390()
+                       foo391()
+                       foo392()
+                       foo393()
+                       foo394()
+                       foo395()
+                       foo396()
+                       foo397()
+                       foo398()
+                       foo399()
+                       foo400()
+                       foo401()
+                       foo402()
+                       foo403()
+                       foo404()
+                       foo405()
+                       foo406()
+                       foo407()
+                       foo408()
+                       foo409()
+                       foo410()
+                       foo411()
+                       foo412()
+                       foo413()
+                       foo414()
+                       foo415()
+                       foo416()
+                       foo417()
+                       foo418()
+                       foo419()
+                       foo420()
+                       foo421()
+                       foo422()
+                       foo423()
+                       foo424()
+                       foo425()
+                       foo426()
+                       foo427()
+                       foo428()
+                       foo429()
+                       foo430()
+                       foo431()
+                       foo432()
+                       foo433()
+                       foo434()
+                       foo435()
+                       foo436()
+                       foo437()
+                       foo438()
+                       foo439()
+                       foo440()
+                       foo441()
+                       foo442()
+                       foo443()
+                       foo444()
+                       foo445()
+                       foo446()
+                       foo447()
+                       foo448()
+                       foo449()
+                       foo450()
+                       foo451()
+                       foo452()
+                       foo453()
+                       foo454()
+                       foo455()
+                       foo456()
+                       foo457()
+                       foo458()
+                       foo459()
+                       foo460()
+                       foo461()
+                       foo462()
+                       foo463()
+                       foo464()
+                       foo465()
+                       foo466()
+                       foo467()
+                       foo468()
+                       foo469()
+                       foo470()
+                       foo471()
+                       foo472()
+                       foo473()
+                       foo474()
+                       foo475()
+                       foo476()
+                       foo477()
+                       foo478()
+                       foo479()
+                       foo480()
+                       foo481()
+                       foo482()
+                       foo483()
+                       foo484()
+                       foo485()
+                       foo486()
+                       foo487()
+                       foo488()
+                       foo489()
+                       foo490()
+                       foo491()
+                       foo492()
+                       foo493()
+                       foo494()
+                       foo495()
+                       foo496()
+                       foo497()
+                       foo498()
+                       foo499()
+                       foo500()
+                       foo501()
+                       foo502()
+                       foo503()
+                       foo504()
+                       foo505()
+                       foo506()
+                       foo507()
+                       foo508()
+                       foo509()
+                       foo510()
+                       foo511()
+               }
+               func $(i I) {
+                       i.foo511()
+               }
+               `,
+               pos: []string{"TESTB"},
+       },
+       {
+               fn: `
+               func $(i I) {
+                       i.foo001()
+               }
+               `,
+               neg: []string{"TESTB"},
+       },
 }
 
 var linux386Tests = []*asmTest{
index a99a20a116ffeeb75db27a87098c3b5e9b851c03..254cf63c1c0bd715ef9697ca836f67c837334295 100644 (file)
@@ -3258,9 +3258,7 @@ func (s *state) call(n *Node, k callKind) *ssa.Value {
                }
                i := s.expr(fn.Left)
                itab := s.newValue1(ssa.OpITab, types.Types[TUINTPTR], i)
-               if k != callNormal {
-                       s.nilCheck(itab)
-               }
+               s.nilCheck(itab)
                itabidx := fn.Xoffset + 2*int64(Widthptr) + 8 // offset of fun field in runtime.itab
                itab = s.newValue1I(ssa.OpOffPtr, s.f.Config.Types.UintptrPtr, itabidx, itab)
                if k == callNormal {