blob: 6f7ebbe537f99c7205bb9fa112ba97d84f49911f [file] [log] [blame]
//===-- VerifyDiagnosticsClient.h - Verifying Diagnostic Client -*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_FRONTEND_VERIFYDIAGNOSTICSCLIENT_H
#define LLVM_CLANG_FRONTEND_VERIFYDIAGNOSTICSCLIENT_H
#include "clang/Basic/Diagnostic.h"
#include "llvm/ADT/OwningPtr.h"
namespace clang {
class Diagnostic;
class SourceMgr;
class TextDiagnosticBuffer;
/// VerifyDiagnosticsClient - Create a diagnostic client which will use markers
/// in the input source to check that all the emitted diagnostics match those
/// expected.
///
/// USING THE DIAGNOSTIC CHECKER:
///
/// Indicating that a line expects an error or a warning is simple. Put a
/// comment on the line that has the diagnostic, use "expected-{error,warning}"
/// to tag if it's an expected error or warning, and place the expected text
/// between {{ and }} markers. The full text doesn't have to be included, only
/// enough to ensure that the correct diagnostic was emitted.
///
/// Here's an example:
///
/// int A = B; // expected-error {{use of undeclared identifier 'B'}}
///
/// You can place as many diagnostics on one line as you wish. To make the code
/// more readable, you can use slash-newline to separate out the diagnostics.
///
/// The simple syntax above allows each specification to match exactly one
/// error. You can use the extended syntax to customize this. The extended
/// syntax is "expected-<type> <n> {{diag text}}", where <type> is one of
/// "error", "warning" or "note", and <n> is a positive integer. This allows the
/// diagnostic to appear as many times as specified. Example:
///
/// void f(); // expected-note 2 {{previous declaration is here}}
///
class VerifyDiagnosticsClient : public DiagnosticClient {
public:
Diagnostic &Diags;
llvm::OwningPtr<DiagnosticClient> PrimaryClient;
llvm::OwningPtr<TextDiagnosticBuffer> Buffer;
Preprocessor *CurrentPreprocessor;
unsigned NumErrors;
private:
void CheckDiagnostics();
public:
/// Create a new verifying diagnostic client, which will issue errors to \arg
/// PrimaryClient when a diagnostic does not match what is expected (as
/// indicated in the source file). The verifying diagnostic client takes
/// ownership of \arg PrimaryClient.
VerifyDiagnosticsClient(Diagnostic &Diags, DiagnosticClient *PrimaryClient);
~VerifyDiagnosticsClient();
virtual void BeginSourceFile(const LangOptions &LangOpts,
const Preprocessor *PP);
virtual void EndSourceFile();
virtual void HandleDiagnostic(Diagnostic::Level DiagLevel,
const DiagnosticInfo &Info);
/// HadErrors - Check if there were any mismatches in expected diagnostics.
bool HadErrors();
};
} // end namspace clang
#endif