aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-12-08 12:32:19 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-12-08 12:32:19 +0000
commit4341f26129d04fe3b6b92e8c19ddaad14593f22d (patch)
tree1f7fb017d2dd22276b4e2f71fd3fd1a72e5b5a43 /gcc
parentbefa62e74e117f401f2520a985e820fc1fff4399 (diff)
downloadgcc-4341f26129d04fe3b6b92e8c19ddaad14593f22d.zip
gcc-4341f26129d04fe3b6b92e8c19ddaad14593f22d.tar.gz
gcc-4341f26129d04fe3b6b92e8c19ddaad14593f22d.tar.bz2
re PR lto/50747 (ICE in produce_symtab, at lto-streamer-out.c:1435)
2011-12-08 Richard Guenther <rguenther@suse.de> 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/lto-streamer-out.c6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/opt/pr50747-1_0.C18
-rw-r--r--gcc/testsuite/g++.dg/opt/pr50747-2_0.C112
5 files changed, 142 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 84083ed..5b4eab5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2011-12-08 Richard Guenther <rguenther@suse.de>
+ PR lto/50747
+ * lto-streamer-out.c (produce_symtab): Remove asserts.
+
+2011-12-08 Richard Guenther <rguenther@suse.de>
+
PR lto/49945
* lto-streamer-out.c (tree_is_indexable): Localize variably
modified types and their FIELD_DECLs.
diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
index e5c79d1..80bf9e9 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 898478b..7cc3500 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2011-12-08 Richard Guenther <rguenther@suse.de>
+
+ 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 <ebotcazou@adacore.com>
* 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 0000000..4a5546c
--- /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 <typename T, int&> struct B : T {};
+
+B<A, i> 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 0000000..26f423a
--- /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<typename _Alloc> class allocator;
+ template<class _CharT> struct char_traits;
+ template<typename _CharT, typename _Traits = char_traits<_CharT> > class basic_ostream;
+ template<typename _CharT, typename _Traits = char_traits<_CharT>, typename _Alloc = allocator<_CharT> > class basic_ostringstream;
+}
+extern "C++" {
+ namespace std {
+ class exception {
+ };
+ };
+}
+namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class new_allocator {
+ };
+}
+namespace std __attribute__ ((__visibility__ ("default"))) {
+ template<typename _Tp> class allocator: public __gnu_cxx::new_allocator<_Tp> {
+ public: typedef size_t size_type;
+ template<typename _Tp1> struct rebind {
+ typedef allocator<_Tp1> other;
+ };
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc> 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<class _InputIterator> basic_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a = _Alloc());
+ static _CharT* _S_construct(size_type __req, _CharT __c, const _Alloc& __a);
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc> inline basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const basic_string<_CharT, _Traits, _Alloc>& __str) {
+ }
+ template<typename _CharT, typename _Traits, typename _Alloc> template<typename _InputIterator> 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<typename _CharT, typename _Traits> class basic_streambuf {
+ public: typedef _CharT char_type;
+ char_type* egptr() const {
+ }
+ char_type* pbase() const {
+ }
+ char_type* pptr() const {
+ }
+ };
+ template<typename _CharT, typename _Traits> class basic_ios : public ios_base {
+ };
+ template<typename _CharT, typename _Traits> class basic_ostream : virtual public basic_ios<_CharT, _Traits> {
+ };
+ template<typename _CharT, typename _Traits, typename _Alloc> class basic_stringbuf : public basic_streambuf<_CharT, _Traits> {
+ public: typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef basic_streambuf<char_type, traits_type> __streambuf_type;
+ typedef basic_string<char_type, _Traits, _Alloc> __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 <typename _CharT, typename _Traits, typename _Alloc> 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<char_type, traits_type> __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<typename _Tp> class complex;
+ template<typename _Tp, typename _CharT, class _Traits> 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<wchar_t, char_traits<wchar_t> >& operator<<(basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<long double>&);
+}