Hi,
as per the recent discussion. This also changes c++/50870 from
ice-on-valid to reject-valid, a *tad* better I think (but I mean to
continue working on it, for a while). Tested x86_64-linux.
Ok for mainline?
Thanks,
Paolo.
////////////////////
/cp
2011-10-28 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/50864
* pt.c (tsubst_copy_and_build): Fix qualified_name_lookup_error
call in case COMPONENT_REF.
/testsuite
2011-10-28 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/50864
* testsuite/g++.dg/template/crash109.C: New.
Index: testsuite/g++.dg/template/crash109.C
===================================================================
--- testsuite/g++.dg/template/crash109.C (revision 0)
+++ testsuite/g++.dg/template/crash109.C (revision 0)
@@ -0,0 +1,10 @@
+// PR c++/50864
+
+namespace impl
+{
+ template <class T> T create();
+}
+
+template <class T, class U, __SIZE_TYPE__
+ = sizeof(impl::create<T>() -> impl::create<U>())> // { dg-error "not
a member" }
+struct foo;
Index: cp/pt.c
===================================================================
--- cp/pt.c (revision 180619)
+++ cp/pt.c (working copy)
@@ -13741,14 +13741,12 @@ tsubst_copy_and_build (tree t,
else if (TREE_CODE (member) == SCOPE_REF
&& TREE_CODE (TREE_OPERAND (member, 1)) == TEMPLATE_ID_EXPR)
{
- tree tmpl;
- tree args;
-
/* Lookup the template functions now that we know what the
scope is. */
- tmpl = TREE_OPERAND (TREE_OPERAND (member, 1), 0);
- args = TREE_OPERAND (TREE_OPERAND (member, 1), 1);
- member = lookup_qualified_name (TREE_OPERAND (member, 0), tmpl,
+ tree scope = TREE_OPERAND (member, 0);
+ tree tmpl = TREE_OPERAND (TREE_OPERAND (member, 1), 0);
+ tree args = TREE_OPERAND (TREE_OPERAND (member, 1), 1);
+ member = lookup_qualified_name (scope, tmpl,
/*is_type_p=*/false,
/*complain=*/false);
if (BASELINK_P (member))
@@ -13762,7 +13760,7 @@ tsubst_copy_and_build (tree t,
}
else
{
- qualified_name_lookup_error (object_type, tmpl, member,
+ qualified_name_lookup_error (scope, tmpl, member,
input_location);
return error_mark_node;
}