Add raw_ostream operators to NamedDecl for convenience. Switch over all users of getNameAsString on a stream.

The next step is to print the name directly into the stream, avoiding a temporary std::string copy.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@101632 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp
index d4cc945..fdec2f5 100644
--- a/lib/AST/Decl.cpp
+++ b/lib/AST/Decl.cpp
@@ -512,6 +512,12 @@
   return false;
 }
 
+llvm::raw_ostream &clang::operator<<(llvm::raw_ostream &OS,
+                                     const NamedDecl *ND) {
+  OS << ND->getNameAsString();
+  return OS;
+}
+
 //===----------------------------------------------------------------------===//
 // DeclaratorDecl Implementation
 //===----------------------------------------------------------------------===//
diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp
index db46d89..dc4aacd 100644
--- a/lib/AST/DeclObjC.cpp
+++ b/lib/AST/DeclObjC.cpp
@@ -843,6 +843,12 @@
   return 0;
 }
 
+llvm::raw_ostream &clang::operator<<(llvm::raw_ostream &OS,
+                                     const ObjCCategoryImplDecl *CID) {
+  OS << CID->getName();
+  return OS;
+}
+
 //===----------------------------------------------------------------------===//
 // ObjCImplementationDecl
 //===----------------------------------------------------------------------===//
@@ -855,6 +861,12 @@
   return new (C) ObjCImplementationDecl(DC, L, ClassInterface, SuperDecl);
 }
 
+llvm::raw_ostream &clang::operator<<(llvm::raw_ostream &OS,
+                                     const ObjCImplementationDecl *ID) {
+  OS << ID->getName();
+  return OS;
+}
+
 //===----------------------------------------------------------------------===//
 // ObjCCompatibleAliasDecl
 //===----------------------------------------------------------------------===//
diff --git a/lib/AST/DeclPrinter.cpp b/lib/AST/DeclPrinter.cpp
index a625865..5394924 100644
--- a/lib/AST/DeclPrinter.cpp
+++ b/lib/AST/DeclPrinter.cpp
@@ -301,17 +301,15 @@
 }
 
 void DeclPrinter::VisitEnumDecl(EnumDecl *D) {
-  Out << "enum " << D->getNameAsString() << " {\n";
+  Out << "enum " << D << " {\n";
   VisitDeclContext(D);
   Indent() << "}";
 }
 
 void DeclPrinter::VisitRecordDecl(RecordDecl *D) {
   Out << D->getKindName();
-  if (D->getIdentifier()) {
-    Out << " ";
-    Out << D->getNameAsString();
-  }
+  if (D->getIdentifier())
+    Out << ' ' << D;
 
   if (D->isDefinition()) {
     Out << " {\n";
@@ -321,7 +319,7 @@
 }
 
 void DeclPrinter::VisitEnumConstantDecl(EnumConstantDecl *D) {
-  Out << D->getNameAsString();
+  Out << D;
   if (Expr *Init = D->getInitExpr()) {
     Out << " = ";
     Init->printPretty(Out, Context, 0, Policy, Indentation);
@@ -406,7 +404,7 @@
             Out << ", ";
           if (BMInitializer->isMemberInitializer()) {
             FieldDecl *FD = BMInitializer->getMember();
-            Out <<  FD->getNameAsString();
+            Out << FD;
           } else {
             Out << QualType(BMInitializer->getBaseClass(), 0).getAsString();
           }
@@ -537,7 +535,7 @@
 // C++ declarations
 //----------------------------------------------------------------------------
 void DeclPrinter::VisitNamespaceDecl(NamespaceDecl *D) {
-  Out << "namespace " << D->getNameAsString() << " {\n";
+  Out << "namespace " << D << " {\n";
   VisitDeclContext(D);
   Indent() << "}";
 }
@@ -546,22 +544,20 @@
   Out << "using namespace ";
   if (D->getQualifier())
     D->getQualifier()->print(Out, Policy);
-  Out << D->getNominatedNamespaceAsWritten()->getNameAsString();
+  Out << D->getNominatedNamespaceAsWritten();
 }
 
 void DeclPrinter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
-  Out << "namespace " << D->getNameAsString() << " = ";
+  Out << "namespace " << D << " = ";
   if (D->getQualifier())
     D->getQualifier()->print(Out, Policy);
-  Out << D->getAliasedNamespace()->getNameAsString();
+  Out << D->getAliasedNamespace();
 }
 
 void DeclPrinter::VisitCXXRecordDecl(CXXRecordDecl *D) {
   Out << D->getKindName();
-  if (D->getIdentifier()) {
-    Out << " ";
-    Out << D->getNameAsString();
-  }
+  if (D->getIdentifier())
+    Out << ' ' << D;
 
   if (D->isDefinition()) {
     // Print the base classes
@@ -669,7 +665,7 @@
   for (ObjCClassDecl::iterator I = D->begin(), E = D->end();
        I != E; ++I) {
     if (I != D->begin()) Out << ", ";
-    Out << I->getInterface()->getNameAsString();
+    Out << I->getInterface();
   }
 }
 
@@ -688,8 +684,7 @@
     // FIXME: selector is missing here!
     pos = name.find_first_of(":", lastPos);
     Out << " " << name.substr(lastPos, pos - lastPos);
-    Out << ":(" << (*PI)->getType().getAsString(Policy) << ")"
-        << (*PI)->getNameAsString();
+    Out << ":(" << (*PI)->getType().getAsString(Policy) << ')' << *PI;
     lastPos = pos + 1;
   }
 
@@ -711,7 +706,7 @@
   ObjCInterfaceDecl *SID = OID->getSuperClass();
 
   if (SID)
-    Out << "@implementation " << I << " : " << SID->getNameAsString();
+    Out << "@implementation " << I << " : " << SID;
   else
     Out << "@implementation " << I;
   Out << "\n";
@@ -724,7 +719,7 @@
   ObjCInterfaceDecl *SID = OID->getSuperClass();
 
   if (SID)
-    Out << "@interface " << I << " : " << SID->getNameAsString();
+    Out << "@interface " << I << " : " << SID;
   else
     Out << "@interface " << I;
 
@@ -733,7 +728,7 @@
   if (!Protocols.empty()) {
     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
          E = Protocols.end(); I != E; ++I)
-      Out << (I == Protocols.begin() ? '<' : ',') << (*I)->getNameAsString();
+      Out << (I == Protocols.begin() ? '<' : ',') << *I;
   }
 
   if (!Protocols.empty())
@@ -744,8 +739,7 @@
     Indentation += Policy.Indentation;
     for (ObjCInterfaceDecl::ivar_iterator I = OID->ivar_begin(),
          E = OID->ivar_end(); I != E; ++I) {
-      Indent() << (*I)->getType().getAsString(Policy)
-          << ' '  << (*I)->getNameAsString() << ";\n";
+      Indent() << (*I)->getType().getAsString(Policy) << ' ' << *I << ";\n";
     }
     Indentation -= Policy.Indentation;
     Out << "}\n";
@@ -762,20 +756,18 @@
          E = D->protocol_end();
        I != E; ++I) {
     if (I != D->protocol_begin()) Out << ", ";
-    Out << (*I)->getNameAsString();
+    Out << *I;
   }
 }
 
 void DeclPrinter::VisitObjCProtocolDecl(ObjCProtocolDecl *PID) {
-  Out << "@protocol " << PID->getNameAsString() << '\n';
+  Out << "@protocol " << PID << '\n';
   VisitDeclContext(PID, false);
   Out << "@end";
 }
 
 void DeclPrinter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *PID) {
-  Out << "@implementation "
-      << PID->getClassInterface()->getNameAsString()
-      << '(' << PID->getNameAsString() << ")\n";
+  Out << "@implementation " << PID->getClassInterface() << '(' << PID << ")\n";
 
   VisitDeclContext(PID, false);
   Out << "@end";
@@ -783,9 +775,7 @@
 }
 
 void DeclPrinter::VisitObjCCategoryDecl(ObjCCategoryDecl *PID) {
-  Out << "@interface "
-      << PID->getClassInterface()->getNameAsString()
-      << '(' << PID->getNameAsString() << ")\n";
+  Out << "@interface " << PID->getClassInterface() << '(' << PID << ")\n";
   VisitDeclContext(PID, false);
   Out << "@end";
 
@@ -793,8 +783,8 @@
 }
 
 void DeclPrinter::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *AID) {
-  Out << "@compatibility_alias " << AID->getNameAsString()
-      << ' ' << AID->getClassInterface()->getNameAsString() << ";\n";
+  Out << "@compatibility_alias " << AID
+      << ' ' << AID->getClassInterface() << ";\n";
 }
 
 /// PrintObjCPropertyDecl - print a property declaration.
@@ -854,8 +844,7 @@
   }
   Out << " )";
   }
-  Out << ' ' << PDecl->getType().getAsString(Policy)
-  << ' ' << PDecl->getNameAsString();
+  Out << ' ' << PDecl->getType().getAsString(Policy) << ' ' << PDecl;
 }
 
 void DeclPrinter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PID) {
@@ -863,28 +852,28 @@
     Out << "@synthesize ";
   else
     Out << "@dynamic ";
-  Out << PID->getPropertyDecl()->getNameAsString();
+  Out << PID->getPropertyDecl();
   if (PID->getPropertyIvarDecl())
-    Out << "=" << PID->getPropertyIvarDecl()->getNameAsString();
+    Out << '=' << PID->getPropertyIvarDecl();
 }
 
 void DeclPrinter::VisitUsingDecl(UsingDecl *D) {
   Out << "using ";
   D->getTargetNestedNameDecl()->print(Out, Policy);
-  Out << D->getNameAsString();
+  Out << D;
 }
 
 void
 DeclPrinter::VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) {
   Out << "using typename ";
   D->getTargetNestedNameSpecifier()->print(Out, Policy);
-  Out << D->getDeclName().getAsString();
+  Out << D->getDeclName();
 }
 
 void DeclPrinter::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
   Out << "using ";
   D->getTargetNestedNameSpecifier()->print(Out, Policy);
-  Out << D->getDeclName().getAsString();
+  Out << D->getDeclName();
 }
 
 void DeclPrinter::VisitUsingShadowDecl(UsingShadowDecl *D) {
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index 7c715bd..88b5b5e 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -290,14 +290,12 @@
     // For incorrect code, there might not be an ObjCInterfaceDecl.  Do
     // a null check to avoid a crash.
     if (const ObjCInterfaceDecl *ID = MD->getClassInterface())
-      Out << ID->getNameAsString();
+      Out << ID;
 
     if (const ObjCCategoryImplDecl *CID =
-        dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext())) {
-      Out << '(';
-      Out <<  CID->getNameAsString();
-      Out <<  ')';
-    }
+        dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext()))
+      Out << '(' << CID << ')';
+
     Out <<  ' ';
     Out << MD->getSelector().getAsString();
     Out <<  ']';
diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp
index 15ad11f..d1de70a 100644
--- a/lib/AST/RecordLayoutBuilder.cpp
+++ b/lib/AST/RecordLayoutBuilder.cpp
@@ -924,7 +924,7 @@
   // Vtable pointer.
   if (RD->isDynamicClass() && !PrimaryBase) {
     PrintOffset(OS, Offset, IndentLevel);
-    OS << '(' << RD->getNameAsString() << " vtable pointer)\n";
+    OS << '(' << RD << " vtable pointer)\n";
   }
   // Dump (non-virtual) bases
   for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
@@ -961,8 +961,7 @@
     }
 
     PrintOffset(OS, FieldOffset, IndentLevel);
-    OS << Field->getType().getAsString() << ' ';
-    OS << Field->getNameAsString() << '\n';
+    OS << Field->getType().getAsString() << ' ' << Field << '\n';
   }
 
   if (!IncludeVirtualBases)
diff --git a/lib/AST/StmtDumper.cpp b/lib/AST/StmtDumper.cpp
index ba6218b..79f61f2 100644
--- a/lib/AST/StmtDumper.cpp
+++ b/lib/AST/StmtDumper.cpp
@@ -219,7 +219,7 @@
   // nodes are where they need to be.
   if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) {
     OS << "\"typedef " << localType->getUnderlyingType().getAsString()
-       << " " << localType->getNameAsString() << "\"";
+       << ' ' << localType << '"';
   } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
     OS << "\"";
     // Emit storage class for vardecls.
@@ -328,15 +328,14 @@
   case Decl::ObjCClass: OS << "ObjCClass"; break;
   }
 
-  OS << "='" << Node->getDecl()->getNameAsString()
-     << "' " << (void*)Node->getDecl();
+  OS << "='" << Node->getDecl() << "' " << (void*)Node->getDecl();
 }
 
 void StmtDumper::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
   DumpExpr(Node);
   OS << " (";
   if (!Node->requiresADL()) OS << "no ";
-  OS << "ADL) = '" << Node->getName().getAsString() << "'";
+  OS << "ADL) = '" << Node->getName() << '\'';
 
   UnresolvedLookupExpr::decls_iterator
     I = Node->decls_begin(), E = Node->decls_end();
@@ -349,7 +348,7 @@
   DumpExpr(Node);
 
   OS << " " << Node->getDecl()->getDeclKindName()
-     << "Decl='" << Node->getDecl()->getNameAsString()
+     << "Decl='" << Node->getDecl()
      << "' " << (void*)Node->getDecl();
   if (Node->isFreeIvar())
     OS << " isFreeIvar";
@@ -408,7 +407,7 @@
 void StmtDumper::VisitMemberExpr(MemberExpr *Node) {
   DumpExpr(Node);
   OS << " " << (Node->isArrow() ? "->" : ".")
-     << Node->getMemberDecl()->getNameAsString() << " "
+     << Node->getMemberDecl() << ' '
      << (void*)Node->getMemberDecl();
 }
 void StmtDumper::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
@@ -525,14 +524,13 @@
 void StmtDumper::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
   DumpExpr(Node);
 
-  OS << " " << Node->getProtocol()->getNameAsString();
+  OS << ' ' << Node->getProtocol();
 }
 
 void StmtDumper::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
   DumpExpr(Node);
 
