Commit 7a20d689 by Jason Merrill Committed by Jason Merrill

re PR c++/33239 (internal compiler error in instantiate_class_template, at cp/pt.c:5666)

        PR c++/33239
        * pt.c (resolve_typename_type): Don't look things up in the original
        template if it would mean losing template arguments.

From-SVN: r128725
parent 7b7bdf67
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> 2007-09-24 Jakub Jelinek <jakub@redhat.com>
PR c++/33506 PR c++/33506
......
...@@ -15732,9 +15732,16 @@ resolve_typename_type (tree type, bool only_current_p) ...@@ -15732,9 +15732,16 @@ resolve_typename_type (tree type, bool only_current_p)
to look inside it. */ to look inside it. */
if (only_current_p && !currently_open_class (scope)) if (only_current_p && !currently_open_class (scope))
return type; return type;
/* If SCOPE is a partial instantiation, it will not have a valid /* If SCOPE isn't the template itself, it will not have a valid
TYPE_FIELDS list, so use the original template. */ 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); 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 /* Enter the SCOPE so that name lookup will be resolved as if we
were in the class definition. In particular, SCOPE will no were in the class definition. In particular, SCOPE will no
longer be considered a dependent type. */ longer be considered a dependent type. */
......
// 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment