Index: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td	(revision 183634)
+++ include/clang/Basic/DiagnosticSemaKinds.td	(working copy)
@@ -3534,6 +3534,9 @@
   
 def err_redefinition_of_enumerator : Error<"redefinition of enumerator %0">;
 def err_duplicate_member : Error<"duplicate member %0">;
+def ext_redeclaration_of_declared_member_class : ExtWarn<
+  "ISO C++ forbids redeclaration of member class %0">,
+  InGroup<DiagGroup<"member-class-redeclared">>;
 def err_misplaced_ivar : Error<
   "instance variables may not be placed in %select{categories|class extension}0">;
 def warn_ivars_in_interface : Warning<
Index: www/cxx_dr_status.html
===================================================================
--- www/cxx_dr_status.html	(revision 183634)
+++ www/cxx_dr_status.html	(working copy)
@@ -548,7 +548,7 @@
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#85">85</a></td>
     <td>TC1</td>
     <td>Redeclaration of member class</td>
-    <td class="none" align="center">No</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#86">86</a></td>
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp	(revision 183634)
+++ lib/Sema/SemaDecl.cpp	(working copy)
@@ -9892,6 +9892,17 @@
             return TUK == TUK_Declaration ? PrevTagDecl : 0;
         }
 
+        // C++11 [class.mem]p1:
+        //   A member shall not be declared twice in the member-speciﬁcation,
+        //   except that a nested class or member class template can be declared
+        //   and then later defined.
+        if (isClassCompatTagKind(Kind) && S->isDeclScope(PrevDecl) &&
+            PrevDecl->isCXXClassMember() && TUK == TUK_Declaration) {
+          Diag(NameLoc, diag::ext_redeclaration_of_declared_member_class)
+            << Name;
+          Diag(PrevTagDecl->getLocation(), diag::note_previous_declaration);
+        }
+
         if (!Invalid) {
           // If this is a use, just return the declaration we found.
 
Index: test/CXX/drs/dr0xx.cpp
===================================================================
--- test/CXX/drs/dr0xx.cpp	(revision 183634)
+++ test/CXX/drs/dr0xx.cpp	(working copy)
@@ -862,15 +861,11 @@
   B b = a; // expected-error {{no viable}}
 }
 
-namespace dr85 { // dr85: no
+namespace dr85 { // dr85: yes
   struct A {
     struct B;
-    struct B {};
-    // FIXME: This redeclaration is invalid. Per [class.mem]p1,
-    //   "A member shall not be declared twice in the member-specification,
-    //   except that a nested class [...] can be declared then later defined"
-    // This is not that case.
-    struct B;
+    struct B {}; // expected-note{{previous declaration is here}}
+    struct B; // expected-error{{ISO C++ forbids redeclaration of member class 'B'}}
   };
 }
 
Index: test/SemaCXX/access.cpp
===================================================================
--- test/SemaCXX/access.cpp	(revision 183634)
+++ test/SemaCXX/access.cpp	(working copy)
@@ -26,9 +26,11 @@
 namespace test1 {
   class A {
   private:
-    class X; // expected-note {{previously declared 'private' here}}
+    class X; // expected-note {{previously declared 'private' here}} \
+             // expected-note {{previous declaration is here}}
   public:
-    class X; // expected-error {{'X' redeclared with 'public' access}}
+    class X; // expected-error {{'X' redeclared with 'public' access}} \
+             // expected-warning {{ISO C++ forbids redeclaration of member class 'X'}}
     class X {};
   };
 }
Index: test/SemaTemplate/instantiate-member-class.cpp
===================================================================
--- test/SemaTemplate/instantiate-member-class.cpp	(revision 183634)
+++ test/SemaTemplate/instantiate-member-class.cpp	(working copy)
@@ -91,13 +91,11 @@
       typedef int X;
     };
     typename Foo::X x;
-    class Foo;
   };
   template class B<int>;
 
   template <typename T> class C {
     class Foo;
-    class Foo;
   };
   template <typename T> class C<T>::Foo {
     int x;
Index: test/SemaTemplate/dependent-names.cpp
===================================================================
--- test/SemaTemplate/dependent-names.cpp	(revision 183634)
+++ test/SemaTemplate/dependent-names.cpp	(working copy)
@@ -354,7 +354,6 @@
     struct A : public B {  // expected-note{{'rdar12629723::X::A' declared here}}
       virtual void foo() { }
     };
-    struct B;
 
     struct D : T::foo { };
     struct E : D { };