-  OS << " Kind=PropertyRef Property=\""
-     << Node->getProperty()->getNameAsString() << "\"";
+  OS << " Kind=PropertyRef Property=\"" << Node->getProperty() << '"';
 }
 
 void StmtDumper::VisitObjCImplicitSetterGetterRefExpr(
diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp
index da43878..44d4758 100644
--- a/lib/AST/StmtPrinter.cpp
+++ b/lib/AST/StmtPrinter.cpp
@@ -474,7 +474,7 @@
 void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
   if (NestedNameSpecifier *Qualifier = Node->getQualifier())
     Qualifier->print(OS, Policy);
-  OS << Node->getDecl()->getNameAsString();
+  OS << Node->getDecl();
   if (Node->hasExplicitTemplateArgumentList())
     OS << TemplateSpecializationType::PrintTemplateArgumentList(
                                                     Node->getTemplateArgs(),
@@ -509,7 +509,7 @@
     PrintExpr(Node->getBase());
     OS << (Node->isArrow() ? "->" : ".");
   }
-  OS << Node->getDecl()->getNameAsString();
+  OS << Node->getDecl();
 }
 
 void StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
@@ -527,7 +527,7 @@
     OS << ".";
   }
   if (Node->getGetterMethod())
-    OS << Node->getGetterMethod()->getNameAsString();
+    OS << Node->getGetterMethod();
 
 }
 
@@ -695,7 +695,7 @@
   } else {
     MemberExpr *ME = cast<MemberExpr>(E);
     bool IsFirst = PrintOffsetOfDesignator(ME->getBase());
-    OS << (IsFirst ? "" : ".") << ME->getMemberDecl()->getNameAsString();
+    OS << (IsFirst ? "" : ".") << ME->getMemberDecl();
     return false;
   }
 }
@@ -746,7 +746,7 @@
   if (NestedNameSpecifier *Qualifier = Node->getQualifier())
     Qualifier->print(OS, Policy);
 
-  OS << Node->getMemberDecl()->getNameAsString();
+  OS << Node->getMemberDecl();
 
   if (Node->hasExplicitTemplateArgumentList())
     OS << TemplateSpecializationType::PrintTemplateArgumentList(
@@ -1242,7 +1242,7 @@
 }
 
 void StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
-  OS << "@protocol(" << Node->getProtocol()->getNameAsString() << ')';
+  OS << "@protocol(" << Node->getProtocol() << ')';
 }
 
 void StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) {
@@ -1304,7 +1304,7 @@
 }
 
 void StmtPrinter::VisitBlockDeclRefExpr(BlockDeclRefExpr *Node) {
-  OS << Node->getDecl()->getNameAsString();
+  OS << Node->getDecl();
 }
 //===----------------------------------------------------------------------===//
 // Stmt method implementations
diff --git a/lib/AST/TemplateName.cpp b/lib/AST/TemplateName.cpp
index a1ee552..14722f7 100644
--- a/lib/AST/TemplateName.cpp
+++ b/lib/AST/TemplateName.cpp
@@ -47,13 +47,13 @@
 TemplateName::print(llvm::raw_ostream &OS, const PrintingPolicy &Policy,
                     bool SuppressNNS) const {
   if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>())
-    OS << Template->getNameAsString();
+    OS << Template;
   else if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) {
     if (!SuppressNNS)
       QTN->getQualifier()->print(OS, Policy);
     if (QTN->hasTemplateKeyword())
       OS << "template ";
-    OS << QTN->getDecl()->getNameAsString();
+    OS << QTN->getDecl();
   } else if (DependentTemplateName *DTN = getAsDependentTemplateName()) {
     if (!SuppressNNS && DTN->getQualifier())
       DTN->getQualifier()->print(OS, Policy);
diff --git a/lib/Checker/BugReporter.cpp b/lib/Checker/BugReporter.cpp
index 4475872..3bcc03f 100644
--- a/lib/Checker/BugReporter.cpp
+++ b/lib/Checker/BugReporter.cpp
@@ -607,7 +607,7 @@
 
                   if (D) {
                     GetRawInt = false;
-                    os << D->getNameAsString();
+                    os << D;
                   }
                 }
 
diff --git a/lib/Checker/BugReporterVisitors.cpp b/lib/Checker/BugReporterVisitors.cpp
index 06cee5b..544129b 100644
--- a/lib/Checker/BugReporterVisitors.cpp
+++ b/lib/Checker/BugReporterVisitors.cpp
@@ -144,7 +144,7 @@
       if (const DeclStmt *DS = PS->getStmtAs<DeclStmt>()) {
 
         if (const VarRegion *VR = dyn_cast<VarRegion>(R)) {
-          os << "Variable '" << VR->getDecl()->getNameAsString() << "' ";
+          os << "Variable '" << VR->getDecl() << "' ";
         }
         else
           return NULL;
@@ -206,7 +206,7 @@
         return NULL;
 
       if (const VarRegion *VR = dyn_cast<VarRegion>(R)) {
-        os << '\'' << VR->getDecl()->getNameAsString() << '\'';
+        os << '\'' << VR->getDecl() << '\'';
       }
       else
         return NULL;
diff --git a/lib/Checker/CFRefCount.cpp b/lib/Checker/CFRefCount.cpp
index 3c4a27c..a0b4666 100644
--- a/lib/Checker/CFRefCount.cpp
+++ b/lib/Checker/CFRefCount.cpp
@@ -2081,7 +2081,7 @@
       // Get the name of the callee (if it is available).
       SVal X = CurrSt->getSValAsScalarOrLoc(CE->getCallee());
       if (const FunctionDecl* FD = X.getAsFunctionDecl())
-        os << "Call to function '" << FD->getNameAsString() <<'\'';
+        os << "Call to function '" << FD << '\'';
       else
         os << "function call";
     }
