[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
https://github.com/cor3ntin closed https://github.com/llvm/llvm-project/pull/91933 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
https://github.com/erichkeane approved this pull request. https://github.com/llvm/llvm-project/pull/91933 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
https://github.com/zyn0217 approved this pull request. Thanks for the prompt fix! I think this looks good now, but please wait for @erichkeane for the final stamp. https://github.com/llvm/llvm-project/pull/91933 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
https://github.com/cor3ntin updated https://github.com/llvm/llvm-project/pull/91933 >From 4cadff527e02ae03aa5850ee713fe57aee663a52 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 10:00:19 +0200 Subject: [PATCH 1/6] [Clang] Fix dependency computation for pack indexing expression Given `foo...[idx]` if idx is value dependent, the expression is type dependent. Fixes #91885 Fixes #91884 --- clang/lib/AST/ComputeDependence.cpp| 3 +++ clang/test/SemaCXX/cxx2c-pack-indexing.cpp | 14 ++ 2 files changed, 17 insertions(+) diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index bad8e75b2f878..ee56c50d76512 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -376,6 +376,9 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); + if (D & ExprDependence::Value) +D |= ExprDependence::TypeInstantiation; + ArrayRef Exprs = E->getExpressions(); if (Exprs.empty()) D |= (E->getPackIdExpression()->getDependence() | diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index a3e5a0931491b..764f6163710bd 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -194,3 +194,17 @@ 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>(); +} + +void f( ) { +test(1); +} + +} >From 7c9192cffe099fe4a35e8cb9a88ec56b4480daa1 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 14:24:34 +0200 Subject: [PATCH 2/6] address review feedback --- clang/lib/AST/ComputeDependence.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index ee56c50d76512..bd0519a1787cc 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -377,7 +377,7 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); if (D & ExprDependence::Value) -D |= ExprDependence::TypeInstantiation; +D |= E->getPackIdExpression()->getDependence() & ExprDependence::Type; ArrayRef Exprs = E->getExpressions(); if (Exprs.empty()) >From 320b9fe584d02e5f156ff012b3c0facf9cc06e7b Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 15:56:02 +0200 Subject: [PATCH 3/6] add additional test --- clang/test/SemaCXX/cxx2c-pack-indexing.cpp | 11 ++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index 764f6163710bd..ef35a49023952 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -203,8 +203,17 @@ void test(auto...args){ }.template operator()<0>(); } +template +void test2(){ + [&](){ +using R = decltype( args...[idx] ) ; + }.template operator()<0>(); +} + void f( ) { -test(1); + test(1); + test2<1>(); } + } >From bb6b680b8200e2cc7c6e8059be31959b2dfb4a51 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 17:34:36 +0200 Subject: [PATCH 4/6] Fix tests? --- clang/test/SemaCXX/cxx2c-pack-indexing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index ef35a49023952..0ac85b5bcc14b 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -203,7 +203,7 @@ void test(auto...args){ }.template operator()<0>(); } -template +template void test2(){ [&](){ using R = decltype( args...[idx] ) ; >From fdd321f94f29e37648a956d2fff9a9e9e739f10c Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 19:20:32 +0200 Subject: [PATCH 5/6] Fix getDecltypeForExpr + cleanup --- clang/lib/AST/ComputeDependence.cpp | 14 +- clang/lib/Sema/SemaType.cpp | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index bd0519a1787cc..62ca15ea398f5 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -375,15 +375,19 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { } ExprDependence clang::computeDependence(PackIndexingExpr *E) { + + ExprDependence PatternDep = E->getPackIdExpression()->getDependence() & + ~ExprDependence::UnexpandedPack; +
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
@@ -9806,7 +9806,7 @@ 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()) + if (E->isInstantiationDependent()) zyn0217 wrote: Is it... right? I was assuming this would bring such regressions e.g. ```cpp template const int val = sizeof(T); template void foo() { decltype(val); // <-- this is instantiation-dependent, but not type-dependent. } ``` Perhaps we can move it to line 9816 where the `PackIndexingExpr` is handled? https://github.com/llvm/llvm-project/pull/91933 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
https://github.com/cor3ntin updated https://github.com/llvm/llvm-project/pull/91933 >From 4cadff527e02ae03aa5850ee713fe57aee663a52 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 10:00:19 +0200 Subject: [PATCH 1/5] [Clang] Fix dependency computation for pack indexing expression Given `foo...[idx]` if idx is value dependent, the expression is type dependent. Fixes #91885 Fixes #91884 --- clang/lib/AST/ComputeDependence.cpp| 3 +++ clang/test/SemaCXX/cxx2c-pack-indexing.cpp | 14 ++ 2 files changed, 17 insertions(+) diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index bad8e75b2f878..ee56c50d76512 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -376,6 +376,9 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); + if (D & ExprDependence::Value) +D |= ExprDependence::TypeInstantiation; + ArrayRef Exprs = E->getExpressions(); if (Exprs.empty()) D |= (E->getPackIdExpression()->getDependence() | diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index a3e5a0931491b..764f6163710bd 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -194,3 +194,17 @@ 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>(); +} + +void f( ) { +test(1); +} + +} >From 7c9192cffe099fe4a35e8cb9a88ec56b4480daa1 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 14:24:34 +0200 Subject: [PATCH 2/5] address review feedback --- clang/lib/AST/ComputeDependence.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index ee56c50d76512..bd0519a1787cc 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -377,7 +377,7 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); if (D & ExprDependence::Value) -D |= ExprDependence::TypeInstantiation; +D |= E->getPackIdExpression()->getDependence() & ExprDependence::Type; ArrayRef Exprs = E->getExpressions(); if (Exprs.empty()) >From 320b9fe584d02e5f156ff012b3c0facf9cc06e7b Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 15:56:02 +0200 Subject: [PATCH 3/5] add additional test --- clang/test/SemaCXX/cxx2c-pack-indexing.cpp | 11 ++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index 764f6163710bd..ef35a49023952 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -203,8 +203,17 @@ void test(auto...args){ }.template operator()<0>(); } +template +void test2(){ + [&](){ +using R = decltype( args...[idx] ) ; + }.template operator()<0>(); +} + void f( ) { -test(1); + test(1); + test2<1>(); } + } >From bb6b680b8200e2cc7c6e8059be31959b2dfb4a51 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 17:34:36 +0200 Subject: [PATCH 4/5] Fix tests? --- clang/test/SemaCXX/cxx2c-pack-indexing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index ef35a49023952..0ac85b5bcc14b 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -203,7 +203,7 @@ void test(auto...args){ }.template operator()<0>(); } -template +template void test2(){ [&](){ using R = decltype( args...[idx] ) ; >From fdd321f94f29e37648a956d2fff9a9e9e739f10c Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 19:20:32 +0200 Subject: [PATCH 5/5] Fix getDecltypeForExpr + cleanup --- clang/lib/AST/ComputeDependence.cpp | 14 +- clang/lib/Sema/SemaType.cpp | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index bd0519a1787cc..62ca15ea398f5 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -375,15 +375,19 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { } ExprDependence clang::computeDependence(PackIndexingExpr *E) { + + ExprDependence PatternDep = E->getPackIdExpression()->getDependence() & + ~ExprDependence::UnexpandedPack; +
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
https://github.com/cor3ntin updated https://github.com/llvm/llvm-project/pull/91933 >From 4cadff527e02ae03aa5850ee713fe57aee663a52 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 10:00:19 +0200 Subject: [PATCH 1/4] [Clang] Fix dependency computation for pack indexing expression Given `foo...[idx]` if idx is value dependent, the expression is type dependent. Fixes #91885 Fixes #91884 --- clang/lib/AST/ComputeDependence.cpp| 3 +++ clang/test/SemaCXX/cxx2c-pack-indexing.cpp | 14 ++ 2 files changed, 17 insertions(+) diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index bad8e75b2f878..ee56c50d76512 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -376,6 +376,9 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); + if (D & ExprDependence::Value) +D |= ExprDependence::TypeInstantiation; + ArrayRef Exprs = E->getExpressions(); if (Exprs.empty()) D |= (E->getPackIdExpression()->getDependence() | diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index a3e5a0931491b..764f6163710bd 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -194,3 +194,17 @@ 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>(); +} + +void f( ) { +test(1); +} + +} >From 7c9192cffe099fe4a35e8cb9a88ec56b4480daa1 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 14:24:34 +0200 Subject: [PATCH 2/4] address review feedback --- clang/lib/AST/ComputeDependence.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index ee56c50d76512..bd0519a1787cc 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -377,7 +377,7 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); if (D & ExprDependence::Value) -D |= ExprDependence::TypeInstantiation; +D |= E->getPackIdExpression()->getDependence() & ExprDependence::Type; ArrayRef Exprs = E->getExpressions(); if (Exprs.empty()) >From 320b9fe584d02e5f156ff012b3c0facf9cc06e7b Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 15:56:02 +0200 Subject: [PATCH 3/4] add additional test --- clang/test/SemaCXX/cxx2c-pack-indexing.cpp | 11 ++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index 764f6163710bd..ef35a49023952 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -203,8 +203,17 @@ void test(auto...args){ }.template operator()<0>(); } +template +void test2(){ + [&](){ +using R = decltype( args...[idx] ) ; + }.template operator()<0>(); +} + void f( ) { -test(1); + test(1); + test2<1>(); } + } >From bb6b680b8200e2cc7c6e8059be31959b2dfb4a51 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 17:34:36 +0200 Subject: [PATCH 4/4] Fix tests? --- clang/test/SemaCXX/cxx2c-pack-indexing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index ef35a49023952..0ac85b5bcc14b 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -203,7 +203,7 @@ void test(auto...args){ }.template operator()<0>(); } -template +template void test2(){ [&](){ using R = decltype( args...[idx] ) ; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
@@ -377,7 +377,7 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); if (D & ExprDependence::Value) -D |= ExprDependence::TypeInstantiation; +D |= E->getPackIdExpression()->getDependence() & ExprDependence::Type; RungeCC wrote: > In that case (no selected expression) the pack is always type dependent. I don't get it, could you explain the reason? FWIW, new test failed in CI so we may need to reconsider this. https://github.com/llvm/llvm-project/pull/91933 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
@@ -377,7 +377,7 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); if (D & ExprDependence::Value) -D |= ExprDependence::TypeInstantiation; +D |= E->getPackIdExpression()->getDependence() & ExprDependence::Type; cor3ntin wrote: > The change seems reasonable to me, however with it we need to alter the way > PackIndexingExpr is handled inside the getDecltypeForExpr, since when 1) E is > not type-dependent (int... case) and 2) index is instantiation-dependent we > shall not directly call getSelectedExpr. In that case (no selected expression) the pack is always type dependent. I did add a test though https://github.com/llvm/llvm-project/pull/91933 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
https://github.com/cor3ntin updated https://github.com/llvm/llvm-project/pull/91933 >From 4cadff527e02ae03aa5850ee713fe57aee663a52 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 10:00:19 +0200 Subject: [PATCH 1/3] [Clang] Fix dependency computation for pack indexing expression Given `foo...[idx]` if idx is value dependent, the expression is type dependent. Fixes #91885 Fixes #91884 --- clang/lib/AST/ComputeDependence.cpp| 3 +++ clang/test/SemaCXX/cxx2c-pack-indexing.cpp | 14 ++ 2 files changed, 17 insertions(+) diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index bad8e75b2f878..ee56c50d76512 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -376,6 +376,9 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); + if (D & ExprDependence::Value) +D |= ExprDependence::TypeInstantiation; + ArrayRef Exprs = E->getExpressions(); if (Exprs.empty()) D |= (E->getPackIdExpression()->getDependence() | diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index a3e5a0931491b..764f6163710bd 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -194,3 +194,17 @@ 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>(); +} + +void f( ) { +test(1); +} + +} >From 7c9192cffe099fe4a35e8cb9a88ec56b4480daa1 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 14:24:34 +0200 Subject: [PATCH 2/3] address review feedback --- clang/lib/AST/ComputeDependence.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index ee56c50d76512..bd0519a1787cc 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -377,7 +377,7 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); if (D & ExprDependence::Value) -D |= ExprDependence::TypeInstantiation; +D |= E->getPackIdExpression()->getDependence() & ExprDependence::Type; ArrayRef Exprs = E->getExpressions(); if (Exprs.empty()) >From 320b9fe584d02e5f156ff012b3c0facf9cc06e7b Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 15:56:02 +0200 Subject: [PATCH 3/3] add additional test --- clang/test/SemaCXX/cxx2c-pack-indexing.cpp | 11 ++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index 764f6163710bd..ef35a49023952 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -203,8 +203,17 @@ void test(auto...args){ }.template operator()<0>(); } +template +void test2(){ + [&](){ +using R = decltype( args...[idx] ) ; + }.template operator()<0>(); +} + void f( ) { -test(1); + test(1); + test2<1>(); } + } ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
@@ -377,7 +377,7 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); if (D & ExprDependence::Value) -D |= ExprDependence::TypeInstantiation; +D |= E->getPackIdExpression()->getDependence() & ExprDependence::Type; RungeCC wrote: Possibly `PackExpr->getExpressions().front()` for the type-independent `PackExpr` with its `IndexExpr` instantiation-dependent? I'm not sure whether we need an empty-check here. https://github.com/llvm/llvm-project/pull/91933 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
@@ -377,7 +377,7 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); if (D & ExprDependence::Value) -D |= ExprDependence::TypeInstantiation; +D |= E->getPackIdExpression()->getDependence() & ExprDependence::Type; RungeCC wrote: The change seems reasonable to me, however with it we need to alter the way `PackIndexingExpr` is handled inside the `getDecltypeForExpr`, since when 1) `E` is not type-dependent (`int...` case) and 2) `index` is instantiation-dependent we shall not directly call `getSelectedExpr`. https://github.com/llvm/llvm-project/blob/ad1a65fcacda8794e2f1fa3e1dec1c1b7813422c/clang/lib/Sema/SemaType.cpp#L9739-L9748 https://github.com/llvm/llvm-project/blob/ad1a65fcacda8794e2f1fa3e1dec1c1b7813422c/clang/include/clang/AST/ExprCXX.h#L4411-L4415 In short, crash on the following code: ```c++ template // notice the "int..." here. void test(){ [&](){ using R = decltype( args...[idx] ) ; }.template operator()<0>(); } void f( ) { test<1>(); } ``` https://github.com/llvm/llvm-project/pull/91933 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
https://github.com/cor3ntin updated https://github.com/llvm/llvm-project/pull/91933 >From 4cadff527e02ae03aa5850ee713fe57aee663a52 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 10:00:19 +0200 Subject: [PATCH 1/2] [Clang] Fix dependency computation for pack indexing expression Given `foo...[idx]` if idx is value dependent, the expression is type dependent. Fixes #91885 Fixes #91884 --- clang/lib/AST/ComputeDependence.cpp| 3 +++ clang/test/SemaCXX/cxx2c-pack-indexing.cpp | 14 ++ 2 files changed, 17 insertions(+) diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index bad8e75b2f878..ee56c50d76512 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -376,6 +376,9 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); + if (D & ExprDependence::Value) +D |= ExprDependence::TypeInstantiation; + ArrayRef Exprs = E->getExpressions(); if (Exprs.empty()) D |= (E->getPackIdExpression()->getDependence() | diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index a3e5a0931491b..764f6163710bd 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -194,3 +194,17 @@ 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>(); +} + +void f( ) { +test(1); +} + +} >From 7c9192cffe099fe4a35e8cb9a88ec56b4480daa1 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 14:24:34 +0200 Subject: [PATCH 2/2] address review feedback --- clang/lib/AST/ComputeDependence.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index ee56c50d76512..bd0519a1787cc 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -377,7 +377,7 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); if (D & ExprDependence::Value) -D |= ExprDependence::TypeInstantiation; +D |= E->getPackIdExpression()->getDependence() & ExprDependence::Type; ArrayRef Exprs = E->getExpressions(); if (Exprs.empty()) ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
@@ -376,6 +376,9 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); + if (D & ExprDependence::Value) +D |= ExprDependence::TypeInstantiation; cor3ntin wrote: NVM, you are right, we can simplify this whole thing, I'll do that shortly https://github.com/llvm/llvm-project/pull/91933 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
@@ -376,6 +376,9 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); + if (D & ExprDependence::Value) +D |= ExprDependence::TypeInstantiation; cor3ntin wrote: > Should E...[N] be treated as type-dependent regardless of the result being > always an int? Yes. (We don't do anything to look at whether all the expressions would have the same type) https://github.com/llvm/llvm-project/pull/91933 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
@@ -376,6 +376,9 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); + if (D & ExprDependence::Value) +D |= ExprDependence::TypeInstantiation; zyn0217 wrote: Probably `E->getPackIdExpression()->getDependence() & ExprDependence::TypeInstantiation`? https://github.com/llvm/llvm-project/pull/91933 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
@@ -376,6 +376,9 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); + if (D & ExprDependence::Value) +D |= ExprDependence::TypeInstantiation; zyn0217 wrote: Does it mean "if the index expression is value-dependent, then the whole `PackIndexingExpr` is type-dependent despite its expressions"? For example, ```cpp template auto foo() { return E...[N]; } ``` Should `E...[N]` be treated as type-dependent regardless of the result being always an int? https://github.com/llvm/llvm-project/pull/91933 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
https://github.com/cor3ntin updated https://github.com/llvm/llvm-project/pull/91933 >From 4cadff527e02ae03aa5850ee713fe57aee663a52 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 10:00:19 +0200 Subject: [PATCH] [Clang] Fix dependency computation for pack indexing expression Given `foo...[idx]` if idx is value dependent, the expression is type dependent. Fixes #91885 Fixes #91884 --- clang/lib/AST/ComputeDependence.cpp| 3 +++ clang/test/SemaCXX/cxx2c-pack-indexing.cpp | 14 ++ 2 files changed, 17 insertions(+) diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index bad8e75b2f878..ee56c50d76512 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -376,6 +376,9 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); + if (D & ExprDependence::Value) +D |= ExprDependence::TypeInstantiation; + ArrayRef Exprs = E->getExpressions(); if (Exprs.empty()) D |= (E->getPackIdExpression()->getDependence() | diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index a3e5a0931491b..764f6163710bd 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -194,3 +194,17 @@ 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>(); +} + +void f( ) { +test(1); +} + +} ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
llvmbot wrote: @llvm/pr-subscribers-clang Author: cor3ntin (cor3ntin) Changes Given `foo...[idx]` if idx is value dependent, the expression is type dependent. Fixes #91885 Fixes #91884 --- Full diff: https://github.com/llvm/llvm-project/pull/91933.diff 2 Files Affected: - (modified) clang/lib/AST/ComputeDependence.cpp (+3) - (modified) clang/test/SemaCXX/cxx2c-pack-indexing.cpp (+14) ``diff diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index bad8e75b2f878..ee56c50d76512 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -376,6 +376,9 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); + if (D & ExprDependence::Value) +D |= ExprDependence::TypeInstantiation; + ArrayRef Exprs = E->getExpressions(); if (Exprs.empty()) D |= (E->getPackIdExpression()->getDependence() | diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index a3e5a0931491b..764f6163710bd 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -194,3 +194,17 @@ 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>(); +} + +void f( ) { +test(1); +} + +} `` https://github.com/llvm/llvm-project/pull/91933 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix dependency computation for pack indexing expression (PR #91933)
https://github.com/cor3ntin created https://github.com/llvm/llvm-project/pull/91933 Given `foo...[idx]` if idx is value dependent, the expression is type dependent. Fixes #91885 Fixes #91884 >From 066e23de6ef0b3bb44513c1d239981e7d0f4453e Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Mon, 13 May 2024 10:00:19 +0200 Subject: [PATCH] [Clang] Fix dependency computation for pack indexing expression Given `foo...[idx]` if idx is value dependent, the expression is type dependent. Fixes #91885 Fixes #91884 --- clang/lib/AST/ComputeDependence.cpp| 3 +++ clang/test/SemaCXX/cxx2c-pack-indexing.cpp | 14 ++ 2 files changed, 17 insertions(+) diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index bad8e75b2f878..ee56c50d76512 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -376,6 +376,9 @@ ExprDependence clang::computeDependence(PackExpansionExpr *E) { ExprDependence clang::computeDependence(PackIndexingExpr *E) { ExprDependence D = E->getIndexExpr()->getDependence(); + if (D & ExprDependence::Value) +D |= ExprDependence::TypeInstantiation; + ArrayRef Exprs = E->getExpressions(); if (Exprs.empty()) D |= (E->getPackIdExpression()->getDependence() | diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index a3e5a0931491b..764f6163710bd 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -194,3 +194,17 @@ 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>(); +} + +void f( ) { +test(1); +} + +} ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits