diff options
-rw-r--r-- | gcc/lto/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/lto/lto-symtab.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/pr88049_0.C | 16 |
3 files changed, 28 insertions, 2 deletions
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 6b183df..f8a1bbe 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,9 @@ +2019-02-28 Jason Merrill <jason@redhat.com> + + PR c++/88049 - ICE with undefined destructor and anon namespace. + * lto-symtab.c (lto_symtab_prevailing_virtual_decl): Return early + for a type in an anonymous namespace. + 2019-01-09 Sandra Loosemore <sandra@codesourcery.com> PR other/16615 diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c index 22da4c7..343915c 100644 --- a/gcc/lto/lto-symtab.c +++ b/gcc/lto/lto-symtab.c @@ -1085,8 +1085,12 @@ lto_symtab_prevailing_virtual_decl (tree decl) { if (DECL_ABSTRACT_P (decl)) return decl; - gcc_checking_assert (!type_in_anonymous_namespace_p (DECL_CONTEXT (decl)) - && DECL_ASSEMBLER_NAME_SET_P (decl)); + + if (type_in_anonymous_namespace_p (DECL_CONTEXT (decl))) + /* There can't be any other declarations. */ + return decl; + + gcc_checking_assert (DECL_ASSEMBLER_NAME_SET_P (decl)); symtab_node *n = symtab_node::get_for_asmname (DECL_ASSEMBLER_NAME (decl)); diff --git a/gcc/testsuite/g++.dg/lto/pr88049_0.C b/gcc/testsuite/g++.dg/lto/pr88049_0.C new file mode 100644 index 0000000..7ac3618 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr88049_0.C @@ -0,0 +1,16 @@ +// PR c++/88049 +// { dg-lto-do link } +// { dg-lto-options {{ -flto -O2 -w }} } +// { dg-extra-ld-options -r } + +template <typename> class a; +class b {}; +template <typename e> a<e> d(char); +template <typename> class a : public b { +public: + virtual ~a(); +}; +namespace { + class f; + b c = d<f>(int()); +} // namespace |