diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index bad8e75b2f878c..62ca15ea398f5c 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -375,12 +375,19 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { } ExprDependence clang::computeDependence(PackIndexingExpr *E) { + + ExprDependence PatternDep = E->getPackIdExpression()->getDependence() & + ~ExprDependence::UnexpandedPack; + ExprDependence D = E->getIndexExpr()->getDependence(); + if (D & ExprDependence::TypeValueInstantiation) + D |= E->getIndexExpr()->getDependence() | PatternDep | + ExprDependence::Instantiation; + ArrayRef Exprs = E->getExpressions(); if (Exprs.empty()) - D |= (E->getPackIdExpression()->getDependence() | - ExprDependence::TypeValueInstantiation) & - ~ExprDependence::UnexpandedPack; + D |= PatternDep | ExprDependence::Instantiation; + else if (!E->getIndexExpr()->isInstantiationDependent()) { std::optional Index = E->getSelectedIndex(); assert(Index && *Index < Exprs.size() && "pack index out of bound"); diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index bfa3799bda06e4..d65fafc8cf4f76 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -9351,15 +9351,20 @@ QualType Sema::BuildCountAttributedArrayType(QualType WrappedTy, /// that expression, according to the rules in C++11 /// [dcl.type.simple]p4 and C++11 [expr.lambda.prim]p18. QualType Sema::getDecltypeForExpr(Expr *E) { - if (E->isTypeDependent()) - return Context.DependentTy; Expr *IDExpr = E; if (auto *ImplCastExpr = dyn_cast(E)) IDExpr = ImplCastExpr->getSubExpr(); - if (auto *PackExpr = dyn_cast(E)) - IDExpr = PackExpr->getSelectedExpr(); + if (auto *PackExpr = dyn_cast(E)) { + if (E->isInstantiationDependent()) + IDExpr = PackExpr->getPackIdExpression(); + else + IDExpr = PackExpr->getSelectedExpr(); + } + + if (E->isTypeDependent()) + return Context.DependentTy; // C++11 [dcl.type.simple]p4: // The type denoted by decltype(e) is defined as follows: diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index a3e5a0931491b5..0ac85b5bcc14bf 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -194,3 +194,26 @@ void h() { // expected-note-re@-2 {{function template specialization '{{.*}}' requested here}} } } + +namespace GH91885 { + +void test(auto...args){ + [&](){ + using R = decltype( args...[idx] ) ; + }.template operator()<0>(); +} + +template +void test2(){ + [&](){ + using R = decltype( args...[idx] ) ; + }.template operator()<0>(); +} + +void f( ) { + test(1); + test2<1>(); +} + + +}