diff --git a/lib/Checker/CallAndMessageChecker.cpp b/lib/Checker/CallAndMessageChecker.cpp
index dd1856c..ce9f26e 100644
--- a/lib/Checker/CallAndMessageChecker.cpp
+++ b/lib/Checker/CallAndMessageChecker.cpp
@@ -154,8 +154,7 @@
         os << "Passed-by-value struct argument contains uninitialized data";
 
         if (F.FieldChain.size() == 1)
-          os << " (e.g., field: '" << F.FieldChain[0]->getNameAsString()
-             << "')";
+          os << " (e.g., field: '" << F.FieldChain[0] << "')";
         else {
           os << " (e.g., via the field chain: '";
           bool first = true;
@@ -165,7 +164,7 @@
               first = false;
             else
               os << '.';
-            os << (*DI)->getNameAsString();
+            os << *DI;
           }
           os << "')";
         }
diff --git a/lib/Checker/CheckObjCDealloc.cpp b/lib/Checker/CheckObjCDealloc.cpp
index d9606f1..f510de5 100644
--- a/lib/Checker/CheckObjCDealloc.cpp
+++ b/lib/Checker/CheckObjCDealloc.cpp
@@ -166,8 +166,7 @@
 
     std::string buf;
     llvm::raw_string_ostream os(buf);
-    os << "Objective-C class '" << D->getNameAsString()
-       << "' lacks a 'dealloc' instance method";
+    os << "Objective-C class '" << D << "' lacks a 'dealloc' instance method";
 
     BR.EmitBasicReport(name, os.str(), D->getLocStart());
     return;
@@ -182,8 +181,7 @@
 
     std::string buf;
     llvm::raw_string_ostream os(buf);
-    os << "The 'dealloc' instance method in Objective-C class '"
-       << D->getNameAsString()
+    os << "The 'dealloc' instance method in Objective-C class '" << D
        << "' does not send a 'dealloc' message to its super class"
            " (missing [super dealloc])";
 
@@ -238,7 +236,7 @@
                ? "missing ivar release (leak)"
                : "missing ivar release (Hybrid MM, non-GC)";
 
-        os << "The '" << ID->getNameAsString()
+        os << "The '" << ID
            << "' instance variable was retained by a synthesized property but "
               "wasn't released in 'dealloc'";
       } else {
@@ -246,7 +244,7 @@
                ? "extra ivar release (use-after-release)"
                : "extra ivar release (Hybrid MM, non-GC)";
 
-        os << "The '" << ID->getNameAsString()
+        os << "The '" << ID
            << "' instance variable was not retained by a synthesized property "
               "but was released in 'dealloc'";
       }
diff --git a/lib/Checker/CheckObjCInstMethSignature.cpp b/lib/Checker/CheckObjCInstMethSignature.cpp
index 8c43a45..76a0923 100644
--- a/lib/Checker/CheckObjCInstMethSignature.cpp
+++ b/lib/Checker/CheckObjCInstMethSignature.cpp
@@ -49,16 +49,16 @@
     llvm::raw_string_ostream os(sbuf);
 
     os << "The Objective-C class '"
-       << MethDerived->getClassInterface()->getNameAsString()
+       << MethDerived->getClassInterface()
        << "', which is derived from class '"
-       << MethAncestor->getClassInterface()->getNameAsString()
+       << MethAncestor->getClassInterface()
        << "', defines the instance method '"
        << MethDerived->getSelector().getAsString()
        << "' whose return type is '"
        << ResDerived.getAsString()
        << "'.  A method with the same name (same selector) is also defined in "
           "class '"
-       << MethAncestor->getClassInterface()->getNameAsString()
+       << MethAncestor->getClassInterface()
        << "' and has a return type of '"
        << ResAncestor.getAsString()
        << "'.  These two types are incompatible, and may result in undefined "
diff --git a/lib/Checker/CheckSecuritySyntaxOnly.cpp b/lib/Checker/CheckSecuritySyntaxOnly.cpp
index efbce61..74e12b1 100644
--- a/lib/Checker/CheckSecuritySyntaxOnly.cpp
+++ b/lib/Checker/CheckSecuritySyntaxOnly.cpp
@@ -387,11 +387,11 @@
   // Issue a warning.
   llvm::SmallString<256> buf1;
   llvm::raw_svector_ostream os1(buf1);
