aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2005-12-12 01:40:25 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2005-12-12 01:40:25 +0000
commit3897c0aae8cdd410c306f775e424fd32fd918257 (patch)
tree0088e57be105cdaee7b7cd3cd2d0ef817a15a368
parent392cc400f49a47b029b29a59541468e20d5ac08b (diff)
downloadgcc-3897c0aae8cdd410c306f775e424fd32fd918257.zip
gcc-3897c0aae8cdd410c306f775e424fd32fd918257.tar.gz
gcc-3897c0aae8cdd410c306f775e424fd32fd918257.tar.bz2
re PR c++/25337 (ICE with template processing)
PR c++/25337 * pt.c (tsubst_copy_and_build): Permit dependent types for the object in a class member access expression. PR c++/25337 * g++.dg/template/defarg7.C: New test. From-SVN: r108394
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/defarg7.C7
4 files changed, 26 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 13b075b..b3bad79 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2005-12-10 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/25337
+ * pt.c (tsubst_copy_and_build): Permit dependent types for the
+ object in a class member access expression.
+
2005-12-10 Terry Laurenzo <tlaurenzo@gmail.com>
PR java/9861
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 5f28b41..e2c987a 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -8857,6 +8857,7 @@ tsubst_copy_and_build (tree t,
case COMPONENT_REF:
{
tree object;
+ tree object_type;
tree member;
object = tsubst_non_call_postfix_expression (TREE_OPERAND (t, 0),
@@ -8864,6 +8865,7 @@ tsubst_copy_and_build (tree t,
/* Remember that there was a reference to this entity. */
if (DECL_P (object))
mark_used (object);
+ object_type = TREE_TYPE (object);
member = TREE_OPERAND (t, 1);
if (BASELINK_P (member))
@@ -8872,20 +8874,20 @@ tsubst_copy_and_build (tree t,
args, complain, in_decl);
else
member = tsubst_copy (member, args, complain, in_decl);
-
if (member == error_mark_node)
return error_mark_node;
- else if (!CLASS_TYPE_P (TREE_TYPE (object)))
+
+ if (object_type && !CLASS_TYPE_P (object_type))
{
if (TREE_CODE (member) == BIT_NOT_EXPR)
return finish_pseudo_destructor_expr (object,
NULL_TREE,
- TREE_TYPE (object));
+ object_type);
else if (TREE_CODE (member) == SCOPE_REF
&& (TREE_CODE (TREE_OPERAND (member, 1)) == BIT_NOT_EXPR))
return finish_pseudo_destructor_expr (object,
object,
- TREE_TYPE (object));
+ object_type);
}
else if (TREE_CODE (member) == SCOPE_REF
&& TREE_CODE (TREE_OPERAND (member, 1)) == TEMPLATE_ID_EXPR)
@@ -8907,12 +8909,11 @@ tsubst_copy_and_build (tree t,
args);
member = (adjust_result_of_qualified_name_lookup
(member, BINFO_TYPE (BASELINK_BINFO (member)),
- TREE_TYPE (object)));
+ object_type));
}
else
{
- qualified_name_lookup_error (TREE_TYPE (object), tmpl,
- member);
+ qualified_name_lookup_error (object_type, tmpl, member);
return error_mark_node;
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 21ec14b..c91a3e9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-12-11 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/25337
+ * g++.dg/template/defarg7.C: New test.
+
2005-12-11 Andrew Pinski <pinskia@physics.uc.edu>
PR libobjc/25347
diff --git a/gcc/testsuite/g++.dg/template/defarg7.C b/gcc/testsuite/g++.dg/template/defarg7.C
new file mode 100644
index 0000000..77506d4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/defarg7.C
@@ -0,0 +1,7 @@
+// PR c++/25337
+
+template <typename T> T& MakeT();
+template <typename U, int N = sizeof (MakeT<U>().operator[](0))>
+struct helper{};
+template <typename U>
+static char is_here(helper<U>*);