Index: test/CXX/temp/temp.param/p15-ms.cpp
===================================================================
--- test/CXX/temp/temp.param/p15-ms.cpp	(revision 0)
+++ test/CXX/temp/temp.param/p15-ms.cpp	(working copy)
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++98 -fms-compatibility -Wc++98-compat -verify %s
+template<typename T> struct X;
+template<int I> struct Y;
+
+X<X<int> > *x1;
+X<X<int>> *x2; // expected-warning{{consecutive right angle brackets are incompatible with C++98 (use '> >')}}
+
+X<X<X<X<int>> // expected-warning{{consecutive right angle brackets are incompatible with C++98 (use '> >')}}
+    >> *x3;   // expected-warning{{consecutive right angle brackets are incompatible with C++98 (use '> >')}}
+
+Y<(1 >> 2)> *y1;
+Y<1 >> 2> *y2; // expected-warning{{use of right-shift operator ('>>') in template argument will require parentheses in C++11}}
Index: lib/Parse/ParseTemplate.cpp
===================================================================
--- lib/Parse/ParseTemplate.cpp	(revision 162990)
+++ lib/Parse/ParseTemplate.cpp	(working copy)
@@ -788,7 +788,8 @@
     Hint2 = FixItHint::CreateInsertion(Next.getLocation(), " ");
 
   unsigned DiagId = diag::err_two_right_angle_brackets_need_space;
-  if (getLangOpts().CPlusPlus0x && Tok.is(tok::greatergreater))
+  if ((getLangOpts().CPlusPlus0x || getLangOpts().MicrosoftMode)
+      && Tok.is(tok::greatergreater))
     DiagId = diag::warn_cxx98_compat_two_right_angle_brackets;
   else if (Tok.is(tok::greaterequal))
     DiagId = diag::err_right_angle_bracket_equal_needs_space;
