diff options
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/memtmpl3.C | 24 |
3 files changed, 40 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5e9b187..6950166 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-09-24 Jason Merrill <jason@redhat.com> + + PR c++/33239 + * pt.c (resolve_typename_type): Don't look things up in the original + template if it would mean losing template arguments. + 2007-09-24 Jakub Jelinek <jakub@redhat.com> PR c++/33506 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index c9ec370..5b07c70 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -15732,9 +15732,16 @@ resolve_typename_type (tree type, bool only_current_p) to look inside it. */ if (only_current_p && !currently_open_class (scope)) return type; - /* If SCOPE is a partial instantiation, it will not have a valid - TYPE_FIELDS list, so use the original template. */ - scope = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (scope); + /* If SCOPE isn't the template itself, it will not have a valid + TYPE_FIELDS list. */ + if (same_type_p (scope, CLASSTYPE_PRIMARY_TEMPLATE_TYPE (scope))) + /* scope is either the template itself or a compatible instantiation + like X<T>, so look up the name in the original template. */ + scope = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (scope); + else + /* scope is a partial instantiation, so we can't do the lookup or we + will lose the template arguments. */ + return type; /* Enter the SCOPE so that name lookup will be resolved as if we were in the class definition. In particular, SCOPE will no longer be considered a dependent type. */ diff --git a/gcc/testsuite/g++.dg/template/memtmpl3.C b/gcc/testsuite/g++.dg/template/memtmpl3.C new file mode 100644 index 0000000..583155e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memtmpl3.C @@ -0,0 +1,24 @@ +// PR c++/33239 + +struct null_type; + +template<typename T1, typename T2> +struct tuple_impl +{ + template<typename U> + struct append + { + typedef tuple_impl<U, null_type> type; + }; + + int data; +}; + +template<typename T1> +class tuple +: public tuple_impl<T1, null_type>::template append<T1>::type +{ + using tuple_impl<T1, null_type>::template append<T1>::type::data; +}; + +tuple<int> my_tuple; |