clang: include/clang/AST/TemplateBase.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef LLVM_CLANG_AST_TEMPLATEBASE_H
15#define LLVM_CLANG_AST_TEMPLATEBASE_H
16
23#include "llvm/ADT/APInt.h"
24#include "llvm/ADT/APSInt.h"
25#include "llvm/ADT/ArrayRef.h"
26#include "llvm/ADT/SmallVector.h"
27#include "llvm/Support/Compiler.h"
28#include "llvm/Support/TrailingObjects.h"
29#include
30#include
31#include
32#include
33
34namespace llvm {
35
36class FoldingSetNodeID;
37
38
39
40
48
49}
50
52
55class Expr;
56struct PrintingPolicy;
57class TypeSourceInfo;
58class ValueDecl;
59
60
62public:
63
65
66
68
69
71
72
73
75
76
77
79
80
81
83
84
85
86
87
88
90
91
92
94
95
96
98
99
100
101
102
104
105
106
108 };
109
110private:
111
112
113 struct DA {
114 LLVM_PREFERRED_TYPE(ArgKind)
115 unsigned Kind : 31;
116 LLVM_PREFERRED_TYPE(bool)
117 unsigned IsDefaulted : 1;
118 void *QT;
120 };
121 struct I {
122 LLVM_PREFERRED_TYPE(ArgKind)
123 unsigned Kind : 31;
124 LLVM_PREFERRED_TYPE(bool)
125 unsigned IsDefaulted : 1;
126
127
128
129 unsigned BitWidth : 31;
130 LLVM_PREFERRED_TYPE(bool)
131 unsigned IsUnsigned : 1;
132 union {
133
134 uint64_t VAL;
135
136
137 const uint64_t *pVal;
138 };
139 void *Type;
140 };
141 struct V {
142 LLVM_PREFERRED_TYPE(ArgKind)
143 unsigned Kind : 31;
144 LLVM_PREFERRED_TYPE(bool)
145 unsigned IsDefaulted : 1;
147 void *Type;
148 };
149 struct A {
150 LLVM_PREFERRED_TYPE(ArgKind)
151 unsigned Kind : 31;
152 LLVM_PREFERRED_TYPE(bool)
153 unsigned IsDefaulted : 1;
154 unsigned NumArgs;
156 };
157 struct TA {
158 LLVM_PREFERRED_TYPE(ArgKind)
159 unsigned Kind : 31;
160 LLVM_PREFERRED_TYPE(bool)
161 unsigned IsDefaulted : 1;
162 UnsignedOrNone NumExpansions;
163 void *Name;
164 };
165 struct TV {
166 LLVM_PREFERRED_TYPE(ArgKind)
167 unsigned Kind : 31;
168 LLVM_PREFERRED_TYPE(bool)
169 unsigned IsDefaulted : 1;
170 LLVM_PREFERRED_TYPE(bool)
171 unsigned IsCanonicalExpr : 1;
173 };
174 union {
181 };
182
183 void initFromType(QualType T, bool IsNullPtr, bool IsDefaulted);
184 void initFromDeclaration(ValueDecl *D, QualType QT, bool IsDefaulted);
185 void initFromIntegral(const ASTContext &Ctx, const llvm::APSInt &Value,
188 const APValue &V, bool IsDefaulted);
189
190public:
191
194
195
197 bool IsDefaulted = false) {
198 initFromType(T, isNullPtr, IsDefaulted);
199 }
200
201
202
204 initFromDeclaration(D, QT, IsDefaulted);
205 }
206
207
208
211
212
214 bool IsDefaulted = false);
215
216
217
222
223
224
225
226
227
228
229
230
231
232
233
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
256 bool IsDefaulted = false) {
260 TemplateArg.NumExpansions = NumExpansions;
261 }
262
263
264
265
266
267
274
275
276
277
278
280 this->Args.Kind = Pack;
281 this->Args.IsDefaulted = false;
282 this->Args.Args = Args.data();
283 this->Args.NumArgs = Args.size();
284 }
285
289
290
291
294
295
297
298
300
301 TemplateArgumentDependence getDependence() const;
302
303
304
305
307
308
309
311
312
313
315
316
318
320
321
323 assert(getKind() == Type && "Unexpected kind");
325 }
326
327
328
333
338
339
344
345
350
351
352
355 "Unexpected kind");
356
358 }
359
360
361
363
364
365
368
369 using namespace llvm;
370
371 if (Integer.BitWidth <= 64)
373
374 unsigned NumWords = APInt::getNumWords(Integer.BitWidth);
377 }
378
379
384
387 Integer.Type = T.getAsOpaquePtr();
388 }
389
390
391
393
394
395
397
398
400
401
405
406
407
409
410
415
420
421
423
424
425
428 return Args.Args;
429 }
430
431
432
435 return Args.Args + Args.NumArgs;
436 }
437
438
439
443
444
445
448 return Args.NumArgs;
449 }
450
451
454 return {Args.Args, Args.NumArgs};
455 }
456
457
458
460
461
462
464
465
467 bool IncludeType) const;
468
469
471
472
473 void dump() const;
474
475
476 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) const;
477};
478
479
487
491
494
496
497
502
506
508
512
516
520
521private:
522 llvm::PointerUnion<TemplateTemplateArgLocInfo *, Expr *, TypeSourceInfo *>
524};
525
526
527
531
532public:
534
537 : Argument(Argument), LocInfo(Opaque) {}
538
540 : Argument(Argument), LocInfo(TInfo) {
542 }
543
545 : Argument(Argument), LocInfo(E) {
546
547
548
554 }
555
561
562
570
571
573
575
577
580 return nullptr;
581 return LocInfo.getAsTypeSourceInfo();
582 }
583
586 return LocInfo.getAsExpr();
587 }
588
591 return LocInfo.getAsExpr();
592 }
593
596 return LocInfo.getAsExpr();
597 }
598
601 return LocInfo.getAsExpr();
602 }
603
606 return LocInfo.getAsExpr();
607 }
608
613 return LocInfo.getTemplateKwLoc();
614 }
615
617
622 return LocInfo.getTemplateNameLoc();
623 }
624
628 return LocInfo.getTemplateEllipsisLoc();
629 }
630};
631
632
633
638
639public:
641
643 : LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc) {}
644
645
646
648
651
654
655 unsigned size() const { return Arguments.size(); }
656
658 return Arguments.data();
659 }
660
662
664 return Arguments[I];
665 }
666
668
670};
671
672
673
674
675
676struct ASTTemplateArgumentListInfo final
677 : private llvm::TrailingObjects<ASTTemplateArgumentListInfo,
678 TemplateArgumentLoc> {
679private:
681 friend TrailingObjects;
682
684
685
686 ASTTemplateArgumentListInfo(const ASTTemplateArgumentListInfo *List);
687
688public:
689
691
692
694
695
697
700
701
703 return getTrailingObjects();
704 }
706
710
714
717
718
721};
722
723
724
725
726
727
728
729
731
733
734
736
737
738
739
740
742
743
745
749
750
751
755 TemplateArgumentDependence &Deps);
757
760};
761
764
765}
766
767#endif
static StringRef bytes(const std::vector< T, Allocator > &v)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::SourceLocation class and associated facilities.
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Information about one declarator, including the parsed type information and the identifier.
This represents one expression.
A C++ nested-name-specifier augmented with source location information.
A (possibly-)qualified type.
static QualType getFromOpaquePtr(const void *Ptr)
Encodes a location in the source.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.
A convenient class for passing around template argument information.
Definition TemplateBase.h:634
SourceLocation getRAngleLoc() const
Definition TemplateBase.h:650
void setLAngleLoc(SourceLocation Loc)
Definition TemplateBase.h:652
void setRAngleLoc(SourceLocation Loc)
Definition TemplateBase.h:653
TemplateArgumentListInfo(SourceLocation LAngleLoc, SourceLocation RAngleLoc)
Definition TemplateBase.h:642
const TemplateArgumentLoc * getArgumentArray() const
Definition TemplateBase.h:657
void addArgument(const TemplateArgumentLoc &Loc)
Definition TemplateBase.h:669
ArrayRef< TemplateArgumentLoc > arguments() const
Definition TemplateBase.h:661
TemplateArgumentListInfo()=default
const TemplateArgumentLoc & operator[](unsigned I) const
Definition TemplateBase.h:663
SourceLocation getLAngleLoc() const
Definition TemplateBase.h:649
TemplateArgumentLoc & operator[](unsigned I)
Definition TemplateBase.h:667
unsigned size() const
Definition TemplateBase.h:655
Location wrapper for a TemplateArgument.
Definition TemplateBase.h:528
SourceLocation getLocation() const
Definition TemplateBase.h:563
SourceLocation getTemplateEllipsisLoc() const
Definition TemplateBase.h:625
Expr * getSourceStructuralValueExpression() const
Definition TemplateBase.h:604
Expr * getSourceIntegralExpression() const
Definition TemplateBase.h:599
TemplateArgumentLocInfo getLocInfo() const
Definition TemplateBase.h:576
const TemplateArgument & getArgument() const
Definition TemplateBase.h:574
TemplateArgumentLoc(const TemplateArgument &Argument, TemplateArgumentLocInfo Opaque)
Definition TemplateBase.h:535
SourceLocation getTemplateNameLoc() const
Definition TemplateBase.h:618
TemplateArgumentLoc()
Definition TemplateBase.h:533
SourceLocation getTemplateKWLoc() const
Definition TemplateBase.h:609
TypeSourceInfo * getTypeSourceInfo() const
Definition TemplateBase.h:578
TemplateArgumentLoc(const TemplateArgument &Argument, TypeSourceInfo *TInfo)
Definition TemplateBase.h:539
Expr * getSourceNullPtrExpression() const
Definition TemplateBase.h:594
TemplateArgumentLoc(const TemplateArgument &Argument, Expr *E)
Definition TemplateBase.h:544
SourceRange getSourceRange() const LLVM_READONLY
Expr * getSourceDeclExpression() const
Definition TemplateBase.h:589
Expr * getSourceExpression() const
Definition TemplateBase.h:584
NestedNameSpecifierLoc getTemplateQualifierLoc() const
Represents a template argument.
Definition TemplateBase.h:61
struct DA DeclArg
Definition TemplateBase.h:175
ArrayRef< TemplateArgument > getPackAsArray() const
Return the array of arguments in this template argument pack.
Definition TemplateBase.h:452
void dump(raw_ostream &Out, const ASTContext &Context) const
Debugging aid that dumps the template argument.
QualType getStructuralValueType() const
Get the type of a StructuralValue.
Definition TemplateBase.h:402
TemplateArgument(const TemplateArgument &Other, QualType Type)
Construct an integral constant template argument with the same value as Other but a different type.
Definition TemplateBase.h:218
QualType getParamTypeForDecl() const
Definition TemplateBase.h:334
TemplateArgument(QualType T, bool isNullPtr=false, bool IsDefaulted=false)
Construct a template type argument.
Definition TemplateBase.h:196
Expr * getAsExpr() const
Retrieve the template argument as an expression.
Definition TemplateBase.h:411
struct TV TypeOrValue
Definition TemplateBase.h:180
bool isDependent() const
Whether this template argument is dependent on a template parameter such that its result can change f...
TemplateArgument(ArrayRef< TemplateArgument > Args)
Construct a template argument that is a template argument pack.
Definition TemplateBase.h:279
pack_iterator pack_end() const
Iterator referencing one past the last argument of a template argument pack.
Definition TemplateBase.h:433
const TemplateArgument * pack_iterator
Iterator that traverses the elements of a template argument pack.
Definition TemplateBase.h:422
struct V Value
Definition TemplateBase.h:177
bool isInstantiationDependent() const
Whether this template argument is dependent on a template parameter.
constexpr TemplateArgument()
Construct an empty, invalid template argument.
Definition TemplateBase.h:192
TemplateArgument(TemplateName Name, UnsignedOrNone NumExpansions, bool IsDefaulted=false)
Construct a template argument that is a template pack expansion.
Definition TemplateBase.h:255
void setIntegralType(QualType T)
Definition TemplateBase.h:385
TemplateArgument(ValueDecl *D, QualType QT, bool IsDefaulted=false)
Construct a template argument that refers to a (non-dependent) declaration.
Definition TemplateBase.h:203
pack_iterator pack_begin() const
Iterator referencing the first argument of a template argument pack.
Definition TemplateBase.h:426
UnsignedOrNone getNumTemplateExpansions() const
Retrieve the number of expansions that a template template argument expansion will produce,...
QualType getNonTypeTemplateArgumentType() const
If this is a non-type template argument, get its type.
bool isConceptOrConceptTemplateParameter() const
void dump() const
Debugging aid that dumps the template argument to standard error.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) const
Used to insert TemplateArguments into FoldingSets.
QualType getAsType() const
Retrieve the type for a type template argument.
Definition TemplateBase.h:322
llvm::APSInt getAsIntegral() const
Retrieve the template argument as an integral value.
Definition TemplateBase.h:366
QualType getNullPtrType() const
Retrieve the type for null non-type template argument.
Definition TemplateBase.h:340
static TemplateArgument CreatePackCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument pack by copying the given set of template arguments.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
Definition TemplateBase.h:346
bool containsUnexpandedParameterPack() const
Whether this template argument contains an unexpanded parameter pack.
TemplateArgument getPackExpansionPattern() const
When the template argument is a pack expansion, returns the pattern of the pack expansion.
TemplateArgument(Expr *E, bool IsCanonical, bool IsDefaulted=false)
Construct a template argument that is an expression.
Definition TemplateBase.h:268
bool isNull() const
Determine whether this template argument has no value.
Definition TemplateBase.h:299
static TemplateArgument getEmptyPack()
Definition TemplateBase.h:286
unsigned pack_size() const
The number of template arguments in the given template argument pack.
Definition TemplateBase.h:446
bool structurallyEquals(const TemplateArgument &Other) const
Determines whether two template arguments are superficially the same.
struct TA TemplateArg
Definition TemplateBase.h:179
void print(const PrintingPolicy &Policy, raw_ostream &Out, bool IncludeType) const
Print this template argument to the given output stream.
QualType getIntegralType() const
Retrieve the type of the integral value.
Definition TemplateBase.h:380
bool getIsDefaulted() const
If returns 'true', this TemplateArgument corresponds to a default template parameter.
Definition TemplateBase.h:396
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
Definition TemplateBase.h:329
TemplateArgument(TemplateName Name, bool IsDefaulted=false)
Construct a template argument that is a template.
Definition TemplateBase.h:234
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
Definition TemplateBase.h:440
ArgKind
The kind of template argument we're storing.
Definition TemplateBase.h:64
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
Definition TemplateBase.h:74
@ Template
The template argument is a template name that was provided for a template template parameter.
Definition TemplateBase.h:93
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
Definition TemplateBase.h:89
@ Pack
The template argument is actually a parameter pack.
Definition TemplateBase.h:107
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
Definition TemplateBase.h:97
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
Definition TemplateBase.h:78
@ Type
The template argument is a type.
Definition TemplateBase.h:70
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
Definition TemplateBase.h:67
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
Definition TemplateBase.h:82
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
Definition TemplateBase.h:103
ArgKind getKind() const
Return the kind of stored template argument.
Definition TemplateBase.h:296
TemplateArgumentDependence getDependence() const
bool isCanonicalExpr() const
Definition TemplateBase.h:416
bool isPackExpansion() const
Determine whether this template argument is a pack expansion.
struct I Integer
Definition TemplateBase.h:176
struct A Args
Definition TemplateBase.h:178
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
Definition TemplateBase.h:353
const APValue & getAsStructuralValue() const
Get the value of a StructuralValue.
Definition TemplateBase.h:399
void setIsDefaulted(bool v)
Set to 'true' if this TemplateArgument corresponds to a default template parameter.
Definition TemplateBase.h:392
Represents a C++ template name within the type system.
static TemplateName getFromVoidPointer(void *Ptr)
Build a template name from a void pointer.
void * getAsVoidPointer() const
Retrieve the template name as a void pointer.
A container of type source information.
The base class of the type hierarchy.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
The JSON file list parser is used to communicate input to InstallAPI.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
const FunctionProtoType * T
bool isNullPtr(const clang::Expr *E)
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
U cast(CodeGen::Address addr)
@ Other
Other implicit parameter.
Diagnostic wrappers for TextAPI types for error reporting.
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
Represents an explicit template argument list in C++, e.g., the "" in "sort".
Definition TemplateBase.h:678
SourceLocation RAngleLoc
The source location of the right angle bracket ('>').
Definition TemplateBase.h:693
const TemplateArgumentLoc * getTemplateArgs() const
Retrieve the template arguments.
Definition TemplateBase.h:702
SourceLocation LAngleLoc
The source location of the left angle bracket ('<').
Definition TemplateBase.h:690
const TemplateArgumentLoc & operator[](unsigned I) const
Definition TemplateBase.h:711
SourceLocation getLAngleLoc() const
Definition TemplateBase.h:698
friend class ASTNodeImporter
Definition TemplateBase.h:680
ArrayRef< TemplateArgumentLoc > arguments() const
Definition TemplateBase.h:707
unsigned getNumTemplateArgs() const
Definition TemplateBase.h:705
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
Definition TemplateBase.h:696
SourceLocation getRAngleLoc() const
Definition TemplateBase.h:699
Represents an explicit template argument list in C++, e.g., the "" in "sort".
Definition TemplateBase.h:730
SourceLocation LAngleLoc
The source location of the left angle bracket ('<').
Definition TemplateBase.h:732
void copyInto(const TemplateArgumentLoc *ArgArray, TemplateArgumentListInfo &List) const
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
Definition TemplateBase.h:744
void initializeFrom(SourceLocation TemplateKWLoc, const TemplateArgumentListInfo &List, TemplateArgumentLoc *OutArgArray)
SourceLocation RAngleLoc
The source location of the right angle bracket ('>').
Definition TemplateBase.h:735
SourceLocation TemplateKWLoc
The source location of the template keyword; this is used as part of the representation of qualified ...
Definition TemplateBase.h:741
Describes how types, statements, expressions, and declarations should be printed.
Definition TemplateBase.h:481
SourceLocation TemplateKwLoc
Definition TemplateBase.h:483
SourceLocation TemplateNameLoc
Definition TemplateBase.h:484
void * QualifierLocData
Definition TemplateBase.h:482
SourceLocation EllipsisLoc
Definition TemplateBase.h:485
Location information for a TemplateArgument.
Definition TemplateBase.h:480
SourceLocation getTemplateEllipsisLoc() const
Definition TemplateBase.h:517
SourceLocation getTemplateKwLoc() const
Definition TemplateBase.h:509
TypeSourceInfo * getAsTypeSourceInfo() const
Definition TemplateBase.h:503
TemplateArgumentLocInfo(TypeSourceInfo *Declarator)
Definition TemplateBase.h:493
TemplateTemplateArgLocInfo * getTemplate() const
Definition TemplateBase.h:488
SourceLocation getTemplateNameLoc() const
Definition TemplateBase.h:513
TemplateArgumentLocInfo()
Definition TemplateBase.h:492
TemplateArgumentLocInfo(Expr *E)
Definition TemplateBase.h:495
Expr * getAsExpr() const
Definition TemplateBase.h:507
static void * getAsVoidPointer(clang::Expr *P)
Definition TemplateBase.h:42
static clang::Expr * getFromVoidPointer(void *P)
Definition TemplateBase.h:43
static constexpr int NumLowBitsAvailable
Definition TemplateBase.h:46