From 6add7e946e2254cbc23517a5b6ace896515efd45 Mon Sep 17 00:00:00 2001
From: Paolo Carlini <paolo.carlini@oracle.com>
Date: Tue, 3 May 2011 18:30:37 +0000
Subject: [PATCH] re PR c++/28501 (ICE with __real__ and implicit type
 conversion)

/cp
2011-05-03  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/28501
	* call.c (add_builtin_candidate): Handle REALPART_EXPR and
	IMAGPART_EXPR.

/testsuite
2011-05-03  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/28501
	* g++.dg/ext/complex9.C: New.

From-SVN: r173337
---
 gcc/cp/ChangeLog                    | 6 ++++++
 gcc/cp/call.c                       | 9 ++++++++-
 gcc/testsuite/ChangeLog             | 5 +++++
 gcc/testsuite/g++.dg/ext/complex9.C | 8 ++++++++
 4 files changed, 27 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/ext/complex9.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e44ff10d9fbd..dccd76512225 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2011-05-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	PR c++/28501
+	* call.c (add_builtin_candidate): Handle REALPART_EXPR and
+	IMAGPART_EXPR.
+
 2011-05-02  Lawrence Crowl  <crowl@google.com>
 
 	* decl.c: (push_local_name): Change TV_NAME_LOOKUP to start/stop.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 4dbcce922ee5..f5bd521ddaa5 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -1,6 +1,7 @@
 /* Functions related to invoking methods and overloaded functions.
    Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+   2010, 2011
    Free Software Foundation, Inc.
    Contributed by Michael Tiemann (tiemann@cygnus.com) and
    modified by Brendan Kehoe (brendan@cygnus.com).
@@ -2586,6 +2587,12 @@ add_builtin_candidate (struct z_candidate **candidates, enum tree_code code,
 	 types are TYPE2.  */
       break;
 
+    case REALPART_EXPR:
+    case IMAGPART_EXPR:
+      if (ARITHMETIC_TYPE_P (type1))
+	break;
+      return;
+ 
     default:
       gcc_unreachable ();
     }
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a796f4fc2190..332b2092bbd7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-05-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	PR c++/28501
+	* g++.dg/ext/complex9.C: New.
+
 2011-05-03  Stuart Henderson  <shenders@gcc.gnu.org>
 
 	From Mike Frysinger
diff --git a/gcc/testsuite/g++.dg/ext/complex9.C b/gcc/testsuite/g++.dg/ext/complex9.C
new file mode 100644
index 000000000000..5bb1625c9fb2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/complex9.C
@@ -0,0 +1,8 @@
+// PR c++/28501
+
+struct A
+{
+  operator int();
+};
+
+int i = __real__ A();
-- 
GitLab