1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===- VerifyDiagnosticConsumer.h - Verifying Diagnostic Client -*- C++ -*-===//
2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//                     The LLVM Compiler Infrastructure
4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file is distributed under the University of Illinois Open Source
6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// License. See LICENSE.TXT for details.
7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===//
9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#ifndef LLVM_CLANG_FRONTEND_VERIFYDIAGNOSTICCONSUMER_H
11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#define LLVM_CLANG_FRONTEND_VERIFYDIAGNOSTICCONSUMER_H
12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/Diagnostic.h"
14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Lex/Preprocessor.h"
15f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/DenseMap.h"
16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/PointerIntPair.h"
17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/STLExtras.h"
18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <climits>
19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <memory>
20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace clang {
22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass DiagnosticsEngine;
24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass TextDiagnosticBuffer;
25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass FileEntry;
26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// VerifyDiagnosticConsumer - Create a diagnostic client which will use
28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// markers in the input source to check that all the emitted diagnostics match
29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// those expected.
30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// USING THE DIAGNOSTIC CHECKER:
32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Indicating that a line expects an error or a warning is simple. Put a
34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// comment on the line that has the diagnostic, use:
35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code
37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   expected-{error,warning,remark,note}
38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode
39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// to tag if it's an expected error, remark or warning, and place the expected
41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// text between {{ and }} markers. The full text doesn't have to be included,
42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// only enough to ensure that the correct diagnostic was emitted.
43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Here's an example:
45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code
47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   int A = B; // expected-error {{use of undeclared identifier 'B'}}
48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode
49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// You can place as many diagnostics on one line as you wish. To make the code
51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// more readable, you can use slash-newline to separate out the diagnostics.
52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Alternatively, it is possible to specify the line on which the diagnostic
54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// should appear by appending "@<line>" to "expected-<type>", for example:
55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code
57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   #warning some text
58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   // expected-warning@10 {{some text}}
59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode
60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// The line number may be absolute (as above), or relative to the current
62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// line by prefixing the number with either '+' or '-'.
63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// If the diagnostic is generated in a separate file, for example in a shared
65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// header file, it may be beneficial to be able to declare the file in which
66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// the diagnostic will appear, rather than placing the expected-* directive in
67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// the actual file itself.  This can be done using the following syntax:
68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code
70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   // expected-error@path/include.h:15 {{error message}}
71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode
72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// The path can be absolute or relative and the same search paths will be used
74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// as for #include directives.  The line number in an external file may be
75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// substituted with '*' meaning that any line number will match (useful where
76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// the included file is, for example, a system header where the actual line
77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// number may change and is not critical).
78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// The simple syntax above allows each specification to match exactly one
80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// error.  You can use the extended syntax to customize this. The extended
81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// syntax is "expected-<type> <n> {{diag text}}", where \<type> is one of
82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// "error", "warning" or "note", and \<n> is a positive integer. This allows
83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// the diagnostic to appear as many times as specified. Example:
84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code
86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   void f(); // expected-note 2 {{previous declaration is here}}
87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode
88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Where the diagnostic is expected to occur a minimum number of times, this
90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// can be specified by appending a '+' to the number. Example:
91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code
93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   void f(); // expected-note 0+ {{previous declaration is here}}
94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   void g(); // expected-note 1+ {{previous declaration is here}}
95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode
96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// In the first example, the diagnostic becomes optional, i.e. it will be
98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// swallowed if it occurs, but will not generate an error if it does not
99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// occur.  In the second example, the diagnostic must occur at least once.
100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// As a short-hand, "one or more" can be specified simply by '+'. Example:
101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code
103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   void g(); // expected-note + {{previous declaration is here}}
104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode
105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// A range can also be specified by "<n>-<m>".  Example:
107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code
109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   void f(); // expected-note 0-1 {{previous declaration is here}}
110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode
111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// In this example, the diagnostic may appear only once, if at all.
113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Regex matching mode may be selected by appending '-re' to type and
115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// including regexes wrapped in double curly braces in the directive, such as:
116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code
118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   expected-error-re {{format specifies type 'wchar_t **' (aka '{{.+}}')}}
119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode
120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Examples matching error: "variable has incomplete type 'struct s'"
122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code
124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   // expected-error {{variable has incomplete type 'struct s'}}
125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   // expected-error {{variable has incomplete type}}
126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   // expected-error-re {{variable has type 'struct {{.}}'}}
128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   // expected-error-re {{variable has type 'struct {{.*}}'}}
129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   // expected-error-re {{variable has type 'struct {{(.*)}}'}}
130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   // expected-error-re {{variable has type 'struct{{[[:space:]](.*)}}'}}
131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode
132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// VerifyDiagnosticConsumer expects at least one expected-* directive to
134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// be found inside the source code.  If no diagnostics are expected the
135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// following directive can be used to indicate this:
136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code
138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///   // expected-no-diagnostics
139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode
140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot///
141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass VerifyDiagnosticConsumer: public DiagnosticConsumer,
142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                                public CommentHandler {
143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// Directive - Abstract class representing a parsed verify directive.
145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ///
146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  class Directive {
147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  public:
148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    static std::unique_ptr<Directive> create(bool RegexKind,
149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                                             SourceLocation DirectiveLoc,
150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                                             SourceLocation DiagnosticLoc,
151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                                             bool MatchAnyLine, StringRef Text,
152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                                             unsigned Min, unsigned Max);
153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  public:
155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// Constant representing n or more matches.
156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    static const unsigned MaxCount = UINT_MAX;
157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SourceLocation DirectiveLoc;
159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SourceLocation DiagnosticLoc;
160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    const std::string Text;
161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    unsigned Min, Max;
162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    bool MatchAnyLine;
163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    virtual ~Directive() { }
165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    // Returns true if directive text is valid.
167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    // Otherwise returns false and populates E.
168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    virtual bool isValid(std::string &Error) = 0;
169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    // Returns true on match.
171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    virtual bool match(StringRef S) = 0;
172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  protected:
174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Directive(SourceLocation DirectiveLoc, SourceLocation DiagnosticLoc,
175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              bool MatchAnyLine, StringRef Text, unsigned Min, unsigned Max)
176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      : DirectiveLoc(DirectiveLoc), DiagnosticLoc(DiagnosticLoc),
177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        Text(Text), Min(Min), Max(Max), MatchAnyLine(MatchAnyLine) {
178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(!DirectiveLoc.isInvalid() && "DirectiveLoc is invalid!");
179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert((!DiagnosticLoc.isInvalid() || MatchAnyLine) &&
180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot           "DiagnosticLoc is invalid!");
181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  private:
184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Directive(const Directive &) = delete;
185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    void operator=(const Directive &) = delete;
186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef std::vector<std::unique_ptr<Directive>> DirectiveList;
189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// ExpectedData - owns directive objects and deletes on destructor.
191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ///
192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  struct ExpectedData {
193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    DirectiveList Errors;
194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    DirectiveList Warnings;
195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    DirectiveList Remarks;
196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    DirectiveList Notes;
197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    void Reset() {
199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Errors.clear();
200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Warnings.clear();
201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Remarks.clear();
202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Notes.clear();
203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum DirectiveStatus {
207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    HasNoDirectives,
208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    HasNoDirectivesReported,
209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    HasExpectedNoDiagnostics,
210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    HasOtherExpectedDirectives
211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DiagnosticsEngine &Diags;
215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DiagnosticConsumer *PrimaryClient;
216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  std::unique_ptr<DiagnosticConsumer> PrimaryClientOwner;
217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  std::unique_ptr<TextDiagnosticBuffer> Buffer;
218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const Preprocessor *CurrentPreprocessor;
219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const LangOptions *LangOpts;
220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SourceManager *SrcManager;
221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned ActiveSourceFiles;
222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DirectiveStatus Status;
223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ExpectedData ED;
224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void CheckDiagnostics();
226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setSourceManager(SourceManager &SM) {
227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert((!SrcManager || SrcManager == &SM) && "SourceManager changed!");
228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SrcManager = &SM;
229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  // These facilities are used for validation in debug builds.
232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  class UnparsedFileStatus {
233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm::PointerIntPair<const FileEntry *, 1, bool> Data;
234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  public:
235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    UnparsedFileStatus(const FileEntry *File, bool FoundDirectives)
236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      : Data(File, FoundDirectives) {}
237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    const FileEntry *getFile() const { return Data.getPointer(); }
238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    bool foundDirectives() const { return Data.getInt(); }
239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef llvm::DenseMap<FileID, const FileEntry *> ParsedFilesMap;
241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef llvm::DenseMap<FileID, UnparsedFileStatus> UnparsedFilesMap;
242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ParsedFilesMap ParsedFiles;
243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  UnparsedFilesMap UnparsedFiles;
244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// Create a new verifying diagnostic client, which will issue errors to
247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// the currently-attached diagnostic client when a diagnostic does not match
248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// what is expected (as indicated in the source file).
249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VerifyDiagnosticConsumer(DiagnosticsEngine &Diags);
250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ~VerifyDiagnosticConsumer() override;
251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void BeginSourceFile(const LangOptions &LangOpts,
253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                       const Preprocessor *PP) override;
254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void EndSourceFile() override;
256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum ParsedStatus {
258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// File has been processed via HandleComment.
259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    IsParsed,
260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// File has diagnostics and may have directives.
262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    IsUnparsed,
263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    /// File has diagnostics but guaranteed no directives.
265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    IsUnparsedNoDirectives
266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// \brief Update lists of parsed and unparsed files.
269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void UpdateParsedFileStatus(SourceManager &SM, FileID FID, ParsedStatus PS);
270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool HandleComment(Preprocessor &PP, SourceRange Comment) override;
272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,
274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                        const Diagnostic &Info) override;
275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} // end namspace clang
278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#endif
280