Index: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td	(revision 113137)
+++ include/clang/Basic/DiagnosticSemaKinds.td	(working copy)
@@ -1780,6 +1780,8 @@
   "ISO C forbids forward references to 'enum' types">;
 def err_forward_ref_enum : Error<
   "ISO C++ forbids forward references to 'enum' types">;
+def ext_ms_forward_ref_enum : Extension<
+  "forward references to 'enum' types are a MSVC extension">;
 def ext_forward_ref_enum_def : Extension<
   "redeclaration of already-defined enum %0 is a GNU extension">, InGroup<GNU>;
   
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp	(revision 113137)
+++ lib/Sema/SemaDecl.cpp	(working copy)
@@ -5702,9 +5702,12 @@
           << New;
         Diag(Def->getLocation(), diag::note_previous_definition);
       } else {
-        Diag(Loc, 
-             getLangOptions().CPlusPlus? diag::err_forward_ref_enum
-                                       : diag::ext_forward_ref_enum);
+        unsigned DiagID = diag::ext_forward_ref_enum;
+        if (getLangOptions().Microsoft)
+          DiagID = diag::ext_ms_forward_ref_enum;
+        else if (getLangOptions().CPlusPlus)
+          DiagID = diag::err_forward_ref_enum;
+        Diag(Loc, DiagID);
       }
     }
   } else {
Index: test/SemaCXX/MicrosoftExtensions.cpp
===================================================================
--- test/SemaCXX/MicrosoftExtensions.cpp	(revision 113137)
+++ test/SemaCXX/MicrosoftExtensions.cpp	(working copy)
@@ -42,3 +42,7 @@
   h1<int>(&M::addP);
   h1(&M::subtractP);
 } 
+
+//MSVC allows forward enum declaration
+enum ENUM;
+ENUM *var;     
