From 206fd7886b717d49758de9c125c1fd3575d74ef6 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Fri, 21 Sep 2018 21:03:35 -0700 Subject: [PATCH] spec: be more precise about the moment deferred functions are executed Fixes #27802. Change-Id: I7ea9f7279300a55b0cb851893edc591a6f84e324 Reviewed-on: https://go-review.googlesource.com/136758 Reviewed-by: Rob Pike Reviewed-by: Ian Lance Taylor --- doc/go_spec.html | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/doc/go_spec.html b/doc/go_spec.html index 57bb3b53f5..32336e86f8 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,6 +1,6 @@ @@ -5546,7 +5546,10 @@ executes, the function value and parameters to the call are and saved anew but the actual function is not invoked. Instead, deferred functions are invoked immediately before the surrounding function returns, in the reverse order -they were deferred. +they were deferred. That is, if the surrounding function +returns through an explicit return statement, +deferred functions are executed after any result parameters are set +by that return statement but before the function returns to its caller. If a deferred function value evaluates to nil, execution panics when the function is invoked, not when the "defer" statement is executed. @@ -5572,12 +5575,13 @@ for i := 0; i <= 3; i++ { defer fmt.Print(i) } -// f returns 1 +// f returns 42 func f() (result int) { defer func() { - result++ + // result is accessed after it was set to 6 by the return statement + result *= 7 }() - return 0 + return 6 }