1876bb86eSHaojian Wu //===- ComputeDependence.cpp ----------------------------------------------===// 2876bb86eSHaojian Wu // 3876bb86eSHaojian Wu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4876bb86eSHaojian Wu // See https://llvm.org/LICENSE.txt for license information. 5876bb86eSHaojian Wu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6876bb86eSHaojian Wu // 7876bb86eSHaojian Wu //===----------------------------------------------------------------------===// 8876bb86eSHaojian Wu 9876bb86eSHaojian Wu #include "clang/AST/ComputeDependence.h" 10876bb86eSHaojian Wu #include "clang/AST/Attr.h" 11876bb86eSHaojian Wu #include "clang/AST/DeclCXX.h" 12876bb86eSHaojian Wu #include "clang/AST/DeclarationName.h" 13876bb86eSHaojian Wu #include "clang/AST/DependenceFlags.h" 14876bb86eSHaojian Wu #include "clang/AST/Expr.h" 15876bb86eSHaojian Wu #include "clang/AST/ExprCXX.h" 16876bb86eSHaojian Wu #include "clang/AST/ExprConcepts.h" 17876bb86eSHaojian Wu #include "clang/AST/ExprObjC.h" 18876bb86eSHaojian Wu #include "clang/AST/ExprOpenMP.h" 19876bb86eSHaojian Wu #include "clang/Basic/ExceptionSpecificationType.h" 20876bb86eSHaojian Wu #include "llvm/ADT/ArrayRef.h" 21876bb86eSHaojian Wu 22876bb86eSHaojian Wu using namespace clang; 23876bb86eSHaojian Wu 24876bb86eSHaojian Wu ExprDependence clang::computeDependence(FullExpr *E) { 25876bb86eSHaojian Wu return E->getSubExpr()->getDependence(); 26876bb86eSHaojian Wu } 27876bb86eSHaojian Wu 28876bb86eSHaojian Wu ExprDependence clang::computeDependence(OpaqueValueExpr *E) { 29f1b0a4fcSRichard Smith auto D = toExprDependenceForImpliedType(E->getType()->getDependence()); 30876bb86eSHaojian Wu if (auto *S = E->getSourceExpr()) 31876bb86eSHaojian Wu D |= S->getDependence(); 32876bb86eSHaojian Wu assert(!(D & ExprDependence::UnexpandedPack)); 33876bb86eSHaojian Wu return D; 34876bb86eSHaojian Wu } 35876bb86eSHaojian Wu 36876bb86eSHaojian Wu ExprDependence clang::computeDependence(ParenExpr *E) { 37876bb86eSHaojian Wu return E->getSubExpr()->getDependence(); 38876bb86eSHaojian Wu } 39876bb86eSHaojian Wu 406b760a50SRichard Smith ExprDependence clang::computeDependence(UnaryOperator *E, 416b760a50SRichard Smith const ASTContext &Ctx) { 42f1b0a4fcSRichard Smith ExprDependence Dep = 43f1b0a4fcSRichard Smith // FIXME: Do we need to look at the type? 44f1b0a4fcSRichard Smith toExprDependenceForImpliedType(E->getType()->getDependence()) | 45876bb86eSHaojian Wu E->getSubExpr()->getDependence(); 466b760a50SRichard Smith 476b760a50SRichard Smith // C++ [temp.dep.constexpr]p5: 486b760a50SRichard Smith // An expression of the form & qualified-id where the qualified-id names a 496b760a50SRichard Smith // dependent member of the current instantiation is value-dependent. An 506b760a50SRichard Smith // expression of the form & cast-expression is also value-dependent if 516b760a50SRichard Smith // evaluating cast-expression as a core constant expression succeeds and 526b760a50SRichard Smith // the result of the evaluation refers to a templated entity that is an 536b760a50SRichard Smith // object with static or thread storage duration or a member function. 546b760a50SRichard Smith // 556b760a50SRichard Smith // What this amounts to is: constant-evaluate the operand and check whether it 566b760a50SRichard Smith // refers to a templated entity other than a variable with local storage. 577e7f38f8SRichard Smith if (Ctx.getLangOpts().CPlusPlus && E->getOpcode() == UO_AddrOf && 586b760a50SRichard Smith !(Dep & ExprDependence::Value)) { 596b760a50SRichard Smith Expr::EvalResult Result; 606b760a50SRichard Smith SmallVector<PartialDiagnosticAt, 8> Diag; 616b760a50SRichard Smith Result.Diag = &Diag; 627e7f38f8SRichard Smith // FIXME: This doesn't enforce the C++98 constant expression rules. 636b760a50SRichard Smith if (E->getSubExpr()->EvaluateAsConstantExpr(Result, Ctx) && Diag.empty() && 646b760a50SRichard Smith Result.Val.isLValue()) { 656b760a50SRichard Smith auto *VD = Result.Val.getLValueBase().dyn_cast<const ValueDecl *>(); 666b760a50SRichard Smith if (VD && VD->isTemplated()) { 676b760a50SRichard Smith auto *VarD = dyn_cast<VarDecl>(VD); 686b760a50SRichard Smith if (!VarD || !VarD->hasLocalStorage()) 698ba442bcSHans Wennborg Dep |= ExprDependence::Value; 706b760a50SRichard Smith } 716b760a50SRichard Smith } 726b760a50SRichard Smith } 736b760a50SRichard Smith 746b760a50SRichard Smith return Dep; 75876bb86eSHaojian Wu } 76876bb86eSHaojian Wu 77876bb86eSHaojian Wu ExprDependence clang::computeDependence(UnaryExprOrTypeTraitExpr *E) { 78876bb86eSHaojian Wu // Never type-dependent (C++ [temp.dep.expr]p3). 79876bb86eSHaojian Wu // Value-dependent if the argument is type-dependent. 80876bb86eSHaojian Wu if (E->isArgumentType()) 81876bb86eSHaojian Wu return turnTypeToValueDependence( 82f1b0a4fcSRichard Smith toExprDependenceAsWritten(E->getArgumentType()->getDependence())); 83876bb86eSHaojian Wu 84876bb86eSHaojian Wu auto ArgDeps = E->getArgumentExpr()->getDependence(); 85876bb86eSHaojian Wu auto Deps = ArgDeps & ~ExprDependence::TypeValue; 86876bb86eSHaojian Wu // Value-dependent if the argument is type-dependent. 87876bb86eSHaojian Wu if (ArgDeps & ExprDependence::Type) 88876bb86eSHaojian Wu Deps |= ExprDependence::Value; 89876bb86eSHaojian Wu // Check to see if we are in the situation where alignof(decl) should be 90876bb86eSHaojian Wu // dependent because decl's alignment is dependent. 91876bb86eSHaojian Wu auto ExprKind = E->getKind(); 92876bb86eSHaojian Wu if (ExprKind != UETT_AlignOf && ExprKind != UETT_PreferredAlignOf) 93876bb86eSHaojian Wu return Deps; 94876bb86eSHaojian Wu if ((Deps & ExprDependence::Value) && (Deps & ExprDependence::Instantiation)) 95876bb86eSHaojian Wu return Deps; 96876bb86eSHaojian Wu 97876bb86eSHaojian Wu auto *NoParens = E->getArgumentExpr()->IgnoreParens(); 98876bb86eSHaojian Wu const ValueDecl *D = nullptr; 99876bb86eSHaojian Wu if (const auto *DRE = dyn_cast<DeclRefExpr>(NoParens)) 100876bb86eSHaojian Wu D = DRE->getDecl(); 101876bb86eSHaojian Wu else if (const auto *ME = dyn_cast<MemberExpr>(NoParens)) 102876bb86eSHaojian Wu D = ME->getMemberDecl(); 103876bb86eSHaojian Wu if (!D) 104876bb86eSHaojian Wu return Deps; 105876bb86eSHaojian Wu for (const auto *I : D->specific_attrs<AlignedAttr>()) { 10617198dfaSHaojian Wu if (I->isAlignmentErrorDependent()) 10717198dfaSHaojian Wu Deps |= ExprDependence::Error; 108876bb86eSHaojian Wu if (I->isAlignmentDependent()) 10917198dfaSHaojian Wu Deps |= ExprDependence::ValueInstantiation; 110876bb86eSHaojian Wu } 111876bb86eSHaojian Wu return Deps; 112876bb86eSHaojian Wu } 113876bb86eSHaojian Wu 114876bb86eSHaojian Wu ExprDependence clang::computeDependence(ArraySubscriptExpr *E) { 115876bb86eSHaojian Wu return E->getLHS()->getDependence() | E->getRHS()->getDependence(); 116876bb86eSHaojian Wu } 117876bb86eSHaojian Wu 1188f3f88d2SFlorian Hahn ExprDependence clang::computeDependence(MatrixSubscriptExpr *E) { 1198f3f88d2SFlorian Hahn return E->getBase()->getDependence() | E->getRowIdx()->getDependence() | 1208f3f88d2SFlorian Hahn (E->getColumnIdx() ? E->getColumnIdx()->getDependence() 1218f3f88d2SFlorian Hahn : ExprDependence::None); 1228f3f88d2SFlorian Hahn } 1238f3f88d2SFlorian Hahn 124876bb86eSHaojian Wu ExprDependence clang::computeDependence(CompoundLiteralExpr *E) { 125f1b0a4fcSRichard Smith return toExprDependenceAsWritten( 126f1b0a4fcSRichard Smith E->getTypeSourceInfo()->getType()->getDependence()) | 127f1b0a4fcSRichard Smith toExprDependenceForImpliedType(E->getType()->getDependence()) | 128876bb86eSHaojian Wu turnTypeToValueDependence(E->getInitializer()->getDependence()); 129876bb86eSHaojian Wu } 130876bb86eSHaojian Wu 131f1b0a4fcSRichard Smith ExprDependence clang::computeDependence(ImplicitCastExpr *E) { 132f1b0a4fcSRichard Smith // We model implicit conversions as combining the dependence of their 133f1b0a4fcSRichard Smith // subexpression, apart from its type, with the semantic portion of the 134f1b0a4fcSRichard Smith // target type. 135f1b0a4fcSRichard Smith ExprDependence D = 136f1b0a4fcSRichard Smith toExprDependenceForImpliedType(E->getType()->getDependence()); 137f1b0a4fcSRichard Smith if (auto *S = E->getSubExpr()) 138f1b0a4fcSRichard Smith D |= S->getDependence() & ~ExprDependence::Type; 139f1b0a4fcSRichard Smith return D; 140f1b0a4fcSRichard Smith } 141f1b0a4fcSRichard Smith 142f1b0a4fcSRichard Smith ExprDependence clang::computeDependence(ExplicitCastExpr *E) { 143876bb86eSHaojian Wu // Cast expressions are type-dependent if the type is 144876bb86eSHaojian Wu // dependent (C++ [temp.dep.expr]p3). 145876bb86eSHaojian Wu // Cast expressions are value-dependent if the type is 146876bb86eSHaojian Wu // dependent or if the subexpression is value-dependent. 147f1b0a4fcSRichard Smith // 148f1b0a4fcSRichard Smith // Note that we also need to consider the dependence of the actual type here, 149f1b0a4fcSRichard Smith // because when the type as written is a deduced type, that type is not 150f1b0a4fcSRichard Smith // dependent, but it may be deduced as a dependent type. 151f1b0a4fcSRichard Smith ExprDependence D = 152f1b0a4fcSRichard Smith toExprDependenceAsWritten( 153f1b0a4fcSRichard Smith cast<ExplicitCastExpr>(E)->getTypeAsWritten()->getDependence()) | 154f1b0a4fcSRichard Smith toExprDependenceForImpliedType(E->getType()->getDependence()); 155876bb86eSHaojian Wu if (auto *S = E->getSubExpr()) 156876bb86eSHaojian Wu D |= S->getDependence() & ~ExprDependence::Type; 157876bb86eSHaojian Wu return D; 158876bb86eSHaojian Wu } 159876bb86eSHaojian Wu 160876bb86eSHaojian Wu ExprDependence clang::computeDependence(BinaryOperator *E) { 161876bb86eSHaojian Wu return E->getLHS()->getDependence() | E->getRHS()->getDependence(); 162876bb86eSHaojian Wu } 163876bb86eSHaojian Wu 164876bb86eSHaojian Wu ExprDependence clang::computeDependence(ConditionalOperator *E) { 165876bb86eSHaojian Wu // The type of the conditional operator depends on the type of the conditional 166876bb86eSHaojian Wu // to support the GCC vector conditional extension. Additionally, 1673dbb6befSMichael Park // [temp.dep.expr] does specify that this should be dependent on ALL sub 168876bb86eSHaojian Wu // expressions. 169876bb86eSHaojian Wu return E->getCond()->getDependence() | E->getLHS()->getDependence() | 170876bb86eSHaojian Wu E->getRHS()->getDependence(); 171876bb86eSHaojian Wu } 172876bb86eSHaojian Wu 173876bb86eSHaojian Wu ExprDependence clang::computeDependence(BinaryConditionalOperator *E) { 174876bb86eSHaojian Wu return E->getCommon()->getDependence() | E->getFalseExpr()->getDependence(); 175876bb86eSHaojian Wu } 176876bb86eSHaojian Wu 177876bb86eSHaojian Wu ExprDependence clang::computeDependence(StmtExpr *E, unsigned TemplateDepth) { 178f1b0a4fcSRichard Smith auto D = toExprDependenceForImpliedType(E->getType()->getDependence()); 17928ccd09dSHaojian Wu // Propagate dependence of the result. 18028ccd09dSHaojian Wu if (const auto *CompoundExprResult = 18128ccd09dSHaojian Wu dyn_cast_or_null<ValueStmt>(E->getSubStmt()->getStmtExprResult())) 18228ccd09dSHaojian Wu if (const Expr *ResultExpr = CompoundExprResult->getExprStmt()) 18328ccd09dSHaojian Wu D |= ResultExpr->getDependence(); 184876bb86eSHaojian Wu // Note: we treat a statement-expression in a dependent context as always 185876bb86eSHaojian Wu // being value- and instantiation-dependent. This matches the behavior of 186876bb86eSHaojian Wu // lambda-expressions and GCC. 187876bb86eSHaojian Wu if (TemplateDepth) 188876bb86eSHaojian Wu D |= ExprDependence::ValueInstantiation; 18928ccd09dSHaojian Wu // A param pack cannot be expanded over stmtexpr boundaries. 19028ccd09dSHaojian Wu return D & ~ExprDependence::UnexpandedPack; 191876bb86eSHaojian Wu } 192876bb86eSHaojian Wu 193876bb86eSHaojian Wu ExprDependence clang::computeDependence(ConvertVectorExpr *E) { 194f1b0a4fcSRichard Smith auto D = toExprDependenceAsWritten( 195f1b0a4fcSRichard Smith E->getTypeSourceInfo()->getType()->getDependence()) | 196876bb86eSHaojian Wu E->getSrcExpr()->getDependence(); 197876bb86eSHaojian Wu if (!E->getType()->isDependentType()) 198876bb86eSHaojian Wu D &= ~ExprDependence::Type; 199876bb86eSHaojian Wu return D; 200876bb86eSHaojian Wu } 201876bb86eSHaojian Wu 202876bb86eSHaojian Wu ExprDependence clang::computeDependence(ChooseExpr *E) { 203876bb86eSHaojian Wu if (E->isConditionDependent()) 204876bb86eSHaojian Wu return ExprDependence::TypeValueInstantiation | 205876bb86eSHaojian Wu E->getCond()->getDependence() | E->getLHS()->getDependence() | 206876bb86eSHaojian Wu E->getRHS()->getDependence(); 207876bb86eSHaojian Wu 208876bb86eSHaojian Wu auto Cond = E->getCond()->getDependence(); 209876bb86eSHaojian Wu auto Active = E->getLHS()->getDependence(); 210876bb86eSHaojian Wu auto Inactive = E->getRHS()->getDependence(); 211876bb86eSHaojian Wu if (!E->isConditionTrue()) 212876bb86eSHaojian Wu std::swap(Active, Inactive); 213876bb86eSHaojian Wu // Take type- and value- dependency from the active branch. Propagate all 214876bb86eSHaojian Wu // other flags from all branches. 215876bb86eSHaojian Wu return (Active & ExprDependence::TypeValue) | 216876bb86eSHaojian Wu ((Cond | Active | Inactive) & ~ExprDependence::TypeValue); 217876bb86eSHaojian Wu } 218876bb86eSHaojian Wu 219876bb86eSHaojian Wu ExprDependence clang::computeDependence(ParenListExpr *P) { 220876bb86eSHaojian Wu auto D = ExprDependence::None; 221876bb86eSHaojian Wu for (auto *E : P->exprs()) 222876bb86eSHaojian Wu D |= E->getDependence(); 223876bb86eSHaojian Wu return D; 224876bb86eSHaojian Wu } 225876bb86eSHaojian Wu 226876bb86eSHaojian Wu ExprDependence clang::computeDependence(VAArgExpr *E) { 227f1b0a4fcSRichard Smith auto D = toExprDependenceAsWritten( 228f1b0a4fcSRichard Smith E->getWrittenTypeInfo()->getType()->getDependence()) | 229876bb86eSHaojian Wu (E->getSubExpr()->getDependence() & ~ExprDependence::Type); 230d4e93524SHaojian Wu return D; 231876bb86eSHaojian Wu } 232876bb86eSHaojian Wu 233876bb86eSHaojian Wu ExprDependence clang::computeDependence(NoInitExpr *E) { 234f1b0a4fcSRichard Smith return toExprDependenceForImpliedType(E->getType()->getDependence()) & 235018ad3b0SSam McCall (ExprDependence::Instantiation | ExprDependence::Error); 236876bb86eSHaojian Wu } 237876bb86eSHaojian Wu 238876bb86eSHaojian Wu ExprDependence clang::computeDependence(ArrayInitLoopExpr *E) { 239876bb86eSHaojian Wu auto D = E->getCommonExpr()->getDependence() | 240876bb86eSHaojian Wu E->getSubExpr()->getDependence() | ExprDependence::Instantiation; 241876bb86eSHaojian Wu if (!E->getType()->isInstantiationDependentType()) 242876bb86eSHaojian Wu D &= ~ExprDependence::Instantiation; 243876bb86eSHaojian Wu return turnTypeToValueDependence(D); 244876bb86eSHaojian Wu } 245876bb86eSHaojian Wu 246876bb86eSHaojian Wu ExprDependence clang::computeDependence(ImplicitValueInitExpr *E) { 247f1b0a4fcSRichard Smith return toExprDependenceForImpliedType(E->getType()->getDependence()) & 248876bb86eSHaojian Wu ExprDependence::Instantiation; 249876bb86eSHaojian Wu } 250876bb86eSHaojian Wu 251876bb86eSHaojian Wu ExprDependence clang::computeDependence(ExtVectorElementExpr *E) { 252876bb86eSHaojian Wu return E->getBase()->getDependence(); 253876bb86eSHaojian Wu } 254876bb86eSHaojian Wu 25548bda00bSSirraide ExprDependence clang::computeDependence(BlockExpr *E, 25648bda00bSSirraide bool ContainsUnexpandedParameterPack) { 257f1b0a4fcSRichard Smith auto D = toExprDependenceForImpliedType(E->getType()->getDependence()); 258876bb86eSHaojian Wu if (E->getBlockDecl()->isDependentContext()) 259876bb86eSHaojian Wu D |= ExprDependence::Instantiation; 26048bda00bSSirraide if (ContainsUnexpandedParameterPack) 26148bda00bSSirraide D |= ExprDependence::UnexpandedPack; 262f1b0a4fcSRichard Smith return D; 263876bb86eSHaojian Wu } 264876bb86eSHaojian Wu 265876bb86eSHaojian Wu ExprDependence clang::computeDependence(AsTypeExpr *E) { 266f1b0a4fcSRichard Smith // FIXME: AsTypeExpr doesn't store the type as written. Assume the expression 267f1b0a4fcSRichard Smith // type has identical sugar for now, so is a type-as-written. 268f1b0a4fcSRichard Smith auto D = toExprDependenceAsWritten(E->getType()->getDependence()) | 269876bb86eSHaojian Wu E->getSrcExpr()->getDependence(); 270876bb86eSHaojian Wu if (!E->getType()->isDependentType()) 271876bb86eSHaojian Wu D &= ~ExprDependence::Type; 272876bb86eSHaojian Wu return D; 273876bb86eSHaojian Wu } 274876bb86eSHaojian Wu 275876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXRewrittenBinaryOperator *E) { 276876bb86eSHaojian Wu return E->getSemanticForm()->getDependence(); 277876bb86eSHaojian Wu } 278876bb86eSHaojian Wu 279876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXStdInitializerListExpr *E) { 280876bb86eSHaojian Wu auto D = turnTypeToValueDependence(E->getSubExpr()->getDependence()); 281f1b0a4fcSRichard Smith D |= toExprDependenceForImpliedType(E->getType()->getDependence()); 282876bb86eSHaojian Wu return D; 283876bb86eSHaojian Wu } 284876bb86eSHaojian Wu 285876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXTypeidExpr *E) { 286876bb86eSHaojian Wu auto D = ExprDependence::None; 287876bb86eSHaojian Wu if (E->isTypeOperand()) 288f1b0a4fcSRichard Smith D = toExprDependenceAsWritten( 289876bb86eSHaojian Wu E->getTypeOperandSourceInfo()->getType()->getDependence()); 290876bb86eSHaojian Wu else 291876bb86eSHaojian Wu D = turnTypeToValueDependence(E->getExprOperand()->getDependence()); 292876bb86eSHaojian Wu // typeid is never type-dependent (C++ [temp.dep.expr]p4) 293876bb86eSHaojian Wu return D & ~ExprDependence::Type; 294876bb86eSHaojian Wu } 295876bb86eSHaojian Wu 296876bb86eSHaojian Wu ExprDependence clang::computeDependence(MSPropertyRefExpr *E) { 297876bb86eSHaojian Wu return E->getBaseExpr()->getDependence() & ~ExprDependence::Type; 298876bb86eSHaojian Wu } 299876bb86eSHaojian Wu 300876bb86eSHaojian Wu ExprDependence clang::computeDependence(MSPropertySubscriptExpr *E) { 301876bb86eSHaojian Wu return E->getIdx()->getDependence(); 302876bb86eSHaojian Wu } 303876bb86eSHaojian Wu 304876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXUuidofExpr *E) { 305876bb86eSHaojian Wu if (E->isTypeOperand()) 306f1b0a4fcSRichard Smith return turnTypeToValueDependence(toExprDependenceAsWritten( 307876bb86eSHaojian Wu E->getTypeOperandSourceInfo()->getType()->getDependence())); 308876bb86eSHaojian Wu 309876bb86eSHaojian Wu return turnTypeToValueDependence(E->getExprOperand()->getDependence()); 310876bb86eSHaojian Wu } 311876bb86eSHaojian Wu 312876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXThisExpr *E) { 313876bb86eSHaojian Wu // 'this' is type-dependent if the class type of the enclosing 314876bb86eSHaojian Wu // member function is dependent (C++ [temp.dep.expr]p2) 315f1b0a4fcSRichard Smith auto D = toExprDependenceForImpliedType(E->getType()->getDependence()); 31638824f28SSirraide 31738824f28SSirraide // If a lambda with an explicit object parameter captures '*this', then 31838824f28SSirraide // 'this' now refers to the captured copy of lambda, and if the lambda 31938824f28SSirraide // is type-dependent, so is the object and thus 'this'. 32038824f28SSirraide // 32138824f28SSirraide // Note: The standard does not mention this case explicitly, but we need 32238824f28SSirraide // to do this so we can mark NSDM accesses as dependent. 32338824f28SSirraide if (E->isCapturedByCopyInLambdaWithExplicitObjectParameter()) 32438824f28SSirraide D |= ExprDependence::Type; 32538824f28SSirraide 326876bb86eSHaojian Wu assert(!(D & ExprDependence::UnexpandedPack)); 327876bb86eSHaojian Wu return D; 328876bb86eSHaojian Wu } 329876bb86eSHaojian Wu 330876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXThrowExpr *E) { 331876bb86eSHaojian Wu auto *Op = E->getSubExpr(); 332876bb86eSHaojian Wu if (!Op) 333876bb86eSHaojian Wu return ExprDependence::None; 334876bb86eSHaojian Wu return Op->getDependence() & ~ExprDependence::TypeValue; 335876bb86eSHaojian Wu } 336876bb86eSHaojian Wu 337876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXBindTemporaryExpr *E) { 338876bb86eSHaojian Wu return E->getSubExpr()->getDependence(); 339876bb86eSHaojian Wu } 340876bb86eSHaojian Wu 341876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXScalarValueInitExpr *E) { 342f1b0a4fcSRichard Smith auto D = toExprDependenceForImpliedType(E->getType()->getDependence()); 343f1b0a4fcSRichard Smith if (auto *TSI = E->getTypeSourceInfo()) 344f1b0a4fcSRichard Smith D |= toExprDependenceAsWritten(TSI->getType()->getDependence()); 345f1b0a4fcSRichard Smith return D; 346876bb86eSHaojian Wu } 347876bb86eSHaojian Wu 348876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXDeleteExpr *E) { 349876bb86eSHaojian Wu return turnTypeToValueDependence(E->getArgument()->getDependence()); 350876bb86eSHaojian Wu } 351876bb86eSHaojian Wu 352876bb86eSHaojian Wu ExprDependence clang::computeDependence(ArrayTypeTraitExpr *E) { 353f1b0a4fcSRichard Smith auto D = toExprDependenceAsWritten(E->getQueriedType()->getDependence()); 354876bb86eSHaojian Wu if (auto *Dim = E->getDimensionExpression()) 355876bb86eSHaojian Wu D |= Dim->getDependence(); 356876bb86eSHaojian Wu return turnTypeToValueDependence(D); 357876bb86eSHaojian Wu } 358876bb86eSHaojian Wu 359876bb86eSHaojian Wu ExprDependence clang::computeDependence(ExpressionTraitExpr *E) { 360876bb86eSHaojian Wu // Never type-dependent. 361876bb86eSHaojian Wu auto D = E->getQueriedExpression()->getDependence() & ~ExprDependence::Type; 362876bb86eSHaojian Wu // Value-dependent if the argument is type-dependent. 363876bb86eSHaojian Wu if (E->getQueriedExpression()->isTypeDependent()) 364876bb86eSHaojian Wu D |= ExprDependence::Value; 365876bb86eSHaojian Wu return D; 366876bb86eSHaojian Wu } 367876bb86eSHaojian Wu 368876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXNoexceptExpr *E, CanThrowResult CT) { 369876bb86eSHaojian Wu auto D = E->getOperand()->getDependence() & ~ExprDependence::TypeValue; 370876bb86eSHaojian Wu if (CT == CT_Dependent) 371876bb86eSHaojian Wu D |= ExprDependence::ValueInstantiation; 372876bb86eSHaojian Wu return D; 373876bb86eSHaojian Wu } 374876bb86eSHaojian Wu 3754b0f1e12SHaojian Wu ExprDependence clang::computeDependence(PackExpansionExpr *E) { 3764b0f1e12SHaojian Wu return (E->getPattern()->getDependence() & ~ExprDependence::UnexpandedPack) | 3774b0f1e12SHaojian Wu ExprDependence::TypeValueInstantiation; 3784b0f1e12SHaojian Wu } 3794b0f1e12SHaojian Wu 380ad1a65fcScor3ntin ExprDependence clang::computeDependence(PackIndexingExpr *E) { 381312f83f0Scor3ntin 382312f83f0Scor3ntin ExprDependence PatternDep = E->getPackIdExpression()->getDependence() & 383312f83f0Scor3ntin ~ExprDependence::UnexpandedPack; 384312f83f0Scor3ntin 385ad1a65fcScor3ntin ExprDependence D = E->getIndexExpr()->getDependence(); 386312f83f0Scor3ntin if (D & ExprDependence::TypeValueInstantiation) 387312f83f0Scor3ntin D |= E->getIndexExpr()->getDependence() | PatternDep | 388312f83f0Scor3ntin ExprDependence::Instantiation; 389312f83f0Scor3ntin 390ad1a65fcScor3ntin ArrayRef<Expr *> Exprs = E->getExpressions(); 391*df335b09SYounan Zhang if (Exprs.empty() || !E->isFullySubstituted()) 392312f83f0Scor3ntin D |= PatternDep | ExprDependence::Instantiation; 393ad1a65fcScor3ntin else if (!E->getIndexExpr()->isInstantiationDependent()) { 394ad1a65fcScor3ntin std::optional<unsigned> Index = E->getSelectedIndex(); 395ad1a65fcScor3ntin assert(Index && *Index < Exprs.size() && "pack index out of bound"); 396ad1a65fcScor3ntin D |= Exprs[*Index]->getDependence(); 397ad1a65fcScor3ntin } 398ad1a65fcScor3ntin return D; 399ad1a65fcScor3ntin } 400ad1a65fcScor3ntin 401876bb86eSHaojian Wu ExprDependence clang::computeDependence(SubstNonTypeTemplateParmExpr *E) { 402876bb86eSHaojian Wu return E->getReplacement()->getDependence(); 403876bb86eSHaojian Wu } 404876bb86eSHaojian Wu 405876bb86eSHaojian Wu ExprDependence clang::computeDependence(CoroutineSuspendExpr *E) { 406876bb86eSHaojian Wu if (auto *Resume = E->getResumeExpr()) 4074b0f1e12SHaojian Wu return (Resume->getDependence() & 4084b0f1e12SHaojian Wu (ExprDependence::TypeValue | ExprDependence::Error)) | 409876bb86eSHaojian Wu (E->getCommonExpr()->getDependence() & ~ExprDependence::TypeValue); 410876bb86eSHaojian Wu return E->getCommonExpr()->getDependence() | 411876bb86eSHaojian Wu ExprDependence::TypeValueInstantiation; 412876bb86eSHaojian Wu } 413876bb86eSHaojian Wu 414876bb86eSHaojian Wu ExprDependence clang::computeDependence(DependentCoawaitExpr *E) { 415876bb86eSHaojian Wu return E->getOperand()->getDependence() | 416876bb86eSHaojian Wu ExprDependence::TypeValueInstantiation; 417876bb86eSHaojian Wu } 418876bb86eSHaojian Wu 419876bb86eSHaojian Wu ExprDependence clang::computeDependence(ObjCBoxedExpr *E) { 420876bb86eSHaojian Wu return E->getSubExpr()->getDependence(); 421876bb86eSHaojian Wu } 422876bb86eSHaojian Wu 423876bb86eSHaojian Wu ExprDependence clang::computeDependence(ObjCEncodeExpr *E) { 424f1b0a4fcSRichard Smith return toExprDependenceAsWritten(E->getEncodedType()->getDependence()); 425876bb86eSHaojian Wu } 426876bb86eSHaojian Wu 427876bb86eSHaojian Wu ExprDependence clang::computeDependence(ObjCIvarRefExpr *E) { 428876bb86eSHaojian Wu return turnTypeToValueDependence(E->getBase()->getDependence()); 429876bb86eSHaojian Wu } 430876bb86eSHaojian Wu 431876bb86eSHaojian Wu ExprDependence clang::computeDependence(ObjCPropertyRefExpr *E) { 432876bb86eSHaojian Wu if (E->isObjectReceiver()) 433876bb86eSHaojian Wu return E->getBase()->getDependence() & ~ExprDependence::Type; 434876bb86eSHaojian Wu if (E->isSuperReceiver()) 435f1b0a4fcSRichard Smith return toExprDependenceForImpliedType( 436f1b0a4fcSRichard Smith E->getSuperReceiverType()->getDependence()) & 437876bb86eSHaojian Wu ~ExprDependence::TypeValue; 438876bb86eSHaojian Wu assert(E->isClassReceiver()); 439876bb86eSHaojian Wu return ExprDependence::None; 440876bb86eSHaojian Wu } 441876bb86eSHaojian Wu 442876bb86eSHaojian Wu ExprDependence clang::computeDependence(ObjCSubscriptRefExpr *E) { 443876bb86eSHaojian Wu return E->getBaseExpr()->getDependence() | E->getKeyExpr()->getDependence(); 444876bb86eSHaojian Wu } 445876bb86eSHaojian Wu 446876bb86eSHaojian Wu ExprDependence clang::computeDependence(ObjCIsaExpr *E) { 447876bb86eSHaojian Wu return E->getBase()->getDependence() & ~ExprDependence::Type & 448876bb86eSHaojian Wu ~ExprDependence::UnexpandedPack; 449876bb86eSHaojian Wu } 450876bb86eSHaojian Wu 451876bb86eSHaojian Wu ExprDependence clang::computeDependence(ObjCIndirectCopyRestoreExpr *E) { 452876bb86eSHaojian Wu return E->getSubExpr()->getDependence(); 453876bb86eSHaojian Wu } 454876bb86eSHaojian Wu 45539adc8f4SErich Keane ExprDependence clang::computeDependence(ArraySectionExpr *E) { 456876bb86eSHaojian Wu auto D = E->getBase()->getDependence(); 457876bb86eSHaojian Wu if (auto *LB = E->getLowerBound()) 458876bb86eSHaojian Wu D |= LB->getDependence(); 459876bb86eSHaojian Wu if (auto *Len = E->getLength()) 460876bb86eSHaojian Wu D |= Len->getDependence(); 46139adc8f4SErich Keane 46239adc8f4SErich Keane if (E->isOMPArraySection()) { 46339adc8f4SErich Keane if (auto *Stride = E->getStride()) 46439adc8f4SErich Keane D |= Stride->getDependence(); 46539adc8f4SErich Keane } 466876bb86eSHaojian Wu return D; 467876bb86eSHaojian Wu } 468876bb86eSHaojian Wu 4697ac9efb0SAlexey Bataev ExprDependence clang::computeDependence(OMPArrayShapingExpr *E) { 470f1b0a4fcSRichard Smith auto D = E->getBase()->getDependence(); 4717ac9efb0SAlexey Bataev for (Expr *Dim: E->getDimensions()) 4727ac9efb0SAlexey Bataev if (Dim) 473f1b0a4fcSRichard Smith D |= turnValueToTypeDependence(Dim->getDependence()); 4747ac9efb0SAlexey Bataev return D; 4757ac9efb0SAlexey Bataev } 4767ac9efb0SAlexey Bataev 47713a1504fSAlexey Bataev ExprDependence clang::computeDependence(OMPIteratorExpr *E) { 478f1b0a4fcSRichard Smith auto D = toExprDependenceForImpliedType(E->getType()->getDependence()); 47913a1504fSAlexey Bataev for (unsigned I = 0, End = E->numOfIterators(); I < End; ++I) { 480f1b0a4fcSRichard Smith if (auto *DD = cast_or_null<DeclaratorDecl>(E->getIteratorDecl(I))) { 481f1b0a4fcSRichard Smith // If the type is omitted, it's 'int', and is not dependent in any way. 482f1b0a4fcSRichard Smith if (auto *TSI = DD->getTypeSourceInfo()) { 483f1b0a4fcSRichard Smith D |= toExprDependenceAsWritten(TSI->getType()->getDependence()); 484f1b0a4fcSRichard Smith } 485f1b0a4fcSRichard Smith } 48613a1504fSAlexey Bataev OMPIteratorExpr::IteratorRange IR = E->getIteratorRange(I); 48713a1504fSAlexey Bataev if (Expr *BE = IR.Begin) 48813a1504fSAlexey Bataev D |= BE->getDependence(); 48913a1504fSAlexey Bataev if (Expr *EE = IR.End) 49013a1504fSAlexey Bataev D |= EE->getDependence(); 49113a1504fSAlexey Bataev if (Expr *SE = IR.Step) 49213a1504fSAlexey Bataev D |= SE->getDependence(); 49313a1504fSAlexey Bataev } 49413a1504fSAlexey Bataev return D; 49513a1504fSAlexey Bataev } 49613a1504fSAlexey Bataev 497876bb86eSHaojian Wu /// Compute the type-, value-, and instantiation-dependence of a 498876bb86eSHaojian Wu /// declaration reference 499876bb86eSHaojian Wu /// based on the declaration being referenced. 500876bb86eSHaojian Wu ExprDependence clang::computeDependence(DeclRefExpr *E, const ASTContext &Ctx) { 501876bb86eSHaojian Wu auto Deps = ExprDependence::None; 502876bb86eSHaojian Wu 503876bb86eSHaojian Wu if (auto *NNS = E->getQualifier()) 504d68c09acSSam McCall Deps |= toExprDependence(NNS->getDependence() & 505d68c09acSSam McCall ~NestedNameSpecifierDependence::Dependent); 506876bb86eSHaojian Wu 507876bb86eSHaojian Wu if (auto *FirstArg = E->getTemplateArgs()) { 508876bb86eSHaojian Wu unsigned NumArgs = E->getNumTemplateArgs(); 509876bb86eSHaojian Wu for (auto *Arg = FirstArg, *End = FirstArg + NumArgs; Arg < End; ++Arg) 5108ba442bcSHans Wennborg Deps |= toExprDependence(Arg->getArgument().getDependence()); 511876bb86eSHaojian Wu } 512876bb86eSHaojian Wu 513876bb86eSHaojian Wu auto *Decl = E->getDecl(); 514876bb86eSHaojian Wu auto Type = E->getType(); 515876bb86eSHaojian Wu 516876bb86eSHaojian Wu if (Decl->isParameterPack()) 517876bb86eSHaojian Wu Deps |= ExprDependence::UnexpandedPack; 518f1b0a4fcSRichard Smith Deps |= toExprDependenceForImpliedType(Type->getDependence()) & 519f1b0a4fcSRichard Smith ExprDependence::Error; 520876bb86eSHaojian Wu 5217e7f38f8SRichard Smith // C++ [temp.dep.expr]p3: 522876bb86eSHaojian Wu // An id-expression is type-dependent if it contains: 523876bb86eSHaojian Wu 5247e7f38f8SRichard Smith // - an identifier associated by name lookup with one or more declarations 5257e7f38f8SRichard Smith // declared with a dependent type 526af475173SCorentin Jabot // - an identifier associated by name lookup with an entity captured by 527af475173SCorentin Jabot // copy ([expr.prim.lambda.capture]) 528af475173SCorentin Jabot // in a lambda-expression that has an explicit object parameter whose 529af475173SCorentin Jabot // type is dependent ([dcl.fct]), 5307e7f38f8SRichard Smith // 5317e7f38f8SRichard Smith // [The "or more" case is not modeled as a DeclRefExpr. There are a bunch 5327e7f38f8SRichard Smith // more bullets here that we handle by treating the declaration as having a 5337e7f38f8SRichard Smith // dependent type if they involve a placeholder type that can't be deduced.] 534876bb86eSHaojian Wu if (Type->isDependentType()) 5359ca395b5SHaojian Wu Deps |= ExprDependence::TypeValueInstantiation; 536876bb86eSHaojian Wu else if (Type->isInstantiationDependentType()) 537876bb86eSHaojian Wu Deps |= ExprDependence::Instantiation; 538876bb86eSHaojian Wu 539af475173SCorentin Jabot // - an identifier associated by name lookup with an entity captured by 540af475173SCorentin Jabot // copy ([expr.prim.lambda.capture]) 541af475173SCorentin Jabot if (E->isCapturedByCopyInLambdaWithExplicitObjectParameter()) 542af475173SCorentin Jabot Deps |= ExprDependence::Type; 543af475173SCorentin Jabot 5447e7f38f8SRichard Smith // - a conversion-function-id that specifies a dependent type 545876bb86eSHaojian Wu if (Decl->getDeclName().getNameKind() == 546876bb86eSHaojian Wu DeclarationName::CXXConversionFunctionName) { 547876bb86eSHaojian Wu QualType T = Decl->getDeclName().getCXXNameType(); 548876bb86eSHaojian Wu if (T->isDependentType()) 549876bb86eSHaojian Wu return Deps | ExprDependence::TypeValueInstantiation; 550876bb86eSHaojian Wu 551876bb86eSHaojian Wu if (T->isInstantiationDependentType()) 552876bb86eSHaojian Wu Deps |= ExprDependence::Instantiation; 553876bb86eSHaojian Wu } 554876bb86eSHaojian Wu 5557e7f38f8SRichard Smith // - a template-id that is dependent, 5567e7f38f8SRichard Smith // - a nested-name-specifier or a qualified-id that names a member of an 5577e7f38f8SRichard Smith // unknown specialization 5587e7f38f8SRichard Smith // [These are not modeled as DeclRefExprs.] 5597e7f38f8SRichard Smith 5607e7f38f8SRichard Smith // or if it names a dependent member of the current instantiation that is a 5617e7f38f8SRichard Smith // static data member of type "array of unknown bound of T" for some T 5627e7f38f8SRichard Smith // [handled below]. 5637e7f38f8SRichard Smith 5647e7f38f8SRichard Smith // C++ [temp.dep.constexpr]p2: 5657e7f38f8SRichard Smith // An id-expression is value-dependent if: 5667e7f38f8SRichard Smith 5677e7f38f8SRichard Smith // - it is type-dependent [handled above] 5687e7f38f8SRichard Smith 5697e7f38f8SRichard Smith // - it is the name of a non-type template parameter, 570876bb86eSHaojian Wu if (isa<NonTypeTemplateParmDecl>(Decl)) 571876bb86eSHaojian Wu return Deps | ExprDependence::ValueInstantiation; 572876bb86eSHaojian Wu 5737e7f38f8SRichard Smith // - it names a potentially-constant variable that is initialized with an 5747e7f38f8SRichard Smith // expression that is value-dependent 5757e7f38f8SRichard Smith if (const auto *Var = dyn_cast<VarDecl>(Decl)) { 5763423d5c9SHaojian Wu if (const Expr *Init = Var->getAnyInitializer()) { 5773423d5c9SHaojian Wu if (Init->containsErrors()) 5783423d5c9SHaojian Wu Deps |= ExprDependence::Error; 5799ca395b5SHaojian Wu 5809ca395b5SHaojian Wu if (Var->mightBeUsableInConstantExpressions(Ctx) && 5819ca395b5SHaojian Wu Init->isValueDependent()) 5829ca395b5SHaojian Wu Deps |= ExprDependence::ValueInstantiation; 583876bb86eSHaojian Wu } 584876bb86eSHaojian Wu 5857e7f38f8SRichard Smith // - it names a static data member that is a dependent member of the 5867e7f38f8SRichard Smith // current instantiation and is not initialized in a member-declarator, 587876bb86eSHaojian Wu if (Var->isStaticDataMember() && 5887e7f38f8SRichard Smith Var->getDeclContext()->isDependentContext() && 5897e7f38f8SRichard Smith !Var->getFirstDecl()->hasInit()) { 5907e7f38f8SRichard Smith const VarDecl *First = Var->getFirstDecl(); 5917e7f38f8SRichard Smith TypeSourceInfo *TInfo = First->getTypeSourceInfo(); 5927e7f38f8SRichard Smith if (TInfo->getType()->isIncompleteArrayType()) { 5937e7f38f8SRichard Smith Deps |= ExprDependence::TypeValueInstantiation; 5947e7f38f8SRichard Smith } else if (!First->hasInit()) { 595876bb86eSHaojian Wu Deps |= ExprDependence::ValueInstantiation; 5967e7f38f8SRichard Smith } 597876bb86eSHaojian Wu } 598876bb86eSHaojian Wu 599876bb86eSHaojian Wu return Deps; 600876bb86eSHaojian Wu } 601876bb86eSHaojian Wu 6027e7f38f8SRichard Smith // - it names a static member function that is a dependent member of the 6037e7f38f8SRichard Smith // current instantiation 6047e7f38f8SRichard Smith // 6057e7f38f8SRichard Smith // FIXME: It's unclear that the restriction to static members here has any 6067e7f38f8SRichard Smith // effect: any use of a non-static member function name requires either 6077e7f38f8SRichard Smith // forming a pointer-to-member or providing an object parameter, either of 6087e7f38f8SRichard Smith // which makes the overall expression value-dependent. 6097e7f38f8SRichard Smith if (auto *MD = dyn_cast<CXXMethodDecl>(Decl)) { 6107e7f38f8SRichard Smith if (MD->isStatic() && Decl->getDeclContext()->isDependentContext()) 611876bb86eSHaojian Wu Deps |= ExprDependence::ValueInstantiation; 6127e7f38f8SRichard Smith } 6137e7f38f8SRichard Smith 614876bb86eSHaojian Wu return Deps; 615876bb86eSHaojian Wu } 616876bb86eSHaojian Wu 617733edf97SHaojian Wu ExprDependence clang::computeDependence(RecoveryExpr *E) { 6186ac9e589SHaojian Wu // RecoveryExpr is 6196ac9e589SHaojian Wu // - always value-dependent, and therefore instantiation dependent 6206ac9e589SHaojian Wu // - contains errors (ExprDependence::Error), by definition 6216ac9e589SHaojian Wu // - type-dependent if we don't know the type (fallback to an opaque 6226ac9e589SHaojian Wu // dependent type), or the type is known and dependent, or it has 6236ac9e589SHaojian Wu // type-dependent subexpressions. 6242492c52aSMatheus Izvekov auto D = toExprDependenceAsWritten(E->getType()->getDependence()) | 625566b4988SHaojian Wu ExprDependence::ErrorDependent; 6266ac9e589SHaojian Wu // FIXME: remove the type-dependent bit from subexpressions, if the 6276ac9e589SHaojian Wu // RecoveryExpr has a non-dependent type. 628733edf97SHaojian Wu for (auto *S : E->subExpressions()) 629733edf97SHaojian Wu D |= S->getDependence(); 630733edf97SHaojian Wu return D; 631733edf97SHaojian Wu } 632733edf97SHaojian Wu 633eba69b59SErich Keane ExprDependence clang::computeDependence(SYCLUniqueStableNameExpr *E) { 634f1b0a4fcSRichard Smith return toExprDependenceAsWritten( 635f1b0a4fcSRichard Smith E->getTypeSourceInfo()->getType()->getDependence()); 636eba69b59SErich Keane } 637eba69b59SErich Keane 638876bb86eSHaojian Wu ExprDependence clang::computeDependence(PredefinedExpr *E) { 639f1b0a4fcSRichard Smith return toExprDependenceForImpliedType(E->getType()->getDependence()); 640876bb86eSHaojian Wu } 641876bb86eSHaojian Wu 642876bb86eSHaojian Wu ExprDependence clang::computeDependence(CallExpr *E, 643876bb86eSHaojian Wu llvm::ArrayRef<Expr *> PreArgs) { 644876bb86eSHaojian Wu auto D = E->getCallee()->getDependence(); 64520a05677SMariya Podchishchaeva if (E->getType()->isDependentType()) 64620a05677SMariya Podchishchaeva D |= ExprDependence::Type; 647a3c248dbSserge-sans-paille for (auto *A : llvm::ArrayRef(E->getArgs(), E->getNumArgs())) { 648876bb86eSHaojian Wu if (A) 649876bb86eSHaojian Wu D |= A->getDependence(); 650876bb86eSHaojian Wu } 651876bb86eSHaojian Wu for (auto *A : PreArgs) 652876bb86eSHaojian Wu D |= A->getDependence(); 653876bb86eSHaojian Wu return D; 654876bb86eSHaojian Wu } 655876bb86eSHaojian Wu 656876bb86eSHaojian Wu ExprDependence clang::computeDependence(OffsetOfExpr *E) { 657f1b0a4fcSRichard Smith auto D = turnTypeToValueDependence(toExprDependenceAsWritten( 658f1b0a4fcSRichard Smith E->getTypeSourceInfo()->getType()->getDependence())); 659876bb86eSHaojian Wu for (unsigned I = 0, N = E->getNumExpressions(); I < N; ++I) 660876bb86eSHaojian Wu D |= turnTypeToValueDependence(E->getIndexExpr(I)->getDependence()); 661876bb86eSHaojian Wu return D; 662876bb86eSHaojian Wu } 663876bb86eSHaojian Wu 664a0130fc5SMariya Podchishchaeva static inline ExprDependence getDependenceInExpr(DeclarationNameInfo Name) { 665a0130fc5SMariya Podchishchaeva auto D = ExprDependence::None; 666a0130fc5SMariya Podchishchaeva if (Name.isInstantiationDependent()) 667a0130fc5SMariya Podchishchaeva D |= ExprDependence::Instantiation; 668a0130fc5SMariya Podchishchaeva if (Name.containsUnexpandedParameterPack()) 669a0130fc5SMariya Podchishchaeva D |= ExprDependence::UnexpandedPack; 670a0130fc5SMariya Podchishchaeva return D; 671a0130fc5SMariya Podchishchaeva } 672a0130fc5SMariya Podchishchaeva 673876bb86eSHaojian Wu ExprDependence clang::computeDependence(MemberExpr *E) { 674b4f02d89SSam McCall auto D = E->getBase()->getDependence(); 675a0130fc5SMariya Podchishchaeva D |= getDependenceInExpr(E->getMemberNameInfo()); 676a0130fc5SMariya Podchishchaeva 677a0130fc5SMariya Podchishchaeva if (auto *NNS = E->getQualifier()) 678a0130fc5SMariya Podchishchaeva D |= toExprDependence(NNS->getDependence() & 679a0130fc5SMariya Podchishchaeva ~NestedNameSpecifierDependence::Dependent); 680a0130fc5SMariya Podchishchaeva 6810cd44ff1SKrystian Stasiowski for (const auto &A : E->template_arguments()) 6820cd44ff1SKrystian Stasiowski D |= toExprDependence(A.getArgument().getDependence()); 6830cd44ff1SKrystian Stasiowski 684a0130fc5SMariya Podchishchaeva auto *MemberDecl = E->getMemberDecl(); 685b4f02d89SSam McCall if (FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl)) { 686b4f02d89SSam McCall DeclContext *DC = MemberDecl->getDeclContext(); 687b4f02d89SSam McCall // dyn_cast_or_null is used to handle objC variables which do not 688b4f02d89SSam McCall // have a declaration context. 689b4f02d89SSam McCall CXXRecordDecl *RD = dyn_cast_or_null<CXXRecordDecl>(DC); 690b4f02d89SSam McCall if (RD && RD->isDependentContext() && RD->isCurrentInstantiation(DC)) { 691b4f02d89SSam McCall if (!E->getType()->isDependentType()) 692b4f02d89SSam McCall D &= ~ExprDependence::Type; 693b4f02d89SSam McCall } 694b4f02d89SSam McCall 695b4f02d89SSam McCall // Bitfield with value-dependent width is type-dependent. 696b4f02d89SSam McCall if (FD && FD->isBitField() && FD->getBitWidth()->isValueDependent()) { 697b4f02d89SSam McCall D |= ExprDependence::Type; 698b4f02d89SSam McCall } 699b4f02d89SSam McCall } 700b4f02d89SSam McCall return D; 701876bb86eSHaojian Wu } 702876bb86eSHaojian Wu 703876bb86eSHaojian Wu ExprDependence clang::computeDependence(InitListExpr *E) { 704876bb86eSHaojian Wu auto D = ExprDependence::None; 705876bb86eSHaojian Wu for (auto *A : E->inits()) 706876bb86eSHaojian Wu D |= A->getDependence(); 707876bb86eSHaojian Wu return D; 708876bb86eSHaojian Wu } 709876bb86eSHaojian Wu 710876bb86eSHaojian Wu ExprDependence clang::computeDependence(ShuffleVectorExpr *E) { 711f1b0a4fcSRichard Smith auto D = toExprDependenceForImpliedType(E->getType()->getDependence()); 712a3c248dbSserge-sans-paille for (auto *C : llvm::ArrayRef(E->getSubExprs(), E->getNumSubExprs())) 713876bb86eSHaojian Wu D |= C->getDependence(); 714876bb86eSHaojian Wu return D; 715876bb86eSHaojian Wu } 716876bb86eSHaojian Wu 717876bb86eSHaojian Wu ExprDependence clang::computeDependence(GenericSelectionExpr *E, 718876bb86eSHaojian Wu bool ContainsUnexpandedPack) { 719876bb86eSHaojian Wu auto D = ContainsUnexpandedPack ? ExprDependence::UnexpandedPack 720876bb86eSHaojian Wu : ExprDependence::None; 7214b0f1e12SHaojian Wu for (auto *AE : E->getAssocExprs()) 7224b0f1e12SHaojian Wu D |= AE->getDependence() & ExprDependence::Error; 72312728e14SAaron Ballman 72412728e14SAaron Ballman if (E->isExprPredicate()) 7254b0f1e12SHaojian Wu D |= E->getControllingExpr()->getDependence() & ExprDependence::Error; 72612728e14SAaron Ballman else 72712728e14SAaron Ballman D |= toExprDependenceAsWritten( 72812728e14SAaron Ballman E->getControllingType()->getType()->getDependence()); 7294b0f1e12SHaojian Wu 730876bb86eSHaojian Wu if (E->isResultDependent()) 731876bb86eSHaojian Wu return D | ExprDependence::TypeValueInstantiation; 732876bb86eSHaojian Wu return D | (E->getResultExpr()->getDependence() & 733876bb86eSHaojian Wu ~ExprDependence::UnexpandedPack); 734876bb86eSHaojian Wu } 735876bb86eSHaojian Wu 736876bb86eSHaojian Wu ExprDependence clang::computeDependence(DesignatedInitExpr *E) { 737876bb86eSHaojian Wu auto Deps = E->getInit()->getDependence(); 73838ecb976SManna, Soumi for (const auto &D : E->designators()) { 739876bb86eSHaojian Wu auto DesignatorDeps = ExprDependence::None; 740876bb86eSHaojian Wu if (D.isArrayDesignator()) 741876bb86eSHaojian Wu DesignatorDeps |= E->getArrayIndex(D)->getDependence(); 742876bb86eSHaojian Wu else if (D.isArrayRangeDesignator()) 743876bb86eSHaojian Wu DesignatorDeps |= E->getArrayRangeStart(D)->getDependence() | 744876bb86eSHaojian Wu E->getArrayRangeEnd(D)->getDependence(); 745876bb86eSHaojian Wu Deps |= DesignatorDeps; 746876bb86eSHaojian Wu if (DesignatorDeps & ExprDependence::TypeValue) 747876bb86eSHaojian Wu Deps |= ExprDependence::TypeValueInstantiation; 748876bb86eSHaojian Wu } 749876bb86eSHaojian Wu return Deps; 750876bb86eSHaojian Wu } 751876bb86eSHaojian Wu 752876bb86eSHaojian Wu ExprDependence clang::computeDependence(PseudoObjectExpr *O) { 753876bb86eSHaojian Wu auto D = O->getSyntacticForm()->getDependence(); 754876bb86eSHaojian Wu for (auto *E : O->semantics()) 755876bb86eSHaojian Wu D |= E->getDependence(); 756876bb86eSHaojian Wu return D; 757876bb86eSHaojian Wu } 758876bb86eSHaojian Wu 759876bb86eSHaojian Wu ExprDependence clang::computeDependence(AtomicExpr *A) { 760876bb86eSHaojian Wu auto D = ExprDependence::None; 761a3c248dbSserge-sans-paille for (auto *E : llvm::ArrayRef(A->getSubExprs(), A->getNumSubExprs())) 762876bb86eSHaojian Wu D |= E->getDependence(); 763876bb86eSHaojian Wu return D; 764876bb86eSHaojian Wu } 765876bb86eSHaojian Wu 766876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXNewExpr *E) { 767f1b0a4fcSRichard Smith auto D = toExprDependenceAsWritten( 768f1b0a4fcSRichard Smith E->getAllocatedTypeSourceInfo()->getType()->getDependence()); 769f1b0a4fcSRichard Smith D |= toExprDependenceForImpliedType(E->getAllocatedType()->getDependence()); 770876bb86eSHaojian Wu auto Size = E->getArraySize(); 771452db157SKazu Hirata if (Size && *Size) 772876bb86eSHaojian Wu D |= turnTypeToValueDependence((*Size)->getDependence()); 773876bb86eSHaojian Wu if (auto *I = E->getInitializer()) 774876bb86eSHaojian Wu D |= turnTypeToValueDependence(I->getDependence()); 775876bb86eSHaojian Wu for (auto *A : E->placement_arguments()) 776876bb86eSHaojian Wu D |= turnTypeToValueDependence(A->getDependence()); 777876bb86eSHaojian Wu return D; 778876bb86eSHaojian Wu } 779876bb86eSHaojian Wu 780876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXPseudoDestructorExpr *E) { 781876bb86eSHaojian Wu auto D = E->getBase()->getDependence(); 782f1b0a4fcSRichard Smith if (auto *TSI = E->getDestroyedTypeInfo()) 783f1b0a4fcSRichard Smith D |= toExprDependenceAsWritten(TSI->getType()->getDependence()); 784876bb86eSHaojian Wu if (auto *ST = E->getScopeTypeInfo()) 785876bb86eSHaojian Wu D |= turnTypeToValueDependence( 786f1b0a4fcSRichard Smith toExprDependenceAsWritten(ST->getType()->getDependence())); 787876bb86eSHaojian Wu if (auto *Q = E->getQualifier()) 788d68c09acSSam McCall D |= toExprDependence(Q->getDependence() & 789d68c09acSSam McCall ~NestedNameSpecifierDependence::Dependent); 790876bb86eSHaojian Wu return D; 791876bb86eSHaojian Wu } 792876bb86eSHaojian Wu 793876bb86eSHaojian Wu ExprDependence 794876bb86eSHaojian Wu clang::computeDependence(OverloadExpr *E, bool KnownDependent, 795876bb86eSHaojian Wu bool KnownInstantiationDependent, 796876bb86eSHaojian Wu bool KnownContainsUnexpandedParameterPack) { 797876bb86eSHaojian Wu auto Deps = ExprDependence::None; 798876bb86eSHaojian Wu if (KnownDependent) 799876bb86eSHaojian Wu Deps |= ExprDependence::TypeValue; 800876bb86eSHaojian Wu if (KnownInstantiationDependent) 801876bb86eSHaojian Wu Deps |= ExprDependence::Instantiation; 802876bb86eSHaojian Wu if (KnownContainsUnexpandedParameterPack) 803876bb86eSHaojian Wu Deps |= ExprDependence::UnexpandedPack; 804876bb86eSHaojian Wu Deps |= getDependenceInExpr(E->getNameInfo()); 805876bb86eSHaojian Wu if (auto *Q = E->getQualifier()) 806d68c09acSSam McCall Deps |= toExprDependence(Q->getDependence() & 807d68c09acSSam McCall ~NestedNameSpecifierDependence::Dependent); 808876bb86eSHaojian Wu for (auto *D : E->decls()) { 809876bb86eSHaojian Wu if (D->getDeclContext()->isDependentContext() || 810876bb86eSHaojian Wu isa<UnresolvedUsingValueDecl>(D)) 811876bb86eSHaojian Wu Deps |= ExprDependence::TypeValueInstantiation; 812876bb86eSHaojian Wu } 813876bb86eSHaojian Wu // If we have explicit template arguments, check for dependent 814876bb86eSHaojian Wu // template arguments and whether they contain any unexpanded pack 815876bb86eSHaojian Wu // expansions. 81659cb4701SManna, Soumi for (const auto &A : E->template_arguments()) 817876bb86eSHaojian Wu Deps |= toExprDependence(A.getArgument().getDependence()); 818876bb86eSHaojian Wu return Deps; 819876bb86eSHaojian Wu } 820876bb86eSHaojian Wu 821876bb86eSHaojian Wu ExprDependence clang::computeDependence(DependentScopeDeclRefExpr *E) { 822876bb86eSHaojian Wu auto D = ExprDependence::TypeValue; 823876bb86eSHaojian Wu D |= getDependenceInExpr(E->getNameInfo()); 824876bb86eSHaojian Wu if (auto *Q = E->getQualifier()) 825876bb86eSHaojian Wu D |= toExprDependence(Q->getDependence()); 826ff4d2207SManna, Soumi for (const auto &A : E->template_arguments()) 827876bb86eSHaojian Wu D |= toExprDependence(A.getArgument().getDependence()); 828876bb86eSHaojian Wu return D; 829876bb86eSHaojian Wu } 830876bb86eSHaojian Wu 831876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXConstructExpr *E) { 832f1b0a4fcSRichard Smith ExprDependence D = 833f1b0a4fcSRichard Smith toExprDependenceForImpliedType(E->getType()->getDependence()); 834d3d84421SHaojian Wu for (auto *A : E->arguments()) 835d3d84421SHaojian Wu D |= A->getDependence() & ~ExprDependence::Type; 836876bb86eSHaojian Wu return D; 837876bb86eSHaojian Wu } 838876bb86eSHaojian Wu 839f1b0a4fcSRichard Smith ExprDependence clang::computeDependence(CXXTemporaryObjectExpr *E) { 840f1b0a4fcSRichard Smith CXXConstructExpr *BaseE = E; 841f1b0a4fcSRichard Smith return toExprDependenceAsWritten( 842f1b0a4fcSRichard Smith E->getTypeSourceInfo()->getType()->getDependence()) | 843f1b0a4fcSRichard Smith computeDependence(BaseE); 844f1b0a4fcSRichard Smith } 845f1b0a4fcSRichard Smith 846f8f1e5fbSHaojian Wu ExprDependence clang::computeDependence(CXXDefaultInitExpr *E) { 847f8f1e5fbSHaojian Wu return E->getExpr()->getDependence(); 848f8f1e5fbSHaojian Wu } 849f8f1e5fbSHaojian Wu 850a9593745SAdam Czachorowski ExprDependence clang::computeDependence(CXXDefaultArgExpr *E) { 851a9593745SAdam Czachorowski return E->getExpr()->getDependence(); 852a9593745SAdam Czachorowski } 853a9593745SAdam Czachorowski 854876bb86eSHaojian Wu ExprDependence clang::computeDependence(LambdaExpr *E, 855876bb86eSHaojian Wu bool ContainsUnexpandedParameterPack) { 856f1b0a4fcSRichard Smith auto D = toExprDependenceForImpliedType(E->getType()->getDependence()); 857876bb86eSHaojian Wu if (ContainsUnexpandedParameterPack) 858876bb86eSHaojian Wu D |= ExprDependence::UnexpandedPack; 859876bb86eSHaojian Wu return D; 860876bb86eSHaojian Wu } 861876bb86eSHaojian Wu 862876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXUnresolvedConstructExpr *E) { 863876bb86eSHaojian Wu auto D = ExprDependence::ValueInstantiation; 864f1b0a4fcSRichard Smith D |= toExprDependenceAsWritten(E->getTypeAsWritten()->getDependence()); 865f1b0a4fcSRichard Smith D |= toExprDependenceForImpliedType(E->getType()->getDependence()); 866876bb86eSHaojian Wu for (auto *A : E->arguments()) 8674b0f1e12SHaojian Wu D |= A->getDependence() & 8684b0f1e12SHaojian Wu (ExprDependence::UnexpandedPack | ExprDependence::Error); 869876bb86eSHaojian Wu return D; 870876bb86eSHaojian Wu } 871876bb86eSHaojian Wu 872876bb86eSHaojian Wu ExprDependence clang::computeDependence(CXXDependentScopeMemberExpr *E) { 873876bb86eSHaojian Wu auto D = ExprDependence::TypeValueInstantiation; 874876bb86eSHaojian Wu if (!E->isImplicitAccess()) 875876bb86eSHaojian Wu D |= E->getBase()->getDependence(); 876876bb86eSHaojian Wu if (auto *Q = E->getQualifier()) 877876bb86eSHaojian Wu D |= toExprDependence(Q->getDependence()); 878876bb86eSHaojian Wu D |= getDependenceInExpr(E->getMemberNameInfo()); 879ff4d2207SManna, Soumi for (const auto &A : E->template_arguments()) 880876bb86eSHaojian Wu D |= toExprDependence(A.getArgument().getDependence()); 881876bb86eSHaojian Wu return D; 882876bb86eSHaojian Wu } 883876bb86eSHaojian Wu 884876bb86eSHaojian Wu ExprDependence clang::computeDependence(MaterializeTemporaryExpr *E) { 885876bb86eSHaojian Wu return E->getSubExpr()->getDependence(); 886876bb86eSHaojian Wu } 887876bb86eSHaojian Wu 8884b0f1e12SHaojian Wu ExprDependence clang::computeDependence(CXXFoldExpr *E) { 8894b0f1e12SHaojian Wu auto D = ExprDependence::TypeValueInstantiation; 8904b0f1e12SHaojian Wu for (const auto *C : {E->getLHS(), E->getRHS()}) { 8914b0f1e12SHaojian Wu if (C) 8924b0f1e12SHaojian Wu D |= C->getDependence() & ~ExprDependence::UnexpandedPack; 8934b0f1e12SHaojian Wu } 8944b0f1e12SHaojian Wu return D; 8954b0f1e12SHaojian Wu } 8964b0f1e12SHaojian Wu 89795a4c0c8SAlan Zhao ExprDependence clang::computeDependence(CXXParenListInitExpr *E) { 89895a4c0c8SAlan Zhao auto D = ExprDependence::None; 89995a4c0c8SAlan Zhao for (const auto *A : E->getInitExprs()) 90095a4c0c8SAlan Zhao D |= A->getDependence(); 90195a4c0c8SAlan Zhao return D; 90295a4c0c8SAlan Zhao } 90395a4c0c8SAlan Zhao 904876bb86eSHaojian Wu ExprDependence clang::computeDependence(TypeTraitExpr *E) { 905876bb86eSHaojian Wu auto D = ExprDependence::None; 906876bb86eSHaojian Wu for (const auto *A : E->getArgs()) 907f1b0a4fcSRichard Smith D |= toExprDependenceAsWritten(A->getType()->getDependence()) & 908f1b0a4fcSRichard Smith ~ExprDependence::Type; 909876bb86eSHaojian Wu return D; 910876bb86eSHaojian Wu } 911876bb86eSHaojian Wu 912876bb86eSHaojian Wu ExprDependence clang::computeDependence(ConceptSpecializationExpr *E, 913876bb86eSHaojian Wu bool ValueDependent) { 914876bb86eSHaojian Wu auto TA = TemplateArgumentDependence::None; 915876bb86eSHaojian Wu const auto InterestingDeps = TemplateArgumentDependence::Instantiation | 916876bb86eSHaojian Wu TemplateArgumentDependence::UnexpandedPack; 917876bb86eSHaojian Wu for (const TemplateArgumentLoc &ArgLoc : 918876bb86eSHaojian Wu E->getTemplateArgsAsWritten()->arguments()) { 919876bb86eSHaojian Wu TA |= ArgLoc.getArgument().getDependence() & InterestingDeps; 920876bb86eSHaojian Wu if (TA == InterestingDeps) 921876bb86eSHaojian Wu break; 922876bb86eSHaojian Wu } 923876bb86eSHaojian Wu 924876bb86eSHaojian Wu ExprDependence D = 925876bb86eSHaojian Wu ValueDependent ? ExprDependence::Value : ExprDependence::None; 926684a7896SErich Keane auto Res = D | toExprDependence(TA); 927684a7896SErich Keane if(!ValueDependent && E->getSatisfaction().ContainsErrors) 928684a7896SErich Keane Res |= ExprDependence::Error; 929684a7896SErich Keane return Res; 930876bb86eSHaojian Wu } 931876bb86eSHaojian Wu 932876bb86eSHaojian Wu ExprDependence clang::computeDependence(ObjCArrayLiteral *E) { 933876bb86eSHaojian Wu auto D = ExprDependence::None; 934876bb86eSHaojian Wu Expr **Elements = E->getElements(); 935876bb86eSHaojian Wu for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) 936876bb86eSHaojian Wu D |= turnTypeToValueDependence(Elements[I]->getDependence()); 937876bb86eSHaojian Wu return D; 938876bb86eSHaojian Wu } 939876bb86eSHaojian Wu 940876bb86eSHaojian Wu ExprDependence clang::computeDependence(ObjCDictionaryLiteral *E) { 941876bb86eSHaojian Wu auto Deps = ExprDependence::None; 942876bb86eSHaojian Wu for (unsigned I = 0, N = E->getNumElements(); I < N; ++I) { 943876bb86eSHaojian Wu auto KV = E->getKeyValueElement(I); 944876bb86eSHaojian Wu auto KVDeps = turnTypeToValueDependence(KV.Key->getDependence() | 945876bb86eSHaojian Wu KV.Value->getDependence()); 946876bb86eSHaojian Wu if (KV.EllipsisLoc.isValid()) 947876bb86eSHaojian Wu KVDeps &= ~ExprDependence::UnexpandedPack; 948876bb86eSHaojian Wu Deps |= KVDeps; 949876bb86eSHaojian Wu } 950876bb86eSHaojian Wu return Deps; 951876bb86eSHaojian Wu } 952876bb86eSHaojian Wu 953876bb86eSHaojian Wu ExprDependence clang::computeDependence(ObjCMessageExpr *E) { 954876bb86eSHaojian Wu auto D = ExprDependence::None; 955876bb86eSHaojian Wu if (auto *R = E->getInstanceReceiver()) 956876bb86eSHaojian Wu D |= R->getDependence(); 957876bb86eSHaojian Wu else 958f1b0a4fcSRichard Smith D |= toExprDependenceForImpliedType(E->getType()->getDependence()); 959876bb86eSHaojian Wu for (auto *A : E->arguments()) 960876bb86eSHaojian Wu D |= A->getDependence(); 961876bb86eSHaojian Wu return D; 962876bb86eSHaojian Wu } 963d412cea8SErich Keane 964d412cea8SErich Keane ExprDependence clang::computeDependence(OpenACCAsteriskSizeExpr *E) { 965d412cea8SErich Keane // This represents a simple asterisk as typed, so cannot be dependent in any 966d412cea8SErich Keane // way. 967d412cea8SErich Keane return ExprDependence::None; 968d412cea8SErich Keane } 969