-  os1 << "'" << FD->getNameAsString() << "' is a poor random number generator";
+  os1 << '\'' << FD << "' is a poor random number generator";
 
   llvm::SmallString<256> buf2;
   llvm::raw_svector_ostream os2(buf2);
-  os2 << "Function '" << FD->getNameAsString()
+  os2 << "Function '" << FD
       << "' is obsolete because it implements a poor random number generator."
       << "  Use 'arc4random' instead";
 
@@ -472,14 +472,12 @@
   // Issue a warning.
   llvm::SmallString<256> buf1;
   llvm::raw_svector_ostream os1(buf1);
-  os1 << "Return value is not checked in call to '" << FD->getNameAsString()
-     << "'";
+  os1 << "Return value is not checked in call to '" << FD << '\'';
 
   llvm::SmallString<256> buf2;
   llvm::raw_svector_ostream os2(buf2);
-  os2 << "The return value from the call to '" << FD->getNameAsString()
-      << "' is not checked.  If an error occurs in '"
-      << FD->getNameAsString()
+  os2 << "The return value from the call to '" << FD
+      << "' is not checked.  If an error occurs in '" << FD
       << "', the following code may execute with unexpected privileges";
 
   SourceRange R = CE->getCallee()->getSourceRange();
diff --git a/lib/Checker/MemRegion.cpp b/lib/Checker/MemRegion.cpp
index 0571d81..9a664c7 100644
--- a/lib/Checker/MemRegion.cpp
+++ b/lib/Checker/MemRegion.cpp
@@ -365,11 +365,11 @@
 }
 
 void FieldRegion::dumpToStream(llvm::raw_ostream& os) const {
-  os << superRegion << "->" << getDecl()->getNameAsString();
+  os << superRegion << "->" << getDecl();
 }
 
 void ObjCIvarRegion::dumpToStream(llvm::raw_ostream& os) const {
-  os << "ivar{" << superRegion << ',' << getDecl()->getNameAsString() << '}';
+  os << "ivar{" << superRegion << ',' << getDecl() << '}';
 }
 
 void StringRegion::dumpToStream(llvm::raw_ostream& os) const {
@@ -381,7 +381,7 @@
 }
 
 void VarRegion::dumpToStream(llvm::raw_ostream& os) const {
-  os << cast<VarDecl>(D)->getNameAsString();
+  os << cast<VarDecl>(D);
 }
 
 void RegionRawOffset::dump() const {
diff --git a/lib/Checker/NSErrorChecker.cpp b/lib/Checker/NSErrorChecker.cpp
index 9130bfa..e30d54c 100644
--- a/lib/Checker/NSErrorChecker.cpp
+++ b/lib/Checker/NSErrorChecker.cpp
@@ -226,7 +226,7 @@
     else
       os << "documented in CoreFoundation/CFError.h the parameter '";
 
-    os << Param->getNameAsString() << "' may be null.";
+    os << Param << "' may be null.";
 
     BugReport *report = new BugReport(*this, os.str(), *I);
     // FIXME: Notable symbols are now part of the report.  We should
diff --git a/lib/Checker/ObjCUnusedIVarsChecker.cpp b/lib/Checker/ObjCUnusedIVarsChecker.cpp
index 04d897a..0e47621 100644
--- a/lib/Checker/ObjCUnusedIVarsChecker.cpp
+++ b/lib/Checker/ObjCUnusedIVarsChecker.cpp
@@ -150,8 +150,7 @@
     if (I->second == Unused) {
       std::string sbuf;
       llvm::raw_string_ostream os(sbuf);
-      os << "Instance variable '" << I->first->getNameAsString()
-         << "' in class '" << ID->getNameAsString()
+      os << "Instance variable '" << I->first << "' in class '" << ID
          << "' is never used by the methods in its @implementation "
             "(although it may be used by category methods).";
 
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index a6c2cc9..d33fd8d 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -3565,7 +3565,7 @@
      << '[' << CD->getName();
   if (const ObjCCategoryImplDecl *CID =
       dyn_cast<ObjCCategoryImplDecl>(D->getDeclContext()))
-    OS << '(' << CID->getNameAsString() << ')';
+    OS << '(' << CID << ')';
   OS << ' ' << D->getSelector().getAsString() << ']';
 }
 
diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp
index c0366bf..2b6e581 100644
--- a/lib/CodeGen/Mangle.cpp
+++ b/lib/CodeGen/Mangle.cpp
@@ -896,7 +896,7 @@
   assert (CD && "Missing container decl in GetNameForMethod");
   OS << (MD->isInstanceMethod() ? '-' : '+') << '[' << CD->getName();
   if (const ObjCCategoryImplDecl *CID = dyn_cast<ObjCCategoryImplDecl>(CD))
-    OS << '(' << CID->getNameAsString() << ')';
+    OS << '(' << CID << ')';
   OS << ' ' << MD->getSelector().getAsString() << ']';
 
   Out << OS.str().size() << OS.str();
diff --git a/lib/Frontend/ASTConsumers.cpp b/lib/Frontend/ASTConsumers.cpp
index b53a80e..7b8ebf9 100644
--- a/lib/Frontend/ASTConsumers.cpp
+++ b/lib/Frontend/ASTConsumers.cpp
@@ -164,7 +164,7 @@
   case Decl::Namespace: {
     Out << "[namespace] ";
     const NamespaceDecl* ND = cast<NamespaceDecl>(DC);
-    Out << ND->getNameAsString();
+    Out << ND;
     break;
   }
   case Decl::Enum: {
@@ -173,7 +173,7 @@
       Out << "[enum] ";
     else
       Out << "<enum> ";
-    Out << ED->getNameAsString();
+    Out << ED;
     break;
   }
   case Decl::Record: {
@@ -182,7 +182,7 @@
       Out << "[struct] ";
     else
       Out << "<struct> ";
-    Out << RD->getNameAsString();
+    Out << RD;
     break;
   }
   case Decl::CXXRecord: {
@@ -191,7 +191,7 @@
       Out << "[class] ";
     else
       Out << "<class> ";
-    Out << RD->getNameAsString() << " " << DC;
+    Out << RD << ' ' << DC;
     break;
   }
   case Decl::ObjCMethod:
@@ -224,7 +224,7 @@
       Out << "[function] ";
     else
       Out << "<function> ";
-    Out << FD->getNameAsString();
+    Out << FD;
     // Print the parameters.
     Out << "(";
     bool PrintComma = false;
@@ -234,7 +234,7 @@
         Out << ", ";
       else
         PrintComma = true;
-      Out << (*I)->getNameAsString();
+      Out << *I;
     }
     Out << ")";
     break;
