15ffd83dbSDimitry Andric //===- ComputeDependence.cpp ----------------------------------------------===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric 95ffd83dbSDimitry Andric #include "clang/AST/ComputeDependence.h" 105ffd83dbSDimitry Andric #include "clang/AST/Attr.h" 115ffd83dbSDimitry Andric #include "clang/AST/DeclCXX.h" 125ffd83dbSDimitry Andric #include "clang/AST/DeclarationName.h" 135ffd83dbSDimitry Andric #include "clang/AST/DependenceFlags.h" 145ffd83dbSDimitry Andric #include "clang/AST/Expr.h" 155ffd83dbSDimitry Andric #include "clang/AST/ExprCXX.h" 165ffd83dbSDimitry Andric #include "clang/AST/ExprConcepts.h" 175ffd83dbSDimitry Andric #include "clang/AST/ExprObjC.h" 185ffd83dbSDimitry Andric #include "clang/AST/ExprOpenMP.h" 195ffd83dbSDimitry Andric #include "clang/Basic/ExceptionSpecificationType.h" 205ffd83dbSDimitry Andric #include "llvm/ADT/ArrayRef.h" 215ffd83dbSDimitry Andric 225ffd83dbSDimitry Andric using namespace clang; 235ffd83dbSDimitry Andric 245ffd83dbSDimitry Andric ExprDependence clang::computeDependence(FullExpr *E) { 255ffd83dbSDimitry Andric return E->getSubExpr()->getDependence(); 265ffd83dbSDimitry Andric } 275ffd83dbSDimitry Andric 285ffd83dbSDimitry Andric ExprDependence clang::computeDependence(OpaqueValueExpr *E) { 295ffd83dbSDimitry Andric auto D = toExprDependence(E->getType()->getDependence()); 305ffd83dbSDimitry Andric if (auto *S = E->getSourceExpr()) 315ffd83dbSDimitry Andric D |= S->getDependence(); 325ffd83dbSDimitry Andric assert(!(D & ExprDependence::UnexpandedPack)); 335ffd83dbSDimitry Andric return D; 345ffd83dbSDimitry Andric } 355ffd83dbSDimitry Andric 365ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ParenExpr *E) { 375ffd83dbSDimitry Andric return E->getSubExpr()->getDependence(); 385ffd83dbSDimitry Andric } 395ffd83dbSDimitry Andric 40*e8d8bef9SDimitry Andric ExprDependence clang::computeDependence(UnaryOperator *E, 41*e8d8bef9SDimitry Andric const ASTContext &Ctx) { 42*e8d8bef9SDimitry Andric ExprDependence Dep = toExprDependence(E->getType()->getDependence()) | 435ffd83dbSDimitry Andric E->getSubExpr()->getDependence(); 44*e8d8bef9SDimitry Andric 45*e8d8bef9SDimitry Andric // C++ [temp.dep.constexpr]p5: 46*e8d8bef9SDimitry Andric // An expression of the form & qualified-id where the qualified-id names a 47*e8d8bef9SDimitry Andric // dependent member of the current instantiation is value-dependent. An 48*e8d8bef9SDimitry Andric // expression of the form & cast-expression is also value-dependent if 49*e8d8bef9SDimitry Andric // evaluating cast-expression as a core constant expression succeeds and 50*e8d8bef9SDimitry Andric // the result of the evaluation refers to a templated entity that is an 51*e8d8bef9SDimitry Andric // object with static or thread storage duration or a member function. 52*e8d8bef9SDimitry Andric // 53*e8d8bef9SDimitry Andric // What this amounts to is: constant-evaluate the operand and check whether it 54*e8d8bef9SDimitry Andric // refers to a templated entity other than a variable with local storage. 55*e8d8bef9SDimitry Andric if (Ctx.getLangOpts().CPlusPlus && E->getOpcode() == UO_AddrOf && 56*e8d8bef9SDimitry Andric !(Dep & ExprDependence::Value)) { 57*e8d8bef9SDimitry Andric Expr::EvalResult Result; 58*e8d8bef9SDimitry Andric SmallVector<PartialDiagnosticAt, 8> Diag; 59*e8d8bef9SDimitry Andric Result.Diag = &Diag; 60*e8d8bef9SDimitry Andric // FIXME: This doesn't enforce the C++98 constant expression rules. 61*e8d8bef9SDimitry Andric if (E->getSubExpr()->EvaluateAsConstantExpr(Result, Ctx) && Diag.empty() && 62*e8d8bef9SDimitry Andric Result.Val.isLValue()) { 63*e8d8bef9SDimitry Andric auto *VD = Result.Val.getLValueBase().dyn_cast<const ValueDecl *>(); 64*e8d8bef9SDimitry Andric if (VD && VD->isTemplated()) { 65*e8d8bef9SDimitry Andric auto *VarD = dyn_cast<VarDecl>(VD); 66*e8d8bef9SDimitry Andric if (!VarD || !VarD->hasLocalStorage()) 67*e8d8bef9SDimitry Andric Dep |= ExprDependence::Value; 68*e8d8bef9SDimitry Andric } 69*e8d8bef9SDimitry Andric } 70*e8d8bef9SDimitry Andric } 71*e8d8bef9SDimitry Andric 72*e8d8bef9SDimitry Andric return Dep; 735ffd83dbSDimitry Andric } 745ffd83dbSDimitry Andric 755ffd83dbSDimitry Andric ExprDependence clang::computeDependence(UnaryExprOrTypeTraitExpr *E) { 765ffd83dbSDimitry Andric // Never type-dependent (C++ [temp.dep.expr]p3). 775ffd83dbSDimitry Andric // Value-dependent if the argument is type-dependent. 785ffd83dbSDimitry Andric if (E->isArgumentType()) 795ffd83dbSDimitry Andric return turnTypeToValueDependence( 805ffd83dbSDimitry Andric toExprDependence(E->getArgumentType()->getDependence())); 815ffd83dbSDimitry Andric 825ffd83dbSDimitry Andric auto ArgDeps = E->getArgumentExpr()->getDependence(); 835ffd83dbSDimitry Andric auto Deps = ArgDeps & ~ExprDependence::TypeValue; 845ffd83dbSDimitry Andric // Value-dependent if the argument is type-dependent. 855ffd83dbSDimitry Andric if (ArgDeps & ExprDependence::Type) 865ffd83dbSDimitry Andric Deps |= ExprDependence::Value; 875ffd83dbSDimitry Andric // Check to see if we are in the situation where alignof(decl) should be 885ffd83dbSDimitry Andric // dependent because decl's alignment is dependent. 895ffd83dbSDimitry Andric auto ExprKind = E->getKind(); 905ffd83dbSDimitry Andric if (ExprKind != UETT_AlignOf && ExprKind != UETT_PreferredAlignOf) 915ffd83dbSDimitry Andric return Deps; 925ffd83dbSDimitry Andric if ((Deps & ExprDependence::Value) && (Deps & ExprDependence::Instantiation)) 935ffd83dbSDimitry Andric return Deps; 945ffd83dbSDimitry Andric 955ffd83dbSDimitry Andric auto *NoParens = E->getArgumentExpr()->IgnoreParens(); 965ffd83dbSDimitry Andric const ValueDecl *D = nullptr; 975ffd83dbSDimitry Andric if (const auto *DRE = dyn_cast<DeclRefExpr>(NoParens)) 985ffd83dbSDimitry Andric D = DRE->getDecl(); 995ffd83dbSDimitry Andric else if (const auto *ME = dyn_cast<MemberExpr>(NoParens)) 1005ffd83dbSDimitry Andric D = ME->getMemberDecl(); 1015ffd83dbSDimitry Andric if (!D) 1025ffd83dbSDimitry Andric return Deps; 1035ffd83dbSDimitry Andric for (const auto *I : D->specific_attrs<AlignedAttr>()) { 1045ffd83dbSDimitry Andric if (I->isAlignmentErrorDependent()) 1055ffd83dbSDimitry Andric Deps |= ExprDependence::Error; 1065ffd83dbSDimitry Andric if (I->isAlignmentDependent()) 1075ffd83dbSDimitry Andric Deps |= ExprDependence::ValueInstantiation; 1085ffd83dbSDimitry Andric } 1095ffd83dbSDimitry Andric return Deps; 1105ffd83dbSDimitry Andric } 1115ffd83dbSDimitry Andric 1125ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ArraySubscriptExpr *E) { 1135ffd83dbSDimitry Andric return E->getLHS()->getDependence() | E->getRHS()->getDependence(); 1145ffd83dbSDimitry Andric } 1155ffd83dbSDimitry Andric 1165ffd83dbSDimitry Andric ExprDependence clang::computeDependence(MatrixSubscriptExpr *E) { 1175ffd83dbSDimitry Andric return E->getBase()->getDependence() | E->getRowIdx()->getDependence() | 1185ffd83dbSDimitry Andric (E->getColumnIdx() ? E->getColumnIdx()->getDependence() 1195ffd83dbSDimitry Andric : ExprDependence::None); 1205ffd83dbSDimitry Andric } 1215ffd83dbSDimitry Andric 1225ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CompoundLiteralExpr *E) { 1235ffd83dbSDimitry Andric return toExprDependence(E->getTypeSourceInfo()->getType()->getDependence()) | 1245ffd83dbSDimitry Andric turnTypeToValueDependence(E->getInitializer()->getDependence()); 1255ffd83dbSDimitry Andric } 1265ffd83dbSDimitry Andric 1275ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CastExpr *E) { 1285ffd83dbSDimitry Andric // Cast expressions are type-dependent if the type is 1295ffd83dbSDimitry Andric // dependent (C++ [temp.dep.expr]p3). 1305ffd83dbSDimitry Andric // Cast expressions are value-dependent if the type is 1315ffd83dbSDimitry Andric // dependent or if the subexpression is value-dependent. 1325ffd83dbSDimitry Andric auto D = toExprDependence(E->getType()->getDependence()); 1335ffd83dbSDimitry Andric if (E->getStmtClass() == Stmt::ImplicitCastExprClass) { 1345ffd83dbSDimitry Andric // An implicit cast expression doesn't (lexically) contain an 1355ffd83dbSDimitry Andric // unexpanded pack, even if its target type does. 1365ffd83dbSDimitry Andric D &= ~ExprDependence::UnexpandedPack; 1375ffd83dbSDimitry Andric } 1385ffd83dbSDimitry Andric if (auto *S = E->getSubExpr()) 1395ffd83dbSDimitry Andric D |= S->getDependence() & ~ExprDependence::Type; 1405ffd83dbSDimitry Andric return D; 1415ffd83dbSDimitry Andric } 1425ffd83dbSDimitry Andric 1435ffd83dbSDimitry Andric ExprDependence clang::computeDependence(BinaryOperator *E) { 1445ffd83dbSDimitry Andric return E->getLHS()->getDependence() | E->getRHS()->getDependence(); 1455ffd83dbSDimitry Andric } 1465ffd83dbSDimitry Andric 1475ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ConditionalOperator *E) { 1485ffd83dbSDimitry Andric // The type of the conditional operator depends on the type of the conditional 1495ffd83dbSDimitry Andric // to support the GCC vector conditional extension. Additionally, 1505ffd83dbSDimitry Andric // [temp.dep.expr] does specify state that this should be dependent on ALL sub 1515ffd83dbSDimitry Andric // expressions. 1525ffd83dbSDimitry Andric return E->getCond()->getDependence() | E->getLHS()->getDependence() | 1535ffd83dbSDimitry Andric E->getRHS()->getDependence(); 1545ffd83dbSDimitry Andric } 1555ffd83dbSDimitry Andric 1565ffd83dbSDimitry Andric ExprDependence clang::computeDependence(BinaryConditionalOperator *E) { 1575ffd83dbSDimitry Andric return E->getCommon()->getDependence() | E->getFalseExpr()->getDependence(); 1585ffd83dbSDimitry Andric } 1595ffd83dbSDimitry Andric 1605ffd83dbSDimitry Andric ExprDependence clang::computeDependence(StmtExpr *E, unsigned TemplateDepth) { 1615ffd83dbSDimitry Andric auto D = toExprDependence(E->getType()->getDependence()); 1625ffd83dbSDimitry Andric // Propagate dependence of the result. 1635ffd83dbSDimitry Andric if (const auto *CompoundExprResult = 1645ffd83dbSDimitry Andric dyn_cast_or_null<ValueStmt>(E->getSubStmt()->getStmtExprResult())) 1655ffd83dbSDimitry Andric if (const Expr *ResultExpr = CompoundExprResult->getExprStmt()) 1665ffd83dbSDimitry Andric D |= ResultExpr->getDependence(); 1675ffd83dbSDimitry Andric // Note: we treat a statement-expression in a dependent context as always 1685ffd83dbSDimitry Andric // being value- and instantiation-dependent. This matches the behavior of 1695ffd83dbSDimitry Andric // lambda-expressions and GCC. 1705ffd83dbSDimitry Andric if (TemplateDepth) 1715ffd83dbSDimitry Andric D |= ExprDependence::ValueInstantiation; 1725ffd83dbSDimitry Andric // A param pack cannot be expanded over stmtexpr boundaries. 1735ffd83dbSDimitry Andric return D & ~ExprDependence::UnexpandedPack; 1745ffd83dbSDimitry Andric } 1755ffd83dbSDimitry Andric 1765ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ConvertVectorExpr *E) { 1775ffd83dbSDimitry Andric auto D = toExprDependence(E->getType()->getDependence()) | 1785ffd83dbSDimitry Andric E->getSrcExpr()->getDependence(); 1795ffd83dbSDimitry Andric if (!E->getType()->isDependentType()) 1805ffd83dbSDimitry Andric D &= ~ExprDependence::Type; 1815ffd83dbSDimitry Andric return D; 1825ffd83dbSDimitry Andric } 1835ffd83dbSDimitry Andric 1845ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ChooseExpr *E) { 1855ffd83dbSDimitry Andric if (E->isConditionDependent()) 1865ffd83dbSDimitry Andric return ExprDependence::TypeValueInstantiation | 1875ffd83dbSDimitry Andric E->getCond()->getDependence() | E->getLHS()->getDependence() | 1885ffd83dbSDimitry Andric E->getRHS()->getDependence(); 1895ffd83dbSDimitry Andric 1905ffd83dbSDimitry Andric auto Cond = E->getCond()->getDependence(); 1915ffd83dbSDimitry Andric auto Active = E->getLHS()->getDependence(); 1925ffd83dbSDimitry Andric auto Inactive = E->getRHS()->getDependence(); 1935ffd83dbSDimitry Andric if (!E->isConditionTrue()) 1945ffd83dbSDimitry Andric std::swap(Active, Inactive); 1955ffd83dbSDimitry Andric // Take type- and value- dependency from the active branch. Propagate all 1965ffd83dbSDimitry Andric // other flags from all branches. 1975ffd83dbSDimitry Andric return (Active & ExprDependence::TypeValue) | 1985ffd83dbSDimitry Andric ((Cond | Active | Inactive) & ~ExprDependence::TypeValue); 1995ffd83dbSDimitry Andric } 2005ffd83dbSDimitry Andric 2015ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ParenListExpr *P) { 2025ffd83dbSDimitry Andric auto D = ExprDependence::None; 2035ffd83dbSDimitry Andric for (auto *E : P->exprs()) 2045ffd83dbSDimitry Andric D |= E->getDependence(); 2055ffd83dbSDimitry Andric return D; 2065ffd83dbSDimitry Andric } 2075ffd83dbSDimitry Andric 2085ffd83dbSDimitry Andric ExprDependence clang::computeDependence(VAArgExpr *E) { 2095ffd83dbSDimitry Andric auto D = 2105ffd83dbSDimitry Andric toExprDependence(E->getWrittenTypeInfo()->getType()->getDependence()) | 2115ffd83dbSDimitry Andric (E->getSubExpr()->getDependence() & ~ExprDependence::Type); 2125ffd83dbSDimitry Andric return D & ~ExprDependence::Value; 2135ffd83dbSDimitry Andric } 2145ffd83dbSDimitry Andric 2155ffd83dbSDimitry Andric ExprDependence clang::computeDependence(NoInitExpr *E) { 2165ffd83dbSDimitry Andric return toExprDependence(E->getType()->getDependence()) & 2175ffd83dbSDimitry Andric (ExprDependence::Instantiation | ExprDependence::Error); 2185ffd83dbSDimitry Andric } 2195ffd83dbSDimitry Andric 2205ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ArrayInitLoopExpr *E) { 2215ffd83dbSDimitry Andric auto D = E->getCommonExpr()->getDependence() | 2225ffd83dbSDimitry Andric E->getSubExpr()->getDependence() | ExprDependence::Instantiation; 2235ffd83dbSDimitry Andric if (!E->getType()->isInstantiationDependentType()) 2245ffd83dbSDimitry Andric D &= ~ExprDependence::Instantiation; 2255ffd83dbSDimitry Andric return turnTypeToValueDependence(D); 2265ffd83dbSDimitry Andric } 2275ffd83dbSDimitry Andric 2285ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ImplicitValueInitExpr *E) { 2295ffd83dbSDimitry Andric return toExprDependence(E->getType()->getDependence()) & 2305ffd83dbSDimitry Andric ExprDependence::Instantiation; 2315ffd83dbSDimitry Andric } 2325ffd83dbSDimitry Andric 2335ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ExtVectorElementExpr *E) { 2345ffd83dbSDimitry Andric return E->getBase()->getDependence(); 2355ffd83dbSDimitry Andric } 2365ffd83dbSDimitry Andric 2375ffd83dbSDimitry Andric ExprDependence clang::computeDependence(BlockExpr *E) { 2385ffd83dbSDimitry Andric auto D = toExprDependence(E->getType()->getDependence()); 2395ffd83dbSDimitry Andric if (E->getBlockDecl()->isDependentContext()) 2405ffd83dbSDimitry Andric D |= ExprDependence::Instantiation; 2415ffd83dbSDimitry Andric return D & ~ExprDependence::UnexpandedPack; 2425ffd83dbSDimitry Andric } 2435ffd83dbSDimitry Andric 2445ffd83dbSDimitry Andric ExprDependence clang::computeDependence(AsTypeExpr *E) { 2455ffd83dbSDimitry Andric auto D = toExprDependence(E->getType()->getDependence()) | 2465ffd83dbSDimitry Andric E->getSrcExpr()->getDependence(); 2475ffd83dbSDimitry Andric if (!E->getType()->isDependentType()) 2485ffd83dbSDimitry Andric D &= ~ExprDependence::Type; 2495ffd83dbSDimitry Andric return D; 2505ffd83dbSDimitry Andric } 2515ffd83dbSDimitry Andric 2525ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXRewrittenBinaryOperator *E) { 2535ffd83dbSDimitry Andric return E->getSemanticForm()->getDependence(); 2545ffd83dbSDimitry Andric } 2555ffd83dbSDimitry Andric 2565ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXStdInitializerListExpr *E) { 2575ffd83dbSDimitry Andric auto D = turnTypeToValueDependence(E->getSubExpr()->getDependence()); 2585ffd83dbSDimitry Andric D |= toExprDependence(E->getType()->getDependence()) & 2595ffd83dbSDimitry Andric (ExprDependence::Type | ExprDependence::Error); 2605ffd83dbSDimitry Andric return D; 2615ffd83dbSDimitry Andric } 2625ffd83dbSDimitry Andric 2635ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXTypeidExpr *E) { 2645ffd83dbSDimitry Andric auto D = ExprDependence::None; 2655ffd83dbSDimitry Andric if (E->isTypeOperand()) 2665ffd83dbSDimitry Andric D = toExprDependence( 2675ffd83dbSDimitry Andric E->getTypeOperandSourceInfo()->getType()->getDependence()); 2685ffd83dbSDimitry Andric else 2695ffd83dbSDimitry Andric D = turnTypeToValueDependence(E->getExprOperand()->getDependence()); 2705ffd83dbSDimitry Andric // typeid is never type-dependent (C++ [temp.dep.expr]p4) 2715ffd83dbSDimitry Andric return D & ~ExprDependence::Type; 2725ffd83dbSDimitry Andric } 2735ffd83dbSDimitry Andric 2745ffd83dbSDimitry Andric ExprDependence clang::computeDependence(MSPropertyRefExpr *E) { 2755ffd83dbSDimitry Andric return E->getBaseExpr()->getDependence() & ~ExprDependence::Type; 2765ffd83dbSDimitry Andric } 2775ffd83dbSDimitry Andric 2785ffd83dbSDimitry Andric ExprDependence clang::computeDependence(MSPropertySubscriptExpr *E) { 2795ffd83dbSDimitry Andric return E->getIdx()->getDependence(); 2805ffd83dbSDimitry Andric } 2815ffd83dbSDimitry Andric 2825ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXUuidofExpr *E) { 2835ffd83dbSDimitry Andric if (E->isTypeOperand()) 2845ffd83dbSDimitry Andric return turnTypeToValueDependence(toExprDependence( 2855ffd83dbSDimitry Andric E->getTypeOperandSourceInfo()->getType()->getDependence())); 2865ffd83dbSDimitry Andric 2875ffd83dbSDimitry Andric return turnTypeToValueDependence(E->getExprOperand()->getDependence()); 2885ffd83dbSDimitry Andric } 2895ffd83dbSDimitry Andric 2905ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXThisExpr *E) { 2915ffd83dbSDimitry Andric // 'this' is type-dependent if the class type of the enclosing 2925ffd83dbSDimitry Andric // member function is dependent (C++ [temp.dep.expr]p2) 2935ffd83dbSDimitry Andric auto D = toExprDependence(E->getType()->getDependence()); 2945ffd83dbSDimitry Andric assert(!(D & ExprDependence::UnexpandedPack)); 2955ffd83dbSDimitry Andric return D; 2965ffd83dbSDimitry Andric } 2975ffd83dbSDimitry Andric 2985ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXThrowExpr *E) { 2995ffd83dbSDimitry Andric auto *Op = E->getSubExpr(); 3005ffd83dbSDimitry Andric if (!Op) 3015ffd83dbSDimitry Andric return ExprDependence::None; 3025ffd83dbSDimitry Andric return Op->getDependence() & ~ExprDependence::TypeValue; 3035ffd83dbSDimitry Andric } 3045ffd83dbSDimitry Andric 3055ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXBindTemporaryExpr *E) { 3065ffd83dbSDimitry Andric return E->getSubExpr()->getDependence(); 3075ffd83dbSDimitry Andric } 3085ffd83dbSDimitry Andric 3095ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXScalarValueInitExpr *E) { 3105ffd83dbSDimitry Andric return toExprDependence(E->getType()->getDependence()) & 3115ffd83dbSDimitry Andric ~ExprDependence::TypeValue; 3125ffd83dbSDimitry Andric } 3135ffd83dbSDimitry Andric 3145ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXDeleteExpr *E) { 3155ffd83dbSDimitry Andric return turnTypeToValueDependence(E->getArgument()->getDependence()); 3165ffd83dbSDimitry Andric } 3175ffd83dbSDimitry Andric 3185ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ArrayTypeTraitExpr *E) { 3195ffd83dbSDimitry Andric auto D = toExprDependence(E->getQueriedType()->getDependence()); 3205ffd83dbSDimitry Andric if (auto *Dim = E->getDimensionExpression()) 3215ffd83dbSDimitry Andric D |= Dim->getDependence(); 3225ffd83dbSDimitry Andric return turnTypeToValueDependence(D); 3235ffd83dbSDimitry Andric } 3245ffd83dbSDimitry Andric 3255ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ExpressionTraitExpr *E) { 3265ffd83dbSDimitry Andric // Never type-dependent. 3275ffd83dbSDimitry Andric auto D = E->getQueriedExpression()->getDependence() & ~ExprDependence::Type; 3285ffd83dbSDimitry Andric // Value-dependent if the argument is type-dependent. 3295ffd83dbSDimitry Andric if (E->getQueriedExpression()->isTypeDependent()) 3305ffd83dbSDimitry Andric D |= ExprDependence::Value; 3315ffd83dbSDimitry Andric return D; 3325ffd83dbSDimitry Andric } 3335ffd83dbSDimitry Andric 3345ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXNoexceptExpr *E, CanThrowResult CT) { 3355ffd83dbSDimitry Andric auto D = E->getOperand()->getDependence() & ~ExprDependence::TypeValue; 3365ffd83dbSDimitry Andric if (CT == CT_Dependent) 3375ffd83dbSDimitry Andric D |= ExprDependence::ValueInstantiation; 3385ffd83dbSDimitry Andric return D; 3395ffd83dbSDimitry Andric } 3405ffd83dbSDimitry Andric 3415ffd83dbSDimitry Andric ExprDependence clang::computeDependence(PackExpansionExpr *E) { 3425ffd83dbSDimitry Andric return (E->getPattern()->getDependence() & ~ExprDependence::UnexpandedPack) | 3435ffd83dbSDimitry Andric ExprDependence::TypeValueInstantiation; 3445ffd83dbSDimitry Andric } 3455ffd83dbSDimitry Andric 3465ffd83dbSDimitry Andric ExprDependence clang::computeDependence(SubstNonTypeTemplateParmExpr *E) { 3475ffd83dbSDimitry Andric return E->getReplacement()->getDependence(); 3485ffd83dbSDimitry Andric } 3495ffd83dbSDimitry Andric 3505ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CoroutineSuspendExpr *E) { 3515ffd83dbSDimitry Andric if (auto *Resume = E->getResumeExpr()) 3525ffd83dbSDimitry Andric return (Resume->getDependence() & 3535ffd83dbSDimitry Andric (ExprDependence::TypeValue | ExprDependence::Error)) | 3545ffd83dbSDimitry Andric (E->getCommonExpr()->getDependence() & ~ExprDependence::TypeValue); 3555ffd83dbSDimitry Andric return E->getCommonExpr()->getDependence() | 3565ffd83dbSDimitry Andric ExprDependence::TypeValueInstantiation; 3575ffd83dbSDimitry Andric } 3585ffd83dbSDimitry Andric 3595ffd83dbSDimitry Andric ExprDependence clang::computeDependence(DependentCoawaitExpr *E) { 3605ffd83dbSDimitry Andric return E->getOperand()->getDependence() | 3615ffd83dbSDimitry Andric ExprDependence::TypeValueInstantiation; 3625ffd83dbSDimitry Andric } 3635ffd83dbSDimitry Andric 3645ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ObjCBoxedExpr *E) { 3655ffd83dbSDimitry Andric return E->getSubExpr()->getDependence(); 3665ffd83dbSDimitry Andric } 3675ffd83dbSDimitry Andric 3685ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ObjCEncodeExpr *E) { 3695ffd83dbSDimitry Andric return toExprDependence(E->getEncodedType()->getDependence()); 3705ffd83dbSDimitry Andric } 3715ffd83dbSDimitry Andric 3725ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ObjCIvarRefExpr *E) { 3735ffd83dbSDimitry Andric return turnTypeToValueDependence(E->getBase()->getDependence()); 3745ffd83dbSDimitry Andric } 3755ffd83dbSDimitry Andric 3765ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ObjCPropertyRefExpr *E) { 3775ffd83dbSDimitry Andric if (E->isObjectReceiver()) 3785ffd83dbSDimitry Andric return E->getBase()->getDependence() & ~ExprDependence::Type; 3795ffd83dbSDimitry Andric if (E->isSuperReceiver()) 3805ffd83dbSDimitry Andric return toExprDependence(E->getSuperReceiverType()->getDependence()) & 3815ffd83dbSDimitry Andric ~ExprDependence::TypeValue; 3825ffd83dbSDimitry Andric assert(E->isClassReceiver()); 3835ffd83dbSDimitry Andric return ExprDependence::None; 3845ffd83dbSDimitry Andric } 3855ffd83dbSDimitry Andric 3865ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ObjCSubscriptRefExpr *E) { 3875ffd83dbSDimitry Andric return E->getBaseExpr()->getDependence() | E->getKeyExpr()->getDependence(); 3885ffd83dbSDimitry Andric } 3895ffd83dbSDimitry Andric 3905ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ObjCIsaExpr *E) { 3915ffd83dbSDimitry Andric return E->getBase()->getDependence() & ~ExprDependence::Type & 3925ffd83dbSDimitry Andric ~ExprDependence::UnexpandedPack; 3935ffd83dbSDimitry Andric } 3945ffd83dbSDimitry Andric 3955ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ObjCIndirectCopyRestoreExpr *E) { 3965ffd83dbSDimitry Andric return E->getSubExpr()->getDependence(); 3975ffd83dbSDimitry Andric } 3985ffd83dbSDimitry Andric 3995ffd83dbSDimitry Andric ExprDependence clang::computeDependence(OMPArraySectionExpr *E) { 4005ffd83dbSDimitry Andric auto D = E->getBase()->getDependence(); 4015ffd83dbSDimitry Andric if (auto *LB = E->getLowerBound()) 4025ffd83dbSDimitry Andric D |= LB->getDependence(); 4035ffd83dbSDimitry Andric if (auto *Len = E->getLength()) 4045ffd83dbSDimitry Andric D |= Len->getDependence(); 4055ffd83dbSDimitry Andric return D; 4065ffd83dbSDimitry Andric } 4075ffd83dbSDimitry Andric 4085ffd83dbSDimitry Andric ExprDependence clang::computeDependence(OMPArrayShapingExpr *E) { 4095ffd83dbSDimitry Andric auto D = E->getBase()->getDependence() | 4105ffd83dbSDimitry Andric toExprDependence(E->getType()->getDependence()); 4115ffd83dbSDimitry Andric for (Expr *Dim: E->getDimensions()) 4125ffd83dbSDimitry Andric if (Dim) 4135ffd83dbSDimitry Andric D |= Dim->getDependence(); 4145ffd83dbSDimitry Andric return D; 4155ffd83dbSDimitry Andric } 4165ffd83dbSDimitry Andric 4175ffd83dbSDimitry Andric ExprDependence clang::computeDependence(OMPIteratorExpr *E) { 4185ffd83dbSDimitry Andric auto D = toExprDependence(E->getType()->getDependence()); 4195ffd83dbSDimitry Andric for (unsigned I = 0, End = E->numOfIterators(); I < End; ++I) { 4205ffd83dbSDimitry Andric if (auto *VD = cast_or_null<ValueDecl>(E->getIteratorDecl(I))) 4215ffd83dbSDimitry Andric D |= toExprDependence(VD->getType()->getDependence()); 4225ffd83dbSDimitry Andric OMPIteratorExpr::IteratorRange IR = E->getIteratorRange(I); 4235ffd83dbSDimitry Andric if (Expr *BE = IR.Begin) 4245ffd83dbSDimitry Andric D |= BE->getDependence(); 4255ffd83dbSDimitry Andric if (Expr *EE = IR.End) 4265ffd83dbSDimitry Andric D |= EE->getDependence(); 4275ffd83dbSDimitry Andric if (Expr *SE = IR.Step) 4285ffd83dbSDimitry Andric D |= SE->getDependence(); 4295ffd83dbSDimitry Andric } 4305ffd83dbSDimitry Andric return D; 4315ffd83dbSDimitry Andric } 4325ffd83dbSDimitry Andric 4335ffd83dbSDimitry Andric /// Compute the type-, value-, and instantiation-dependence of a 4345ffd83dbSDimitry Andric /// declaration reference 4355ffd83dbSDimitry Andric /// based on the declaration being referenced. 4365ffd83dbSDimitry Andric ExprDependence clang::computeDependence(DeclRefExpr *E, const ASTContext &Ctx) { 4375ffd83dbSDimitry Andric auto Deps = ExprDependence::None; 4385ffd83dbSDimitry Andric 4395ffd83dbSDimitry Andric if (auto *NNS = E->getQualifier()) 4405ffd83dbSDimitry Andric Deps |= toExprDependence(NNS->getDependence() & 4415ffd83dbSDimitry Andric ~NestedNameSpecifierDependence::Dependent); 4425ffd83dbSDimitry Andric 4435ffd83dbSDimitry Andric if (auto *FirstArg = E->getTemplateArgs()) { 4445ffd83dbSDimitry Andric unsigned NumArgs = E->getNumTemplateArgs(); 4455ffd83dbSDimitry Andric for (auto *Arg = FirstArg, *End = FirstArg + NumArgs; Arg < End; ++Arg) 4465ffd83dbSDimitry Andric Deps |= toExprDependence(Arg->getArgument().getDependence()); 4475ffd83dbSDimitry Andric } 4485ffd83dbSDimitry Andric 4495ffd83dbSDimitry Andric auto *Decl = E->getDecl(); 4505ffd83dbSDimitry Andric auto Type = E->getType(); 4515ffd83dbSDimitry Andric 4525ffd83dbSDimitry Andric if (Decl->isParameterPack()) 4535ffd83dbSDimitry Andric Deps |= ExprDependence::UnexpandedPack; 4545ffd83dbSDimitry Andric Deps |= toExprDependence(Type->getDependence()) & ExprDependence::Error; 4555ffd83dbSDimitry Andric 456*e8d8bef9SDimitry Andric // C++ [temp.dep.expr]p3: 4575ffd83dbSDimitry Andric // An id-expression is type-dependent if it contains: 4585ffd83dbSDimitry Andric 459*e8d8bef9SDimitry Andric // - an identifier associated by name lookup with one or more declarations 460*e8d8bef9SDimitry Andric // declared with a dependent type 461*e8d8bef9SDimitry Andric // 462*e8d8bef9SDimitry Andric // [The "or more" case is not modeled as a DeclRefExpr. There are a bunch 463*e8d8bef9SDimitry Andric // more bullets here that we handle by treating the declaration as having a 464*e8d8bef9SDimitry Andric // dependent type if they involve a placeholder type that can't be deduced.] 4655ffd83dbSDimitry Andric if (Type->isDependentType()) 4665ffd83dbSDimitry Andric return Deps | ExprDependence::TypeValueInstantiation; 4675ffd83dbSDimitry Andric else if (Type->isInstantiationDependentType()) 4685ffd83dbSDimitry Andric Deps |= ExprDependence::Instantiation; 4695ffd83dbSDimitry Andric 470*e8d8bef9SDimitry Andric // - a conversion-function-id that specifies a dependent type 4715ffd83dbSDimitry Andric if (Decl->getDeclName().getNameKind() == 4725ffd83dbSDimitry Andric DeclarationName::CXXConversionFunctionName) { 4735ffd83dbSDimitry Andric QualType T = Decl->getDeclName().getCXXNameType(); 4745ffd83dbSDimitry Andric if (T->isDependentType()) 4755ffd83dbSDimitry Andric return Deps | ExprDependence::TypeValueInstantiation; 4765ffd83dbSDimitry Andric 4775ffd83dbSDimitry Andric if (T->isInstantiationDependentType()) 4785ffd83dbSDimitry Andric Deps |= ExprDependence::Instantiation; 4795ffd83dbSDimitry Andric } 4805ffd83dbSDimitry Andric 481*e8d8bef9SDimitry Andric // - a template-id that is dependent, 482*e8d8bef9SDimitry Andric // - a nested-name-specifier or a qualified-id that names a member of an 483*e8d8bef9SDimitry Andric // unknown specialization 484*e8d8bef9SDimitry Andric // [These are not modeled as DeclRefExprs.] 485*e8d8bef9SDimitry Andric 486*e8d8bef9SDimitry Andric // or if it names a dependent member of the current instantiation that is a 487*e8d8bef9SDimitry Andric // static data member of type "array of unknown bound of T" for some T 488*e8d8bef9SDimitry Andric // [handled below]. 489*e8d8bef9SDimitry Andric 490*e8d8bef9SDimitry Andric // C++ [temp.dep.constexpr]p2: 491*e8d8bef9SDimitry Andric // An id-expression is value-dependent if: 492*e8d8bef9SDimitry Andric 493*e8d8bef9SDimitry Andric // - it is type-dependent [handled above] 494*e8d8bef9SDimitry Andric 495*e8d8bef9SDimitry Andric // - it is the name of a non-type template parameter, 4965ffd83dbSDimitry Andric if (isa<NonTypeTemplateParmDecl>(Decl)) 4975ffd83dbSDimitry Andric return Deps | ExprDependence::ValueInstantiation; 4985ffd83dbSDimitry Andric 499*e8d8bef9SDimitry Andric // - it names a potentially-constant variable that is initialized with an 500*e8d8bef9SDimitry Andric // expression that is value-dependent 501*e8d8bef9SDimitry Andric if (const auto *Var = dyn_cast<VarDecl>(Decl)) { 502*e8d8bef9SDimitry Andric if (Var->mightBeUsableInConstantExpressions(Ctx)) { 503*e8d8bef9SDimitry Andric if (const Expr *Init = Var->getAnyInitializer()) { 504*e8d8bef9SDimitry Andric if (Init->isValueDependent()) 5055ffd83dbSDimitry Andric Deps |= ExprDependence::ValueInstantiation; 506*e8d8bef9SDimitry Andric if (Init->containsErrors()) 507*e8d8bef9SDimitry Andric Deps |= ExprDependence::Error; 5085ffd83dbSDimitry Andric } 5095ffd83dbSDimitry Andric } 5105ffd83dbSDimitry Andric 511*e8d8bef9SDimitry Andric // - it names a static data member that is a dependent member of the 512*e8d8bef9SDimitry Andric // current instantiation and is not initialized in a member-declarator, 5135ffd83dbSDimitry Andric if (Var->isStaticDataMember() && 514*e8d8bef9SDimitry Andric Var->getDeclContext()->isDependentContext() && 515*e8d8bef9SDimitry Andric !Var->getFirstDecl()->hasInit()) { 516*e8d8bef9SDimitry Andric const VarDecl *First = Var->getFirstDecl(); 517*e8d8bef9SDimitry Andric TypeSourceInfo *TInfo = First->getTypeSourceInfo(); 518*e8d8bef9SDimitry Andric if (TInfo->getType()->isIncompleteArrayType()) { 519*e8d8bef9SDimitry Andric Deps |= ExprDependence::TypeValueInstantiation; 520*e8d8bef9SDimitry Andric } else if (!First->hasInit()) { 5215ffd83dbSDimitry Andric Deps |= ExprDependence::ValueInstantiation; 522*e8d8bef9SDimitry Andric } 5235ffd83dbSDimitry Andric } 5245ffd83dbSDimitry Andric 5255ffd83dbSDimitry Andric return Deps; 5265ffd83dbSDimitry Andric } 5275ffd83dbSDimitry Andric 528*e8d8bef9SDimitry Andric // - it names a static member function that is a dependent member of the 529*e8d8bef9SDimitry Andric // current instantiation 530*e8d8bef9SDimitry Andric // 531*e8d8bef9SDimitry Andric // FIXME: It's unclear that the restriction to static members here has any 532*e8d8bef9SDimitry Andric // effect: any use of a non-static member function name requires either 533*e8d8bef9SDimitry Andric // forming a pointer-to-member or providing an object parameter, either of 534*e8d8bef9SDimitry Andric // which makes the overall expression value-dependent. 535*e8d8bef9SDimitry Andric if (auto *MD = dyn_cast<CXXMethodDecl>(Decl)) { 536*e8d8bef9SDimitry Andric if (MD->isStatic() && Decl->getDeclContext()->isDependentContext()) 5375ffd83dbSDimitry Andric Deps |= ExprDependence::ValueInstantiation; 538*e8d8bef9SDimitry Andric } 539*e8d8bef9SDimitry Andric 5405ffd83dbSDimitry Andric return Deps; 5415ffd83dbSDimitry Andric } 5425ffd83dbSDimitry Andric 5435ffd83dbSDimitry Andric ExprDependence clang::computeDependence(RecoveryExpr *E) { 5445ffd83dbSDimitry Andric // RecoveryExpr is 5455ffd83dbSDimitry Andric // - always value-dependent, and therefore instantiation dependent 5465ffd83dbSDimitry Andric // - contains errors (ExprDependence::Error), by definition 5475ffd83dbSDimitry Andric // - type-dependent if we don't know the type (fallback to an opaque 5485ffd83dbSDimitry Andric // dependent type), or the type is known and dependent, or it has 5495ffd83dbSDimitry Andric // type-dependent subexpressions. 5505ffd83dbSDimitry Andric auto D = toExprDependence(E->getType()->getDependence()) | 551*e8d8bef9SDimitry Andric ExprDependence::ErrorDependent; 5525ffd83dbSDimitry Andric // FIXME: remove the type-dependent bit from subexpressions, if the 5535ffd83dbSDimitry Andric // RecoveryExpr has a non-dependent type. 5545ffd83dbSDimitry Andric for (auto *S : E->subExpressions()) 5555ffd83dbSDimitry Andric D |= S->getDependence(); 5565ffd83dbSDimitry Andric return D; 5575ffd83dbSDimitry Andric } 5585ffd83dbSDimitry Andric 5595ffd83dbSDimitry Andric ExprDependence clang::computeDependence(PredefinedExpr *E) { 5605ffd83dbSDimitry Andric return toExprDependence(E->getType()->getDependence()) & 5615ffd83dbSDimitry Andric ~ExprDependence::UnexpandedPack; 5625ffd83dbSDimitry Andric } 5635ffd83dbSDimitry Andric 5645ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CallExpr *E, 5655ffd83dbSDimitry Andric llvm::ArrayRef<Expr *> PreArgs) { 5665ffd83dbSDimitry Andric auto D = E->getCallee()->getDependence(); 5675ffd83dbSDimitry Andric for (auto *A : llvm::makeArrayRef(E->getArgs(), E->getNumArgs())) { 5685ffd83dbSDimitry Andric if (A) 5695ffd83dbSDimitry Andric D |= A->getDependence(); 5705ffd83dbSDimitry Andric } 5715ffd83dbSDimitry Andric for (auto *A : PreArgs) 5725ffd83dbSDimitry Andric D |= A->getDependence(); 5735ffd83dbSDimitry Andric return D; 5745ffd83dbSDimitry Andric } 5755ffd83dbSDimitry Andric 5765ffd83dbSDimitry Andric ExprDependence clang::computeDependence(OffsetOfExpr *E) { 5775ffd83dbSDimitry Andric auto D = turnTypeToValueDependence( 5785ffd83dbSDimitry Andric toExprDependence(E->getTypeSourceInfo()->getType()->getDependence())); 5795ffd83dbSDimitry Andric for (unsigned I = 0, N = E->getNumExpressions(); I < N; ++I) 5805ffd83dbSDimitry Andric D |= turnTypeToValueDependence(E->getIndexExpr(I)->getDependence()); 5815ffd83dbSDimitry Andric return D; 5825ffd83dbSDimitry Andric } 5835ffd83dbSDimitry Andric 5845ffd83dbSDimitry Andric ExprDependence clang::computeDependence(MemberExpr *E) { 5855ffd83dbSDimitry Andric auto *MemberDecl = E->getMemberDecl(); 5865ffd83dbSDimitry Andric auto D = E->getBase()->getDependence(); 5875ffd83dbSDimitry Andric if (FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl)) { 5885ffd83dbSDimitry Andric DeclContext *DC = MemberDecl->getDeclContext(); 5895ffd83dbSDimitry Andric // dyn_cast_or_null is used to handle objC variables which do not 5905ffd83dbSDimitry Andric // have a declaration context. 5915ffd83dbSDimitry Andric CXXRecordDecl *RD = dyn_cast_or_null<CXXRecordDecl>(DC); 5925ffd83dbSDimitry Andric if (RD && RD->isDependentContext() && RD->isCurrentInstantiation(DC)) { 5935ffd83dbSDimitry Andric if (!E->getType()->isDependentType()) 5945ffd83dbSDimitry Andric D &= ~ExprDependence::Type; 5955ffd83dbSDimitry Andric } 5965ffd83dbSDimitry Andric 5975ffd83dbSDimitry Andric // Bitfield with value-dependent width is type-dependent. 5985ffd83dbSDimitry Andric if (FD && FD->isBitField() && FD->getBitWidth()->isValueDependent()) { 5995ffd83dbSDimitry Andric D |= ExprDependence::Type; 6005ffd83dbSDimitry Andric } 6015ffd83dbSDimitry Andric } 6025ffd83dbSDimitry Andric // FIXME: move remaining dependence computation from MemberExpr::Create() 6035ffd83dbSDimitry Andric return D; 6045ffd83dbSDimitry Andric } 6055ffd83dbSDimitry Andric 6065ffd83dbSDimitry Andric ExprDependence clang::computeDependence(InitListExpr *E) { 6075ffd83dbSDimitry Andric auto D = ExprDependence::None; 6085ffd83dbSDimitry Andric for (auto *A : E->inits()) 6095ffd83dbSDimitry Andric D |= A->getDependence(); 6105ffd83dbSDimitry Andric return D; 6115ffd83dbSDimitry Andric } 6125ffd83dbSDimitry Andric 6135ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ShuffleVectorExpr *E) { 6145ffd83dbSDimitry Andric auto D = toExprDependence(E->getType()->getDependence()); 6155ffd83dbSDimitry Andric for (auto *C : llvm::makeArrayRef(E->getSubExprs(), E->getNumSubExprs())) 6165ffd83dbSDimitry Andric D |= C->getDependence(); 6175ffd83dbSDimitry Andric return D; 6185ffd83dbSDimitry Andric } 6195ffd83dbSDimitry Andric 6205ffd83dbSDimitry Andric ExprDependence clang::computeDependence(GenericSelectionExpr *E, 6215ffd83dbSDimitry Andric bool ContainsUnexpandedPack) { 6225ffd83dbSDimitry Andric auto D = ContainsUnexpandedPack ? ExprDependence::UnexpandedPack 6235ffd83dbSDimitry Andric : ExprDependence::None; 6245ffd83dbSDimitry Andric for (auto *AE : E->getAssocExprs()) 6255ffd83dbSDimitry Andric D |= AE->getDependence() & ExprDependence::Error; 6265ffd83dbSDimitry Andric D |= E->getControllingExpr()->getDependence() & ExprDependence::Error; 6275ffd83dbSDimitry Andric 6285ffd83dbSDimitry Andric if (E->isResultDependent()) 6295ffd83dbSDimitry Andric return D | ExprDependence::TypeValueInstantiation; 6305ffd83dbSDimitry Andric return D | (E->getResultExpr()->getDependence() & 6315ffd83dbSDimitry Andric ~ExprDependence::UnexpandedPack); 6325ffd83dbSDimitry Andric } 6335ffd83dbSDimitry Andric 6345ffd83dbSDimitry Andric ExprDependence clang::computeDependence(DesignatedInitExpr *E) { 6355ffd83dbSDimitry Andric auto Deps = E->getInit()->getDependence(); 6365ffd83dbSDimitry Andric for (auto D : E->designators()) { 6375ffd83dbSDimitry Andric auto DesignatorDeps = ExprDependence::None; 6385ffd83dbSDimitry Andric if (D.isArrayDesignator()) 6395ffd83dbSDimitry Andric DesignatorDeps |= E->getArrayIndex(D)->getDependence(); 6405ffd83dbSDimitry Andric else if (D.isArrayRangeDesignator()) 6415ffd83dbSDimitry Andric DesignatorDeps |= E->getArrayRangeStart(D)->getDependence() | 6425ffd83dbSDimitry Andric E->getArrayRangeEnd(D)->getDependence(); 6435ffd83dbSDimitry Andric Deps |= DesignatorDeps; 6445ffd83dbSDimitry Andric if (DesignatorDeps & ExprDependence::TypeValue) 6455ffd83dbSDimitry Andric Deps |= ExprDependence::TypeValueInstantiation; 6465ffd83dbSDimitry Andric } 6475ffd83dbSDimitry Andric return Deps; 6485ffd83dbSDimitry Andric } 6495ffd83dbSDimitry Andric 6505ffd83dbSDimitry Andric ExprDependence clang::computeDependence(PseudoObjectExpr *O) { 6515ffd83dbSDimitry Andric auto D = O->getSyntacticForm()->getDependence(); 6525ffd83dbSDimitry Andric for (auto *E : O->semantics()) 6535ffd83dbSDimitry Andric D |= E->getDependence(); 6545ffd83dbSDimitry Andric return D; 6555ffd83dbSDimitry Andric } 6565ffd83dbSDimitry Andric 6575ffd83dbSDimitry Andric ExprDependence clang::computeDependence(AtomicExpr *A) { 6585ffd83dbSDimitry Andric auto D = ExprDependence::None; 6595ffd83dbSDimitry Andric for (auto *E : llvm::makeArrayRef(A->getSubExprs(), A->getNumSubExprs())) 6605ffd83dbSDimitry Andric D |= E->getDependence(); 6615ffd83dbSDimitry Andric return D; 6625ffd83dbSDimitry Andric } 6635ffd83dbSDimitry Andric 6645ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXNewExpr *E) { 6655ffd83dbSDimitry Andric auto D = toExprDependence(E->getType()->getDependence()); 6665ffd83dbSDimitry Andric auto Size = E->getArraySize(); 6675ffd83dbSDimitry Andric if (Size.hasValue() && *Size) 6685ffd83dbSDimitry Andric D |= turnTypeToValueDependence((*Size)->getDependence()); 6695ffd83dbSDimitry Andric if (auto *I = E->getInitializer()) 6705ffd83dbSDimitry Andric D |= turnTypeToValueDependence(I->getDependence()); 6715ffd83dbSDimitry Andric for (auto *A : E->placement_arguments()) 6725ffd83dbSDimitry Andric D |= turnTypeToValueDependence(A->getDependence()); 6735ffd83dbSDimitry Andric return D; 6745ffd83dbSDimitry Andric } 6755ffd83dbSDimitry Andric 6765ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXPseudoDestructorExpr *E) { 6775ffd83dbSDimitry Andric auto D = E->getBase()->getDependence(); 6785ffd83dbSDimitry Andric if (!E->getDestroyedType().isNull()) 6795ffd83dbSDimitry Andric D |= toExprDependence(E->getDestroyedType()->getDependence()); 6805ffd83dbSDimitry Andric if (auto *ST = E->getScopeTypeInfo()) 6815ffd83dbSDimitry Andric D |= turnTypeToValueDependence( 6825ffd83dbSDimitry Andric toExprDependence(ST->getType()->getDependence())); 6835ffd83dbSDimitry Andric if (auto *Q = E->getQualifier()) 6845ffd83dbSDimitry Andric D |= toExprDependence(Q->getDependence() & 6855ffd83dbSDimitry Andric ~NestedNameSpecifierDependence::Dependent); 6865ffd83dbSDimitry Andric return D; 6875ffd83dbSDimitry Andric } 6885ffd83dbSDimitry Andric 6895ffd83dbSDimitry Andric static inline ExprDependence getDependenceInExpr(DeclarationNameInfo Name) { 6905ffd83dbSDimitry Andric auto D = ExprDependence::None; 6915ffd83dbSDimitry Andric if (Name.isInstantiationDependent()) 6925ffd83dbSDimitry Andric D |= ExprDependence::Instantiation; 6935ffd83dbSDimitry Andric if (Name.containsUnexpandedParameterPack()) 6945ffd83dbSDimitry Andric D |= ExprDependence::UnexpandedPack; 6955ffd83dbSDimitry Andric return D; 6965ffd83dbSDimitry Andric } 6975ffd83dbSDimitry Andric 6985ffd83dbSDimitry Andric ExprDependence 6995ffd83dbSDimitry Andric clang::computeDependence(OverloadExpr *E, bool KnownDependent, 7005ffd83dbSDimitry Andric bool KnownInstantiationDependent, 7015ffd83dbSDimitry Andric bool KnownContainsUnexpandedParameterPack) { 7025ffd83dbSDimitry Andric auto Deps = ExprDependence::None; 7035ffd83dbSDimitry Andric if (KnownDependent) 7045ffd83dbSDimitry Andric Deps |= ExprDependence::TypeValue; 7055ffd83dbSDimitry Andric if (KnownInstantiationDependent) 7065ffd83dbSDimitry Andric Deps |= ExprDependence::Instantiation; 7075ffd83dbSDimitry Andric if (KnownContainsUnexpandedParameterPack) 7085ffd83dbSDimitry Andric Deps |= ExprDependence::UnexpandedPack; 7095ffd83dbSDimitry Andric Deps |= getDependenceInExpr(E->getNameInfo()); 7105ffd83dbSDimitry Andric if (auto *Q = E->getQualifier()) 7115ffd83dbSDimitry Andric Deps |= toExprDependence(Q->getDependence() & 7125ffd83dbSDimitry Andric ~NestedNameSpecifierDependence::Dependent); 7135ffd83dbSDimitry Andric for (auto *D : E->decls()) { 7145ffd83dbSDimitry Andric if (D->getDeclContext()->isDependentContext() || 7155ffd83dbSDimitry Andric isa<UnresolvedUsingValueDecl>(D)) 7165ffd83dbSDimitry Andric Deps |= ExprDependence::TypeValueInstantiation; 7175ffd83dbSDimitry Andric } 7185ffd83dbSDimitry Andric // If we have explicit template arguments, check for dependent 7195ffd83dbSDimitry Andric // template arguments and whether they contain any unexpanded pack 7205ffd83dbSDimitry Andric // expansions. 7215ffd83dbSDimitry Andric for (auto A : E->template_arguments()) 7225ffd83dbSDimitry Andric Deps |= toExprDependence(A.getArgument().getDependence()); 7235ffd83dbSDimitry Andric return Deps; 7245ffd83dbSDimitry Andric } 7255ffd83dbSDimitry Andric 7265ffd83dbSDimitry Andric ExprDependence clang::computeDependence(DependentScopeDeclRefExpr *E) { 7275ffd83dbSDimitry Andric auto D = ExprDependence::TypeValue; 7285ffd83dbSDimitry Andric D |= getDependenceInExpr(E->getNameInfo()); 7295ffd83dbSDimitry Andric if (auto *Q = E->getQualifier()) 7305ffd83dbSDimitry Andric D |= toExprDependence(Q->getDependence()); 7315ffd83dbSDimitry Andric for (auto A : E->template_arguments()) 7325ffd83dbSDimitry Andric D |= toExprDependence(A.getArgument().getDependence()); 7335ffd83dbSDimitry Andric return D; 7345ffd83dbSDimitry Andric } 7355ffd83dbSDimitry Andric 7365ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXConstructExpr *E) { 7375ffd83dbSDimitry Andric auto D = toExprDependence(E->getType()->getDependence()); 7385ffd83dbSDimitry Andric for (auto *A : E->arguments()) 7395ffd83dbSDimitry Andric D |= A->getDependence() & ~ExprDependence::Type; 7405ffd83dbSDimitry Andric return D; 7415ffd83dbSDimitry Andric } 7425ffd83dbSDimitry Andric 743*e8d8bef9SDimitry Andric ExprDependence clang::computeDependence(CXXDefaultInitExpr *E) { 744*e8d8bef9SDimitry Andric return E->getExpr()->getDependence(); 745*e8d8bef9SDimitry Andric } 746*e8d8bef9SDimitry Andric 7475ffd83dbSDimitry Andric ExprDependence clang::computeDependence(LambdaExpr *E, 7485ffd83dbSDimitry Andric bool ContainsUnexpandedParameterPack) { 7495ffd83dbSDimitry Andric auto D = toExprDependence(E->getType()->getDependence()); 7505ffd83dbSDimitry Andric if (ContainsUnexpandedParameterPack) 7515ffd83dbSDimitry Andric D |= ExprDependence::UnexpandedPack; 7525ffd83dbSDimitry Andric return D; 7535ffd83dbSDimitry Andric } 7545ffd83dbSDimitry Andric 7555ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXUnresolvedConstructExpr *E) { 7565ffd83dbSDimitry Andric auto D = ExprDependence::ValueInstantiation; 7575ffd83dbSDimitry Andric D |= toExprDependence(E->getType()->getDependence()); 7585ffd83dbSDimitry Andric for (auto *A : E->arguments()) 7595ffd83dbSDimitry Andric D |= A->getDependence() & 7605ffd83dbSDimitry Andric (ExprDependence::UnexpandedPack | ExprDependence::Error); 7615ffd83dbSDimitry Andric return D; 7625ffd83dbSDimitry Andric } 7635ffd83dbSDimitry Andric 7645ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXDependentScopeMemberExpr *E) { 7655ffd83dbSDimitry Andric auto D = ExprDependence::TypeValueInstantiation; 7665ffd83dbSDimitry Andric if (!E->isImplicitAccess()) 7675ffd83dbSDimitry Andric D |= E->getBase()->getDependence(); 7685ffd83dbSDimitry Andric if (auto *Q = E->getQualifier()) 7695ffd83dbSDimitry Andric D |= toExprDependence(Q->getDependence()); 7705ffd83dbSDimitry Andric D |= getDependenceInExpr(E->getMemberNameInfo()); 7715ffd83dbSDimitry Andric for (auto A : E->template_arguments()) 7725ffd83dbSDimitry Andric D |= toExprDependence(A.getArgument().getDependence()); 7735ffd83dbSDimitry Andric return D; 7745ffd83dbSDimitry Andric } 7755ffd83dbSDimitry Andric 7765ffd83dbSDimitry Andric ExprDependence clang::computeDependence(MaterializeTemporaryExpr *E) { 7775ffd83dbSDimitry Andric return E->getSubExpr()->getDependence(); 7785ffd83dbSDimitry Andric } 7795ffd83dbSDimitry Andric 7805ffd83dbSDimitry Andric ExprDependence clang::computeDependence(CXXFoldExpr *E) { 7815ffd83dbSDimitry Andric auto D = ExprDependence::TypeValueInstantiation; 7825ffd83dbSDimitry Andric for (const auto *C : {E->getLHS(), E->getRHS()}) { 7835ffd83dbSDimitry Andric if (C) 7845ffd83dbSDimitry Andric D |= C->getDependence() & ~ExprDependence::UnexpandedPack; 7855ffd83dbSDimitry Andric } 7865ffd83dbSDimitry Andric return D; 7875ffd83dbSDimitry Andric } 7885ffd83dbSDimitry Andric 7895ffd83dbSDimitry Andric ExprDependence clang::computeDependence(TypeTraitExpr *E) { 7905ffd83dbSDimitry Andric auto D = ExprDependence::None; 7915ffd83dbSDimitry Andric for (const auto *A : E->getArgs()) 7925ffd83dbSDimitry Andric D |= 7935ffd83dbSDimitry Andric toExprDependence(A->getType()->getDependence()) & ~ExprDependence::Type; 7945ffd83dbSDimitry Andric return D; 7955ffd83dbSDimitry Andric } 7965ffd83dbSDimitry Andric 7975ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ConceptSpecializationExpr *E, 7985ffd83dbSDimitry Andric bool ValueDependent) { 7995ffd83dbSDimitry Andric auto TA = TemplateArgumentDependence::None; 8005ffd83dbSDimitry Andric const auto InterestingDeps = TemplateArgumentDependence::Instantiation | 8015ffd83dbSDimitry Andric TemplateArgumentDependence::UnexpandedPack; 8025ffd83dbSDimitry Andric for (const TemplateArgumentLoc &ArgLoc : 8035ffd83dbSDimitry Andric E->getTemplateArgsAsWritten()->arguments()) { 8045ffd83dbSDimitry Andric TA |= ArgLoc.getArgument().getDependence() & InterestingDeps; 8055ffd83dbSDimitry Andric if (TA == InterestingDeps) 8065ffd83dbSDimitry Andric break; 8075ffd83dbSDimitry Andric } 8085ffd83dbSDimitry Andric 8095ffd83dbSDimitry Andric ExprDependence D = 8105ffd83dbSDimitry Andric ValueDependent ? ExprDependence::Value : ExprDependence::None; 8115ffd83dbSDimitry Andric return D | toExprDependence(TA); 8125ffd83dbSDimitry Andric } 8135ffd83dbSDimitry Andric 8145ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ObjCArrayLiteral *E) { 8155ffd83dbSDimitry Andric auto D = ExprDependence::None; 8165ffd83dbSDimitry Andric Expr **Elements = E->getElements(); 8175ffd83dbSDimitry Andric for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) 8185ffd83dbSDimitry Andric D |= turnTypeToValueDependence(Elements[I]->getDependence()); 8195ffd83dbSDimitry Andric return D; 8205ffd83dbSDimitry Andric } 8215ffd83dbSDimitry Andric 8225ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ObjCDictionaryLiteral *E) { 8235ffd83dbSDimitry Andric auto Deps = ExprDependence::None; 8245ffd83dbSDimitry Andric for (unsigned I = 0, N = E->getNumElements(); I < N; ++I) { 8255ffd83dbSDimitry Andric auto KV = E->getKeyValueElement(I); 8265ffd83dbSDimitry Andric auto KVDeps = turnTypeToValueDependence(KV.Key->getDependence() | 8275ffd83dbSDimitry Andric KV.Value->getDependence()); 8285ffd83dbSDimitry Andric if (KV.EllipsisLoc.isValid()) 8295ffd83dbSDimitry Andric KVDeps &= ~ExprDependence::UnexpandedPack; 8305ffd83dbSDimitry Andric Deps |= KVDeps; 8315ffd83dbSDimitry Andric } 8325ffd83dbSDimitry Andric return Deps; 8335ffd83dbSDimitry Andric } 8345ffd83dbSDimitry Andric 8355ffd83dbSDimitry Andric ExprDependence clang::computeDependence(ObjCMessageExpr *E) { 8365ffd83dbSDimitry Andric auto D = ExprDependence::None; 8375ffd83dbSDimitry Andric if (auto *R = E->getInstanceReceiver()) 8385ffd83dbSDimitry Andric D |= R->getDependence(); 8395ffd83dbSDimitry Andric else 8405ffd83dbSDimitry Andric D |= toExprDependence(E->getType()->getDependence()); 8415ffd83dbSDimitry Andric for (auto *A : E->arguments()) 8425ffd83dbSDimitry Andric D |= A->getDependence(); 8435ffd83dbSDimitry Andric return D; 8445ffd83dbSDimitry Andric } 845