PR c++/79050 - ICE with undeduced auto and LTO
authorJason Merrill <jason@redhat.com>
Thu, 16 Feb 2017 16:42:00 +0000 (11:42 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 16 Feb 2017 16:42:00 +0000 (11:42 -0500)
* decl.c (poplevel): Remove undeduced auto decls.

From-SVN: r245510

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.dg/lto/pr79050_0.C [new file with mode: 0644]

index b48a6f2cc037c3ddcc57fcb97ed9d28785cc0dd2..2e94feeccf7cf9c5a693d4df715b2f6e48092726 100644 (file)
@@ -1,3 +1,8 @@
+2017-02-16  Jason Merrill  <jason@redhat.com>
+
+       PR c++/79050 - ICE with undeduced auto and LTO
+       * decl.c (poplevel): Remove undeduced auto decls.
+
 2017-02-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/79512
index 353e7b5d726df5779a9102ed5b2ce5f73cb7329e..70c44fbb9f02582377e13c29d5c7d81027820fca 100644 (file)
@@ -792,14 +792,17 @@ poplevel (int keep, int reverse, int functionbody)
      back ends won't understand OVERLOAD, so we remove them here.
      Because the BLOCK_VARS are (temporarily) shared with
      CURRENT_BINDING_LEVEL->NAMES we must do this fixup after we have
-     popped all the bindings.  */
+     popped all the bindings.  Also remove undeduced 'auto' decls,
+     which LTO doesn't understand, and can't have been used by anything.  */
   if (block)
     {
       tree* d;
 
       for (d = &BLOCK_VARS (block); *d; )
        {
-         if (TREE_CODE (*d) == TREE_LIST)
+         if (TREE_CODE (*d) == TREE_LIST
+             || (!processing_template_decl
+                 && undeduced_auto_decl (*d)))
            *d = TREE_CHAIN (*d);
          else
            d = &DECL_CHAIN (*d);
diff --git a/gcc/testsuite/g++.dg/lto/pr79050_0.C b/gcc/testsuite/g++.dg/lto/pr79050_0.C
new file mode 100644 (file)
index 0000000..1f31b5d
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/79050
+// { dg-lto-do assemble }
+
+int main ()
+{
+  auto foo ();
+}