C++ PATCH: PR 25337
Mark Mitchell
mark@codesourcery.com
Mon Dec 12 01:45:00 GMT 2005
This patch fixes PR c++/25337, and ICE on valid code. We were
forgetting that, even after substitution, "a.b" might be dependent;
see the test case attached.
Tested on x86_64-unknown-linux-gnu, applied on the mainline and on the
4.0 and 4.1 branches.
--
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com
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-11 Mark Mitchell <mark@codesourcery.com>
PR c++/25337
* g++.dg/template/defarg7.C: New test.
Index: gcc/cp/pt.c
===================================================================
--- gcc/cp/pt.c (revision 108374)
+++ gcc/cp/pt.c (working copy)
@@ -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;
}
}
Index: gcc/testsuite/g++.dg/template/defarg7.C
===================================================================
--- gcc/testsuite/g++.dg/template/defarg7.C (revision 0)
+++ gcc/testsuite/g++.dg/template/defarg7.C (revision 0)
@@ -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>*);
More information about the Gcc-patches
mailing list