]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/19311 (ICE in resolve_overloaded_unification)
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Sun, 6 Mar 2005 16:59:19 +0000 (16:59 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Sun, 6 Mar 2005 16:59:19 +0000 (16:59 +0000)
PR c++/19311
* init.c (build_offset_ref): Don't build non-dependent SCOPE_REF.
* pt.c (build_non_dependent_expr): Don't build NON_DEPENDENT_EXPR
for OFFSET_TYPE.
* typeck.c (build_x_unary_op): Don't build non-dependent SCOPE_REF.
Also set PTRMEM_OK_P for NON_DEPENDENT_EXPR.
(build_unary_op): Handle building ADDR_EXPR of OFFSET_REF inside
template.

* g++.dg/template/non-dependent11.C: New test.

From-SVN: r95975

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/cp/pt.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog

index 9eeebd992265c6b798980616e00f11c8d86166fa..2d30c545ee7ebd00bdf78dc284c6532981d82bbd 100644 (file)
@@ -1,3 +1,14 @@
+2005-03-06  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/19311
+       * init.c (build_offset_ref): Don't build non-dependent SCOPE_REF.
+       * pt.c (build_non_dependent_expr): Don't build NON_DEPENDENT_EXPR
+       for OFFSET_TYPE.
+       * typeck.c (build_x_unary_op): Don't build non-dependent SCOPE_REF.
+       Also set PTRMEM_OK_P for NON_DEPENDENT_EXPR.
+       (build_unary_op): Handle building ADDR_EXPR of OFFSET_REF inside
+       template.
+
 2005-03-02  Alexandre Oliva  <aoliva@redhat.com>
 
        * name-lookup.c (push_overloaded_decl): Don't error if the new
index 3adf37fb97bf8f9dd41e11b2d2dbcb4afc7b0a59..5659f0f1617a373da4c6e3a2b49777211264531d 100644 (file)
@@ -1462,14 +1462,6 @@ build_offset_ref (tree type, tree name, bool address_p)
       return error_mark_node;
     }
 
-  if (processing_template_decl)
-    {
-      if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR)
-       return build_min (SCOPE_REF, TREE_TYPE (member), type, orig_name);
-      else
-       return build_min (SCOPE_REF, TREE_TYPE (member), type, name);
-    }
-
   if (TREE_CODE (member) == TYPE_DECL)
     {
       TREE_USED (member) = 1;
index 45557c108108087ab9af36b0887265b5a1d29a11..e5aadc127498c64c0edfcdc2d05cf509a7202365 100644 (file)
@@ -12236,7 +12236,8 @@ build_non_dependent_expr (tree expr)
   if (TREE_CODE (inner_expr) == OVERLOAD 
       || TREE_CODE (inner_expr) == FUNCTION_DECL
       || TREE_CODE (inner_expr) == TEMPLATE_DECL
-      || TREE_CODE (inner_expr) == TEMPLATE_ID_EXPR)
+      || TREE_CODE (inner_expr) == TEMPLATE_ID_EXPR
+      || TREE_CODE (inner_expr) == OFFSET_REF)
     return expr;
   /* Preserve string constants; conversions from string constants to
      "char *" are allowed, even though normally a "const char *"
index d7c1cb36922c65b232a450a4fbe6810f59bebe9d..adcddaf7b3f165c2cd8aaea4a7be62353fbf6936 100644 (file)
@@ -3549,23 +3549,6 @@ build_x_unary_op (enum tree_code code, tree xarg)
       if (type_dependent_expression_p (xarg))
        return build_min_nt (code, xarg, NULL_TREE);
 
-      /* For non-dependent pointer-to-member, the SCOPE_REF will be
-        processed during template substitution.  Just compute the
-        right type here and build an ADDR_EXPR around it for
-        diagnostics.  */
-      if (code == ADDR_EXPR && TREE_CODE (xarg) == SCOPE_REF)
-       {
-         tree type;
-         if (TREE_TYPE (xarg) == unknown_type_node)
-           type = unknown_type_node;
-         else if (TREE_CODE (TREE_TYPE (xarg)) == FUNCTION_TYPE)
-           type = build_pointer_type (TREE_TYPE (xarg));
-         else
-           type = build_ptrmem_type (TREE_OPERAND (xarg, 0),
-                                     TREE_TYPE (xarg));
-         return build_min (code, type, xarg, NULL_TREE);
-       }
-
       xarg = build_non_dependent_expr (xarg);
     }
 
@@ -3627,13 +3610,13 @@ build_x_unary_op (enum tree_code code, tree xarg)
       else if (TREE_CODE (xarg) == TARGET_EXPR)
        warning ("taking address of temporary");
       exp = build_unary_op (ADDR_EXPR, xarg, 0);
-      if (TREE_CODE (exp) == ADDR_EXPR)
-       PTRMEM_OK_P (exp) = ptrmem;
     }
 
   if (processing_template_decl && exp != error_mark_node)
-    return build_min_non_dep (code, exp, orig_expr,
-                             /*For {PRE,POST}{INC,DEC}REMENT_EXPR*/NULL_TREE);
+    exp = build_min_non_dep (code, exp, orig_expr,
+                            /*For {PRE,POST}{INC,DEC}REMENT_EXPR*/NULL_TREE);
+  if (TREE_CODE (exp) == ADDR_EXPR)
+    PTRMEM_OK_P (exp) = ptrmem;
   return exp;
 }
 
@@ -4095,6 +4078,7 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
         is an error.  */
       else if (TREE_CODE (argtype) != FUNCTION_TYPE
               && TREE_CODE (argtype) != METHOD_TYPE
+              && TREE_CODE (arg) != OFFSET_REF
               && !lvalue_or_else (arg, "unary `&'"))
        return error_mark_node;
 
@@ -4109,7 +4093,11 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
               expression so we can just form an ADDR_EXPR with the
               correct type.  */
            || processing_template_decl)
-         addr = build_address (arg);
+         {
+           addr = build_address (arg);
+           if (TREE_CODE (arg) == OFFSET_REF)
+             PTRMEM_OK_P (addr) = PTRMEM_OK_P (arg);
+         }
        else if (TREE_CODE (TREE_OPERAND (arg, 1)) == BASELINK)
          {
            tree fn = BASELINK_FUNCTIONS (TREE_OPERAND (arg, 1));
index 0859cbb222224b885a92a45950eecacd333aeb4f..e583559c55d28611f0c71ab4d0b09b2c30553da1 100644 (file)
@@ -1,3 +1,8 @@
+2005-03-06  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/19311
+       * g++.dg/template/non-dependent11.C: New test.
+
 2005-03-04  David Billinghurst  <David.Billinghurst@riotinto.com>
 
        * gcc.dg/cpp/assert4.c:  Fix for cygwin