Commit 22149e37 by Ian Lance Taylor

compiler: check for nil receiver in value method

    
    We already dereference the pointer to copy the value, but if the
    method does not use the value then the pointer dereference may be
    optimized away.  Do an explicit nil check so that we get the panic
    that is required.
    
    Fixes golang/go#19806
    
    Reviewed-on: https://go-review.googlesource.com/91275

	* go.go-torture/execute/printnil.go: New test.

From-SVN: r257280
parent ee249a76
65eaa9003db4effc9c5ffe9c955e9534ba5d7d15 71758f9ca1804743afe178f0e2fca489e0217474
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -5610,7 +5610,7 @@ Function::build(Gogo* gogo, Named_object* named_function) ...@@ -5610,7 +5610,7 @@ Function::build(Gogo* gogo, Named_object* named_function)
Expression::make_var_reference(parm_no, loc); Expression::make_var_reference(parm_no, loc);
parm_ref = parm_ref =
Expression::make_dereference(parm_ref, Expression::make_dereference(parm_ref,
Expression::NIL_CHECK_DEFAULT, Expression::NIL_CHECK_NEEDED,
loc); loc);
if ((*p)->var_value()->is_in_heap()) if ((*p)->var_value()->is_in_heap())
parm_ref = Expression::make_heap_expression(parm_ref, loc); parm_ref = Expression::make_heap_expression(parm_ref, loc);
......
// printnil checks that fmt correctly handles a nil pointer receiver
// for a value method at all optimization levels.
package main
import "fmt"
type MyType struct {
val int
}
func (t MyType) String() string {
return "foobar"
}
func main() {
if got := fmt.Sprintf("%s", (*MyType)(nil)); got != "<nil>" {
panic(got)
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment