Index: test/SemaCXX/undefined-internal.cpp
===================================================================
--- test/SemaCXX/undefined-internal.cpp	(revision 174484)
+++ test/SemaCXX/undefined-internal.cpp	(working copy)
@@ -231,3 +231,15 @@
     };
   }
 }
+
+namespace test11 {
+  namespace {
+    struct A {
+      virtual bool operator()() const = 0;
+    };
+  }
+
+  void test(A *a) {
+    (*a)();
+  }
+}
Index: lib/Sema/SemaOverload.cpp
===================================================================
--- lib/Sema/SemaOverload.cpp	(revision 174484)
+++ lib/Sema/SemaOverload.cpp	(working copy)
@@ -11071,7 +11071,17 @@
                          RParenLoc);
   }
 
-  MarkFunctionReferenced(LParenLoc, Best->Function);
+  // TODO: update this with DR# once we have one.
+  // C++11 defect. If operator() is pure, then our call isn't an odr use. If
+  // it's virtual then it's already marked odr used elsewhere.
+  bool OdrUse = true;
+  if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Best->Function))
+    if (Method->isVirtual())
+      OdrUse = false;
+  if (OdrUse)
+    MarkFunctionReferenced(LParenLoc, Best->Function);
+  else
+    Best->Function->setReferenced();
   CheckMemberOperatorAccess(LParenLoc, Object.get(), 0, Best->FoundDecl);
   DiagnoseUseOfDecl(Best->FoundDecl, LParenLoc);
 
