ptr := s.newValue1(ssa.OpStringPtr, s.f.Config.Types.BytePtr, right)
s.vars[&memVar] = s.newValue3A(ssa.OpStore, types.TypeMem, s.f.Config.Types.BytePtr, left, ptr, s.mem())
case t.IsSlice():
- ptr := s.newValue1(ssa.OpSlicePtr, s.f.Config.Types.BytePtr, right)
- s.vars[&memVar] = s.newValue3A(ssa.OpStore, types.TypeMem, s.f.Config.Types.BytePtr, left, ptr, s.mem())
+ elType := types.NewPtr(t.Elem())
+ ptr := s.newValue1(ssa.OpSlicePtr, elType, right)
+ s.vars[&memVar] = s.newValue3A(ssa.OpStore, types.TypeMem, elType, left, ptr, s.mem())
case t.IsInterface():
// itab field is treated as a scalar.
idata := s.newValue1(ssa.OpIData, s.f.Config.Types.BytePtr, right)
type t1 struct {
x *nih
+ s []nih
y [1024]byte // Prevent write decomposition
}
type t2 struct {
x *ih
+ s []ih
y [1024]byte
}
func f() {
// Test direct writes
- v1.x = nil // no barrier
- v2.x = nil // ERROR "write barrier"
+ v1.x = nil // no barrier
+ v2.x = nil // ERROR "write barrier"
+ v1.s = []nih(nil) // no barrier
+ v2.s = []ih(nil) // ERROR "write barrier"
}
func g() {