/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/include/clang/AST/OptionalDiagnostic.h
Line | Count | Source |
1 | | //===- OptionalDiagnostic.h - An optional diagnostic ------------*- C++ -*-===// |
2 | | // |
3 | | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | | // See https://llvm.org/LICENSE.txt for license information. |
5 | | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | | // |
7 | | //===----------------------------------------------------------------------===// |
8 | | // |
9 | | /// \file |
10 | | /// Implements a partial diagnostic which may not be emitted. |
11 | | // |
12 | | //===----------------------------------------------------------------------===// |
13 | | |
14 | | #ifndef LLVM_CLANG_AST_OPTIONALDIAGNOSTIC_H |
15 | | #define LLVM_CLANG_AST_OPTIONALDIAGNOSTIC_H |
16 | | |
17 | | #include "clang/AST/APValue.h" |
18 | | #include "clang/Basic/PartialDiagnostic.h" |
19 | | #include "llvm/ADT/APFloat.h" |
20 | | #include "llvm/ADT/APSInt.h" |
21 | | #include "llvm/ADT/SmallVector.h" |
22 | | #include "llvm/ADT/StringRef.h" |
23 | | |
24 | | namespace clang { |
25 | | |
26 | | /// A partial diagnostic which we might know in advance that we are not going |
27 | | /// to emit. |
28 | | class OptionalDiagnostic { |
29 | | PartialDiagnostic *Diag; |
30 | | |
31 | | public: |
32 | 9.51M | explicit OptionalDiagnostic(PartialDiagnostic *Diag = nullptr) : Diag(Diag) {} |
33 | | |
34 | 4.55M | template <typename T> OptionalDiagnostic &operator<<(const T &v) { |
35 | 4.55M | if (Diag) |
36 | 878k | *Diag << v; |
37 | 4.55M | return *this; |
38 | 4.55M | } clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::AccessKinds>(clang::AccessKinds const&) Line | Count | Source | 34 | 4.12k | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 4.12k | if (Diag) | 36 | 1.61k | *Diag << v; | 37 | 4.12k | return *this; | 38 | 4.12k | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<bool>(bool const&) Line | Count | Source | 34 | 333k | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 333k | if (Diag) | 36 | 168k | *Diag << v; | 37 | 333k | return *this; | 38 | 333k | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::QualType>(clang::QualType const&) Line | Count | Source | 34 | 288k | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 288k | if (Diag) | 36 | 37.3k | *Diag << v; | 37 | 288k | return *this; | 38 | 288k | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::VarDecl const*>(clang::VarDecl const* const&) Line | Count | Source | 34 | 3.76M | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 3.76M | if (Diag) | 36 | 604k | *Diag << v; | 37 | 3.76M | return *this; | 38 | 3.76M | } |
Unexecuted instantiation: clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<char [31]>(char const (&) [31]) clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 34 | 1.74k | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 1.74k | if (Diag) | 36 | 1.08k | *Diag << v; | 37 | 1.74k | return *this; | 38 | 1.74k | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<int>(int const&) Line | Count | Source | 34 | 47.7k | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 47.7k | if (Diag) | 36 | 5.20k | *Diag << v; | 37 | 47.7k | return *this; | 38 | 47.7k | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::NamedDecl const*>(clang::NamedDecl const* const&) Line | Count | Source | 34 | 12 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 12 | if (Diag) | 36 | 11 | *Diag << v; | 37 | 12 | return *this; | 38 | 12 | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::FieldDecl*>(clang::FieldDecl* const&) Line | Count | Source | 34 | 5 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 5 | if (Diag) | 36 | 5 | *Diag << v; | 37 | 5 | return *this; | 38 | 5 | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::FieldDecl const*>(clang::FieldDecl const* const&) Line | Count | Source | 34 | 551 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 551 | if (Diag) | 36 | 392 | *Diag << v; | 37 | 551 | return *this; | 38 | 551 | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::CheckSubobjectKind>(clang::CheckSubobjectKind const&) Line | Count | Source | 34 | 607 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 607 | if (Diag) | 36 | 166 | *Diag << v; | 37 | 607 | return *this; | 38 | 607 | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<unsigned int>(unsigned int const&) Line | Count | Source | 34 | 357 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 357 | if (Diag) | 36 | 150 | *Diag << v; | 37 | 357 | return *this; | 38 | 357 | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::CXXRecordDecl const*>(clang::CXXRecordDecl const* const&) Line | Count | Source | 34 | 10 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 10 | if (Diag) | 36 | 10 | *Diag << v; | 37 | 10 | return *this; | 38 | 10 | } |
ExprConstant.cpp:clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<(anonymous namespace)::DynAlloc::Kind>((anonymous namespace)::DynAlloc::Kind const&) Line | Count | Source | 34 | 38 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 38 | if (Diag) | 36 | 34 | *Diag << v; | 37 | 38 | return *this; | 38 | 38 | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::CXXMethodDecl const*>(clang::CXXMethodDecl const* const&) Line | Count | Source | 34 | 5 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 5 | if (Diag) | 36 | 4 | *Diag << v; | 37 | 5 | return *this; | 38 | 5 | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::CXXRecordDecl*>(clang::CXXRecordDecl* const&) Line | Count | Source | 34 | 13 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 13 | if (Diag) | 36 | 13 | *Diag << v; | 37 | 13 | return *this; | 38 | 13 | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::FunctionDecl const*>(clang::FunctionDecl const* const&) Line | Count | Source | 34 | 61.4k | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 61.4k | if (Diag) | 36 | 31.2k | *Diag << v; | 37 | 61.4k | return *this; | 38 | 61.4k | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::RecordDecl const*>(clang::RecordDecl const* const&) Line | Count | Source | 34 | 8 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 8 | if (Diag) | 36 | 8 | *Diag << v; | 37 | 8 | return *this; | 38 | 8 | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::AccessSpecifier>(clang::AccessSpecifier const&) Line | Count | Source | 34 | 8 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 8 | if (Diag) | 36 | 8 | *Diag << v; | 37 | 8 | return *this; | 38 | 8 | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::FunctionDecl*>(clang::FunctionDecl* const&) Line | Count | Source | 34 | 211 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 211 | if (Diag) | 36 | 10 | *Diag << v; | 37 | 211 | return *this; | 38 | 211 | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::SourceRange>(clang::SourceRange const&) Line | Count | Source | 34 | 40 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 40 | if (Diag) | 36 | 32 | *Diag << v; | 37 | 40 | return *this; | 38 | 40 | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::CXXConstructorDecl const*>(clang::CXXConstructorDecl const* const&) Line | Count | Source | 34 | 15.2k | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 15.2k | if (Diag) | 36 | 1.20k | *Diag << v; | 37 | 15.2k | return *this; | 38 | 15.2k | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<llvm::StringRef>(llvm::StringRef const&) Line | Count | Source | 34 | 41 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 41 | if (Diag) | 36 | 41 | *Diag << v; | 37 | 41 | return *this; | 38 | 41 | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::ValueDecl const*>(clang::ValueDecl const* const&) Line | Count | Source | 34 | 32.1k | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 32.1k | if (Diag) | 36 | 27.7k | *Diag << v; | 37 | 32.1k | return *this; | 38 | 32.1k | } |
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::FixItHint>(clang::FixItHint const&) Line | Count | Source | 34 | 38 | template <typename T> OptionalDiagnostic &operator<<(const T &v) { | 35 | 38 | if (Diag) | 36 | 36 | *Diag << v; | 37 | 38 | return *this; | 38 | 38 | } |
|
39 | | |
40 | 768 | OptionalDiagnostic &operator<<(const llvm::APSInt &I) { |
41 | 768 | if (Diag) { |
42 | 190 | SmallVector<char, 32> Buffer; |
43 | 190 | I.toString(Buffer); |
44 | 190 | *Diag << StringRef(Buffer.data(), Buffer.size()); |
45 | 190 | } |
46 | 768 | return *this; |
47 | 768 | } |
48 | | |
49 | 28 | OptionalDiagnostic &operator<<(const llvm::APFloat &F) { |
50 | 28 | if (Diag) { |
51 | | // FIXME: Force the precision of the source value down so we don't |
52 | | // print digits which are usually useless (we don't really care here if |
53 | | // we truncate a digit by accident in edge cases). Ideally, |
54 | | // APFloat::toString would automatically print the shortest |
55 | | // representation which rounds to the correct value, but it's a bit |
56 | | // tricky to implement. Could use std::to_chars. |
57 | 17 | unsigned precision = llvm::APFloat::semanticsPrecision(F.getSemantics()); |
58 | 17 | precision = (precision * 59 + 195) / 196; |
59 | 17 | SmallVector<char, 32> Buffer; |
60 | 17 | F.toString(Buffer, precision); |
61 | 17 | *Diag << StringRef(Buffer.data(), Buffer.size()); |
62 | 17 | } |
63 | 28 | return *this; |
64 | 28 | } |
65 | | |
66 | 43 | OptionalDiagnostic &operator<<(const llvm::APFixedPoint &FX) { |
67 | 43 | if (Diag) { |
68 | 8 | SmallVector<char, 32> Buffer; |
69 | 8 | FX.toString(Buffer); |
70 | 8 | *Diag << StringRef(Buffer.data(), Buffer.size()); |
71 | 8 | } |
72 | 43 | return *this; |
73 | 43 | } |
74 | | }; |
75 | | |
76 | | } // namespace clang |
77 | | |
78 | | #endif |