-
Notifications
You must be signed in to change notification settings - Fork 17.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[release-branch.go1.14] cmd/compile: remove check that Zero's arg has…
… the correct base type It doesn't have to. The type in the aux field is authoritative. There are cases involving casting from interface{} where pointers have a placeholder pointer type (because the type is not known when the IData op is generated). The check was introduced in CL 13447. Fixes #39849 Change-Id: Id77a57577806a271aeebd20bea5d92d08ee7aa6b Reviewed-on: https://go-review.googlesource.com/c/go/+/239817 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com> (cherry picked from commit 3b2f67a) Reviewed-on: https://go-review.googlesource.com/c/go/+/239997 Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>
- Loading branch information
Showing
2 changed files
with
29 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
// compile | ||
|
||
// Copyright 2020 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
package p | ||
|
||
type T struct { // big enough to be an unSSAable type | ||
a, b, c, d, e, f int | ||
} | ||
|
||
func f(x interface{}, p *int) { | ||
_ = *p // trigger nil check here, removing it from below | ||
switch x := x.(type) { | ||
case *T: | ||
// Zero twice, so one of them will be removed by the deadstore pass | ||
*x = T{} | ||
*p = 0 // store op to prevent Zero ops from being optimized by the earlier opt pass rewrite rules | ||
*x = T{} | ||
} | ||
} |