clang: lib/AST/ComputeDependence.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

20#include "llvm/ADT/ArrayRef.h"

21

22using namespace clang;

23

26}

27

30 if (auto *S = E->getSourceExpr())

31 D |= S->getDependence();

32 assert(!(D & ExprDependence::UnexpandedPack));

33 return D;

34}

35

38}

39

43

46

47

48

49

50

51

52

53

54

55

56

57 if (Ctx.getLangOpts().CPlusPlus && E->getOpcode() == UO_AddrOf &&

58 !(Dep & ExprDependence::Value)) {

61 Result.Diag = &Diag;

62

64 Result.Val.isLValue()) {

65 auto *VD = Result.Val.getLValueBase().dyn_cast<const ValueDecl *>();

66 if (VD && VD->isTemplated()) {

67 auto *VarD = dyn_cast(VD);

68 if (!VarD || !VarD->hasLocalStorage())

69 Dep |= ExprDependence::Value;

70 }

71 }

72 }

73

74 return Dep;

75}

76

78

79

80 if (E->isArgumentType())

83

86

87 if (ArgDeps & ExprDependence::Type)

88 Deps |= ExprDependence::Value;

89

90

91 auto ExprKind = E->getKind();

92 if (ExprKind != UETT_AlignOf && ExprKind != UETT_PreferredAlignOf)

93 return Deps;

94 if ((Deps & ExprDependence::Value) && (Deps & ExprDependence::Instantiation))

95 return Deps;

96

97 auto *NoParens = E->getArgumentExpr()->IgnoreParens();

99 if (const auto *DRE = dyn_cast(NoParens))

100 D = DRE->getDecl();

101 else if (const auto *ME = dyn_cast(NoParens))

102 D = ME->getMemberDecl();

103 if (D)

104 return Deps;

106 if (I->isAlignmentErrorDependent())

107 Deps |= ExprDependence::Error;

108 if (I->isAlignmentDependent())

109 Deps |= ExprDependence::ValueInstantiation;

110 }

111 return Deps;

112}

113

116}

117

121 : ExprDependence::None);

122}

123

129}

130

132

133

134

137 if (auto *S = E->getSubExpr())

139 return D;

140}

141

143

144

145

146

147

148

149

150

153 cast(E)->getTypeAsWritten()->getDependence()) |

155 if (auto *S = E->getSubExpr())

157 return D;

158}

159

162}

163

165

166

167

168

171}

172

175}

176

179

180 if (const auto *CompoundExprResult =

181 dyn_cast_or_null(E->getSubStmt()->getStmtExprResult()))

182 if (const Expr *ResultExpr = CompoundExprResult->getExprStmt())

183 D |= ResultExpr->getDependence();

184

185

186

187 if (TemplateDepth)

188 D |= ExprDependence::ValueInstantiation;

189

191}

192

199 return D;

200}

201

203 if (E->isConditionDependent())

204 return ExprDependence::TypeValueInstantiation |

207

211 if (E->isConditionTrue())

212 std::swap(Active, Inactive);

213

214

215 return (Active & ExprDependence::TypeValue) |

216 ((Cond | Active | Inactive) & ~ExprDependence::TypeValue);

217}

218

220 auto D = ExprDependence::None;

221 for (auto *E : P->exprs())

223 return D;

224}

225

230 return D;

231}

232

235 (ExprDependence::Instantiation | ExprDependence::Error);

236}

237

240 E->getSubExpr()->getDependence() | ExprDependence::Instantiation;

244}

245

248 ExprDependence::Instantiation;

249}

250

253}

254

256 bool ContainsUnexpandedParameterPack) {

258 if (E->getBlockDecl()->isDependentContext())

259 D |= ExprDependence::Instantiation;

260 if (ContainsUnexpandedParameterPack)

261 D |= ExprDependence::UnexpandedPack;

262 return D;

263}

264

266

267

272 return D;

273}

274

277}

278

282 return D;

283}

