| //===- 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 |