aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c13
-rw-r--r--gcc/testsuite/g++.dg/template/memtmpl3.C24
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;