284

286 auto D = ExprDependence::None;

287 if (E->isTypeOperand())

290 else

292

294}

295

298}

299

302}

303

305 if (E->isTypeOperand())

308

310}

311

313

314

316

317

318

319

320

321

322

323 if (E->isCapturedByCopyInLambdaWithExplicitObjectParameter())

324 D |= ExprDependence::Type;

325

326 assert(!(D & ExprDependence::UnexpandedPack));

327 return D;

328}

329

331 auto *Op = E->getSubExpr();

332 if (!Op)

333 return ExprDependence::None;

335}

336

339}

340

343 if (auto *TSI = E->getTypeSourceInfo())

345 return D;

346}

347

350}

351

354 if (auto *Dim = E->getDimensionExpression())

355 D |= Dim->getDependence();

357}

358

360

362

364 D |= ExprDependence::Value;

365 return D;

366}

367

371 D |= ExprDependence::ValueInstantiation;

372 return D;

373}

374

376 return (E->getPattern()->getDependence() & ~ExprDependence::UnexpandedPack) |

377 ExprDependence::TypeValueInstantiation;

378}

379

381

384

386 if (D & ExprDependence::TypeValueInstantiation)

388 ExprDependence::Instantiation;

389

391 if (Exprs.empty() || E->isFullySubstituted())

392 D |= PatternDep | ExprDependence::Instantiation;

394 std::optional Index = E->getSelectedIndex();

395 assert(Index && *Index < Exprs.size() && "pack index out of bound");

396 D |= Exprs[*Index]->getDependence();

397 }

398 return D;

399}

400

403}

404

406 if (auto *Resume = E->getResumeExpr())

407 return (Resume->getDependence() &

408 (ExprDependence::TypeValue | ExprDependence::Error)) |

411 ExprDependence::TypeValueInstantiation;

412}

413

416 ExprDependence::TypeValueInstantiation;

417}

418

421}

422

425}

426

429}

430

432 if (E->isObjectReceiver())

434 if (E->isSuperReceiver())

438 assert(E->isClassReceiver());

439 return ExprDependence::None;

440}

441

444}

445

449}

450

453}

454

457 if (auto *LB = E->getLowerBound())

458 D |= LB->getDependence();

459 if (auto *Len = E->getLength())

460 D |= Len->getDependence();

461

462 if (E->isOMPArraySection()) {

463 if (auto *Stride = E->getStride())

464 D |= Stride->getDependence();

465 }

466 return D;

467}

468

471 for (Expr *Dim: E->getDimensions())

474 return D;

475}

476

479 for (unsigned I = 0, End = E->numOfIterators(); I < End; ++I) {

480 if (auto *DD = cast_or_null(E->getIteratorDecl(I))) {

481

482 if (auto *TSI = DD->getTypeSourceInfo()) {

484 }

485 }

488 D |= BE->getDependence();

490 D |= EE->getDependence();

492 D |= SE->getDependence();

493 }

494 return D;

495}

496

497

498

499

501 auto Deps = ExprDependence::None;

502

503 if (auto *NNS = E->getQualifier())

505 ~NestedNameSpecifierDependence::Dependent);

506

507 if (auto *FirstArg = E->getTemplateArgs()) {

508 unsigned NumArgs = E->getNumTemplateArgs();

509 for (auto *Arg = FirstArg, *End = FirstArg + NumArgs; Arg < End; ++Arg)

510 Deps |= toExprDependence(Arg->getArgument().getDependence());

511 }

512

513 auto *Decl = E->getDecl();

515

517 Deps |= ExprDependence::UnexpandedPack;

519 ExprDependence::Error;

520

521

522

523

524

525

526

527

528

529

530

531

532

533

535 Deps |= ExprDependence::TypeValueInstantiation;

537 Deps |= ExprDependence::Instantiation;

538

539

540

541 if (E->isCapturedByCopyInLambdaWithExplicitObjectParameter())

542 Deps |= ExprDependence::Type;

