OSDN Git Service

* call.c (standard_conversion): Fix multi-level ptr conversions.
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 14 Feb 1998 15:49:20 +0000 (15:49 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 14 Feb 1998 15:49:20 +0000 (15:49 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@17999 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/pt.c

index bf10132..bd3003f 100644 (file)
@@ -1,6 +1,6 @@
-Fri Feb 13 14:30:35 1998  Jason Merrill  <jason@yorick.cygnus.com>
+Fri Feb 13 14:55:37 1998  Jason Merrill  <jason@yorick.cygnus.com>
 
-       * pt.c (determine_specialization): Give better errors.
+       * call.c (standard_conversion): Fix multi-level ptr conversions.
 
 Fri Feb 13 14:06:22 1998  Mike Stump  <mrs@wrs.com>
 
index 424bfd5..8853ba3 100644 (file)
@@ -3107,19 +3107,15 @@ standard_conversion (to, from, expr)
     {
       enum tree_code ufcode = TREE_CODE (TREE_TYPE (from));
       enum tree_code utcode = TREE_CODE (TREE_TYPE (to));
-      tree nconv = NULL_TREE;
 
-      if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (from)),
-                    TYPE_MAIN_VARIANT (TREE_TYPE (to)), 1))
-       nconv = conv;
-      else if (utcode == VOID_TYPE && ufcode != OFFSET_TYPE
-              && ufcode != FUNCTION_TYPE)
+      if (utcode == VOID_TYPE && ufcode != OFFSET_TYPE
+         && ufcode != FUNCTION_TYPE)
        {
          from = build_pointer_type
            (cp_build_type_variant (void_type_node,
                                    TYPE_READONLY (TREE_TYPE (from)),
                                    TYPE_VOLATILE (TREE_TYPE (from))));
-         nconv = build_conv (PTR_CONV, from, conv);
+         conv = build_conv (PTR_CONV, from, conv);
        }
       else if (ufcode == OFFSET_TYPE && utcode == OFFSET_TYPE)
        {
@@ -3133,7 +3129,7 @@ standard_conversion (to, from, expr)
            {
              from = build_offset_type (tbase, TREE_TYPE (TREE_TYPE (from)));
              from = build_pointer_type (from);
-             nconv = build_conv (PMEM_CONV, from, conv);
+             conv = build_conv (PMEM_CONV, from, conv);
            }
        }
       else if (IS_AGGR_TYPE (TREE_TYPE (from))
@@ -3145,14 +3141,14 @@ standard_conversion (to, from, expr)
                                            TYPE_READONLY (TREE_TYPE (from)),
                                            TYPE_VOLATILE (TREE_TYPE (from)));
              from = build_pointer_type (from);
-             nconv = build_conv (PTR_CONV, from, conv);
+             conv = build_conv (PTR_CONV, from, conv);
            }
        }
 
-      if (nconv && comptypes (from, to, 1))
-       conv = nconv;
-      else if (nconv && comp_ptr_ttypes (TREE_TYPE (to), TREE_TYPE (from)))
-       conv = build_conv (QUAL_CONV, to, nconv);
+      if (comptypes (from, to, 1))
+       /* OK */;
+      else if (comp_ptr_ttypes (TREE_TYPE (to), TREE_TYPE (from)))
+       conv = build_conv (QUAL_CONV, to, conv);
       else if (ptr_reasonably_similar (TREE_TYPE (to), TREE_TYPE (from)))
        {
          conv = build_conv (PTR_CONV, to, conv);
index a96b534..e4fa8bb 100644 (file)
@@ -519,15 +519,7 @@ determine_specialization (template_id, decl, targs_out,
        tmpl = DECL_TI_TEMPLATE (fn);
       else if (TREE_CODE (fn) != TEMPLATE_DECL
               || (need_member_template && !is_member_template (fn)))
-       {
-         if (decls_match (decl, fn) && 0)
-           {
-             cp_error ("`template <>' applied to non-specialization `%D'",
-                       fn);
-             return NULL_TREE;
-           }
-         continue;
-       }
+       continue;
       else
        tmpl = fn;
 
@@ -572,7 +564,8 @@ determine_specialization (template_id, decl, targs_out,
     {
     no_match:
       if (complain)
-       cp_error ("`%D' does not match any template declaration", decl);
+       cp_error ("`%D' does not match any template declaration",
+                 template_id);
       
       return NULL_TREE;
     }
@@ -581,7 +574,8 @@ determine_specialization (template_id, decl, targs_out,
     ambiguous:
       if (complain)
        {
-         cp_error ("ambiguous template specialization `%D'", decl);
+         cp_error ("ambiguous template specialization `%D'",
+                   template_id);
          print_candidates (templates);
        }
       return NULL_TREE;