aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2001-06-05 12:53:52 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2001-06-05 12:53:52 +0000
commitbea09693c9fcd220569bc8c9bbeb0862eaf8daac (patch)
tree8f692d3a97ff18f16f19e7b81c5e5b61d15efcfe /gcc
parent8f7550cae830626a17bad0d31f89a9c6aa6a99f0 (diff)
downloadgcc-bea09693c9fcd220569bc8c9bbeb0862eaf8daac.zip
gcc-bea09693c9fcd220569bc8c9bbeb0862eaf8daac.tar.gz
gcc-bea09693c9fcd220569bc8c9bbeb0862eaf8daac.tar.bz2
call.c (build_user_type_conversion_1): Set ICS_USER_FLAG and ICS_BAD_FLAG on created conversion.
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/call.c16
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/conv7.C45
4 files changed, 66 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 970f787..f4e08d6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 5367cc5..f2478ed 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 14ca76f..0732fb3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..0a7e76d
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.other/conv7.C
@@ -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;
+}