Define DiagnosticBuilder<<APValue so it's easy to include APValues in
diagnostics.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135398 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/unittests/AST/APValueTest.cpp b/unittests/AST/APValueTest.cpp
new file mode 100644
index 0000000..ae054b3
--- /dev/null
+++ b/unittests/AST/APValueTest.cpp
@@ -0,0 +1,79 @@
+//===- unittests/AST/APValueTest.cpp - APValue tests ---===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/AST/APValue.h"
+
+#include "clang/Basic/Diagnostic.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/SmallString.h"
+
+#include "gtest/gtest.h"
+
+using namespace llvm;
+using namespace clang;
+
+namespace {
+
+class DiagnosticOutputGetter {
+  class LastDiagnosticString : public DiagnosticClient {
+    SmallString<64> LastDiagnostic;
+  public:
+    virtual void HandleDiagnostic(Diagnostic::Level DiagLevel,
+                                  const DiagnosticInfo &Info) {
+      LastDiagnostic.clear();
+      Info.FormatDiagnostic(LastDiagnostic);
+    }
+
+    StringRef get() const { return LastDiagnostic; }
+  };
+
+  const IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs;
+  const unsigned diag_just_format;
+  LastDiagnosticString LastDiagnostic;
+  Diagnostic Diag;
+
+public:
+  DiagnosticOutputGetter()
+    : DiagIDs(new DiagnosticIDs),
+      diag_just_format(DiagIDs->getCustomDiagID(DiagnosticIDs::Error, "%0")),
+      Diag(DiagIDs, &LastDiagnostic, false) {
+  }
+
+  template<typename T>
+  std::string operator()(const T& value) {
+    Diag.Report(diag_just_format) << value;
+    return LastDiagnostic.get().str();
+  }
+};
+
+TEST(APValue, Diagnostics) {
+  DiagnosticOutputGetter GetDiagnosticOutput;
+
+  EXPECT_EQ("Uninitialized", GetDiagnosticOutput(APValue()));
+  EXPECT_EQ("5", GetDiagnosticOutput(APValue(APSInt(APInt(16, 5)))));
+  EXPECT_EQ("3.141590e+00",
+            GetDiagnosticOutput(APValue(APFloat(APFloat::IEEEdouble,
+                                                "3.14159"))));
+  EXPECT_EQ("3+4i",
+            GetDiagnosticOutput(APValue(APSInt(APInt(16, 3)),
+                                        APSInt(APInt(16, 4)))));
+  EXPECT_EQ("3.200000e+00+5.700000e+00i",
+            GetDiagnosticOutput(APValue(
+                                  APFloat(APFloat::IEEEdouble, "3.2"),
+                                  APFloat(APFloat::IEEEdouble, "5.7"))));
+  APValue V[] = {
+    APValue(APSInt(APInt(16, 3))),
+    APValue(APSInt(APInt(16, 4))),
+    APValue(APSInt(APInt(16, 5)))
+  };
+  EXPECT_EQ("[3, 4, 5]",
+            GetDiagnosticOutput(APValue(V, array_lengthof(V))));
+}
+
+} // anonymous namespace