This patch does the following.
1) Issue digsnostics in non-fragile ABI, when an expression
   evaluates to an interface type (except when it is used to
   access a non-fragile ivar).
2) Issue unsupported error in fragile ABI when an expression
   evaluates to an interface type (except when it is used to
   access a fragile ivar).

llvm-svn: 80860
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp
index ae59aec..7611310 100644
--- a/clang/lib/Sema/SemaStmt.cpp
+++ b/clang/lib/Sema/SemaStmt.cpp
@@ -26,7 +26,15 @@
 Sema::OwningStmtResult Sema::ActOnExprStmt(FullExprArg expr) {
   Expr *E = expr->takeAs<Expr>();
   assert(E && "ActOnExprStmt(): missing expression");
-
+  if (E->getType()->isObjCInterfaceType()) {
+    if (LangOpts.ObjCNonFragileABI)
+      Diag(E->getLocEnd(), diag::err_indirection_requires_nonfragile_object)
+             << E->getType();
+    else
+      Diag(E->getLocEnd(), diag::err_direct_interface_unsupported)
+             << E->getType();
+    return StmtError();
+  }
   // C99 6.8.3p2: The expression in an expression statement is evaluated as a
   // void expression for its side effects.  Conversion to void allows any
   // operand, even incomplete types.