complex() was the only numeric constructor that created a new instance
when given its own type as an argument.
diff --git a/Lib/test/test_b1.py b/Lib/test/test_b1.py
index d80767b..5536246 100644
--- a/Lib/test/test_b1.py
+++ b/Lib/test/test_b1.py
@@ -140,6 +140,10 @@
 if complex("1") != 1+0j: raise TestFailed, 'complex("1")'
 if complex("1j") != 1j: raise TestFailed, 'complex("1j")'
 
+c = 3.14 + 1j
+if complex(c) is not c: raise TestFailed, 'complex(3.14+1j) changed identity'
+del c
+
 try: complex("1", "1")
 except TypeError: pass
 else: raise TestFailed, 'complex("1", "1")'
diff --git a/Objects/complexobject.c b/Objects/complexobject.c
index bb28354..56638d5 100644
--- a/Objects/complexobject.c
+++ b/Objects/complexobject.c
@@ -823,6 +823,15 @@
 	if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
 					 &r, &i))
 		return NULL;
+
+	/* Special-case for single argumet that is already complex */
+	if (PyComplex_CheckExact(r) && i == NULL) {
+		/* Note that we can't know whether it's safe to return
+		   a complex *subclass* instance as-is, hence the restriction
+		   to exact complexes here.  */
+		Py_INCREF(r);
+		return r;
+	}
 	if (PyString_Check(r) || PyUnicode_Check(r)) {
 		if (i != NULL) {
 			PyErr_SetString(PyExc_TypeError,