diff mbox

Go patch committed: Don't allow builtin function values that are not called

Message ID CAOyqgcVtE4oqPmBB_fuvzihHwvHgZL+=fA6-qrgD6-hQVfVivQ@mail.gmail.com
State New
Headers show

Commit Message

Ian Lance Taylor July 31, 2015, 5:52 p.m. UTC
The Go spec says that builtin functions may not be referenced other
than being called.  This patch from Chris Manghane implements that
restriction in the Go frontend.  This fixes
https://golang.org/issue/11570 .  Bootstrapped and ran Go testsuite on
x86_64-unknown-linux-gnu.  Committed to mainline.

Ian
diff mbox

Patch

Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE	(revision 226366)
+++ gcc/go/gofrontend/MERGE	(working copy)
@@ -1,4 +1,4 @@ 
-9931f2c150e2da4b7d468db332823d8ef4fb8c34
+4c676d965c19b9c5d5e5049d0f8070502e9c27b0
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: gcc/go/gofrontend/gogo.cc
===================================================================
--- gcc/go/gofrontend/gogo.cc	(revision 226009)
+++ gcc/go/gofrontend/gogo.cc	(working copy)
@@ -3154,6 +3154,28 @@  Check_types_traverse::variable(Named_obj
 		     reason.c_str());
 	  var->clear_init();
 	}
+      else if (init != NULL
+               && init->func_expression() != NULL)
+        {
+          Named_object* no = init->func_expression()->named_object();
+          Function_type* fntype;
+          if (no->is_function())
+            fntype = no->func_value()->type();
+          else if (no->is_function_declaration())
+            fntype = no->func_declaration_value()->type();
+          else
+            go_unreachable();
+
+          // Builtin functions cannot be used as function values for variable
+          // initialization.
+          if (fntype->is_builtin())
+            {
+              error_at(init->location(),
+                       "invalid use of special builtin function %qs; "
+                       "must be called",
+                       no->message_name().c_str());
+            }
+        }
       else if (!var->is_used()
 	       && !var->is_global()
 	       && !var->is_parameter()