diff options
author | Mark Mitchell <mark@codesourcery.com> | 2005-12-12 01:40:25 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2005-12-12 01:40:25 +0000 |
commit | 3897c0aae8cdd410c306f775e424fd32fd918257 (patch) | |
tree | 0088e57be105cdaee7b7cd3cd2d0ef817a15a368 | |
parent | 392cc400f49a47b029b29a59541468e20d5ac08b (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/defarg7.C | 7 |
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>*); |