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