Bug #1648179:  set.update() not recognizing __iter__ overrides in dict subclasses.
diff --git a/Misc/NEWS b/Misc/NEWS
index ff8a082..303f4cf 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -16,6 +16,9 @@
   a weakref on itself during a __del__ call for new-style classes (classic
   classes still have the bug).
 
+- Bug #1648179:  set.update() did not recognize an overridden __iter__ 
+  method in subclasses of dict.
+
 - Bug #1579370: Make PyTraceBack_Here use the current thread, not the
   frame's thread state.
 
diff --git a/Objects/setobject.c b/Objects/setobject.c
index f038ee3..5b5fb3d 100644
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -915,7 +915,7 @@
 	if (PyAnySet_Check(other))
 		return set_merge(so, other);
 
-	if (PyDict_Check(other)) {
+	if (PyDict_CheckExact(other)) {
 		PyObject *value;
 		Py_ssize_t pos = 0;
 		while (PyDict_Next(other, &pos, &key, &value)) {
@@ -1363,7 +1363,7 @@
 	setentry *entry;
 	Py_ssize_t pos = 0;
 
-	if (!PyAnySet_Check(other)  && !PyDict_Check(other)) {
+	if (!PyAnySet_Check(other)  && !PyDict_CheckExact(other)) {
 		result = set_copy(so);
 		if (result == NULL)
 			return NULL;
@@ -1377,7 +1377,7 @@
 	if (result == NULL)
 		return NULL;
 
-	if (PyDict_Check(other)) {
+	if (PyDict_CheckExact(other)) {
 		while (set_next(so, &pos, &entry)) {
 			setentry entrycopy;
 			entrycopy.hash = entry->hash;
@@ -1450,7 +1450,7 @@
 	if ((PyObject *)so == other)
 		return set_clear(so);
 
-	if (PyDict_Check(other)) {
+	if (PyDict_CheckExact(other)) {
 		PyObject *value;
 		int rv;
 		while (PyDict_Next(other, &pos, &key, &value)) {