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