Coverage Report

Created: 2018-09-25 23:22

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/clang/include/clang/AST/DeclAccessPair.h
Line
Count
Source (jump to first uncovered line)
1
//===--- DeclAccessPair.h - A decl bundled with its path access -*- C++ -*-===//
2
//
3
//                     The LLVM Compiler Infrastructure
4
//
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
7
//
8
//===----------------------------------------------------------------------===//
9
//
10
//  This file defines the DeclAccessPair class, which provides an
11
//  efficient representation of a pair of a NamedDecl* and an
12
//  AccessSpecifier.  Generally the access specifier gives the
13
//  natural access of a declaration when named in a class, as
14
//  defined in C++ [class.access.base]p1.
15
//
16
//===----------------------------------------------------------------------===//
17
18
#ifndef LLVM_CLANG_AST_DECLACCESSPAIR_H
19
#define LLVM_CLANG_AST_DECLACCESSPAIR_H
20
21
#include "clang/Basic/Specifiers.h"
22
#include "llvm/Support/DataTypes.h"
23
24
namespace clang {
25
26
class NamedDecl;
27
28
/// A POD class for pairing a NamedDecl* with an access specifier.
29
/// Can be put into unions.
30
0
class DeclAccessPair {
Unexecuted instantiation: clang::DeclAccessPair::operator=(clang::DeclAccessPair const&)
Unexecuted instantiation: clang::DeclAccessPair::operator=(clang::DeclAccessPair&&)
31
  uintptr_t Ptr; // we'd use llvm::PointerUnion, but it isn't trivial
32
33
  enum { Mask = 0x3 };
34
35
public:
36
110M
  static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS) {
37
110M
    DeclAccessPair p;
38
110M
    p.set(D, AS);
39
110M
    return p;
40
110M
  }
41
42
344M
  NamedDecl *getDecl() const {
43
344M
    return reinterpret_cast<NamedDecl*>(~Mask & Ptr);
44
344M
  }
45
12.1M
  AccessSpecifier getAccess() const {
46
12.1M
    return AccessSpecifier(Mask & Ptr);
47
12.1M
  }
48
49
45
  void setDecl(NamedDecl *D) {
50
45
    set(D, getAccess());
51
45
  }
52
47.4k
  void setAccess(AccessSpecifier AS) {
53
47.4k
    set(getDecl(), AS);
54
47.4k
  }
55
110M
  void set(NamedDecl *D, AccessSpecifier AS) {
56
110M
    Ptr = uintptr_t(AS) | reinterpret_cast<uintptr_t>(D);
57
110M
  }
58
59
26.7M
  operator NamedDecl*() const { return getDecl(); }
60
62.0M
  NamedDecl *operator->() const { return getDecl(); }
61
};
62
}
63
64
// Take a moment to tell SmallVector that DeclAccessPair is POD.
65
namespace llvm {
66
template<typename> struct isPodLike;
67
template<> struct isPodLike<clang::DeclAccessPair> {
68
   static const bool value = true;
69
};
70
}
71
72
#endif