543

544

545 if (Decl->getDeclName().getNameKind() ==

547 QualType T = Decl->getDeclName().getCXXNameType();

549 return Deps | ExprDependence::TypeValueInstantiation;

550

552 Deps |= ExprDependence::Instantiation;

553 }

554

555

556

557

558

559

560

561

562

563

564

565

566

567

568

569

570 if (isa(Decl))

571 return Deps | ExprDependence::ValueInstantiation;

572

573

574

575 if (const auto *Var = dyn_cast(Decl)) {

576 if (const Expr *Init = Var->getAnyInitializer()) {

577 if (Init->containsErrors())

578 Deps |= ExprDependence::Error;

579

580 if (Var->mightBeUsableInConstantExpressions(Ctx) &&

581 Init->isValueDependent())

582 Deps |= ExprDependence::ValueInstantiation;

583 }

584

585

586

587 if (Var->isStaticDataMember() &&

588 Var->getDeclContext()->isDependentContext() &&

589 !Var->getFirstDecl()->hasInit()) {

593 Deps |= ExprDependence::TypeValueInstantiation;

594 } else if (First->hasInit()) {

595 Deps |= ExprDependence::ValueInstantiation;

596 }

597 }

598

599 return Deps;

600 }

601

602

603

604

605

606

607

608

609 if (auto *MD = dyn_cast(Decl)) {

611 Deps |= ExprDependence::ValueInstantiation;

612 }

613

614 return Deps;

615}

616

618

619

620

621

622

623

625 ExprDependence::ErrorDependent;

626

627

628 for (auto *S : E->subExpressions())

629 D |= S->getDependence();

630 return D;

631}

632

636}

637

640}

641

646 D |= ExprDependence::Type;

647 for (auto *A : llvm::ArrayRef(E->getArgs(), E->getNumArgs())) {

648 if (A)

649 D |= A->getDependence();

650 }

651 for (auto *A : PreArgs)

652 D |= A->getDependence();

653 return D;

654}

655

659 for (unsigned I = 0, N = E->getNumExpressions(); I < N; ++I)

661 return D;

662}

663

665 auto D = ExprDependence::None;

666 if (Name.isInstantiationDependent())

667 D |= ExprDependence::Instantiation;

668 if (Name.containsUnexpandedParameterPack())

669 D |= ExprDependence::UnexpandedPack;

670 return D;

671}

672

676

677 if (auto *NNS = E->getQualifier())

679 ~NestedNameSpecifierDependence::Dependent);

680

681 for (const auto &A : E->template_arguments())

683

684 auto *MemberDecl = E->getMemberDecl();

685 if (FieldDecl *FD = dyn_cast(MemberDecl)) {

686 DeclContext *DC = MemberDecl->getDeclContext();

687

688

689 CXXRecordDecl *RD = dyn_cast_or_null(DC);

693 }

694

695

696 if (FD && FD->isBitField() && FD->getBitWidth()->isValueDependent()) {

697 D |= ExprDependence::Type;

698 }

699 }

700 return D;

701}

702

704 auto D = ExprDependence::None;

705 for (auto *A : E->inits())

706 D |= A->getDependence();

707 return D;

708}

709

712 for (auto *C : llvm::ArrayRef(E->getSubExprs(), E->getNumSubExprs()))

713 D |= C->getDependence();

714 return D;

715}

716

718 bool ContainsUnexpandedPack) {

719 auto D = ContainsUnexpandedPack ? ExprDependence::UnexpandedPack

720 : ExprDependence::None;

721 for (auto *AE : E->getAssocExprs())

722 D |= AE->getDependence() & ExprDependence::Error;

723

724 if (E->isExprPredicate())

725 D |= E->getControllingExpr()->getDependence() & ExprDependence::Error;

726 else

729

730 if (E->isResultDependent())

731 return D | ExprDependence::TypeValueInstantiation;

734}

735

