diff options
-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 1da3589cc3f..dea9da94d07 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 7e7b9243da5..69b6ad51d63 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 00000000000..c63951e5bd8 --- /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; +} diff --git a/gcc/tree.c b/gcc/tree.c index d923ac89a76..be469909995 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -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; } |