From 61cee2603036c29761a49c07a6531561ca507ddc Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 16 Feb 2017 11:42:00 -0500 Subject: [PATCH] PR c++/79050 - ICE with undeduced auto and LTO * decl.c (poplevel): Remove undeduced auto decls. From-SVN: r245510 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/decl.c | 7 +++++-- gcc/testsuite/g++.dg/lto/pr79050_0.C | 7 +++++++ 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/lto/pr79050_0.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b48a6f2cc03..2e94feeccf7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2017-02-16 Jason Merrill + + PR c++/79050 - ICE with undeduced auto and LTO + * decl.c (poplevel): Remove undeduced auto decls. + 2017-02-16 Jakub Jelinek PR c++/79512 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 353e7b5d726..70c44fbb9f0 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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 index 00000000000..1f31b5d0020 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr79050_0.C @@ -0,0 +1,7 @@ +// PR c++/79050 +// { dg-lto-do assemble } + +int main () +{ + auto foo (); +} -- 2.30.2