738 for (const auto &D : E->designators()) {

739 auto DesignatorDeps = ExprDependence::None;

740 if (D.isArrayDesignator())

742 else if (D.isArrayRangeDesignator())

743 DesignatorDeps |= E->getArrayRangeStart(D)->getDependence() |

745 Deps |= DesignatorDeps;

746 if (DesignatorDeps & ExprDependence::TypeValue)

747 Deps |= ExprDependence::TypeValueInstantiation;

748 }

749 return Deps;

750}

751

756 return D;

757}

758

760 auto D = ExprDependence::None;

763 return D;

764}

765

770 auto Size = E->getArraySize();

771 if (Size && *Size)

773 if (auto *I = E->getInitializer())

775 for (auto *A : E->placement_arguments())

777 return D;

778}

779

782 if (auto *TSI = E->getDestroyedTypeInfo())

784 if (auto *ST = E->getScopeTypeInfo())

787 if (auto *Q = E->getQualifier())

789 ~NestedNameSpecifierDependence::Dependent);

790 return D;

791}

792

795 bool KnownInstantiationDependent,

796 bool KnownContainsUnexpandedParameterPack) {

797 auto Deps = ExprDependence::None;

798 if (KnownDependent)

799 Deps |= ExprDependence::TypeValue;

800 if (KnownInstantiationDependent)

801 Deps |= ExprDependence::Instantiation;

802 if (KnownContainsUnexpandedParameterPack)

803 Deps |= ExprDependence::UnexpandedPack;

805 if (auto *Q = E->getQualifier())

807 ~NestedNameSpecifierDependence::Dependent);

808 for (auto *D : E->decls()) {

810 isa(D))

811 Deps |= ExprDependence::TypeValueInstantiation;

812 }

813

814

815

816 for (const auto &A : E->template_arguments())

818 return Deps;

819}

820

822 auto D = ExprDependence::TypeValue;

824 if (auto *Q = E->getQualifier())

826 for (const auto &A : E->template_arguments())

828 return D;

829}

830

834 for (auto *A : E->arguments())

836 return D;

837}

838

844}

845

848}

849

852}

853

855 bool ContainsUnexpandedParameterPack) {

857 if (ContainsUnexpandedParameterPack)

858 D |= ExprDependence::UnexpandedPack;

859 return D;

860}

861

863 auto D = ExprDependence::ValueInstantiation;

866 for (auto *A : E->arguments())

867 D |= A->getDependence() &

868 (ExprDependence::UnexpandedPack | ExprDependence::Error);

869 return D;

870}

871

873 auto D = ExprDependence::TypeValueInstantiation;

874 if (E->isImplicitAccess())

876 if (auto *Q = E->getQualifier())

879 for (const auto &A : E->template_arguments())

881 return D;

882}

883

886}

887

889 auto D = ExprDependence::TypeValueInstantiation;

890 for (const auto *C : {E->getLHS(), E->getRHS()}) {

891 if (C)

893 }

894 return D;

895}

896

898 auto D = ExprDependence::None;

899 for (const auto *A : E->getInitExprs())

900 D |= A->getDependence();

901 return D;

902}

903

905 auto D = ExprDependence::None;

906 for (const auto *A : E->getArgs())

909 return D;

910}

911

913 bool ValueDependent) {

914 auto TA = TemplateArgumentDependence::None;

915 const auto InterestingDeps = TemplateArgumentDependence::Instantiation |

916 TemplateArgumentDependence::UnexpandedPack;

918 E->getTemplateArgsAsWritten()->arguments()) {

919 TA |= ArgLoc.getArgument().getDependence() & InterestingDeps;

920 if (TA == InterestingDeps)

921 break;

922 }

923

925 ValueDependent ? ExprDependence::Value : ExprDependence::None;

927 if(!ValueDependent && E->getSatisfaction().ContainsErrors)

928 Res |= ExprDependence::Error;

929 return Res;

930}

931

933 auto D = ExprDependence::None;

