This patch to the Go frontend by Than McIntosh adds the "no nil check needed" annotation to the dereference operations created in Parse::enclosing_var_reference (this is safe since the closure object is under control of the compiler, and pointer fields in it will always be non-nil). Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 255347) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -338f7434175bb71f3c8905e9ad7f480aec3afee6 +297cf346f2400274946650ab9ecd039427fc986b The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: gcc/go/gofrontend/parse.cc =================================================================== --- gcc/go/gofrontend/parse.cc (revision 255340) +++ gcc/go/gofrontend/parse.cc (working copy) @@ -2747,7 +2747,7 @@ Parse::enclosing_var_reference(Named_obj location); closure_ref = Expression::make_dereference(closure_ref, - Expression::NIL_CHECK_DEFAULT, + Expression::NIL_CHECK_NOT_NEEDED, location); // The closure structure holds pointers to the variables, so we need @@ -2755,7 +2755,8 @@ Parse::enclosing_var_reference(Named_obj Expression* e = Expression::make_field_reference(closure_ref, ins.first->index(), location); - e = Expression::make_dereference(e, Expression::NIL_CHECK_DEFAULT, location); + e = Expression::make_dereference(e, Expression::NIL_CHECK_NOT_NEEDED, + location); return Expression::make_enclosing_var_reference(e, var, location); }