diff options
author | Richard Guenther <rguenther@suse.de> | 2011-03-11 15:59:42 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-03-11 15:59:42 +0000 |
commit | 5f11a50a53603f4888a981e4bc162ef9069bbcd8 (patch) | |
tree | 5a00831f10217363ca6f0423beee4d0e0c453a75 /gcc | |
parent | e33eba75933fdd7bd895a3b35ef1b1b710ddbb13 (diff) | |
download | gcc-5f11a50a53603f4888a981e4bc162ef9069bbcd8.zip gcc-5f11a50a53603f4888a981e4bc162ef9069bbcd8.tar.gz gcc-5f11a50a53603f4888a981e4bc162ef9069bbcd8.tar.bz2 |
re PR c++/48073 (ICE with -flto in templated C++ code)
2011-03-11 Richard Guenther <rguenther@suse.de>
PR lto/48073
* tree.c (find_decls_types_r): Do not walk types only reachable
from IDENTIFIER_NODEs.
* g++.dg/lto/20110311-1_0.C: New testcase.
From-SVN: r170875
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/20110311-1_0.C | 51 | ||||
-rw-r--r-- | gcc/tree.c | 3 |
4 files changed, 64 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1da3589..dea9da9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-03-11 Richard Guenther <rguenther@suse.de> + + PR lto/48073 + * tree.c (find_decls_types_r): Do not walk types only reachable + from IDENTIFIER_NODEs. + 2011-03-11 Jakub Jelinek <jakub@redhat.com> PR middle-end/48044 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7e7b924..69b6ad5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-03-11 Richard Guenther <rguenther@suse.de> + + PR lto/48073 + * g++.dg/lto/20110311-1_0.C: New testcase. + 2011-03-11 Jakub Jelinek <jakub@redhat.com> PR c++/48035 diff --git a/gcc/testsuite/g++.dg/lto/20110311-1_0.C b/gcc/testsuite/g++.dg/lto/20110311-1_0.C new file mode 100644 index 0000000..c63951e --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20110311-1_0.C @@ -0,0 +1,51 @@ +/* { dg-lto-do link } */ +/* { dg-extra-ld-options "-r -nostdlib" } */ + +struct NullType {}; + +template <class T, class U> +struct TList +{ + typedef T Head; + typedef U Tail; +}; + +template <class T> +struct TListLength {}; + +template <class T, class U> +struct TListLength<TList<T,U> > +{ + enum + { + Ret = 1 + TListLength<U>::Ret + }; +}; + +template <> +struct TListLength<NullType> +{ + enum + { + Ret = 0 + }; +}; + +template <class Moves> +class DDQMC +{ +public: + int* moves[TListLength<Moves>::Ret]; + inline DDQMC(); +private: +}; + +template <class Moves> +DDQMC<Moves>::DDQMC() +{ +} + +int main() +{ + typedef DDQMC< TList<float, TList<int, NullType> > > mytype; +} @@ -4822,7 +4822,8 @@ find_decls_types_r (tree *tp, int *ws, void *data) fld_worklist_push (BLOCK_ABSTRACT_ORIGIN (t), fld); } - fld_worklist_push (TREE_TYPE (t), fld); + if (TREE_CODE (t) != IDENTIFIER_NODE) + fld_worklist_push (TREE_TYPE (t), fld); return NULL_TREE; } |