forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
//===- 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 DiagnosticConsumer {
 | 
						|
    SmallString<64> LastDiagnostic;
 | 
						|
  public:
 | 
						|
    virtual void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,
 | 
						|
                                  const Diagnostic &Info) {
 | 
						|
      LastDiagnostic.clear();
 | 
						|
      Info.FormatDiagnostic(LastDiagnostic);
 | 
						|
    }
 | 
						|
 | 
						|
    StringRef get() const { return LastDiagnostic; }
 | 
						|
 | 
						|
    virtual DiagnosticConsumer *clone(DiagnosticsEngine &Diags) const {
 | 
						|
      return new LastDiagnosticString();
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  const IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs;
 | 
						|
  const unsigned diag_just_format;
 | 
						|
  LastDiagnosticString LastDiagnostic;
 | 
						|
  DiagnosticsEngine 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
 |