934 Expr **Elements = E->getElements();

935 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I)

937 return D;

938}

939

941 auto Deps = ExprDependence::None;

942 for (unsigned I = 0, N = E->getNumElements(); I < N; ++I) {

943 auto KV = E->getKeyValueElement(I);

945 KV.Value->getDependence());

946 if (KV.EllipsisLoc.isValid())

948 Deps |= KVDeps;

949 }

950 return Deps;

951}

952

954 auto D = ExprDependence::None;

955 if (auto *R = E->getInstanceReceiver())

956 D |= R->getDependence();

957 else

959 for (auto *A : E->arguments())

960 D |= A->getDependence();

961 return D;

962}

963

965

966

967 return ExprDependence::None;

968}

static ExprDependence getDependenceInExpr(DeclarationNameInfo Name)

Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....

Defines the ExceptionSpecificationType enumeration and various utility functions.

Defines the clang::Expr interface and subclasses for C++ expressions.

Defines Expressions and AST nodes for C++2a concepts.

static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)

Produce a diagnostic highlighting some portion of a literal.

Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...

const LangOptions & getLangOpts() const

Represents a loop initializing the elements of an array.

This class represents BOTH the OpenMP Array Section and OpenACC 'subarray', with a boolean differenti...

ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.

An Embarcadero array type trait, as used in the implementation of __array_rank and __array_extent.

AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2] This AST node provides support ...

AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...

static unsigned getNumSubExprs(AtomicOp Op)

Determine the number of arguments the specified atomic builtin should have.

BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...

A builtin binary operation expression such as "x + y" or "x <= y".

BlockExpr - Adaptor class for mixing a BlockDecl with expressions.

Represents binding an expression to a temporary.

Represents a call to a C++ constructor.

A default argument (C++ [dcl.fct.default]).

A use of a default initializer in a constructor or in aggregate initialization.

Represents a delete expression for memory deallocation and destructor calls, e.g.

Represents a C++ member access expression where the actual member referenced could not be resolved be...

Represents a folding of a pack over an operator.

Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".

Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).

Represents a list-initialization with parenthesis.

Represents a C++ pseudo-destructor (C++ [expr.pseudo]).

Represents a C++ struct/union/class.

bool isCurrentInstantiation(const DeclContext *CurContext) const

Determine whether this dependent class is a current instantiation, when viewed from within the given ...

A rewritten comparison expression that was originally written using operator syntax.

An expression "T()" which creates an rvalue of a non-class type T.

Implicit construction of a std::initializer_list object from an array temporary within list-initia...

Represents a C++ functional cast expression that builds a temporary object.

Represents the this expression in C++.

A C++ throw-expression (C++ [except.throw]).

A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...

Describes an explicit type conversion that uses functional notion but could not be resolved because o...

A Microsoft C++ __uuidof expression, which gets the _GUID that corresponds to the supplied type or ex...

CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).

ChooseExpr - GNU builtin-in function __builtin_choose_expr.

CompoundLiteralExpr - [C99 6.5.2.5].

Represents the specialization of a concept - evaluates to a prvalue of type bool.

ConditionalOperator - The ?: ternary operator.

ConvertVectorExpr - Clang builtin function __builtin_convertvector This AST node provides support for...

Represents an expression that might suspend coroutine execution; either a co_await or co_yield expres...

DeclContext - This is used only as base class of specific decl types that can act as declaration cont...

bool isDependentContext() const

Determines whether this context is dependent on a template parameter.

A reference to a declared variable, function, enum, etc.

Decl - This represents one declaration (or definition), e.g.

bool isParameterPack() const

Whether this declaration is a parameter pack.

llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const

DeclContext * getDeclContext()

@ CXXConversionFunctionName

Represents a 'co_await' expression while the type of the promise is dependent.

A qualified reference to a name whose declaration cannot yet be resolved.

Represents a C99 designated initializer expression.

ExplicitCastExpr - An explicit cast written in the source code.

This represents one expression.