@@ -247,7 +247,7 @@
       Out << "(c++ method) ";
     else
       Out << "<c++ method> ";
-    Out << D->getNameAsString();
+    Out << D;
     // Print the parameters.
     Out << "(";
     bool PrintComma = false;
@@ -257,7 +257,7 @@
         Out << ", ";
       else
         PrintComma = true;
-      Out << (*I)->getNameAsString();
+      Out << *I;
     }
     Out << ")";
 
@@ -277,7 +277,7 @@
       Out << "(c++ ctor) ";
     else
       Out << "<c++ ctor> ";
-    Out << D->getNameAsString();
+    Out << D;
     // Print the parameters.
     Out << "(";
     bool PrintComma = false;
@@ -287,7 +287,7 @@
         Out << ", ";
       else
         PrintComma = true;
-      Out << (*I)->getNameAsString();
+      Out << *I;
     }
     Out << ")";
 
@@ -306,7 +306,7 @@
       Out << "(c++ dtor) ";
     else
       Out << "<c++ dtor> ";
-    Out << D->getNameAsString();
+    Out << D;
     // Check the semantic DC.
     const DeclContext* SemaDC = D->getDeclContext();
     const DeclContext* LexicalDC = D->getLexicalDeclContext();
@@ -322,7 +322,7 @@
       Out << "(c++ conversion) ";
     else
       Out << "<c++ conversion> ";
-    Out << D->getNameAsString();
+    Out << D;
     // Check the semantic DC.
     const DeclContext* SemaDC = D->getDeclContext();
     const DeclContext* LexicalDC = D->getLexicalDeclContext();
