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