go/ssa: make Builtin capable of representing non-spec-defined intrinsics.
Also, define ssa:wrapnilchk intrinsic to check and gracefully
fail when a T method is dynamically invoked via a nil *T receiver.
+ Test.
A follow-up CL will add another intrinsic, ssa:memclr.
+ minor cleanups.
LGTM=gri
R=gri
CC=golang-codereviews
https://golang.org/cl/101170044
diff --git a/go/pointer/gen.go b/go/pointer/gen.go
index 850591f..bcb7448 100644
--- a/go/pointer/gen.go
+++ b/go/pointer/gen.go
@@ -531,7 +531,7 @@
// genBuiltinCall generates contraints for a call to a built-in.
func (a *analysis) genBuiltinCall(instr ssa.CallInstruction, cgn *cgnode) {
call := instr.Common()
- switch call.Value.(*ssa.Builtin).Object().Name() {
+ switch call.Value.(*ssa.Builtin).Name() {
case "append":
// Safe cast: append cannot appear in a go or defer statement.
a.genAppend(instr.(*ssa.Call), cgn)
@@ -553,6 +553,9 @@
// to its arg, so make sure we create nodes for it.
a.valueNode(call.Args[0])
+ case "ssa:wrapnilchk":
+ a.copy(a.valueNode(instr.Value()), a.valueNode(call.Args[0]), 1)
+
default:
// No-ops: close len cap real imag complex print println delete.
}