[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 --- Comment #24 from CVS Commits --- The releases/gcc-10 branch has been updated by Patrick Palka : https://gcc.gnu.org/g:fc930b3010bd0de899a3da3209eab20664ddb703 commit r10-9895-gfc930b3010bd0de899a3da3209eab20664ddb703 Author: Patrick Palka Date: Fri Jun 4 13:46:53 2021 -0400 c++: tsubst_function_decl and excess arg levels [PR100102] Here, when instantiating the dependent alias template duration::__is_harmonic with args={{T,U},{int}}, we find ourselves substituting the function decl _S_gcd. Since we have more arg levels than _S_gcd has parm levels, an old special case in tsubst_function_decl causes us to unwantedly reduce args to its innermost level, yielding args={int}, which leads to a nonsensical substitution into the decl context and eventually a crash. The comment for this special case refers to three examples for which we ought to see more arg levels than parm levels here, but none of the examples actually demonstrate this. In the first example, when defining S::f(U) parms_depth is 2 and args_depth is 1, and later when instantiating say S::f both depths are 2. In the second example, when substituting the template friend declaration parms_depth is 2 and args_depth is 1, and later when instantiating f both depths are 1. Finally, the third example is invalid since we can't specialize a member template of an unspecialized class template like that. Given that this reduction code seems no longer relevant for its documented purpose and that it causes problems as in the PR, this patch just removes it. Note that as far as bootstrap/regtest is concerned, this code is dead; the below two tests would be the first to reach it. PR c++/100102 gcc/cp/ChangeLog: * pt.c (tsubst_function_decl): Remove old code for reducing args when it has excess levels. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/alias-decl-72.C: New test. * g++.dg/cpp0x/alias-decl-72a.C: New test. (cherry picked from commit 5357ab75dedef403b0eebf9277d61d1cbeb5898f)
[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 --- Comment #23 from CVS Commits --- The releases/gcc-11 branch has been updated by Patrick Palka : https://gcc.gnu.org/g:f1feb74046e0feb0596b93bbb822fae02940a90e commit r11-8520-gf1feb74046e0feb0596b93bbb822fae02940a90e Author: Patrick Palka Date: Fri Jun 4 13:46:53 2021 -0400 c++: tsubst_function_decl and excess arg levels [PR100102] Here, when instantiating the dependent alias template duration::__is_harmonic with args={{T,U},{int}}, we find ourselves substituting the function decl _S_gcd. Since we have more arg levels than _S_gcd has parm levels, an old special case in tsubst_function_decl causes us to unwantedly reduce args to its innermost level, yielding args={int}, which leads to a nonsensical substitution into the decl context and eventually a crash. The comment for this special case refers to three examples for which we ought to see more arg levels than parm levels here, but none of the examples actually demonstrate this. In the first example, when defining S::f(U) parms_depth is 2 and args_depth is 1, and later when instantiating say S::f both depths are 2. In the second example, when substituting the template friend declaration parms_depth is 2 and args_depth is 1, and later when instantiating f both depths are 1. Finally, the third example is invalid since we can't specialize a member template of an unspecialized class template like that. Given that this reduction code seems no longer relevant for its documented purpose and that it causes problems as in the PR, this patch just removes it. Note that as far as bootstrap/regtest is concerned, this code is dead; the below two tests would be the first to reach it. PR c++/100102 gcc/cp/ChangeLog: * pt.c (tsubst_function_decl): Remove old code for reducing args when it has excess levels. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/alias-decl-72.C: New test. * g++.dg/cpp0x/alias-decl-72a.C: New test. (cherry picked from commit 5357ab75dedef403b0eebf9277d61d1cbeb5898f)
[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 --- Comment #22 from Patrick Palka --- (In reply to Eduard Rozenberg from comment #21) > @ppalka Huge thanks for this fix - it's working well for me. Very happy to > see the patch applied with no problems to gcc 10.3.0, because it could take > several years until the OS and Nvidia support gcc 11 or 12. Otherwise I > would have had to move back to gcc 10.2.0 and build custom kernels for quite > some time. > > Tested as follows: > * Rebuilt Slackware gcc 10.3.0 packages with the patch for `pt.c` > * Built Nvidia nccl-tests - build succeeded (was failing before the patch) > * Built latest pytorch git with Nvidia support - build succeeded (was > failing before the patch) Thanks a lot for testing the fix. It'll get backported to the 11 and 10 release branches later today.
[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 --- Comment #21 from Eduard Rozenberg --- @ppalka Huge thanks for this fix - it's working well for me. Very happy to see the patch applied with no problems to gcc 10.3.0, because it could take several years until the OS and Nvidia support gcc 11 or 12. Otherwise I would have had to move back to gcc 10.2.0 and build custom kernels for quite some time. Tested as follows: * Rebuilt Slackware gcc 10.3.0 packages with the patch for `pt.c` * Built Nvidia nccl-tests - build succeeded (was failing before the patch) * Built latest pytorch git with Nvidia support - build succeeded (was failing before the patch)
[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 --- Comment #20 from CVS Commits --- The master branch has been updated by Patrick Palka : https://gcc.gnu.org/g:5357ab75dedef403b0eebf9277d61d1cbeb5898f commit r12-1223-g5357ab75dedef403b0eebf9277d61d1cbeb5898f Author: Patrick Palka Date: Fri Jun 4 13:46:53 2021 -0400 c++: tsubst_function_decl and excess arg levels [PR100102] Here, when instantiating the dependent alias template duration::__is_harmonic with args={{T,U},{int}}, we find ourselves substituting the function decl _S_gcd. Since we have more arg levels than _S_gcd has parm levels, an old special case in tsubst_function_decl causes us to unwantedly reduce args to its innermost level, yielding args={int}, which leads to a nonsensical substitution into the decl context and eventually a crash. The comment for this special case refers to three examples for which we ought to see more arg levels than parm levels here, but none of the examples actually demonstrate this. In the first example, when defining S::f(U) parms_depth is 2 and args_depth is 1, and later when instantiating say S::f both depths are 2. In the second example, when substituting the template friend declaration parms_depth is 2 and args_depth is 1, and later when instantiating f both depths are 1. Finally, the third example is invalid since we can't specialize a member template of an unspecialized class template like that. Given that this reduction code seems no longer relevant for its documented purpose and that it causes problems as in the PR, this patch just removes it. Note that as far as bootstrap/regtest is concerned, this code is dead; the below two tests would be the first to reach it. PR c++/100102 gcc/cp/ChangeLog: * pt.c (tsubst_function_decl): Remove old code for reducing args when it has excess levels. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/alias-decl-72.C: New test. * g++.dg/cpp0x/alias-decl-72a.C: New test.
[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 --- Comment #19 from Patrick Palka --- Candidate patch that addresses the ICE in the original testcase and reductions: https://gcc.gnu.org/pipermail/gcc-patches/2021-June/571899.html
[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 Patrick Palka changed: What|Removed |Added CC||mu11 at yahoo dot com --- Comment #18 from Patrick Palka --- *** Bug 100599 has been marked as a duplicate of this bug. ***
[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 Patrick Palka changed: What|Removed |Added Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |ppalka at gcc dot gnu.org --- Comment #17 from Patrick Palka --- Reduced valid reproducer: template struct ratio; template struct duration { static constexpr int _S_gcd(); template using __is_harmonic = ratio<_S_gcd>; using type = __is_harmonic; };
[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 --- Comment #16 from Jonathan Wakely --- This is an old, latent g++ bug, but it now makes it impossible to use cuda with GCC (e.g. on Fedora) because of my libstdc++ changes. I will see if I can make another libstdc++ change to avoid the ICE without having to revert the change completely, as it was done to fix a non-conformance bug.
[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 --- Comment #15 from Jonathan Wakely --- (In reply to Erik Schnetter from comment #6) > I looked for the string "GCC" in the user header files, but could not find > any place where things would differ between GCC 10.2 and 10.3. I assume > there could be a difference in GCC-provided header files (the error message > mentions "chrono" and "gcd"), or it could be that nvcc examines the GCC > version and produces different code. The difference is r10-9609-g14f8307cf4261efd5ee4475b3c7f7c42c48557d6 in the header, which is in 10.3 and not 10.2
[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 --- Comment #14 from Jonathan Wakely --- cvised reproducer from PR 100448 template using __bool_constant struct intmax_t; template struct ratio { template struct duration { static intmax_t _S_gcd(); template using __is_harmonic = __bool_constant::den>; class _Period2 __is_harmonic<_Period2>
[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 Jonathan Wakely changed: What|Removed |Added CC||alexander.grund@tu-dresden. ||de --- Comment #13 from Jonathan Wakely --- *** Bug 100448 has been marked as a duplicate of this bug. ***
[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 Jonathan Wakely changed: What|Removed |Added CC||bowie.owens at gmail dot com --- Comment #12 from Jonathan Wakely --- *** Bug 100277 has been marked as a duplicate of this bug. ***
[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 Richard Biener changed: What|Removed |Added Target Milestone|9.4 |9.5 --- Comment #11 from Richard Biener --- GCC 9.4 is being released, retargeting bugs to GCC 9.5.
[Bug c++/100102] [9/10/11/12 Regression] ICE in tsubst, at cp/pt.c:15310
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100102 Jakub Jelinek changed: What|Removed |Added Target Milestone|8.5 |9.4 --- Comment #10 from Jakub Jelinek --- GCC 8 branch is being closed.