 |
|
 |
|
| Files: |
1 |
|
Branches Taken: |
56.7% |
17 / 30 |
| Generated: |
2010-02-10 01:31 |
|
Branches Executed: |
80.0% |
24 / 30 |
| |
|
Line Coverage: |
80.4% |
37 / 46 |
| |
 |
|
 |
1 : //===--- TemplateBase.cpp - Common template AST class implementation ------===//
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 implements common classes used throughout C++ template
11 : // representations.
12 : //
13 : //===----------------------------------------------------------------------===//
14 :
15 : #include "llvm/ADT/FoldingSet.h"
16 : #include "clang/AST/TemplateBase.h"
17 : #include "clang/AST/DeclBase.h"
18 : #include "clang/AST/DeclTemplate.h"
19 : #include "clang/AST/Expr.h"
20 : #include "clang/AST/TypeLoc.h"
21 :
22 : using namespace clang;
23 :
24 : //===----------------------------------------------------------------------===//
25 : // TemplateArgument Implementation
26 : //===----------------------------------------------------------------------===//
27 :
28 : /// \brief Construct a template argument pack.
29 : void TemplateArgument::setArgumentPack(TemplateArgument *args, unsigned NumArgs,
30 9: bool CopyArgs) {
9: branch 1 taken
0: branch 2 not taken
31 9: assert(isNull() && "Must call setArgumentPack on a null argument");
32 :
33 9: Kind = Pack;
34 9: Args.NumArgs = NumArgs;
35 9: Args.CopyArgs = CopyArgs;
9: branch 0 taken
0: branch 1 not taken
36 9: if (!Args.CopyArgs) {
37 9: Args.Args = args;
38 9: return;
39 : }
40 :
41 : // FIXME: Allocate in ASTContext
0: branch 2 not taken
0: branch 3 not taken
42 0: Args.Args = new TemplateArgument[NumArgs];
0: branch 0 not taken
0: branch 1 not taken
43 0: for (unsigned I = 0; I != Args.NumArgs; ++I)
44 0: Args.Args[I] = args[I];
45 : }
46 :
47 : void TemplateArgument::Profile(llvm::FoldingSetNodeID &ID,
48 10765: ASTContext &Context) const {
49 10765: ID.AddInteger(Kind);
2: branch 0 taken
7225: branch 1 taken
95: branch 2 taken
39: branch 3 taken
3220: branch 4 taken
184: branch 5 taken
0: branch 6 not taken
0: branch 7 not taken
50 10765: switch (Kind) {
51 : case Null:
52 2: break;
53 :
54 : case Type:
55 7225: getAsType().Profile(ID);
56 7225: break;
57 :
58 : case Declaration:
92: branch 1 taken
3: branch 2 taken
59 95: ID.AddPointer(getAsDecl()? getAsDecl()->getCanonicalDecl() : 0);
60 95: break;
61 :
62 : case Template:
12: branch 0 taken
27: branch 1 taken
63 39: if (TemplateTemplateParmDecl *TTP
64 : = dyn_cast_or_null<TemplateTemplateParmDecl>(
65 39: getAsTemplate().getAsTemplateDecl())) {
66 12: ID.AddBoolean(true);
67 12: ID.AddInteger(TTP->getDepth());
68 12: ID.AddInteger(TTP->getPosition());
69 : } else {
70 27: ID.AddBoolean(false);
71 : ID.AddPointer(Context.getCanonicalTemplateName(getAsTemplate())
72 27: .getAsVoidPointer());
73 : }
74 39: break;
75 :
76 : case Integral:
77 3220: getAsIntegral()->Profile(ID);
78 3220: getIntegralType().Profile(ID);
79 3220: break;
80 :
81 : case Expression:
82 184: getAsExpr()->Profile(ID, Context, true);
83 184: break;
84 :
85 : case Pack:
86 0: ID.AddInteger(Args.NumArgs);
0: branch 0 not taken
0: branch 1 not taken
87 0: for (unsigned I = 0; I != Args.NumArgs; ++I)
88 0: Args.Args[I].Profile(ID, Context);
89 : }
90 10765: }
91 :
92 : //===----------------------------------------------------------------------===//
93 : // TemplateArgumentLoc Implementation
94 : //===----------------------------------------------------------------------===//
95 :
96 43: SourceRange TemplateArgumentLoc::getSourceRange() const {
14: branch 1 taken
0: branch 2 not taken
15: branch 3 taken
14: branch 4 taken
0: branch 5 not taken
0: branch 6 not taken
97 43: switch (Argument.getKind()) {
98 : case TemplateArgument::Expression:
99 14: return getSourceExpression()->getSourceRange();
100 :
101 : case TemplateArgument::Declaration:
102 0: return getSourceDeclExpression()->getSourceRange();
103 :
104 : case TemplateArgument::Type:
105 15: return getTypeSourceInfo()->getTypeLoc().getFullSourceRange();
106 :
107 : case TemplateArgument::Template:
2: branch 2 taken
12: branch 3 taken
108 14: if (getTemplateQualifierRange().isValid())
109 : return SourceRange(getTemplateQualifierRange().getBegin(),
110 2: getTemplateNameLoc());
111 12: return SourceRange(getTemplateNameLoc());
112 :
113 : case TemplateArgument::Integral:
114 : case TemplateArgument::Pack:
115 : case TemplateArgument::Null:
116 0: return SourceRange();
117 : }
118 :
119 : // Silence bonus gcc warning.
120 0: return SourceRange();
121 : }
Generated: 2010-02-10 01:31 by zcov