From 7a20d68989dac61d98b12b5d32404f04021d211f Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 24 Sep 2007 16:54:34 -0400 Subject: 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 --- gcc/cp/pt.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'gcc/cp/pt.c') 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, 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. */ -- cgit v1.1