summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmd/gc/esc.c6
-rw-r--r--test/escape2.go6
2 files changed, 11 insertions, 1 deletions
diff --git a/src/cmd/gc/esc.c b/src/cmd/gc/esc.c
index 3a28a8ba7..8664dc606 100644
--- a/src/cmd/gc/esc.c
+++ b/src/cmd/gc/esc.c
@@ -505,7 +505,7 @@ esccall(Node *n)
}
}
- if(fn && fn->op == ONAME && fn->class == PFUNC && fn->ntype) {
+ if(fn && fn->op == ONAME && fn->class == PFUNC && fn->defn && fn->defn->nbody && fn->ntype) {
// Local function. Incorporate into flow graph.
// Receiver.
@@ -696,6 +696,10 @@ esctag(Node *func)
{
Node *savefn;
NodeList *ll;
+
+ // External functions must be assumed unsafe.
+ if(func->nbody == nil)
+ return;
savefn = curfn;
curfn = func;
diff --git a/test/escape2.go b/test/escape2.go
index 24a88f751..0b78624b6 100644
--- a/test/escape2.go
+++ b/test/escape2.go
@@ -774,3 +774,9 @@ func foo118(unknown func(*int)) { // ERROR "unknown does not escape"
x := 1 // ERROR "moved to heap: NAME-x"
unknown(&x) // ERROR "&x escapes to heap"
}
+
+func external(*int)
+
+func foo119(x *int) { // ERROR "leaking param: NAME-x"
+ external(x)
+}