add support for inserting a DeclarationName into a diagnostic directly
without calling getAsString().  This implicitly puts quotes around the
name, so diagnostics need to be tweaked to accommodate this.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59916 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp
index fd65f75..efdb329 100644
--- a/lib/Basic/Diagnostic.cpp
+++ b/lib/Basic/Diagnostic.cpp
@@ -536,6 +536,7 @@
       break;
     }
     case Diagnostic::ak_qualtype:
+    case Diagnostic::ak_declarationname:
       OutStr.push_back('\'');
       getDiags()->ConvertArgToString(getArgKind(ArgNo), getRawArg(ArgNo),
                                      Modifier, ModifierLen,
diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp
index b01b5d7..be21c36 100644
--- a/lib/Sema/Sema.cpp
+++ b/lib/Sema/Sema.cpp
@@ -22,17 +22,24 @@
 
 /// ConvertQualTypeToStringFn - This function is used to pretty print the 
 /// specified QualType as a string in diagnostics.
-static void ConvertArgToStringFn(Diagnostic::ArgumentKind Kind, intptr_t QT,
+static void ConvertArgToStringFn(Diagnostic::ArgumentKind Kind, intptr_t Val,
                                       const char *Modifier, unsigned ML,
                                       const char *Argument, unsigned ArgLen,
                                       llvm::SmallVectorImpl<char> &Output) {
   assert(ML == 0 && ArgLen == 0 && "Invalid modifier for QualType argument");
-  assert(Kind == Diagnostic::ak_qualtype);
   
-  QualType Ty(QualType::getFromOpaquePtr(reinterpret_cast<void*>(QT)));
+  std::string S;
+  if (Kind == Diagnostic::ak_qualtype) {
+    QualType Ty(QualType::getFromOpaquePtr(reinterpret_cast<void*>(Val)));
   
-  // FIXME: Playing with std::string is really slow.
-  std::string S = Ty.getAsString();
+    // FIXME: Playing with std::string is really slow.
+    S = Ty.getAsString();
+  } else {
+    assert(Kind == Diagnostic::ak_declarationname);
+   
+    DeclarationName N = DeclarationName::getFromOpaqueInteger(Val);
+    S = N.getAsString();
+  }
   Output.append(S.begin(), S.end());
 }
 
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index ef24d1a..fba9f33 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -856,10 +856,9 @@
       SourceLocation L = D.getIdentifierLoc();
       SourceRange R = D.getCXXScopeSpec().getRange();
       if (isa<FunctionDecl>(CurContext)) {
-        Diag(L, diag::err_invalid_declarator_in_function)
-          << Name.getAsString() << R;
+        Diag(L, diag::err_invalid_declarator_in_function) << Name << R;
       } else {
-      Diag(L, diag::err_invalid_declarator_scope)
+        Diag(L, diag::err_invalid_declarator_scope)
           << Name.getAsString() << cast<NamedDecl>(DC)->getName() << R;
       }
     }