From 4341f26129d04fe3b6b92e8c19ddaad14593f22d Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Thu, 8 Dec 2011 12:32:19 +0000 Subject: [PATCH] re PR lto/50747 (ICE in produce_symtab, at lto-streamer-out.c:1435) 2011-12-08 Richard Guenther PR lto/50747 * lto-streamer-out.c (produce_symtab): Remove asserts. * g++.dg/opt/pr50747-1_0.C: New testcase. * g++.dg/opt/pr50747-2_0.C: Likewise. From-SVN: r182108 --- gcc/ChangeLog | 5 ++ gcc/lto-streamer-out.c | 6 +- gcc/testsuite/ChangeLog | 6 ++ gcc/testsuite/g++.dg/opt/pr50747-1_0.C | 18 ++++ gcc/testsuite/g++.dg/opt/pr50747-2_0.C | 112 +++++++++++++++++++++++++ 5 files changed, 142 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/pr50747-1_0.C create mode 100644 gcc/testsuite/g++.dg/opt/pr50747-2_0.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 84083ed3ab2..5b4eab59f5b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2011-12-08 Richard Guenther + + PR lto/50747 + * lto-streamer-out.c (produce_symtab): Remove asserts. + 2011-12-08 Richard Guenther PR lto/49945 diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index e5c79d11f62..80bf9e9fd4f 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -1450,11 +1450,7 @@ produce_symtab (struct output_block *ob, them indirectly or via vtables. Do not output them to symbol table: they end up being undefined and just consume space. */ if (!node->address_taken && !node->callers) - { - gcc_assert (node->analyzed); - gcc_assert (DECL_DECLARED_INLINE_P (node->decl)); - continue; - } + continue; if (DECL_COMDAT (node->decl) && cgraph_comdat_can_be_unshared_p (node)) continue; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 898478b87a2..7cc35007745 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-12-08 Richard Guenther + + PR lto/50747 + * g++.dg/opt/pr50747-1_0.C: New testcase. + * g++.dg/opt/pr50747-2_0.C: Likewise. + 2011-12-08 Eric Botcazou * gcc.c-torture/execute/20111208-1.c: New test. diff --git a/gcc/testsuite/g++.dg/opt/pr50747-1_0.C b/gcc/testsuite/g++.dg/opt/pr50747-1_0.C new file mode 100644 index 00000000000..4a5546c638e --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr50747-1_0.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// { dg-require-effective-target lto } +// { dg-options "-flto" } + +void foo(); + +static void bar() __attribute__((weakref("foo"))); + +struct A +{ + A(); +}; + +int i; + +template struct B : T {}; + +B b; diff --git a/gcc/testsuite/g++.dg/opt/pr50747-2_0.C b/gcc/testsuite/g++.dg/opt/pr50747-2_0.C new file mode 100644 index 00000000000..26f423af631 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr50747-2_0.C @@ -0,0 +1,112 @@ +// { dg-do compile } +// { dg-require-effective-target lto } +// { dg-options "-w -fpermissive -fno-implicit-templates -flto" } + +namespace std { + typedef long unsigned int size_t; + template class allocator; + template struct char_traits; + template > class basic_ostream; + template, typename _Alloc = allocator<_CharT> > class basic_ostringstream; +} +extern "C++" { + namespace std { + class exception { + }; + }; +} +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) { + template class new_allocator { + }; +} +namespace std __attribute__ ((__visibility__ ("default"))) { + template class allocator: public __gnu_cxx::new_allocator<_Tp> { + public: typedef size_t size_type; + template struct rebind { + typedef allocator<_Tp1> other; + }; + }; + template class basic_string { + typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type; + typedef typename _CharT_alloc_type::size_type size_type; + private: struct _Rep_base { + }; + struct _Rep : _Rep_base { + _CharT* _M_refdata() throw() { + } + }; + struct _Alloc_hider : _Alloc { + _Alloc_hider(_CharT* __dat, const _Alloc& __a) : _Alloc(__a), _M_p(__dat) { + } + _CharT* _M_p; + }; + private: mutable _Alloc_hider _M_dataplus; + static _Rep& _S_empty_rep() { + } + public: basic_string() : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { + } + template basic_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a = _Alloc()); + static _CharT* _S_construct(size_type __req, _CharT __c, const _Alloc& __a); + }; + template inline basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const basic_string<_CharT, _Traits, _Alloc>& __str) { + } + template template basic_string<_CharT, _Traits, _Alloc>:: basic_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a) : _M_dataplus(_S_construct(__beg, __end, __a), __a) { + }; + enum _Ios_Openmode { + _S_app = 1L << 0, _S_ate = 1L << 1, _S_bin = 1L << 2, _S_in = 1L << 3, _S_out = 1L << 4, _S_trunc = 1L << 5, _S_ios_openmode_end = 1L << 16 }; + class ios_base { + public: class failure : public exception { + }; + typedef _Ios_Openmode openmode; + static const openmode in = _S_in; + static const openmode out = _S_out; + }; + template class basic_streambuf { + public: typedef _CharT char_type; + char_type* egptr() const { + } + char_type* pbase() const { + } + char_type* pptr() const { + } + }; + template class basic_ios : public ios_base { + }; + template class basic_ostream : virtual public basic_ios<_CharT, _Traits> { + }; + template class basic_stringbuf : public basic_streambuf<_CharT, _Traits> { + public: typedef _CharT char_type; + typedef _Traits traits_type; + typedef basic_streambuf __streambuf_type; + typedef basic_string __string_type; + protected: ios_base::openmode _M_mode; + __string_type _M_string; + public: explicit basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out) : __streambuf_type(), _M_mode(__mode), _M_string() { + } + __string_type str() const { + __string_type __ret; + if (this->pptr()) { + if (this->pptr() > this->egptr()) __ret = __string_type(this->pbase(), this->pptr()); + } + } + }; + template class basic_ostringstream : public basic_ostream<_CharT, _Traits> { + public: typedef _CharT char_type; + typedef _Traits traits_type; + typedef basic_string<_CharT, _Traits, _Alloc> __string_type; + typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type; + typedef basic_ostream __ostream_type; + private: __stringbuf_type _M_stringbuf; + public: explicit basic_ostringstream(ios_base::openmode __mode = ios_base::out) : __ostream_type(), _M_stringbuf(__mode | ios_base::out) { + } + __string_type str() const { + return _M_stringbuf.str(); + } + }; + template class complex; + template basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x) { + basic_ostringstream<_CharT, _Traits> __s; + return __os << __s.str(); + }; + template basic_ostream >& operator<<(basic_ostream >&, const complex&); +}