Index: test/SemaCXX/exception-spec-ms.cpp
===================================================================
--- test/SemaCXX/exception-spec-ms.cpp	(revision 0)
+++ test/SemaCXX/exception-spec-ms.cpp	(revision 0)
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -fsyntax-only -fexceptions -fms-extensions -verify %s
+
+// The following three are all equivalent when ms-extensions are on
+void foo() throw(int);
+void foo() throw(int, long);
+void foo() throw(...); 
+void foo(); // expected-note {{previous declaration}}
+
+// Only nothrow specification is treated specially.
+void foo() throw(); // expected-error {{exception specification in declaration does not match previous declaration}}
Index: lib/Sema/SemaExceptionSpec.cpp
===================================================================
--- lib/Sema/SemaExceptionSpec.cpp	(revision 112362)
+++ lib/Sema/SemaExceptionSpec.cpp	(working copy)
@@ -261,6 +261,14 @@
 
   bool OldAny = !Old->hasExceptionSpec() || Old->hasAnyExceptionSpec();
   bool NewAny = !New->hasExceptionSpec() || New->hasAnyExceptionSpec();
+  if (getLangOptions().Microsoft) {
+    // Treat throw(whatever) as throw(...) to be compatible with MS headers.
+    if (New->hasExceptionSpec() && New->getNumExceptions() > 0)
+      NewAny = true;
+    if (Old->hasExceptionSpec() && Old->getNumExceptions() > 0)
+      OldAny = true;
+  }
+
   if (OldAny && NewAny)
     return false;
   if (OldAny || NewAny) {
