From e8fe69c33b9164dabea5d77c80c03090a58e8ced Mon Sep 17 00:00:00 2001
From: mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 3 Nov 2005 01:25:13 +0000
Subject: [PATCH] 	PR c++/22434 	* call.c (build_conditional_expr): Do
 bad conversions, if there's 	no other choice. 	PR c++/22434 	*
 g++.dg/expr/cond8.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@106418 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/cp/ChangeLog                  |  4 ++++
 gcc/cp/call.c                     |  4 ++--
 gcc/testsuite/ChangeLog           |  3 +++
 gcc/testsuite/g++.dg/expr/cond8.C | 13 +++++++++++++
 4 files changed, 22 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/expr/cond8.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 8d2ab78a2140..eb52015cab77 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
 2005-11-02  Mark Mitchell  <mark@codesourcery.com>
 
+	PR c++/22434
+	* call.c (build_conditional_expr): Do bad conversions, if there's
+	no other choice.
+
 	PR c++/24560
 	* parser.c (cp_parser_postfix_dot_deref_expression): Improve error
 	message for use of overloaded functions on LHS of "." operator.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 77cbe2a5ae51..99b8bcbee155 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -3281,13 +3281,13 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
 	  error ("operands to ?: have different types");
 	  result = error_mark_node;
 	}
-      else if (conv2 && !conv2->bad_p)
+      else if (conv2 && (!conv2->bad_p || !conv3))
 	{
 	  arg2 = convert_like (conv2, arg2);
 	  arg2 = convert_from_reference (arg2);
 	  arg2_type = TREE_TYPE (arg2);
 	}
-      else if (conv3 && !conv3->bad_p)
+      else if (conv3 && (!conv3->bad_p || !conv2))
 	{
 	  arg3 = convert_like (conv3, arg3);
 	  arg3 = convert_from_reference (arg3);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e71f25cbdc8d..b52603ba2ccf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
 2005-11-02  Mark Mitchell  <mark@codesourcery.com>
 
+	PR c++/22434
+	* g++.dg/expr/cond8.C: New test.
+
 	PR c++/24560
 	* g++.dg/parse/dot1.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/expr/cond8.C b/gcc/testsuite/g++.dg/expr/cond8.C
new file mode 100644
index 000000000000..f05c81a26ce7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/expr/cond8.C
@@ -0,0 +1,13 @@
+// PR c++/22434
+// { dg-options "" }
+
+struct A
+{
+  A(void*);
+  ~A();
+};
+
+void foo(const int i, bool b)
+{
+  b ? A(0) : i; // { dg-error "conversion|initializing" } 
+}
-- 
GitLab