Index: lib/Sema/SemaExpr.cpp
===================================================================
--- lib/Sema/SemaExpr.cpp	(revision 183595)
+++ lib/Sema/SemaExpr.cpp	(working copy)
@@ -8309,7 +8309,12 @@
           << OrigOp.get()->getSourceRange();
         return QualType();
       }
-                  
+      if (isa<UnresolvedMemberExpr>(OrigOp.get()->IgnoreParens())) {
+        S.Diag(OpLoc, diag::err_invalid_form_pointer_member_function)
+          << OrigOp.get()->getSourceRange();
+        return QualType();
+      }
+
       return S.Context.OverloadTy;
     }
 
Index: test/SemaTemplate/instantiate-overload-candidates.cpp
===================================================================
--- test/SemaTemplate/instantiate-overload-candidates.cpp	(revision 183595)
+++ test/SemaTemplate/instantiate-overload-candidates.cpp	(working copy)
@@ -23,10 +23,10 @@
 // Ensure that we instantiate an overloaded function if it's selected by
 // overload resolution when initializing a function pointer.
 template<typename T> struct X {
-  static T f() { T::error; } // expected-error {{has no members}}
-  static T f(bool);
+  T f() { T::error; } // expected-error {{has no members}}
+  T f(bool);
 };
-void (*p)() = &X<void>().f; // expected-note {{instantiation of}}
+void (X<void>::*p)() = &X<void>::f; // expected-note {{instantiation of}}
 
 namespace PR13098 {
   struct A {
Index: test/CXX/over/over.over/p2-resolve-single-template-id.cpp
===================================================================
--- test/CXX/over/over.over/p2-resolve-single-template-id.cpp	(revision 183595)
+++ test/CXX/over/over.over/p2-resolve-single-template-id.cpp	(working copy)
@@ -128,8 +128,8 @@
     template <typename T> bool f(T) { return false; } // expected-note 4 {{possible target for call}}
     template <typename T> static bool g(T) { return false; }
 
-    template <typename T> bool h(T) { return false; }  // expected-note 3 {{possible target for call}}
-    template <int N> static bool h(int) { return false; } // expected-note 3 {{possible target for call}}
+    template <typename T> bool h(T) { return false; }  // expected-note 2 {{possible target for call}}
+    template <int N> static bool h(int) { return false; } // expected-note 2 {{possible target for call}}
   };
 
   void test(S s) {
@@ -148,8 +148,8 @@
     if (&S::g<int>) return;
     if (s.g<char>) return;
     if (s.g<int>) return;
-    if (&s.g<char>) return;
-    if (&s.g<int>) return;
+    if (&s.g<char>) return; // expected-error {{cannot create a non-constant pointer to member function}}
+    if (&s.g<int>) return; // expected-error {{cannot create a non-constant pointer to member function}}
 
     if (S::h<42>) return;
     if (S::h<int>) return; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}}
@@ -157,8 +157,8 @@
     if (&S::h<int>) return;
     if (s.h<42>) return;
     if (s.h<int>) return; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}}
-    if (&s.h<42>) return;
-    if (&s.h<int>) return; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}}
+    if (&s.h<42>) return; // expected-error {{cannot create a non-constant pointer to member function}}
+    if (&s.h<int>) return; // expected-error {{cannot create a non-constant pointer to member function}}
 
     { bool b = S::f<char>; } // expected-error {{call to non-static member function without an object argument}}
     { bool b = S::f<int>; } // expected-error {{call to non-static member function without an object argument}}
@@ -176,8 +176,8 @@
     { bool b = &S::g<int>; }
     { bool b = s.g<char>; }
     { bool b = s.g<int>; }
-    { bool b = &s.g<char>; }
-    { bool b = &s.g<int>; }
+    { bool b = &s.g<char>; } // expected-error {{cannot create a non-constant pointer to member function}}
+    { bool b = &s.g<int>; } // expected-error {{cannot create a non-constant pointer to member function}}
 
     { bool b = S::h<42>; }
     { bool b = S::h<int>; } // expected-error {{can't form member pointer of type 'bool' without '&' and class name}}
@@ -185,7 +185,7 @@
     { bool b = &S::h<int>; }
     { bool b = s.h<42>; }
     { bool b = s.h<int>; } // expected-error {{can't form member pointer of type 'bool' without '&' and class name}}
-    { bool b = &s.h<42>; }
-    { bool b = &s.h<int>; } // expected-error {{can't form member pointer of type 'bool' without '&' and class name}}
+    { bool b = &s.h<42>; } // expected-error {{cannot create a non-constant pointer to member function}}
+    { bool b = &s.h<int>; } // expected-error {{cannot create a non-constant pointer to member function}}
   }
 }
Index: test/CXX/expr/expr.unary/expr.unary.op/p4.cpp
===================================================================
--- test/CXX/expr/expr.unary/expr.unary.op/p4.cpp	(revision 183595)
+++ test/CXX/expr/expr.unary/expr.unary.op/p4.cpp	(working copy)
@@ -38,6 +38,6 @@
   };
 
   void A::test() {
-    int (A::*ptr)(int) = &(A::foo); // expected-error {{can't form member pointer of type 'int (test2::A::*)(int)' without '&' and class name}}
+    int (A::*ptr)(int) = &(A::foo); // expected-error {{cannot create a non-constant pointer to member function}}
   }
 }
Index: test/CXX/drs/dr0xx.cpp
===================================================================
--- test/CXX/drs/dr0xx.cpp	(revision 183595)
+++ test/CXX/drs/dr0xx.cpp	(working copy)
@@ -627,7 +627,7 @@
   int &n = f(k);
 }
 
-namespace dr61 { // dr61: no
+namespace dr61 { // dr61: yes
   struct X {
     static void f();
   } x;
@@ -639,7 +639,7 @@
   // function name.
   void (*p)() = &x.f;
   // FIXME: This should be rejected.
-  void (*q)() = &y.f;
+  void (*q)() = &y.f; // expected-error {{cannot create a non-constant pointer to member function}}
 }
 
 namespace dr62 { // dr62: yes
Index: www/cxx_dr_status.html
===================================================================
--- www/cxx_dr_status.html	(revision 183595)
+++ www/cxx_dr_status.html	(working copy)
@@ -80,7 +80,7 @@
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#7">7</a></td>
     <td>NAD</td>
     <td>Can a class with a private virtual base class be derived from?</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#8">8</a></td>
@@ -404,7 +404,7 @@
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#61">61</a></td>
     <td>NAD</td>
     <td>Address of static member function "<TT>&amp;p-&gt;f</TT>"</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#62">62</a></td>
