Index: include/clang/AST/PrettyPrinter.h
===================================================================
--- include/clang/AST/PrettyPrinter.h	(revision 181029)
+++ include/clang/AST/PrettyPrinter.h	(working copy)
@@ -41,7 +41,7 @@
       ConstantArraySizeAsWritten(false), AnonymousTagLocations(true),
       SuppressStrongLifetime(false), Bool(LO.Bool),
       TerseOutput(false), PolishForDeclaration(false),
-      MSWChar(LO.MicrosoftMode && !LO.WChar) { }
+      MSWChar(LO.MicrosoftMode && !LO.WChar), SuppressImplicitCasts(false) { }
 
   /// \brief What language we're printing.
   LangOptions LangOpts;
@@ -151,6 +151,10 @@
   /// \brief When true, print the built-in wchar_t type as __wchar_t. For use in
   /// Microsoft mode when wchar_t is not available.
   unsigned MSWChar : 1;
+  
+  /// \brief Suppress printing implicit casts.
+  ///
+  unsigned SuppressImplicitCasts : 1;
 };
 
 } // end namespace clang
Index: unittests/AST/StmtPrinterTest.cpp
===================================================================
--- unittests/AST/StmtPrinterTest.cpp	(revision 181029)
+++ unittests/AST/StmtPrinterTest.cpp	(working copy)
@@ -33,6 +33,7 @@
 
 void PrintStmt(raw_ostream &Out, const ASTContext *Context, const Stmt *S) {
   PrintingPolicy Policy = Context->getPrintingPolicy();
+  Policy.SuppressImplicitCasts = true;
   S->printPretty(Out, /*Helper*/ 0, Policy);
 }
 
@@ -163,3 +164,18 @@
     "1.F , -1.F , 1. , -1. , 1.L , -1.L"));
     // Should be: with semicolon
 }
+
+TEST(StmtPrinter, TestSuppressImplicitCast) {
+  ASSERT_TRUE(PrintedStmtCXX98Matches(
+    "struct Z {"
+    "  operator int();"
+    "};"
+    "Z z;"
+    "int i;"
+    "void A() {"
+    "  i = z;"
+    "}",
+    "A",
+    "i = z"));
+    // Should be: with semicolon
+}
Index: lib/AST/StmtPrinter.cpp
===================================================================
--- lib/AST/StmtPrinter.cpp	(revision 181029)
+++ lib/AST/StmtPrinter.cpp	(working copy)
@@ -958,7 +958,11 @@
 }
 void StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) {
   // No need to print anything, simply forward to the sub expression.
-  PrintExpr(Node->getSubExpr());
+  Expr *SubExpr = Node->getSubExpr();
+  if (Policy.SuppressImplicitCasts)
+      if (CXXMemberCallExpr *P = dyn_cast<CXXMemberCallExpr>(SubExpr))
+        SubExpr = P->getImplicitObjectArgument();
+  PrintExpr(SubExpr);
 }
 void StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) {
   PrintExpr(Node->getLHS());
