call.c (build_user_type_conversion_1): Set ICS_USER_FLAG and ICS_BAD_FLAG on created...
authorNathan Sidwell <nathan@codesourcery.com>
Tue, 5 Jun 2001 12:53:52 +0000 (12:53 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 5 Jun 2001 12:53:52 +0000 (12:53 +0000)
cp:
* call.c (build_user_type_conversion_1): Set ICS_USER_FLAG and
ICS_BAD_FLAG on created conversion.
(compare_ics): Break out rank.
testsuite:
* g++.old-deja/g++.other/conv7.C: New test.

From-SVN: r42907

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.other/conv7.C [new file with mode: 0644]

index 970f787..f4e08d6 100644 (file)
@@ -1,5 +1,11 @@
 2001-06-05  Nathan Sidwell  <nathan@codesourcery.com>
 
+       * call.c (build_user_type_conversion_1): Set ICS_USER_FLAG and
+       ICS_BAD_FLAG on created conversion.
+       (compare_ics): Break out rank.
+
+2001-06-05  Nathan Sidwell  <nathan@codesourcery.com>
+
        * decl.c (xref_tag): Remove extraneous %s on dependent name
        lookup warning.
 
index 5367cc5..f2478ed 100644 (file)
@@ -2521,9 +2521,10 @@ build_user_type_conversion_1 (totype, expr, flags)
      (DECL_CONSTRUCTOR_P (cand->fn)
       ? totype : non_reference (TREE_TYPE (TREE_TYPE (cand->fn)))),
      expr, build_ptr_wrapper (cand));
-  ICS_USER_FLAG (cand->second_conv) = 1;
+  
+  ICS_USER_FLAG (cand->second_conv) = ICS_USER_FLAG (*p) = 1;
   if (cand->viable == -1)
-    ICS_BAD_FLAG (cand->second_conv) = 1;
+    ICS_BAD_FLAG (cand->second_conv) = ICS_BAD_FLAG (*p) = 1;
 
   return cand;
 }
@@ -4799,6 +4800,7 @@ compare_ics (ics1, ics2)
   tree deref_from_type2 = NULL_TREE;
   tree deref_to_type1 = NULL_TREE;
   tree deref_to_type2 = NULL_TREE;
+  int rank1, rank2;
 
   /* REF_BINDING is non-zero if the result of the conversion sequence
      is a reference type.   In that case TARGET_TYPE is the
@@ -4828,13 +4830,17 @@ compare_ics (ics1, ics2)
      --a user-defined conversion sequence (_over.ics.user_) is a
        better conversion sequence than an ellipsis conversion sequence
        (_over.ics.ellipsis_).  */
-  if (ICS_RANK (ics1) > ICS_RANK (ics2))
+  rank1 = ICS_RANK (ics1);
+  rank2 = ICS_RANK (ics2);
+  
+  if (rank1 > rank2)
     return -1;
-  else if (ICS_RANK (ics1) < ICS_RANK (ics2))
+  else if (rank1 < rank2)
     return 1;
 
-  if (ICS_RANK (ics1) == BAD_RANK)
+  if (rank1 == BAD_RANK)
     {
+      /* XXX Isn't this an extension? */
       /* Both ICS are bad.  We try to make a decision based on what
         would have happenned if they'd been good.  */
       if (ICS_USER_FLAG (ics1) > ICS_USER_FLAG (ics2)
index 14ca76f..0732fb3 100644 (file)
@@ -1,3 +1,7 @@
+2001-06-05  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.old-deja/g++.other/conv7.C: New test.
+
 2001-06-05  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * gcc.c-torture/compile/20010605-2.c: New test.
diff --git a/gcc/testsuite/g++.old-deja/g++.other/conv7.C b/gcc/testsuite/g++.old-deja/g++.other/conv7.C
new file mode 100644 (file)
index 0000000..0a7e76d
--- /dev/null
@@ -0,0 +1,45 @@
+// Build don't link:
+// 
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 5 May 2001 <nathan@codesourcery.com>
+
+// Bug 2726. We ICE'd trying to say something about possibly confusing
+// conversion overload resolution.
+
+class foo
+{
+};
+
+template<class T>
+class bar
+{
+public:
+    operator const T&() const ;
+    operator T&() ;
+
+};
+
+
+template<class T, class Ref, class NodePtr, class ListPtr>
+class iterator_template
+{
+public:
+    iterator_template();
+    Ref operator*() const;
+
+};
+
+struct IdlDeclarator
+{
+};
+
+typedef bar< IdlDeclarator > IdlDeclarator_bar;
+int
+yyparse()
+
+{
+
+  iterator_template<IdlDeclarator_bar,IdlDeclarator_bar&,foo*,foo*> declIter;
+  const IdlDeclarator& declarator = *declIter; // WARNING - choosing
+  return 1;
+}