cmd/compile: prevent pointer shaping of array pointer shape types#78661
cmd/compile: prevent pointer shaping of array pointer shape types#78661alexandre-daubois wants to merge 1 commit intogolang:masterfrom
Conversation
|
This PR (HEAD: 1ec8441) has been imported to Gerrit for code review. Please visit Gerrit at https://go-review.googlesource.com/c/go/+/765820. Important tips:
|
|
Message from Gopher Robot: Patch Set 1: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/765820. |
|
Message from Alexandre Daubois: Patch Set 1: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/765820. |
|
Message from Cuong Manh Le: Patch Set 2: Hold+1 (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/765820. |
CL 704095 added an exception in shapify to prevent pointer shaping of `*[]go.shape.T`, which would lose the original type by converting it to `*go.shape.uint8`. However, there is another edge case when the type argument is itself already a shape type (e.g., go.shape.*[1]uint8). This happens when a shaped pointer type from an outer generic function is used to instantiate an inner generic function with a basic interface constraint. In this case, pointer shaping converts `go.shape.*[1]uint8` to `go.shape.*uint8`, losing the array element type. Subsequent slice operations then fail with "bad ptr to array in slice" because uint8 is not an array type. This commit adds an exception to skip pointer shaping when the type argument is a pointer shape type whose element is an array, preserving the array type information needed for slice operations. Fixes golang#78297
1ec8441 to
fa4dada
Compare
|
Message from Alexandre Daubois: Patch Set 2: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/765820. |
|
This PR (HEAD: fa4dada) has been imported to Gerrit for code review. Please visit Gerrit at https://go-review.googlesource.com/c/go/+/765820. Important tips:
|
CL 704095 added an exception in shapify to prevent pointer shaping of
*[]go.shape.T, which would lose the original type by converting it to*go.shape.uint8.However, there is another edge case when the type argument is itself
already a shape type (e.g., go.shape.*[1]uint8). This happens when a
shaped pointer type from an outer generic function is used to
instantiate an inner generic function with a basic interface constraint.
In this case, pointer shaping converts
go.shape.*[1]uint8togo.shape.*uint8, losing the array element type. Subsequent sliceoperations then fail with "bad ptr to array in slice" because uint8 is
not an array type.
This commit adds an exception to skip pointer shaping when the type
argument is a pointer shape type whose element is an array, preserving
the array type information needed for slice operations.
Fixes #78297