@@ -120,9 +120,9 @@ ExprDependence clang::computeDependence(BinaryConditionalOperator *E) {
120120}
121121
122122ExprDependence clang::computeDependence (StmtExpr *E, unsigned TemplateDepth) {
123- auto D = ExprDependence::None;
124- if (E->getType ()->isDependentType ())
125- D |= ExprDependence::Type ;
123+ // FIXME: why is unexpanded-pack not propagated?
124+ auto D = toExprDependence (E->getType ()->getDependence ()) &
125+ ~ ExprDependence::UnexpandedPack ;
126126 // Note: we treat a statement-expression in a dependent context as always
127127 // being value- and instantiation-dependent. This matches the behavior of
128128 // lambda-expressions and GCC.
@@ -172,7 +172,7 @@ ExprDependence clang::computeDependence(VAArgExpr *E) {
172172
173173ExprDependence clang::computeDependence (NoInitExpr *E) {
174174 return toExprDependence (E->getType ()->getDependence ()) &
175- ExprDependence::Instantiation;
175+ ( ExprDependence::Instantiation & ExprDependence::Error) ;
176176}
177177
178178ExprDependence clang::computeDependence (ArrayInitLoopExpr *E) {
@@ -213,8 +213,8 @@ ExprDependence clang::computeDependence(CXXRewrittenBinaryOperator *E) {
213213
214214ExprDependence clang::computeDependence (CXXStdInitializerListExpr *E) {
215215 auto D = turnTypeToValueDependence (E->getSubExpr ()->getDependence ());
216- if (E->getType ()->isDependentType ())
217- D |= ExprDependence::Type;
216+ D |= toExprDependence (E->getType ()->getDependence ()) &
217+ ( ExprDependence::Type | ExprDependence::Error) ;
218218 return D;
219219}
220220
@@ -296,13 +296,19 @@ ExprDependence clang::computeDependence(CXXNoexceptExpr *E, CanThrowResult CT) {
296296 return D;
297297}
298298
299+ ExprDependence clang::computeDependence (PackExpansionExpr *E) {
300+ return (E->getPattern ()->getDependence () & ~ExprDependence::UnexpandedPack) |
301+ ExprDependence::TypeValueInstantiation;
302+ }
303+
299304ExprDependence clang::computeDependence (SubstNonTypeTemplateParmExpr *E) {
300305 return E->getReplacement ()->getDependence ();
301306}
302307
303308ExprDependence clang::computeDependence (CoroutineSuspendExpr *E) {
304309 if (auto *Resume = E->getResumeExpr ())
305- return (Resume->getDependence () & ExprDependence::TypeValue) |
310+ return (Resume->getDependence () &
311+ (ExprDependence::TypeValue | ExprDependence::Error)) |
306312 (E->getCommonExpr ()->getDependence () & ~ExprDependence::TypeValue);
307313 return E->getCommonExpr ()->getDependence () |
308314 ExprDependence::TypeValueInstantiation;
@@ -377,6 +383,7 @@ ExprDependence clang::computeDependence(DeclRefExpr *E, const ASTContext &Ctx) {
377383
378384 if (Decl->isParameterPack ())
379385 Deps |= ExprDependence::UnexpandedPack;
386+ Deps |= toExprDependence (Type->getDependence ()) & ExprDependence::Error;
380387
381388 // (TD) C++ [temp.dep.expr]p3:
382389 // An id-expression is type-dependent if it contains:
@@ -496,6 +503,10 @@ ExprDependence clang::computeDependence(GenericSelectionExpr *E,
496503 bool ContainsUnexpandedPack) {
497504 auto D = ContainsUnexpandedPack ? ExprDependence::UnexpandedPack
498505 : ExprDependence::None;
506+ for (auto *AE : E->getAssocExprs ())
507+ D |= AE->getDependence () & ExprDependence::Error;
508+ D |= E->getControllingExpr ()->getDependence () & ExprDependence::Error;
509+
499510 if (E->isResultDependent ())
500511 return D | ExprDependence::TypeValueInstantiation;
501512 return D | (E->getResultExpr ()->getDependence () &
@@ -623,7 +634,8 @@ ExprDependence clang::computeDependence(CXXUnresolvedConstructExpr *E) {
623634 if (E->getType ()->getContainedDeducedType ())
624635 D |= ExprDependence::Type;
625636 for (auto *A : E->arguments ())
626- D |= A->getDependence () & ExprDependence::UnexpandedPack;
637+ D |= A->getDependence () &
638+ (ExprDependence::UnexpandedPack | ExprDependence::Error);
627639 return D;
628640}
629641
@@ -643,6 +655,15 @@ ExprDependence clang::computeDependence(MaterializeTemporaryExpr *E) {
643655 return E->getSubExpr ()->getDependence ();
644656}
645657
658+ ExprDependence clang::computeDependence (CXXFoldExpr *E) {
659+ auto D = ExprDependence::TypeValueInstantiation;
660+ for (const auto *C : {E->getLHS (), E->getRHS ()}) {
661+ if (C)
662+ D |= C->getDependence () & ~ExprDependence::UnexpandedPack;
663+ }
664+ return D;
665+ }
666+
646667ExprDependence clang::computeDependence (TypeTraitExpr *E) {
647668 auto D = ExprDependence::None;
648669 for (const auto *A : E->getArgs ())
0 commit comments