re PR c++/25337 (ICE with template processing)
authorMark Mitchell <mark@codesourcery.com>
Mon, 12 Dec 2005 01:40:25 +0000 (01:40 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 12 Dec 2005 01:40:25 +0000 (01:40 +0000)
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

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/defarg7.C [new file with mode: 0644]

index 13b075bb9d7280e11b23bb6548ca3711c7c4b113..b3bad798b3eb9589cb1116f0bfedca246b717484 100644 (file)
@@ -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
index 5f28b4193a7c4b66dad1d1f1c10dffcf8ed9e882..e2c987a44fb4bc77eb6510f48c9df78d3098c986 100644 (file)
@@ -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 21ec14b7fa228d4249c6dccdb0ee93ced8cb2be3..c91a3e9f1df9e50c4e2c4a4c71b6d29ed66e03ec 100644 (file)
@@ -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 (file)
index 0000000..77506d4
--- /dev/null
@@ -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>*);