@@ -369,42 +369,42 @@
     }
     case Decl::Field: {
       FieldDecl* FD = cast<FieldDecl>(*I);
-      Out << "<field> " << FD->getNameAsString() << "\n";
+      Out << "<field> " << FD << '\n';
       break;
     }
     case Decl::Typedef: {
       TypedefDecl* TD = cast<TypedefDecl>(*I);
-      Out << "<typedef> " << TD->getNameAsString() << "\n";
+      Out << "<typedef> " << TD << '\n';
       break;
     }
     case Decl::EnumConstant: {
       EnumConstantDecl* ECD = cast<EnumConstantDecl>(*I);
-      Out << "<enum constant> " << ECD->getNameAsString() << "\n";
+      Out << "<enum constant> " << ECD << '\n';
       break;
     }
     case Decl::Var: {
       VarDecl* VD = cast<VarDecl>(*I);
-      Out << "<var> " << VD->getNameAsString() << "\n";
+      Out << "<var> " << VD << '\n';
       break;
     }
     case Decl::ImplicitParam: {
       ImplicitParamDecl* IPD = cast<ImplicitParamDecl>(*I);
-      Out << "<implicit parameter> " << IPD->getNameAsString() << "\n";
+      Out << "<implicit parameter> " << IPD << '\n';
       break;
     }
     case Decl::ParmVar: {
       ParmVarDecl* PVD = cast<ParmVarDecl>(*I);
-      Out << "<parameter> " << PVD->getNameAsString() << "\n";
+      Out << "<parameter> " << PVD << '\n';
       break;
     }
     case Decl::ObjCProperty: {
       ObjCPropertyDecl* OPD = cast<ObjCPropertyDecl>(*I);
-      Out << "<objc property> " << OPD->getNameAsString() << "\n";
+      Out << "<objc property> " << OPD << '\n';
       break;
     }
     case Decl::FunctionTemplate: {
       FunctionTemplateDecl* FTD = cast<FunctionTemplateDecl>(*I);
-      Out << "<function template> " << FTD->getNameAsString() << "\n";
+      Out << "<function template> " << FTD << '\n';
       break;
     }
     case Decl::FileScopeAsm: {
@@ -417,16 +417,16 @@
     }
     case Decl::NamespaceAlias: {
       NamespaceAliasDecl* NAD = cast<NamespaceAliasDecl>(*I);
-      Out << "<namespace alias> " << NAD->getNameAsString() << "\n";
+      Out << "<namespace alias> " << NAD << '\n';
       break;
     }
     case Decl::ClassTemplate: {
       ClassTemplateDecl *CTD = cast<ClassTemplateDecl>(*I);
-      Out << "<class template> " << CTD->getNameAsString() << '\n';
+      Out << "<class template> " << CTD << '\n';
       break;
     }
     default:
-      Out << "DeclKind: " << DK << '"' << I->getDeclKindName() << "\"\n";
+      Out << "DeclKind: " << DK << '"' << *I << "\"\n";
       assert(0 && "decl unhandled");
     }
   }
diff --git a/lib/Frontend/AnalysisConsumer.cpp b/lib/Frontend/AnalysisConsumer.cpp
index 2ca833b..d55fbc1 100644
--- a/lib/Frontend/AnalysisConsumer.cpp
+++ b/lib/Frontend/AnalysisConsumer.cpp
@@ -150,7 +150,7 @@
 
     if (isa<FunctionDecl>(D) || isa<ObjCMethodDecl>(D)) {
       const NamedDecl *ND = cast<NamedDecl>(D);
-      llvm::errs() << ' ' << ND->getNameAsString() << '\n';
+      llvm::errs() << ' ' << ND << '\n';
     }
     else if (isa<BlockDecl>(D)) {
       llvm::errs() << ' ' << "block(line:" << Loc.getLine() << ",col:"
diff --git a/lib/Index/ASTLocation.cpp b/lib/Index/ASTLocation.cpp
index c24f3bf..091bc78 100644
--- a/lib/Index/ASTLocation.cpp
+++ b/lib/Index/ASTLocation.cpp
@@ -87,7 +87,7 @@
   case N_Decl:
     OS << "[Decl: " << AsDecl()->getDeclKindName() << " ";
     if (const NamedDecl *ND = dyn_cast<NamedDecl>(AsDecl()))
-      OS << ND->getNameAsString();
+      OS << ND;
     break;
 
   case N_Stmt:
@@ -97,7 +97,7 @@
     
   case N_NamedRef:
     OS << "[NamedRef: " << AsNamedRef().ND->getDeclKindName() << " ";
-    OS << AsNamedRef().ND->getNameAsString();
+    OS << AsNamedRef().ND;
     break;
     
   case N_Type: {
diff --git a/lib/Sema/CodeCompleteConsumer.cpp b/lib/Sema/CodeCompleteConsumer.cpp
index 9f0ee5c..0ef9a15 100644
--- a/lib/Sema/CodeCompleteConsumer.cpp
+++ b/lib/Sema/CodeCompleteConsumer.cpp
@@ -425,7 +425,7 @@
     OS << "COMPLETION: ";
     switch (Results[I].Kind) {
     case Result::RK_Declaration:
-      OS << Results[I].Declaration->getNameAsString() ;
+      OS << Results[I].Declaration;
       if (Results[I].Hidden)
         OS << " (Hidden)";
       if (CodeCompletionString *CCS 
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp
index e50a860..76de072 100644
--- a/lib/Sema/SemaInit.cpp
+++ b/lib/Sema/SemaInit.cpp
@@ -4020,8 +4020,7 @@
       break;
       
     case SK_UserConversion:
-      OS << "user-defined conversion via "
-         << S->Function.Function->getNameAsString();
+      OS << "user-defined conversion via " << S->Function.Function;
       break;
       
     case SK_QualificationConversionRValue:
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index 3d1fa43..c4a42cd 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -226,7 +226,7 @@
     Before.DebugPrint();
     OS << " -> ";
   }
-  OS << "'" << ConversionFunction->getNameAsString() << "'";
+  OS << '\'' << ConversionFunction << '\'';
   if (After.First || After.Second || After.Third) {
     OS << " -> ";
     After.DebugPrint();