1*e038c9c4Sjoerg //===- ComputeDependence.cpp ----------------------------------------------===//
2*e038c9c4Sjoerg //
3*e038c9c4Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*e038c9c4Sjoerg // See https://llvm.org/LICENSE.txt for license information.
5*e038c9c4Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*e038c9c4Sjoerg //
7*e038c9c4Sjoerg //===----------------------------------------------------------------------===//
8*e038c9c4Sjoerg
9*e038c9c4Sjoerg #include "clang/AST/ComputeDependence.h"
10*e038c9c4Sjoerg #include "clang/AST/Attr.h"
11*e038c9c4Sjoerg #include "clang/AST/DeclCXX.h"
12*e038c9c4Sjoerg #include "clang/AST/DeclarationName.h"
13*e038c9c4Sjoerg #include "clang/AST/DependenceFlags.h"
14*e038c9c4Sjoerg #include "clang/AST/Expr.h"
15*e038c9c4Sjoerg #include "clang/AST/ExprCXX.h"
16*e038c9c4Sjoerg #include "clang/AST/ExprConcepts.h"
17*e038c9c4Sjoerg #include "clang/AST/ExprObjC.h"
18*e038c9c4Sjoerg #include "clang/AST/ExprOpenMP.h"
19*e038c9c4Sjoerg #include "clang/Basic/ExceptionSpecificationType.h"
20*e038c9c4Sjoerg #include "llvm/ADT/ArrayRef.h"
21*e038c9c4Sjoerg
22*e038c9c4Sjoerg using namespace clang;
23*e038c9c4Sjoerg
computeDependence(FullExpr * E)24*e038c9c4Sjoerg ExprDependence clang::computeDependence(FullExpr *E) {
25*e038c9c4Sjoerg return E->getSubExpr()->getDependence();
26*e038c9c4Sjoerg }
27*e038c9c4Sjoerg
computeDependence(OpaqueValueExpr * E)28*e038c9c4Sjoerg ExprDependence clang::computeDependence(OpaqueValueExpr *E) {
29*e038c9c4Sjoerg auto D = toExprDependence(E->getType()->getDependence());
30*e038c9c4Sjoerg if (auto *S = E->getSourceExpr())
31*e038c9c4Sjoerg D |= S->getDependence();
32*e038c9c4Sjoerg assert(!(D & ExprDependence::UnexpandedPack));
33*e038c9c4Sjoerg return D;
34*e038c9c4Sjoerg }
35*e038c9c4Sjoerg
computeDependence(ParenExpr * E)36*e038c9c4Sjoerg ExprDependence clang::computeDependence(ParenExpr *E) {
37*e038c9c4Sjoerg return E->getSubExpr()->getDependence();
38*e038c9c4Sjoerg }
39*e038c9c4Sjoerg
computeDependence(UnaryOperator * E,const ASTContext & Ctx)40*e038c9c4Sjoerg ExprDependence clang::computeDependence(UnaryOperator *E,
41*e038c9c4Sjoerg const ASTContext &Ctx) {
42*e038c9c4Sjoerg ExprDependence Dep = toExprDependence(E->getType()->getDependence()) |
43*e038c9c4Sjoerg E->getSubExpr()->getDependence();
44*e038c9c4Sjoerg
45*e038c9c4Sjoerg // C++ [temp.dep.constexpr]p5:
46*e038c9c4Sjoerg // An expression of the form & qualified-id where the qualified-id names a
47*e038c9c4Sjoerg // dependent member of the current instantiation is value-dependent. An
48*e038c9c4Sjoerg // expression of the form & cast-expression is also value-dependent if
49*e038c9c4Sjoerg // evaluating cast-expression as a core constant expression succeeds and
50*e038c9c4Sjoerg // the result of the evaluation refers to a templated entity that is an
51*e038c9c4Sjoerg // object with static or thread storage duration or a member function.
52*e038c9c4Sjoerg //
53*e038c9c4Sjoerg // What this amounts to is: constant-evaluate the operand and check whether it
54*e038c9c4Sjoerg // refers to a templated entity other than a variable with local storage.
55*e038c9c4Sjoerg if (Ctx.getLangOpts().CPlusPlus && E->getOpcode() == UO_AddrOf &&
56*e038c9c4Sjoerg !(Dep & ExprDependence::Value)) {
57*e038c9c4Sjoerg Expr::EvalResult Result;
58*e038c9c4Sjoerg SmallVector<PartialDiagnosticAt, 8> Diag;
59*e038c9c4Sjoerg Result.Diag = &Diag;
60*e038c9c4Sjoerg // FIXME: This doesn't enforce the C++98 constant expression rules.
61*e038c9c4Sjoerg if (E->getSubExpr()->EvaluateAsConstantExpr(Result, Ctx) && Diag.empty() &&
62*e038c9c4Sjoerg Result.Val.isLValue()) {
63*e038c9c4Sjoerg auto *VD = Result.Val.getLValueBase().dyn_cast<const ValueDecl *>();
64*e038c9c4Sjoerg if (VD && VD->isTemplated()) {
65*e038c9c4Sjoerg auto *VarD = dyn_cast<VarDecl>(VD);
66*e038c9c4Sjoerg if (!VarD || !VarD->hasLocalStorage())
67*e038c9c4Sjoerg Dep |= ExprDependence::Value;
68*e038c9c4Sjoerg }
69*e038c9c4Sjoerg }
70*e038c9c4Sjoerg }
71*e038c9c4Sjoerg
72*e038c9c4Sjoerg return Dep;
73*e038c9c4Sjoerg }
74*e038c9c4Sjoerg
computeDependence(UnaryExprOrTypeTraitExpr * E)75*e038c9c4Sjoerg ExprDependence clang::computeDependence(UnaryExprOrTypeTraitExpr *E) {
76*e038c9c4Sjoerg // Never type-dependent (C++ [temp.dep.expr]p3).
77*e038c9c4Sjoerg // Value-dependent if the argument is type-dependent.
78*e038c9c4Sjoerg if (E->isArgumentType())
79*e038c9c4Sjoerg return turnTypeToValueDependence(
80*e038c9c4Sjoerg toExprDependence(E->getArgumentType()->getDependence()));
81*e038c9c4Sjoerg
82*e038c9c4Sjoerg auto ArgDeps = E->getArgumentExpr()->getDependence();
83*e038c9c4Sjoerg auto Deps = ArgDeps & ~ExprDependence::TypeValue;
84*e038c9c4Sjoerg // Value-dependent if the argument is type-dependent.
85*e038c9c4Sjoerg if (ArgDeps & ExprDependence::Type)
86*e038c9c4Sjoerg Deps |= ExprDependence::Value;
87*e038c9c4Sjoerg // Check to see if we are in the situation where alignof(decl) should be
88*e038c9c4Sjoerg // dependent because decl's alignment is dependent.
89*e038c9c4Sjoerg auto ExprKind = E->getKind();
90*e038c9c4Sjoerg if (ExprKind != UETT_AlignOf && ExprKind != UETT_PreferredAlignOf)
91*e038c9c4Sjoerg return Deps;
92*e038c9c4Sjoerg if ((Deps & ExprDependence::Value) && (Deps & ExprDependence::Instantiation))
93*e038c9c4Sjoerg return Deps;
94*e038c9c4Sjoerg
95*e038c9c4Sjoerg auto *NoParens = E->getArgumentExpr()->IgnoreParens();
96*e038c9c4Sjoerg const ValueDecl *D = nullptr;
97*e038c9c4Sjoerg if (const auto *DRE = dyn_cast<DeclRefExpr>(NoParens))
98*e038c9c4Sjoerg D = DRE->getDecl();
99*e038c9c4Sjoerg else if (const auto *ME = dyn_cast<MemberExpr>(NoParens))
100*e038c9c4Sjoerg D = ME->getMemberDecl();
101*e038c9c4Sjoerg if (!D)
102*e038c9c4Sjoerg return Deps;
103*e038c9c4Sjoerg for (const auto *I : D->specific_attrs<AlignedAttr>()) {
104*e038c9c4Sjoerg if (I->isAlignmentErrorDependent())
105*e038c9c4Sjoerg Deps |= ExprDependence::Error;
106*e038c9c4Sjoerg if (I->isAlignmentDependent())
107*e038c9c4Sjoerg Deps |= ExprDependence::ValueInstantiation;
108*e038c9c4Sjoerg }
109*e038c9c4Sjoerg return Deps;
110*e038c9c4Sjoerg }
111*e038c9c4Sjoerg
computeDependence(ArraySubscriptExpr * E)112*e038c9c4Sjoerg ExprDependence clang::computeDependence(ArraySubscriptExpr *E) {
113*e038c9c4Sjoerg return E->getLHS()->getDependence() | E->getRHS()->getDependence();
114*e038c9c4Sjoerg }
115*e038c9c4Sjoerg
computeDependence(MatrixSubscriptExpr * E)116*e038c9c4Sjoerg ExprDependence clang::computeDependence(MatrixSubscriptExpr *E) {
117*e038c9c4Sjoerg return E->getBase()->getDependence() | E->getRowIdx()->getDependence() |
118*e038c9c4Sjoerg (E->getColumnIdx() ? E->getColumnIdx()->getDependence()
119*e038c9c4Sjoerg : ExprDependence::None);
120*e038c9c4Sjoerg }
121*e038c9c4Sjoerg
computeDependence(CompoundLiteralExpr * E)122*e038c9c4Sjoerg ExprDependence clang::computeDependence(CompoundLiteralExpr *E) {
123*e038c9c4Sjoerg return toExprDependence(E->getTypeSourceInfo()->getType()->getDependence()) |
124*e038c9c4Sjoerg turnTypeToValueDependence(E->getInitializer()->getDependence());
125*e038c9c4Sjoerg }
126*e038c9c4Sjoerg
computeDependence(CastExpr * E)127*e038c9c4Sjoerg ExprDependence clang::computeDependence(CastExpr *E) {
128*e038c9c4Sjoerg // Cast expressions are type-dependent if the type is
129*e038c9c4Sjoerg // dependent (C++ [temp.dep.expr]p3).
130*e038c9c4Sjoerg // Cast expressions are value-dependent if the type is
131*e038c9c4Sjoerg // dependent or if the subexpression is value-dependent.
132*e038c9c4Sjoerg auto D = toExprDependence(E->getType()->getDependence());
133*e038c9c4Sjoerg if (E->getStmtClass() == Stmt::ImplicitCastExprClass) {
134*e038c9c4Sjoerg // An implicit cast expression doesn't (lexically) contain an
135*e038c9c4Sjoerg // unexpanded pack, even if its target type does.
136*e038c9c4Sjoerg D &= ~ExprDependence::UnexpandedPack;
137*e038c9c4Sjoerg }
138*e038c9c4Sjoerg if (auto *S = E->getSubExpr())
139*e038c9c4Sjoerg D |= S->getDependence() & ~ExprDependence::Type;
140*e038c9c4Sjoerg return D;
141*e038c9c4Sjoerg }
142*e038c9c4Sjoerg
computeDependence(BinaryOperator * E)143*e038c9c4Sjoerg ExprDependence clang::computeDependence(BinaryOperator *E) {
144*e038c9c4Sjoerg return E->getLHS()->getDependence() | E->getRHS()->getDependence();
145*e038c9c4Sjoerg }
146*e038c9c4Sjoerg
computeDependence(ConditionalOperator * E)147*e038c9c4Sjoerg ExprDependence clang::computeDependence(ConditionalOperator *E) {
148*e038c9c4Sjoerg // The type of the conditional operator depends on the type of the conditional
149*e038c9c4Sjoerg // to support the GCC vector conditional extension. Additionally,
150*e038c9c4Sjoerg // [temp.dep.expr] does specify state that this should be dependent on ALL sub
151*e038c9c4Sjoerg // expressions.
152*e038c9c4Sjoerg return E->getCond()->getDependence() | E->getLHS()->getDependence() |
153*e038c9c4Sjoerg E->getRHS()->getDependence();
154*e038c9c4Sjoerg }
155*e038c9c4Sjoerg
computeDependence(BinaryConditionalOperator * E)156*e038c9c4Sjoerg ExprDependence clang::computeDependence(BinaryConditionalOperator *E) {
157*e038c9c4Sjoerg return E->getCommon()->getDependence() | E->getFalseExpr()->getDependence();
158*e038c9c4Sjoerg }
159*e038c9c4Sjoerg
computeDependence(StmtExpr * E,unsigned TemplateDepth)160*e038c9c4Sjoerg ExprDependence clang::computeDependence(StmtExpr *E, unsigned TemplateDepth) {
161*e038c9c4Sjoerg auto D = toExprDependence(E->getType()->getDependence());
162*e038c9c4Sjoerg // Propagate dependence of the result.
163*e038c9c4Sjoerg if (const auto *CompoundExprResult =
164*e038c9c4Sjoerg dyn_cast_or_null<ValueStmt>(E->getSubStmt()->getStmtExprResult()))
165*e038c9c4Sjoerg if (const Expr *ResultExpr = CompoundExprResult->getExprStmt())
166*e038c9c4Sjoerg D |= ResultExpr->getDependence();
167*e038c9c4Sjoerg // Note: we treat a statement-expression in a dependent context as always
168*e038c9c4Sjoerg // being value- and instantiation-dependent. This matches the behavior of
169*e038c9c4Sjoerg // lambda-expressions and GCC.
170*e038c9c4Sjoerg if (TemplateDepth)
171*e038c9c4Sjoerg D |= ExprDependence::ValueInstantiation;
172*e038c9c4Sjoerg // A param pack cannot be expanded over stmtexpr boundaries.
173*e038c9c4Sjoerg return D & ~ExprDependence::UnexpandedPack;
174*e038c9c4Sjoerg }
175*e038c9c4Sjoerg
computeDependence(ConvertVectorExpr * E)176*e038c9c4Sjoerg ExprDependence clang::computeDependence(ConvertVectorExpr *E) {
177*e038c9c4Sjoerg auto D = toExprDependence(E->getType()->getDependence()) |
178*e038c9c4Sjoerg E->getSrcExpr()->getDependence();
179*e038c9c4Sjoerg if (!E->getType()->isDependentType())
180*e038c9c4Sjoerg D &= ~ExprDependence::Type;
181*e038c9c4Sjoerg return D;
182*e038c9c4Sjoerg }
183*e038c9c4Sjoerg
computeDependence(ChooseExpr * E)184*e038c9c4Sjoerg ExprDependence clang::computeDependence(ChooseExpr *E) {
185*e038c9c4Sjoerg if (E->isConditionDependent())
186*e038c9c4Sjoerg return ExprDependence::TypeValueInstantiation |
187*e038c9c4Sjoerg E->getCond()->getDependence() | E->getLHS()->getDependence() |
188*e038c9c4Sjoerg E->getRHS()->getDependence();
189*e038c9c4Sjoerg
190*e038c9c4Sjoerg auto Cond = E->getCond()->getDependence();
191*e038c9c4Sjoerg auto Active = E->getLHS()->getDependence();
192*e038c9c4Sjoerg auto Inactive = E->getRHS()->getDependence();
193*e038c9c4Sjoerg if (!E->isConditionTrue())
194*e038c9c4Sjoerg std::swap(Active, Inactive);
195*e038c9c4Sjoerg // Take type- and value- dependency from the active branch. Propagate all
196*e038c9c4Sjoerg // other flags from all branches.
197*e038c9c4Sjoerg return (Active & ExprDependence::TypeValue) |
198*e038c9c4Sjoerg ((Cond | Active | Inactive) & ~ExprDependence::TypeValue);
199*e038c9c4Sjoerg }
200*e038c9c4Sjoerg
computeDependence(ParenListExpr * P)201*e038c9c4Sjoerg ExprDependence clang::computeDependence(ParenListExpr *P) {
202*e038c9c4Sjoerg auto D = ExprDependence::None;
203*e038c9c4Sjoerg for (auto *E : P->exprs())
204*e038c9c4Sjoerg D |= E->getDependence();
205*e038c9c4Sjoerg return D;
206*e038c9c4Sjoerg }
207*e038c9c4Sjoerg
computeDependence(VAArgExpr * E)208*e038c9c4Sjoerg ExprDependence clang::computeDependence(VAArgExpr *E) {
209*e038c9c4Sjoerg auto D =
210*e038c9c4Sjoerg toExprDependence(E->getWrittenTypeInfo()->getType()->getDependence()) |
211*e038c9c4Sjoerg (E->getSubExpr()->getDependence() & ~ExprDependence::Type);
212*e038c9c4Sjoerg return D & ~ExprDependence::Value;
213*e038c9c4Sjoerg }
214*e038c9c4Sjoerg
computeDependence(NoInitExpr * E)215*e038c9c4Sjoerg ExprDependence clang::computeDependence(NoInitExpr *E) {
216*e038c9c4Sjoerg return toExprDependence(E->getType()->getDependence()) &
217*e038c9c4Sjoerg (ExprDependence::Instantiation | ExprDependence::Error);
218*e038c9c4Sjoerg }
219*e038c9c4Sjoerg
computeDependence(ArrayInitLoopExpr * E)220*e038c9c4Sjoerg ExprDependence clang::computeDependence(ArrayInitLoopExpr *E) {
221*e038c9c4Sjoerg auto D = E->getCommonExpr()->getDependence() |
222*e038c9c4Sjoerg E->getSubExpr()->getDependence() | ExprDependence::Instantiation;
223*e038c9c4Sjoerg if (!E->getType()->isInstantiationDependentType())
224*e038c9c4Sjoerg D &= ~ExprDependence::Instantiation;
225*e038c9c4Sjoerg return turnTypeToValueDependence(D);
226*e038c9c4Sjoerg }
227*e038c9c4Sjoerg
computeDependence(ImplicitValueInitExpr * E)228*e038c9c4Sjoerg ExprDependence clang::computeDependence(ImplicitValueInitExpr *E) {
229*e038c9c4Sjoerg return toExprDependence(E->getType()->getDependence()) &
230*e038c9c4Sjoerg ExprDependence::Instantiation;
231*e038c9c4Sjoerg }
232*e038c9c4Sjoerg
computeDependence(ExtVectorElementExpr * E)233*e038c9c4Sjoerg ExprDependence clang::computeDependence(ExtVectorElementExpr *E) {
234*e038c9c4Sjoerg return E->getBase()->getDependence();
235*e038c9c4Sjoerg }
236*e038c9c4Sjoerg
computeDependence(BlockExpr * E)237*e038c9c4Sjoerg ExprDependence clang::computeDependence(BlockExpr *E) {
238*e038c9c4Sjoerg auto D = toExprDependence(E->getType()->getDependence());
239*e038c9c4Sjoerg if (E->getBlockDecl()->isDependentContext())
240*e038c9c4Sjoerg D |= ExprDependence::Instantiation;
241*e038c9c4Sjoerg return D & ~ExprDependence::UnexpandedPack;
242*e038c9c4Sjoerg }
243*e038c9c4Sjoerg
computeDependence(AsTypeExpr * E)244*e038c9c4Sjoerg ExprDependence clang::computeDependence(AsTypeExpr *E) {
245*e038c9c4Sjoerg auto D = toExprDependence(E->getType()->getDependence()) |
246*e038c9c4Sjoerg E->getSrcExpr()->getDependence();
247*e038c9c4Sjoerg if (!E->getType()->isDependentType())
248*e038c9c4Sjoerg D &= ~ExprDependence::Type;
249*e038c9c4Sjoerg return D;
250*e038c9c4Sjoerg }
251*e038c9c4Sjoerg
computeDependence(CXXRewrittenBinaryOperator * E)252*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXRewrittenBinaryOperator *E) {
253*e038c9c4Sjoerg return E->getSemanticForm()->getDependence();
254*e038c9c4Sjoerg }
255*e038c9c4Sjoerg
computeDependence(CXXStdInitializerListExpr * E)256*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXStdInitializerListExpr *E) {
257*e038c9c4Sjoerg auto D = turnTypeToValueDependence(E->getSubExpr()->getDependence());
258*e038c9c4Sjoerg D |= toExprDependence(E->getType()->getDependence()) &
259*e038c9c4Sjoerg (ExprDependence::Type | ExprDependence::Error);
260*e038c9c4Sjoerg return D;
261*e038c9c4Sjoerg }
262*e038c9c4Sjoerg
computeDependence(CXXTypeidExpr * E)263*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXTypeidExpr *E) {
264*e038c9c4Sjoerg auto D = ExprDependence::None;
265*e038c9c4Sjoerg if (E->isTypeOperand())
266*e038c9c4Sjoerg D = toExprDependence(
267*e038c9c4Sjoerg E->getTypeOperandSourceInfo()->getType()->getDependence());
268*e038c9c4Sjoerg else
269*e038c9c4Sjoerg D = turnTypeToValueDependence(E->getExprOperand()->getDependence());
270*e038c9c4Sjoerg // typeid is never type-dependent (C++ [temp.dep.expr]p4)
271*e038c9c4Sjoerg return D & ~ExprDependence::Type;
272*e038c9c4Sjoerg }
273*e038c9c4Sjoerg
computeDependence(MSPropertyRefExpr * E)274*e038c9c4Sjoerg ExprDependence clang::computeDependence(MSPropertyRefExpr *E) {
275*e038c9c4Sjoerg return E->getBaseExpr()->getDependence() & ~ExprDependence::Type;
276*e038c9c4Sjoerg }
277*e038c9c4Sjoerg
computeDependence(MSPropertySubscriptExpr * E)278*e038c9c4Sjoerg ExprDependence clang::computeDependence(MSPropertySubscriptExpr *E) {
279*e038c9c4Sjoerg return E->getIdx()->getDependence();
280*e038c9c4Sjoerg }
281*e038c9c4Sjoerg
computeDependence(CXXUuidofExpr * E)282*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXUuidofExpr *E) {
283*e038c9c4Sjoerg if (E->isTypeOperand())
284*e038c9c4Sjoerg return turnTypeToValueDependence(toExprDependence(
285*e038c9c4Sjoerg E->getTypeOperandSourceInfo()->getType()->getDependence()));
286*e038c9c4Sjoerg
287*e038c9c4Sjoerg return turnTypeToValueDependence(E->getExprOperand()->getDependence());
288*e038c9c4Sjoerg }
289*e038c9c4Sjoerg
computeDependence(CXXThisExpr * E)290*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXThisExpr *E) {
291*e038c9c4Sjoerg // 'this' is type-dependent if the class type of the enclosing
292*e038c9c4Sjoerg // member function is dependent (C++ [temp.dep.expr]p2)
293*e038c9c4Sjoerg auto D = toExprDependence(E->getType()->getDependence());
294*e038c9c4Sjoerg assert(!(D & ExprDependence::UnexpandedPack));
295*e038c9c4Sjoerg return D;
296*e038c9c4Sjoerg }
297*e038c9c4Sjoerg
computeDependence(CXXThrowExpr * E)298*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXThrowExpr *E) {
299*e038c9c4Sjoerg auto *Op = E->getSubExpr();
300*e038c9c4Sjoerg if (!Op)
301*e038c9c4Sjoerg return ExprDependence::None;
302*e038c9c4Sjoerg return Op->getDependence() & ~ExprDependence::TypeValue;
303*e038c9c4Sjoerg }
304*e038c9c4Sjoerg
computeDependence(CXXBindTemporaryExpr * E)305*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXBindTemporaryExpr *E) {
306*e038c9c4Sjoerg return E->getSubExpr()->getDependence();
307*e038c9c4Sjoerg }
308*e038c9c4Sjoerg
computeDependence(CXXScalarValueInitExpr * E)309*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXScalarValueInitExpr *E) {
310*e038c9c4Sjoerg return toExprDependence(E->getType()->getDependence()) &
311*e038c9c4Sjoerg ~ExprDependence::TypeValue;
312*e038c9c4Sjoerg }
313*e038c9c4Sjoerg
computeDependence(CXXDeleteExpr * E)314*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXDeleteExpr *E) {
315*e038c9c4Sjoerg return turnTypeToValueDependence(E->getArgument()->getDependence());
316*e038c9c4Sjoerg }
317*e038c9c4Sjoerg
computeDependence(ArrayTypeTraitExpr * E)318*e038c9c4Sjoerg ExprDependence clang::computeDependence(ArrayTypeTraitExpr *E) {
319*e038c9c4Sjoerg auto D = toExprDependence(E->getQueriedType()->getDependence());
320*e038c9c4Sjoerg if (auto *Dim = E->getDimensionExpression())
321*e038c9c4Sjoerg D |= Dim->getDependence();
322*e038c9c4Sjoerg return turnTypeToValueDependence(D);
323*e038c9c4Sjoerg }
324*e038c9c4Sjoerg
computeDependence(ExpressionTraitExpr * E)325*e038c9c4Sjoerg ExprDependence clang::computeDependence(ExpressionTraitExpr *E) {
326*e038c9c4Sjoerg // Never type-dependent.
327*e038c9c4Sjoerg auto D = E->getQueriedExpression()->getDependence() & ~ExprDependence::Type;
328*e038c9c4Sjoerg // Value-dependent if the argument is type-dependent.
329*e038c9c4Sjoerg if (E->getQueriedExpression()->isTypeDependent())
330*e038c9c4Sjoerg D |= ExprDependence::Value;
331*e038c9c4Sjoerg return D;
332*e038c9c4Sjoerg }
333*e038c9c4Sjoerg
computeDependence(CXXNoexceptExpr * E,CanThrowResult CT)334*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXNoexceptExpr *E, CanThrowResult CT) {
335*e038c9c4Sjoerg auto D = E->getOperand()->getDependence() & ~ExprDependence::TypeValue;
336*e038c9c4Sjoerg if (CT == CT_Dependent)
337*e038c9c4Sjoerg D |= ExprDependence::ValueInstantiation;
338*e038c9c4Sjoerg return D;
339*e038c9c4Sjoerg }
340*e038c9c4Sjoerg
computeDependence(PackExpansionExpr * E)341*e038c9c4Sjoerg ExprDependence clang::computeDependence(PackExpansionExpr *E) {
342*e038c9c4Sjoerg return (E->getPattern()->getDependence() & ~ExprDependence::UnexpandedPack) |
343*e038c9c4Sjoerg ExprDependence::TypeValueInstantiation;
344*e038c9c4Sjoerg }
345*e038c9c4Sjoerg
computeDependence(SubstNonTypeTemplateParmExpr * E)346*e038c9c4Sjoerg ExprDependence clang::computeDependence(SubstNonTypeTemplateParmExpr *E) {
347*e038c9c4Sjoerg return E->getReplacement()->getDependence();
348*e038c9c4Sjoerg }
349*e038c9c4Sjoerg
computeDependence(CoroutineSuspendExpr * E)350*e038c9c4Sjoerg ExprDependence clang::computeDependence(CoroutineSuspendExpr *E) {
351*e038c9c4Sjoerg if (auto *Resume = E->getResumeExpr())
352*e038c9c4Sjoerg return (Resume->getDependence() &
353*e038c9c4Sjoerg (ExprDependence::TypeValue | ExprDependence::Error)) |
354*e038c9c4Sjoerg (E->getCommonExpr()->getDependence() & ~ExprDependence::TypeValue);
355*e038c9c4Sjoerg return E->getCommonExpr()->getDependence() |
356*e038c9c4Sjoerg ExprDependence::TypeValueInstantiation;
357*e038c9c4Sjoerg }
358*e038c9c4Sjoerg
computeDependence(DependentCoawaitExpr * E)359*e038c9c4Sjoerg ExprDependence clang::computeDependence(DependentCoawaitExpr *E) {
360*e038c9c4Sjoerg return E->getOperand()->getDependence() |
361*e038c9c4Sjoerg ExprDependence::TypeValueInstantiation;
362*e038c9c4Sjoerg }
363*e038c9c4Sjoerg
computeDependence(ObjCBoxedExpr * E)364*e038c9c4Sjoerg ExprDependence clang::computeDependence(ObjCBoxedExpr *E) {
365*e038c9c4Sjoerg return E->getSubExpr()->getDependence();
366*e038c9c4Sjoerg }
367*e038c9c4Sjoerg
computeDependence(ObjCEncodeExpr * E)368*e038c9c4Sjoerg ExprDependence clang::computeDependence(ObjCEncodeExpr *E) {
369*e038c9c4Sjoerg return toExprDependence(E->getEncodedType()->getDependence());
370*e038c9c4Sjoerg }
371*e038c9c4Sjoerg
computeDependence(ObjCIvarRefExpr * E)372*e038c9c4Sjoerg ExprDependence clang::computeDependence(ObjCIvarRefExpr *E) {
373*e038c9c4Sjoerg return turnTypeToValueDependence(E->getBase()->getDependence());
374*e038c9c4Sjoerg }
375*e038c9c4Sjoerg
computeDependence(ObjCPropertyRefExpr * E)376*e038c9c4Sjoerg ExprDependence clang::computeDependence(ObjCPropertyRefExpr *E) {
377*e038c9c4Sjoerg if (E->isObjectReceiver())
378*e038c9c4Sjoerg return E->getBase()->getDependence() & ~ExprDependence::Type;
379*e038c9c4Sjoerg if (E->isSuperReceiver())
380*e038c9c4Sjoerg return toExprDependence(E->getSuperReceiverType()->getDependence()) &
381*e038c9c4Sjoerg ~ExprDependence::TypeValue;
382*e038c9c4Sjoerg assert(E->isClassReceiver());
383*e038c9c4Sjoerg return ExprDependence::None;
384*e038c9c4Sjoerg }
385*e038c9c4Sjoerg
computeDependence(ObjCSubscriptRefExpr * E)386*e038c9c4Sjoerg ExprDependence clang::computeDependence(ObjCSubscriptRefExpr *E) {
387*e038c9c4Sjoerg return E->getBaseExpr()->getDependence() | E->getKeyExpr()->getDependence();
388*e038c9c4Sjoerg }
389*e038c9c4Sjoerg
computeDependence(ObjCIsaExpr * E)390*e038c9c4Sjoerg ExprDependence clang::computeDependence(ObjCIsaExpr *E) {
391*e038c9c4Sjoerg return E->getBase()->getDependence() & ~ExprDependence::Type &
392*e038c9c4Sjoerg ~ExprDependence::UnexpandedPack;
393*e038c9c4Sjoerg }
394*e038c9c4Sjoerg
computeDependence(ObjCIndirectCopyRestoreExpr * E)395*e038c9c4Sjoerg ExprDependence clang::computeDependence(ObjCIndirectCopyRestoreExpr *E) {
396*e038c9c4Sjoerg return E->getSubExpr()->getDependence();
397*e038c9c4Sjoerg }
398*e038c9c4Sjoerg
computeDependence(OMPArraySectionExpr * E)399*e038c9c4Sjoerg ExprDependence clang::computeDependence(OMPArraySectionExpr *E) {
400*e038c9c4Sjoerg auto D = E->getBase()->getDependence();
401*e038c9c4Sjoerg if (auto *LB = E->getLowerBound())
402*e038c9c4Sjoerg D |= LB->getDependence();
403*e038c9c4Sjoerg if (auto *Len = E->getLength())
404*e038c9c4Sjoerg D |= Len->getDependence();
405*e038c9c4Sjoerg return D;
406*e038c9c4Sjoerg }
407*e038c9c4Sjoerg
computeDependence(OMPArrayShapingExpr * E)408*e038c9c4Sjoerg ExprDependence clang::computeDependence(OMPArrayShapingExpr *E) {
409*e038c9c4Sjoerg auto D = E->getBase()->getDependence() |
410*e038c9c4Sjoerg toExprDependence(E->getType()->getDependence());
411*e038c9c4Sjoerg for (Expr *Dim: E->getDimensions())
412*e038c9c4Sjoerg if (Dim)
413*e038c9c4Sjoerg D |= Dim->getDependence();
414*e038c9c4Sjoerg return D;
415*e038c9c4Sjoerg }
416*e038c9c4Sjoerg
computeDependence(OMPIteratorExpr * E)417*e038c9c4Sjoerg ExprDependence clang::computeDependence(OMPIteratorExpr *E) {
418*e038c9c4Sjoerg auto D = toExprDependence(E->getType()->getDependence());
419*e038c9c4Sjoerg for (unsigned I = 0, End = E->numOfIterators(); I < End; ++I) {
420*e038c9c4Sjoerg if (auto *VD = cast_or_null<ValueDecl>(E->getIteratorDecl(I)))
421*e038c9c4Sjoerg D |= toExprDependence(VD->getType()->getDependence());
422*e038c9c4Sjoerg OMPIteratorExpr::IteratorRange IR = E->getIteratorRange(I);
423*e038c9c4Sjoerg if (Expr *BE = IR.Begin)
424*e038c9c4Sjoerg D |= BE->getDependence();
425*e038c9c4Sjoerg if (Expr *EE = IR.End)
426*e038c9c4Sjoerg D |= EE->getDependence();
427*e038c9c4Sjoerg if (Expr *SE = IR.Step)
428*e038c9c4Sjoerg D |= SE->getDependence();
429*e038c9c4Sjoerg }
430*e038c9c4Sjoerg return D;
431*e038c9c4Sjoerg }
432*e038c9c4Sjoerg
433*e038c9c4Sjoerg /// Compute the type-, value-, and instantiation-dependence of a
434*e038c9c4Sjoerg /// declaration reference
435*e038c9c4Sjoerg /// based on the declaration being referenced.
computeDependence(DeclRefExpr * E,const ASTContext & Ctx)436*e038c9c4Sjoerg ExprDependence clang::computeDependence(DeclRefExpr *E, const ASTContext &Ctx) {
437*e038c9c4Sjoerg auto Deps = ExprDependence::None;
438*e038c9c4Sjoerg
439*e038c9c4Sjoerg if (auto *NNS = E->getQualifier())
440*e038c9c4Sjoerg Deps |= toExprDependence(NNS->getDependence() &
441*e038c9c4Sjoerg ~NestedNameSpecifierDependence::Dependent);
442*e038c9c4Sjoerg
443*e038c9c4Sjoerg if (auto *FirstArg = E->getTemplateArgs()) {
444*e038c9c4Sjoerg unsigned NumArgs = E->getNumTemplateArgs();
445*e038c9c4Sjoerg for (auto *Arg = FirstArg, *End = FirstArg + NumArgs; Arg < End; ++Arg)
446*e038c9c4Sjoerg Deps |= toExprDependence(Arg->getArgument().getDependence());
447*e038c9c4Sjoerg }
448*e038c9c4Sjoerg
449*e038c9c4Sjoerg auto *Decl = E->getDecl();
450*e038c9c4Sjoerg auto Type = E->getType();
451*e038c9c4Sjoerg
452*e038c9c4Sjoerg if (Decl->isParameterPack())
453*e038c9c4Sjoerg Deps |= ExprDependence::UnexpandedPack;
454*e038c9c4Sjoerg Deps |= toExprDependence(Type->getDependence()) & ExprDependence::Error;
455*e038c9c4Sjoerg
456*e038c9c4Sjoerg // C++ [temp.dep.expr]p3:
457*e038c9c4Sjoerg // An id-expression is type-dependent if it contains:
458*e038c9c4Sjoerg
459*e038c9c4Sjoerg // - an identifier associated by name lookup with one or more declarations
460*e038c9c4Sjoerg // declared with a dependent type
461*e038c9c4Sjoerg //
462*e038c9c4Sjoerg // [The "or more" case is not modeled as a DeclRefExpr. There are a bunch
463*e038c9c4Sjoerg // more bullets here that we handle by treating the declaration as having a
464*e038c9c4Sjoerg // dependent type if they involve a placeholder type that can't be deduced.]
465*e038c9c4Sjoerg if (Type->isDependentType())
466*e038c9c4Sjoerg return Deps | ExprDependence::TypeValueInstantiation;
467*e038c9c4Sjoerg else if (Type->isInstantiationDependentType())
468*e038c9c4Sjoerg Deps |= ExprDependence::Instantiation;
469*e038c9c4Sjoerg
470*e038c9c4Sjoerg // - a conversion-function-id that specifies a dependent type
471*e038c9c4Sjoerg if (Decl->getDeclName().getNameKind() ==
472*e038c9c4Sjoerg DeclarationName::CXXConversionFunctionName) {
473*e038c9c4Sjoerg QualType T = Decl->getDeclName().getCXXNameType();
474*e038c9c4Sjoerg if (T->isDependentType())
475*e038c9c4Sjoerg return Deps | ExprDependence::TypeValueInstantiation;
476*e038c9c4Sjoerg
477*e038c9c4Sjoerg if (T->isInstantiationDependentType())
478*e038c9c4Sjoerg Deps |= ExprDependence::Instantiation;
479*e038c9c4Sjoerg }
480*e038c9c4Sjoerg
481*e038c9c4Sjoerg // - a template-id that is dependent,
482*e038c9c4Sjoerg // - a nested-name-specifier or a qualified-id that names a member of an
483*e038c9c4Sjoerg // unknown specialization
484*e038c9c4Sjoerg // [These are not modeled as DeclRefExprs.]
485*e038c9c4Sjoerg
486*e038c9c4Sjoerg // or if it names a dependent member of the current instantiation that is a
487*e038c9c4Sjoerg // static data member of type "array of unknown bound of T" for some T
488*e038c9c4Sjoerg // [handled below].
489*e038c9c4Sjoerg
490*e038c9c4Sjoerg // C++ [temp.dep.constexpr]p2:
491*e038c9c4Sjoerg // An id-expression is value-dependent if:
492*e038c9c4Sjoerg
493*e038c9c4Sjoerg // - it is type-dependent [handled above]
494*e038c9c4Sjoerg
495*e038c9c4Sjoerg // - it is the name of a non-type template parameter,
496*e038c9c4Sjoerg if (isa<NonTypeTemplateParmDecl>(Decl))
497*e038c9c4Sjoerg return Deps | ExprDependence::ValueInstantiation;
498*e038c9c4Sjoerg
499*e038c9c4Sjoerg // - it names a potentially-constant variable that is initialized with an
500*e038c9c4Sjoerg // expression that is value-dependent
501*e038c9c4Sjoerg if (const auto *Var = dyn_cast<VarDecl>(Decl)) {
502*e038c9c4Sjoerg if (Var->mightBeUsableInConstantExpressions(Ctx)) {
503*e038c9c4Sjoerg if (const Expr *Init = Var->getAnyInitializer()) {
504*e038c9c4Sjoerg if (Init->isValueDependent())
505*e038c9c4Sjoerg Deps |= ExprDependence::ValueInstantiation;
506*e038c9c4Sjoerg if (Init->containsErrors())
507*e038c9c4Sjoerg Deps |= ExprDependence::Error;
508*e038c9c4Sjoerg }
509*e038c9c4Sjoerg }
510*e038c9c4Sjoerg
511*e038c9c4Sjoerg // - it names a static data member that is a dependent member of the
512*e038c9c4Sjoerg // current instantiation and is not initialized in a member-declarator,
513*e038c9c4Sjoerg if (Var->isStaticDataMember() &&
514*e038c9c4Sjoerg Var->getDeclContext()->isDependentContext() &&
515*e038c9c4Sjoerg !Var->getFirstDecl()->hasInit()) {
516*e038c9c4Sjoerg const VarDecl *First = Var->getFirstDecl();
517*e038c9c4Sjoerg TypeSourceInfo *TInfo = First->getTypeSourceInfo();
518*e038c9c4Sjoerg if (TInfo->getType()->isIncompleteArrayType()) {
519*e038c9c4Sjoerg Deps |= ExprDependence::TypeValueInstantiation;
520*e038c9c4Sjoerg } else if (!First->hasInit()) {
521*e038c9c4Sjoerg Deps |= ExprDependence::ValueInstantiation;
522*e038c9c4Sjoerg }
523*e038c9c4Sjoerg }
524*e038c9c4Sjoerg
525*e038c9c4Sjoerg return Deps;
526*e038c9c4Sjoerg }
527*e038c9c4Sjoerg
528*e038c9c4Sjoerg // - it names a static member function that is a dependent member of the
529*e038c9c4Sjoerg // current instantiation
530*e038c9c4Sjoerg //
531*e038c9c4Sjoerg // FIXME: It's unclear that the restriction to static members here has any
532*e038c9c4Sjoerg // effect: any use of a non-static member function name requires either
533*e038c9c4Sjoerg // forming a pointer-to-member or providing an object parameter, either of
534*e038c9c4Sjoerg // which makes the overall expression value-dependent.
535*e038c9c4Sjoerg if (auto *MD = dyn_cast<CXXMethodDecl>(Decl)) {
536*e038c9c4Sjoerg if (MD->isStatic() && Decl->getDeclContext()->isDependentContext())
537*e038c9c4Sjoerg Deps |= ExprDependence::ValueInstantiation;
538*e038c9c4Sjoerg }
539*e038c9c4Sjoerg
540*e038c9c4Sjoerg return Deps;
541*e038c9c4Sjoerg }
542*e038c9c4Sjoerg
computeDependence(RecoveryExpr * E)543*e038c9c4Sjoerg ExprDependence clang::computeDependence(RecoveryExpr *E) {
544*e038c9c4Sjoerg // RecoveryExpr is
545*e038c9c4Sjoerg // - always value-dependent, and therefore instantiation dependent
546*e038c9c4Sjoerg // - contains errors (ExprDependence::Error), by definition
547*e038c9c4Sjoerg // - type-dependent if we don't know the type (fallback to an opaque
548*e038c9c4Sjoerg // dependent type), or the type is known and dependent, or it has
549*e038c9c4Sjoerg // type-dependent subexpressions.
550*e038c9c4Sjoerg auto D = toExprDependence(E->getType()->getDependence()) |
551*e038c9c4Sjoerg ExprDependence::ErrorDependent;
552*e038c9c4Sjoerg // FIXME: remove the type-dependent bit from subexpressions, if the
553*e038c9c4Sjoerg // RecoveryExpr has a non-dependent type.
554*e038c9c4Sjoerg for (auto *S : E->subExpressions())
555*e038c9c4Sjoerg D |= S->getDependence();
556*e038c9c4Sjoerg return D;
557*e038c9c4Sjoerg }
558*e038c9c4Sjoerg
computeDependence(PredefinedExpr * E)559*e038c9c4Sjoerg ExprDependence clang::computeDependence(PredefinedExpr *E) {
560*e038c9c4Sjoerg return toExprDependence(E->getType()->getDependence()) &
561*e038c9c4Sjoerg ~ExprDependence::UnexpandedPack;
562*e038c9c4Sjoerg }
563*e038c9c4Sjoerg
computeDependence(CallExpr * E,llvm::ArrayRef<Expr * > PreArgs)564*e038c9c4Sjoerg ExprDependence clang::computeDependence(CallExpr *E,
565*e038c9c4Sjoerg llvm::ArrayRef<Expr *> PreArgs) {
566*e038c9c4Sjoerg auto D = E->getCallee()->getDependence();
567*e038c9c4Sjoerg for (auto *A : llvm::makeArrayRef(E->getArgs(), E->getNumArgs())) {
568*e038c9c4Sjoerg if (A)
569*e038c9c4Sjoerg D |= A->getDependence();
570*e038c9c4Sjoerg }
571*e038c9c4Sjoerg for (auto *A : PreArgs)
572*e038c9c4Sjoerg D |= A->getDependence();
573*e038c9c4Sjoerg return D;
574*e038c9c4Sjoerg }
575*e038c9c4Sjoerg
computeDependence(OffsetOfExpr * E)576*e038c9c4Sjoerg ExprDependence clang::computeDependence(OffsetOfExpr *E) {
577*e038c9c4Sjoerg auto D = turnTypeToValueDependence(
578*e038c9c4Sjoerg toExprDependence(E->getTypeSourceInfo()->getType()->getDependence()));
579*e038c9c4Sjoerg for (unsigned I = 0, N = E->getNumExpressions(); I < N; ++I)
580*e038c9c4Sjoerg D |= turnTypeToValueDependence(E->getIndexExpr(I)->getDependence());
581*e038c9c4Sjoerg return D;
582*e038c9c4Sjoerg }
583*e038c9c4Sjoerg
computeDependence(MemberExpr * E)584*e038c9c4Sjoerg ExprDependence clang::computeDependence(MemberExpr *E) {
585*e038c9c4Sjoerg auto *MemberDecl = E->getMemberDecl();
586*e038c9c4Sjoerg auto D = E->getBase()->getDependence();
587*e038c9c4Sjoerg if (FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl)) {
588*e038c9c4Sjoerg DeclContext *DC = MemberDecl->getDeclContext();
589*e038c9c4Sjoerg // dyn_cast_or_null is used to handle objC variables which do not
590*e038c9c4Sjoerg // have a declaration context.
591*e038c9c4Sjoerg CXXRecordDecl *RD = dyn_cast_or_null<CXXRecordDecl>(DC);
592*e038c9c4Sjoerg if (RD && RD->isDependentContext() && RD->isCurrentInstantiation(DC)) {
593*e038c9c4Sjoerg if (!E->getType()->isDependentType())
594*e038c9c4Sjoerg D &= ~ExprDependence::Type;
595*e038c9c4Sjoerg }
596*e038c9c4Sjoerg
597*e038c9c4Sjoerg // Bitfield with value-dependent width is type-dependent.
598*e038c9c4Sjoerg if (FD && FD->isBitField() && FD->getBitWidth()->isValueDependent()) {
599*e038c9c4Sjoerg D |= ExprDependence::Type;
600*e038c9c4Sjoerg }
601*e038c9c4Sjoerg }
602*e038c9c4Sjoerg // FIXME: move remaining dependence computation from MemberExpr::Create()
603*e038c9c4Sjoerg return D;
604*e038c9c4Sjoerg }
605*e038c9c4Sjoerg
computeDependence(InitListExpr * E)606*e038c9c4Sjoerg ExprDependence clang::computeDependence(InitListExpr *E) {
607*e038c9c4Sjoerg auto D = ExprDependence::None;
608*e038c9c4Sjoerg for (auto *A : E->inits())
609*e038c9c4Sjoerg D |= A->getDependence();
610*e038c9c4Sjoerg return D;
611*e038c9c4Sjoerg }
612*e038c9c4Sjoerg
computeDependence(ShuffleVectorExpr * E)613*e038c9c4Sjoerg ExprDependence clang::computeDependence(ShuffleVectorExpr *E) {
614*e038c9c4Sjoerg auto D = toExprDependence(E->getType()->getDependence());
615*e038c9c4Sjoerg for (auto *C : llvm::makeArrayRef(E->getSubExprs(), E->getNumSubExprs()))
616*e038c9c4Sjoerg D |= C->getDependence();
617*e038c9c4Sjoerg return D;
618*e038c9c4Sjoerg }
619*e038c9c4Sjoerg
computeDependence(GenericSelectionExpr * E,bool ContainsUnexpandedPack)620*e038c9c4Sjoerg ExprDependence clang::computeDependence(GenericSelectionExpr *E,
621*e038c9c4Sjoerg bool ContainsUnexpandedPack) {
622*e038c9c4Sjoerg auto D = ContainsUnexpandedPack ? ExprDependence::UnexpandedPack
623*e038c9c4Sjoerg : ExprDependence::None;
624*e038c9c4Sjoerg for (auto *AE : E->getAssocExprs())
625*e038c9c4Sjoerg D |= AE->getDependence() & ExprDependence::Error;
626*e038c9c4Sjoerg D |= E->getControllingExpr()->getDependence() & ExprDependence::Error;
627*e038c9c4Sjoerg
628*e038c9c4Sjoerg if (E->isResultDependent())
629*e038c9c4Sjoerg return D | ExprDependence::TypeValueInstantiation;
630*e038c9c4Sjoerg return D | (E->getResultExpr()->getDependence() &
631*e038c9c4Sjoerg ~ExprDependence::UnexpandedPack);
632*e038c9c4Sjoerg }
633*e038c9c4Sjoerg
computeDependence(DesignatedInitExpr * E)634*e038c9c4Sjoerg ExprDependence clang::computeDependence(DesignatedInitExpr *E) {
635*e038c9c4Sjoerg auto Deps = E->getInit()->getDependence();
636*e038c9c4Sjoerg for (auto D : E->designators()) {
637*e038c9c4Sjoerg auto DesignatorDeps = ExprDependence::None;
638*e038c9c4Sjoerg if (D.isArrayDesignator())
639*e038c9c4Sjoerg DesignatorDeps |= E->getArrayIndex(D)->getDependence();
640*e038c9c4Sjoerg else if (D.isArrayRangeDesignator())
641*e038c9c4Sjoerg DesignatorDeps |= E->getArrayRangeStart(D)->getDependence() |
642*e038c9c4Sjoerg E->getArrayRangeEnd(D)->getDependence();
643*e038c9c4Sjoerg Deps |= DesignatorDeps;
644*e038c9c4Sjoerg if (DesignatorDeps & ExprDependence::TypeValue)
645*e038c9c4Sjoerg Deps |= ExprDependence::TypeValueInstantiation;
646*e038c9c4Sjoerg }
647*e038c9c4Sjoerg return Deps;
648*e038c9c4Sjoerg }
649*e038c9c4Sjoerg
computeDependence(PseudoObjectExpr * O)650*e038c9c4Sjoerg ExprDependence clang::computeDependence(PseudoObjectExpr *O) {
651*e038c9c4Sjoerg auto D = O->getSyntacticForm()->getDependence();
652*e038c9c4Sjoerg for (auto *E : O->semantics())
653*e038c9c4Sjoerg D |= E->getDependence();
654*e038c9c4Sjoerg return D;
655*e038c9c4Sjoerg }
656*e038c9c4Sjoerg
computeDependence(AtomicExpr * A)657*e038c9c4Sjoerg ExprDependence clang::computeDependence(AtomicExpr *A) {
658*e038c9c4Sjoerg auto D = ExprDependence::None;
659*e038c9c4Sjoerg for (auto *E : llvm::makeArrayRef(A->getSubExprs(), A->getNumSubExprs()))
660*e038c9c4Sjoerg D |= E->getDependence();
661*e038c9c4Sjoerg return D;
662*e038c9c4Sjoerg }
663*e038c9c4Sjoerg
computeDependence(CXXNewExpr * E)664*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXNewExpr *E) {
665*e038c9c4Sjoerg auto D = toExprDependence(E->getType()->getDependence());
666*e038c9c4Sjoerg auto Size = E->getArraySize();
667*e038c9c4Sjoerg if (Size.hasValue() && *Size)
668*e038c9c4Sjoerg D |= turnTypeToValueDependence((*Size)->getDependence());
669*e038c9c4Sjoerg if (auto *I = E->getInitializer())
670*e038c9c4Sjoerg D |= turnTypeToValueDependence(I->getDependence());
671*e038c9c4Sjoerg for (auto *A : E->placement_arguments())
672*e038c9c4Sjoerg D |= turnTypeToValueDependence(A->getDependence());
673*e038c9c4Sjoerg return D;
674*e038c9c4Sjoerg }
675*e038c9c4Sjoerg
computeDependence(CXXPseudoDestructorExpr * E)676*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXPseudoDestructorExpr *E) {
677*e038c9c4Sjoerg auto D = E->getBase()->getDependence();
678*e038c9c4Sjoerg if (!E->getDestroyedType().isNull())
679*e038c9c4Sjoerg D |= toExprDependence(E->getDestroyedType()->getDependence());
680*e038c9c4Sjoerg if (auto *ST = E->getScopeTypeInfo())
681*e038c9c4Sjoerg D |= turnTypeToValueDependence(
682*e038c9c4Sjoerg toExprDependence(ST->getType()->getDependence()));
683*e038c9c4Sjoerg if (auto *Q = E->getQualifier())
684*e038c9c4Sjoerg D |= toExprDependence(Q->getDependence() &
685*e038c9c4Sjoerg ~NestedNameSpecifierDependence::Dependent);
686*e038c9c4Sjoerg return D;
687*e038c9c4Sjoerg }
688*e038c9c4Sjoerg
getDependenceInExpr(DeclarationNameInfo Name)689*e038c9c4Sjoerg static inline ExprDependence getDependenceInExpr(DeclarationNameInfo Name) {
690*e038c9c4Sjoerg auto D = ExprDependence::None;
691*e038c9c4Sjoerg if (Name.isInstantiationDependent())
692*e038c9c4Sjoerg D |= ExprDependence::Instantiation;
693*e038c9c4Sjoerg if (Name.containsUnexpandedParameterPack())
694*e038c9c4Sjoerg D |= ExprDependence::UnexpandedPack;
695*e038c9c4Sjoerg return D;
696*e038c9c4Sjoerg }
697*e038c9c4Sjoerg
698*e038c9c4Sjoerg ExprDependence
computeDependence(OverloadExpr * E,bool KnownDependent,bool KnownInstantiationDependent,bool KnownContainsUnexpandedParameterPack)699*e038c9c4Sjoerg clang::computeDependence(OverloadExpr *E, bool KnownDependent,
700*e038c9c4Sjoerg bool KnownInstantiationDependent,
701*e038c9c4Sjoerg bool KnownContainsUnexpandedParameterPack) {
702*e038c9c4Sjoerg auto Deps = ExprDependence::None;
703*e038c9c4Sjoerg if (KnownDependent)
704*e038c9c4Sjoerg Deps |= ExprDependence::TypeValue;
705*e038c9c4Sjoerg if (KnownInstantiationDependent)
706*e038c9c4Sjoerg Deps |= ExprDependence::Instantiation;
707*e038c9c4Sjoerg if (KnownContainsUnexpandedParameterPack)
708*e038c9c4Sjoerg Deps |= ExprDependence::UnexpandedPack;
709*e038c9c4Sjoerg Deps |= getDependenceInExpr(E->getNameInfo());
710*e038c9c4Sjoerg if (auto *Q = E->getQualifier())
711*e038c9c4Sjoerg Deps |= toExprDependence(Q->getDependence() &
712*e038c9c4Sjoerg ~NestedNameSpecifierDependence::Dependent);
713*e038c9c4Sjoerg for (auto *D : E->decls()) {
714*e038c9c4Sjoerg if (D->getDeclContext()->isDependentContext() ||
715*e038c9c4Sjoerg isa<UnresolvedUsingValueDecl>(D))
716*e038c9c4Sjoerg Deps |= ExprDependence::TypeValueInstantiation;
717*e038c9c4Sjoerg }
718*e038c9c4Sjoerg // If we have explicit template arguments, check for dependent
719*e038c9c4Sjoerg // template arguments and whether they contain any unexpanded pack
720*e038c9c4Sjoerg // expansions.
721*e038c9c4Sjoerg for (auto A : E->template_arguments())
722*e038c9c4Sjoerg Deps |= toExprDependence(A.getArgument().getDependence());
723*e038c9c4Sjoerg return Deps;
724*e038c9c4Sjoerg }
725*e038c9c4Sjoerg
computeDependence(DependentScopeDeclRefExpr * E)726*e038c9c4Sjoerg ExprDependence clang::computeDependence(DependentScopeDeclRefExpr *E) {
727*e038c9c4Sjoerg auto D = ExprDependence::TypeValue;
728*e038c9c4Sjoerg D |= getDependenceInExpr(E->getNameInfo());
729*e038c9c4Sjoerg if (auto *Q = E->getQualifier())
730*e038c9c4Sjoerg D |= toExprDependence(Q->getDependence());
731*e038c9c4Sjoerg for (auto A : E->template_arguments())
732*e038c9c4Sjoerg D |= toExprDependence(A.getArgument().getDependence());
733*e038c9c4Sjoerg return D;
734*e038c9c4Sjoerg }
735*e038c9c4Sjoerg
computeDependence(CXXConstructExpr * E)736*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXConstructExpr *E) {
737*e038c9c4Sjoerg auto D = toExprDependence(E->getType()->getDependence());
738*e038c9c4Sjoerg for (auto *A : E->arguments())
739*e038c9c4Sjoerg D |= A->getDependence() & ~ExprDependence::Type;
740*e038c9c4Sjoerg return D;
741*e038c9c4Sjoerg }
742*e038c9c4Sjoerg
computeDependence(CXXDefaultInitExpr * E)743*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXDefaultInitExpr *E) {
744*e038c9c4Sjoerg return E->getExpr()->getDependence();
745*e038c9c4Sjoerg }
746*e038c9c4Sjoerg
computeDependence(LambdaExpr * E,bool ContainsUnexpandedParameterPack)747*e038c9c4Sjoerg ExprDependence clang::computeDependence(LambdaExpr *E,
748*e038c9c4Sjoerg bool ContainsUnexpandedParameterPack) {
749*e038c9c4Sjoerg auto D = toExprDependence(E->getType()->getDependence());
750*e038c9c4Sjoerg if (ContainsUnexpandedParameterPack)
751*e038c9c4Sjoerg D |= ExprDependence::UnexpandedPack;
752*e038c9c4Sjoerg return D;
753*e038c9c4Sjoerg }
754*e038c9c4Sjoerg
computeDependence(CXXUnresolvedConstructExpr * E)755*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXUnresolvedConstructExpr *E) {
756*e038c9c4Sjoerg auto D = ExprDependence::ValueInstantiation;
757*e038c9c4Sjoerg D |= toExprDependence(E->getType()->getDependence());
758*e038c9c4Sjoerg for (auto *A : E->arguments())
759*e038c9c4Sjoerg D |= A->getDependence() &
760*e038c9c4Sjoerg (ExprDependence::UnexpandedPack | ExprDependence::Error);
761*e038c9c4Sjoerg return D;
762*e038c9c4Sjoerg }
763*e038c9c4Sjoerg
computeDependence(CXXDependentScopeMemberExpr * E)764*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXDependentScopeMemberExpr *E) {
765*e038c9c4Sjoerg auto D = ExprDependence::TypeValueInstantiation;
766*e038c9c4Sjoerg if (!E->isImplicitAccess())
767*e038c9c4Sjoerg D |= E->getBase()->getDependence();
768*e038c9c4Sjoerg if (auto *Q = E->getQualifier())
769*e038c9c4Sjoerg D |= toExprDependence(Q->getDependence());
770*e038c9c4Sjoerg D |= getDependenceInExpr(E->getMemberNameInfo());
771*e038c9c4Sjoerg for (auto A : E->template_arguments())
772*e038c9c4Sjoerg D |= toExprDependence(A.getArgument().getDependence());
773*e038c9c4Sjoerg return D;
774*e038c9c4Sjoerg }
775*e038c9c4Sjoerg
computeDependence(MaterializeTemporaryExpr * E)776*e038c9c4Sjoerg ExprDependence clang::computeDependence(MaterializeTemporaryExpr *E) {
777*e038c9c4Sjoerg return E->getSubExpr()->getDependence();
778*e038c9c4Sjoerg }
779*e038c9c4Sjoerg
computeDependence(CXXFoldExpr * E)780*e038c9c4Sjoerg ExprDependence clang::computeDependence(CXXFoldExpr *E) {
781*e038c9c4Sjoerg auto D = ExprDependence::TypeValueInstantiation;
782*e038c9c4Sjoerg for (const auto *C : {E->getLHS(), E->getRHS()}) {
783*e038c9c4Sjoerg if (C)
784*e038c9c4Sjoerg D |= C->getDependence() & ~ExprDependence::UnexpandedPack;
785*e038c9c4Sjoerg }
786*e038c9c4Sjoerg return D;
787*e038c9c4Sjoerg }
788*e038c9c4Sjoerg
computeDependence(TypeTraitExpr * E)789*e038c9c4Sjoerg ExprDependence clang::computeDependence(TypeTraitExpr *E) {
790*e038c9c4Sjoerg auto D = ExprDependence::None;
791*e038c9c4Sjoerg for (const auto *A : E->getArgs())
792*e038c9c4Sjoerg D |=
793*e038c9c4Sjoerg toExprDependence(A->getType()->getDependence()) & ~ExprDependence::Type;
794*e038c9c4Sjoerg return D;
795*e038c9c4Sjoerg }
796*e038c9c4Sjoerg
computeDependence(ConceptSpecializationExpr * E,bool ValueDependent)797*e038c9c4Sjoerg ExprDependence clang::computeDependence(ConceptSpecializationExpr *E,
798*e038c9c4Sjoerg bool ValueDependent) {
799*e038c9c4Sjoerg auto TA = TemplateArgumentDependence::None;
800*e038c9c4Sjoerg const auto InterestingDeps = TemplateArgumentDependence::Instantiation |
801*e038c9c4Sjoerg TemplateArgumentDependence::UnexpandedPack;
802*e038c9c4Sjoerg for (const TemplateArgumentLoc &ArgLoc :
803*e038c9c4Sjoerg E->getTemplateArgsAsWritten()->arguments()) {
804*e038c9c4Sjoerg TA |= ArgLoc.getArgument().getDependence() & InterestingDeps;
805*e038c9c4Sjoerg if (TA == InterestingDeps)
806*e038c9c4Sjoerg break;
807*e038c9c4Sjoerg }
808*e038c9c4Sjoerg
809*e038c9c4Sjoerg ExprDependence D =
810*e038c9c4Sjoerg ValueDependent ? ExprDependence::Value : ExprDependence::None;
811*e038c9c4Sjoerg return D | toExprDependence(TA);
812*e038c9c4Sjoerg }
813*e038c9c4Sjoerg
computeDependence(ObjCArrayLiteral * E)814*e038c9c4Sjoerg ExprDependence clang::computeDependence(ObjCArrayLiteral *E) {
815*e038c9c4Sjoerg auto D = ExprDependence::None;
816*e038c9c4Sjoerg Expr **Elements = E->getElements();
817*e038c9c4Sjoerg for (unsigned I = 0, N = E->getNumElements(); I != N; ++I)
818*e038c9c4Sjoerg D |= turnTypeToValueDependence(Elements[I]->getDependence());
819*e038c9c4Sjoerg return D;
820*e038c9c4Sjoerg }
821*e038c9c4Sjoerg
computeDependence(ObjCDictionaryLiteral * E)822*e038c9c4Sjoerg ExprDependence clang::computeDependence(ObjCDictionaryLiteral *E) {
823*e038c9c4Sjoerg auto Deps = ExprDependence::None;
824*e038c9c4Sjoerg for (unsigned I = 0, N = E->getNumElements(); I < N; ++I) {
825*e038c9c4Sjoerg auto KV = E->getKeyValueElement(I);
826*e038c9c4Sjoerg auto KVDeps = turnTypeToValueDependence(KV.Key->getDependence() |
827*e038c9c4Sjoerg KV.Value->getDependence());
828*e038c9c4Sjoerg if (KV.EllipsisLoc.isValid())
829*e038c9c4Sjoerg KVDeps &= ~ExprDependence::UnexpandedPack;
830*e038c9c4Sjoerg Deps |= KVDeps;
831*e038c9c4Sjoerg }
832*e038c9c4Sjoerg return Deps;
833*e038c9c4Sjoerg }
834*e038c9c4Sjoerg
computeDependence(ObjCMessageExpr * E)835*e038c9c4Sjoerg ExprDependence clang::computeDependence(ObjCMessageExpr *E) {
836*e038c9c4Sjoerg auto D = ExprDependence::None;
837*e038c9c4Sjoerg if (auto *R = E->getInstanceReceiver())
838*e038c9c4Sjoerg D |= R->getDependence();
839*e038c9c4Sjoerg else
840*e038c9c4Sjoerg D |= toExprDependence(E->getType()->getDependence());
841*e038c9c4Sjoerg for (auto *A : E->arguments())
842*e038c9c4Sjoerg D |= A->getDependence();
843*e038c9c4Sjoerg return D;
844*e038c9c4Sjoerg }
845