More work on diagnosing abstract classes. We can now handle cases like

class C {
  void g(C c);

  virtual void f() = 0;
};

In this case, C is not known to be abstract when doing semantic analysis on g. This is done by recursively traversing the abstract class and checking the types of member functions. 

llvm-svn: 67594
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 271f1da..2abf87b 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -197,8 +197,8 @@
                           diag::err_invalid_incomplete_type_use, FullRange))
     return ExprError();
 
-  if (RequireNonAbstractType(TyBeginLoc, Ty, 
-                             diag::err_allocation_of_abstract_type, 0))
+  if (RequireNonAbstractType(TyBeginLoc, Ty,
+                             diag::err_allocation_of_abstract_type))
     return ExprError();
   
   exprs.release();
@@ -243,7 +243,7 @@
     return ExprError();
 
   if (RequireNonAbstractType(D.getSourceRange().getBegin(), AllocType,
-                             diag::err_allocation_of_abstract_type, 0))
+                             diag::err_allocation_of_abstract_type))
     return ExprError();
   
   QualType ResultType = AllocType->isDependentType()