• Alberto Donizetti's avatar
    cmd/compile: fix bogus "fallthrough statement out of place" · 375092bd
    Alberto Donizetti authored
    When processing a fallthrough, the casebody function in swt.go
    checks that the last statement has indeed Op == OXFALL (not-processed
    fallthrough) before setting it to OFALL (processed fallthrough).
    
    Unfortunately, sometimes the fallthrough statement won't be in the
    last node. For example, in
    
    case 0:
    	 return func() int {return 1}()
    	 fallthrough
    
    the compiler generates
    
    autotmp_0 = (func literal)(); return autotmp_0; fallthrough; <node VARKILL>
    
    with an OVARKILL node in the last position. casebody will find that
    last.Op != OXFALL, won't mark the fallthrough as processed, and the
    fallthrough line will cause a "fallthrough statement out of place" error.
    
    To fix this, we change casebody so that it searches for the fallthrough
    statement backwards in the statements list, without assuming that it'll
    be in the last position.
    
    Fixes #13262
    
    Change-Id: I366c6caa7fd7442d365bd7a08cc66a552212d9b2
    Reviewed-on: https://go-review.googlesource.com/22921
    Run-TryBot: Quentin Smith <quentin@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarQuentin Smith <quentin@golang.org>
    375092bd
walk.go 93.7 KB