cmd/compile: add write barrier to type switch

Type switches need write barriers if the written-to
variable is heap allocated.

For the added needwritebarrier call, the right arg doesn't
really matter, I just pass something that will never disqualify
the write barrier.  The left arg is the one that matters.

Fixes #14306

Change-Id: Ic2754167cce062064ea2eeac2944ea4f77cc9c3b
Reviewed-on: https://go-review.googlesource.com/19481
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/test/writebarrier.go b/test/writebarrier.go
index 9b741a6..dcd20a0 100644
--- a/test/writebarrier.go
+++ b/test/writebarrier.go
@@ -144,3 +144,17 @@
 func f16(x []T8, y T8) []T8 {
 	return append(x, y) // ERROR "write barrier"
 }
+
+func t1(i interface{}) **int {
+	// From issue 14306, make sure we have write barriers in a type switch
+	// where the assigned variable escapes.
+	switch x := i.(type) { // ERROR "write barrier"
+	case *int:
+		return &x
+	}
+	switch y := i.(type) { // no write barrier here
+	case **int:
+		return y
+	}
+	return nil
+}