Centralize error reporting of improper uses of incomplete types in the
new DiagnoseIncompleteType. It provides additional information about
struct/class/union/enum types when possible, either by pointing to the
forward declaration of that type or by pointing to the definition (if
we're in the process of defining that type). 
Fixes <rdar://problem/6500531>.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62521 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index 09db18e..8958221 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -172,9 +172,10 @@
   //
   if (Ty->isArrayType())
     return Diag(TyBeginLoc, diag::err_value_init_for_array_type) << FullRange;
-  if (!Ty->isDependentType() && Ty->isIncompleteType() && !Ty->isVoidType())
-    return Diag(TyBeginLoc, diag::err_invalid_incomplete_type_use) 
-             << Ty << FullRange;
+  if (!Ty->isDependentType() && !Ty->isVoidType() &&
+      DiagnoseIncompleteType(TyBeginLoc, Ty, 
+                             diag::err_invalid_incomplete_type_use, FullRange))
+    return true;
 
   return new CXXZeroInitValueExpr(Ty, TyBeginLoc, RParenLoc);
 }
@@ -578,9 +579,10 @@
   }
 
   QualType Pointee = Type->getAsPointerType()->getPointeeType();
-  if (Pointee->isIncompleteType() && !Pointee->isVoidType())
-    Diag(StartLoc, diag::warn_delete_incomplete)
-      << Pointee << Ex->getSourceRange();
+  if (!Pointee->isVoidType() && 
+      DiagnoseIncompleteType(StartLoc, Pointee, diag::warn_delete_incomplete,
+                             Ex->getSourceRange()))
+    return true;
   else if (!Pointee->isObjectType()) {
     Diag(StartLoc, diag::err_delete_operand)
       << Type << Ex->getSourceRange();