Coverage Report

Created: 2022-01-18 06:27

/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
10.3M
  explicit OptionalDiagnostic(PartialDiagnostic *Diag = nullptr) : Diag(Diag) {}
33
34
5.12M
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
5.12M
    if (Diag)
36
951k
      *Diag << v;
37
5.12M
    return *this;
38
5.12M
  }
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::AccessKinds>(clang::AccessKinds const&)
Line
Count
Source
34
4.30k
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
4.30k
    if (Diag)
36
1.87k
      *Diag << v;
37
4.30k
    return *this;
38
4.30k
  }
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<bool>(bool const&)
Line
Count
Source
34
361k
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
361k
    if (Diag)
36
178k
      *Diag << v;
37
361k
    return *this;
38
361k
  }
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::QualType>(clang::QualType const&)
Line
Count
Source
34
420k
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
420k
    if (Diag)
36
48.3k
      *Diag << v;
37
420k
    return *this;
38
420k
  }
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::VarDecl const*>(clang::VarDecl const* const&)
Line
Count
Source
34
4.21M
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
4.21M
    if (Diag)
36
651k
      *Diag << v;
37
4.21M
    return *this;
38
4.21M
  }
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.76k
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
1.76k
    if (Diag)
36
1.09k
      *Diag << v;
37
1.76k
    return *this;
38
1.76k
  }
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<int>(int const&)
Line
Count
Source
34
19.8k
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
19.8k
    if (Diag)
36
5.43k
      *Diag << v;
37
19.8k
    return *this;
38
19.8k
  }
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::NamedDecl const*>(clang::NamedDecl const* const&)
Line
Count
Source
34
24
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
24
    if (Diag)
36
21
      *Diag << v;
37
24
    return *this;
38
24
  }
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::FieldDecl*>(clang::FieldDecl* 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::FieldDecl const*>(clang::FieldDecl const* const&)
Line
Count
Source
34
689
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
689
    if (Diag)
36
498
      *Diag << v;
37
689
    return *this;
38
689
  }
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::CheckSubobjectKind>(clang::CheckSubobjectKind const&)
Line
Count
Source
34
630
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
630
    if (Diag)
36
183
      *Diag << v;
37
630
    return *this;
38
630
  }
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<unsigned int>(unsigned int const&)
Line
Count
Source
34
451
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
451
    if (Diag)
36
211
      *Diag << v;
37
451
    return *this;
38
451
  }
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
11
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
11
    if (Diag)
36
8
      *Diag << v;
37
11
    return *this;
38
11
  }
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::CXXRecordDecl*>(clang::CXXRecordDecl* const&)
Line
Count
Source
34
17
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
17
    if (Diag)
36
17
      *Diag << v;
37
17
    return *this;
38
17
  }
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::FunctionDecl const*>(clang::FunctionDecl const* const&)
Line
Count
Source
34
64.1k
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
64.1k
    if (Diag)
36
31.7k
      *Diag << v;
37
64.1k
    return *this;
38
64.1k
  }
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
215
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
215
    if (Diag)
36
11
      *Diag << v;
37
215
    return *this;
38
215
  }
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
1.46k
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
1.46k
    if (Diag)
36
1.23k
      *Diag << v;
37
1.46k
    return *this;
38
1.46k
  }
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
34.9k
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
34.9k
    if (Diag)
36
30.2k
      *Diag << v;
37
34.9k
    return *this;
38
34.9k
  }
clang::OptionalDiagnostic& clang::OptionalDiagnostic::operator<<<clang::FixItHint>(clang::FixItHint const&)
Line
Count
Source
34
42
  template <typename T> OptionalDiagnostic &operator<<(const T &v) {
35
42
    if (Diag)
36
40
      *Diag << v;
37
42
    return *this;
38
42
  }
39
40
1.12k
  OptionalDiagnostic &operator<<(const llvm::APSInt &I) {
41
1.12k
    if (Diag) {
42
289
      SmallVector<char, 32> Buffer;
43
289
      I.toString(Buffer);
44
289
      *Diag << StringRef(Buffer.data(), Buffer.size());
45
289
    }
46
1.12k
    return *this;
47
1.12k
  }
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
58
  OptionalDiagnostic &operator<<(const llvm::APFixedPoint &FX) {
67
58
    if (Diag) {
68
8
      SmallVector<char, 32> Buffer;
69
8
      FX.toString(Buffer);
70
8
      *Diag << StringRef(Buffer.data(), Buffer.size());
71
8
    }
72
58
    return *this;
73
58
  }
74
};
75
76
} // namespace clang
77
78
#endif