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;
              }

Reply via email to