bool isTypeDependent() const

Determines whether the type of this expression depends on.

Expr * IgnoreParens() LLVM_READONLY

Skip past any parentheses which might surround this expression until reaching a fixed point.

bool EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx, ConstantExprKind Kind=ConstantExprKind::Normal) const

Evaluate an expression that is required to be a constant expression.

bool isInstantiationDependent() const

Whether this expression is instantiation-dependent, meaning that it depends in some way on.

ExprDependence getDependence() const

An expression trait intrinsic.

ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...

Represents a member of a struct/union/class.

FullExpr - Represents a "full-expression" node.

Represents a C11 generic selection.

ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...

Represents an implicitly-generated value initialization of an object of a given type.

Describes an C or C++ initializer list.

A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...

A member reference to an MSPropertyDecl.

MS property subscript expression.

Represents a prvalue temporary that is written into memory so that a reference can bind to it.

MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.

MemberExpr - [C99 6.5.2.3] Structure and Union Members.

Represents a place-holder for an object not to be initialized by anything.

An explicit cast in C or a C-style cast in C++, which uses the syntax ([s1][s2]......

OpenMP 5.0 [2.1.6 Iterators] Iterators are identifiers that expand to multiple values in the clause o...

ObjCArrayLiteral - used for objective-c array containers; as in: @["Hello", NSApp,...

ObjCBoxedExpr - used for generalized expression boxing.

ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...

ObjCEncodeExpr, used for @encode in Objective-C.

ObjCIndirectCopyRestoreExpr - Represents the passing of a function argument by indirect copy-restore ...

ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.

ObjCIvarRefExpr - A reference to an ObjC instance variable.

An expression that sends a message to the given Objective-C object or class.

ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.

ObjCSubscriptRefExpr - used for array and dictionary subscripting.

OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...

OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.

This expression type represents an asterisk in an OpenACC Size-Expr, used in the 'tile' and 'gang' cl...

A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.

Represents a C++11 pack expansion that produces a sequence of expressions.

ParenExpr - This represents a parenthesized expression, e.g.

[C99 6.4.2.2] - A predefined identifier such as func.

PseudoObjectExpr - An expression which accesses a pseudo-object l-value.

ArrayRef< Expr * > semantics()

Expr * getSyntacticForm()

Return the syntactic form of this expression, i.e.

A (possibly-)qualified type.

Frontend produces RecoveryExprs on semantic errors that prevent creating other well-formed expression...

ShuffleVectorExpr - clang-specific builtin-in function __builtin_shufflevector.

StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).

Represents a reference to a non-type template parameter that has been substituted with a template arg...

Location wrapper for a TemplateArgument.

A container of type source information.

QualType getType() const

Return the type wrapped by this type source info.

A type trait used in the implementation of various C++11 and Library TR1 trait templates.

The base class of the type hierarchy.

bool isIncompleteArrayType() const

bool isInstantiationDependentType() const

Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...

bool isDependentType() const

Whether this type is a dependent type, meaning that its definition somehow depends on a template para...

TypeDependence getDependence() const

UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.

UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...

Represents a call to the builtin function __builtin_va_arg.

Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...

const Expr * getExprStmt() const

Represents a variable declaration or definition.

The JSON file list parser is used to communicate input to InstallAPI.

ExprDependence toExprDependence(TemplateArgumentDependence TA)

Computes dependencies of a reference with the name having template arguments with TA dependencies.

CanThrowResult

Possible results from evaluation of a noexcept expression.

ExprDependence turnTypeToValueDependence(ExprDependence D)

ExprDependence toExprDependenceAsWritten(TypeDependence D)

ExprDependence computeDependence(FullExpr *E)

ExprDependence turnValueToTypeDependence(ExprDependence D)

ExprDependence toExprDependenceForImpliedType(TypeDependence D)

const FunctionProtoType * T

DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...

EvalResult is a struct with detailed info about an evaluated expression.

Iterator range representation begin:end[:step].