// run // Copyright 2018 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. // Loads of 8 byte go.strings cannot use DS relocation // in case the alignment is not a multiple of 4. package main import ( "fmt" ) type Level string // The following are all go.strings. A link time error can // occur if an 8 byte load is used to load a go.string that is // not aligned to 4 bytes due to the type of relocation that // is generated for the instruction. A fix was made to avoid // generating an instruction with DS relocation for go.strings // since their alignment is not known until link time. // This problem only affects go.string since other types have // correct alignment. const ( LevelBad Level = "badvals" LevelNone Level = "No" LevelMetadata Level = "Metadata" LevelRequest Level = "Request" LevelRequestResponse Level = "RequestResponse" ) func ordLevel(l Level) int { switch l { case LevelMetadata: return 1 case LevelRequest: return 2 case LevelRequestResponse: return 3 default: return 0 } } //go:noinline func test(l Level) { if ordLevel(l) < ordLevel(LevelMetadata) { fmt.Printf("OK\n") } } func main() { test(LevelMetadata) }