d: Fix ICE in get_frame_for_symbol
authorIain Buclaw <ibuclaw@gdcproject.org>
Sat, 9 Mar 2019 19:29:29 +0000 (19:29 +0000)
committerIain Buclaw <ibuclaw@gcc.gnu.org>
Sat, 9 Mar 2019 19:29:29 +0000 (19:29 +0000)
When generating code for a non-nested delegate literal, there is no
context pointer required to pass to the function.

2019-03-09  Iain Buclaw  <ibuclaw@gdcproject.org>

gcc/d/
PR d/89041
* d-codegen.cc (get_frame_for_symbol): Delegate literals defined in
global scope don't have a frame pointer.

gcc/testsuite/
PR d/89041
* gdc.dg/pr89041.d: New test.

From-SVN: r269533

gcc/d/ChangeLog
gcc/d/d-codegen.cc
gcc/testsuite/ChangeLog
gcc/testsuite/gdc.dg/pr89041.d [new file with mode: 0644]

index 305b22e793d900a5ed6d92d6087934f1ce86b86a..4d9fb99a8d8d743b58a23deeb8030332c10e93e5 100644 (file)
@@ -1,3 +1,9 @@
+2019-03-09  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+       PR d/89041
+       * d-codegen.cc (get_frame_for_symbol): Delegate literals defined in
+       global scope don't have a frame pointer.
+
 2019-03-01  Iain Buclaw  <ibuclaw@gdcproject.org>
 
        * d-builtins.cc (d_init_versions): Add CppRuntime_Gcc as predefined
index 58c8257c63c508725d24e90dd961f74c0e64db2f..e8233b43c67198a10e8c7c15e07e6b23cb7a951c 100644 (file)
@@ -2172,7 +2172,16 @@ get_frame_for_symbol (Dsymbol *sym)
       fdparent = (FuncDeclaration *) sym;
     }
 
-  gcc_assert (fdparent != NULL);
+  /* Not a nested function, there is no frame pointer to pass.  */
+  if (fdparent == NULL)
+    {
+      /* Only delegate literals report as being nested, even if they are in
+        global scope.  */
+      gcc_assert (fd && fd->isFuncLiteralDeclaration ());
+      return null_pointer_node;
+    }
+
+  gcc_assert (thisfd != NULL);
 
   if (thisfd != fdparent)
     {
@@ -2180,8 +2189,8 @@ get_frame_for_symbol (Dsymbol *sym)
       if (!thisfd->vthis)
        {
          error_at (make_location_t (sym->loc),
-                   "is a nested function and cannot be accessed from %qs",
-                   thisfd->toChars ());
+                   "%qs is a nested function and cannot be accessed from %qs",
+                   fd->toPrettyChars (), thisfd->toPrettyChars ());
          return null_pointer_node;
        }
 
index b1714e4410959b349aaea94ea36be85811fe5611..cb4bf77efefe1440bc2d3e6d32701d673ae02310 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-09  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+       PR d/89041
+       * gdc.dg/pr89041.d: New test.
+
 2019-03-09  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/71544
diff --git a/gcc/testsuite/gdc.dg/pr89041.d b/gcc/testsuite/gdc.dg/pr89041.d
new file mode 100644 (file)
index 0000000..b62c2db
--- /dev/null
@@ -0,0 +1,13 @@
+// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89041
+module pr89041;
+
+enum dg = delegate {};
+
+void fn()
+{
+    auto var = dg;
+
+    auto inner() {
+        return dg();
+    }
+}