aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-04-06 11:12:28 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-04-06 11:12:28 -0400
commit0c923157ab1522e9d8b2fe8c3dabc6c5cbc35b1d (patch)
treed5f8ddabc7159df504a33e866042af492bbf4ddc
parentd8ab9ce00a09f3daeea4ad8eea24a385cd7f28f3 (diff)
downloadgcc-0c923157ab1522e9d8b2fe8c3dabc6c5cbc35b1d.zip
gcc-0c923157ab1522e9d8b2fe8c3dabc6c5cbc35b1d.tar.gz
gcc-0c923157ab1522e9d8b2fe8c3dabc6c5cbc35b1d.tar.bz2
PR c++/85240 - LTO ICE with using of undeduced auto fn.
* cp-gimplify.c (cp_genericize_r): Discard using of undeduced auto. From-SVN: r259177
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/cp-gimplify.c20
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/auto-fn51.C9
3 files changed, 26 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 759e9c9..71eceaa 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2018-04-06 Jason Merrill <jason@redhat.com>
+
+ PR c++/85240 - LTO ICE with using of undeduced auto fn.
+ * cp-gimplify.c (cp_genericize_r): Discard using of undeduced auto.
+
2018-04-05 Jakub Jelinek <jakub@redhat.com>
PR c++/85209
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index fd0c37f..fb0aea3 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -1294,16 +1294,20 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
}
if (block)
{
- tree using_directive;
- gcc_assert (TREE_OPERAND (stmt, 0));
+ tree decl = TREE_OPERAND (stmt, 0);
+ gcc_assert (decl);
- using_directive = make_node (IMPORTED_DECL);
- TREE_TYPE (using_directive) = void_type_node;
+ if (undeduced_auto_decl (decl))
+ /* Omit from the GENERIC, the back-end can't handle it. */;
+ else
+ {
+ tree using_directive = make_node (IMPORTED_DECL);
+ TREE_TYPE (using_directive) = void_type_node;
- IMPORTED_DECL_ASSOCIATED_DECL (using_directive)
- = TREE_OPERAND (stmt, 0);
- DECL_CHAIN (using_directive) = BLOCK_VARS (block);
- BLOCK_VARS (block) = using_directive;
+ IMPORTED_DECL_ASSOCIATED_DECL (using_directive) = decl;
+ DECL_CHAIN (using_directive) = BLOCK_VARS (block);
+ BLOCK_VARS (block) = using_directive;
+ }
}
/* The USING_STMT won't appear in GENERIC. */
*stmt_p = build1 (NOP_EXPR, void_type_node, integer_zero_node);
diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn51.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn51.C
new file mode 100644
index 0000000..7e4f488
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn51.C
@@ -0,0 +1,9 @@
+// PR c++/85240
+// { dg-do compile { target c++14 } }
+
+auto foo();
+
+void bar()
+{
+ using ::foo;
+}