Hi. Based on your comments here, and the discussions in another thread https://gcc.gnu.org/pipermail/gcc-patches/2024-July/657703.html I have made another patch to resolve this issue (as well as another bug) that I will be sending right now.
On Thu, 2024-07-18 at 22:16 -0400, Jason Merrill wrote: > On 7/18/24 12:03 PM, Seyed Sajad Kahani wrote: > > When deducing auto for `adc_return_type`, `adc_variable_type`, and > > `adc_decomp_type` contexts (at the usage time), we try to resolve > > the outermost > > template arguments to be used for satisfaction. This is done by one > > of the > > following, depending on the scope: > > > > 1. Checking the `DECL_TEMPLATE_INFO` of the current function scope > > and > > extracting DECL_TI_ARGS from it for function scope deductions > > (pt.cc:31236). > > 2. Checking the `DECL_TEMPLATE_INFO` of the declaration (alongside > > with other > > conditions) for non-function scope variable declaration deductions > > (decl.cc:8527). > > > > Then, we do not retrieve the deeper layers of the template > > arguments; instead, > > we fill the missing levels with dummy levels (pt.cc:31260). > > > > The problem (that is shown in PR114915) is that we do not consider > > the case > > where the deduction happens in a template specialization scope. In > > this case, > > the type is not dependent on the outermost template arguments > > (which are > > the specialization arguments). Yet, we still resolve the outermost > > template > > arguments, and then the number of layers in the template arguments > > exceeds the > > number of levels in the type. This causes the missing levels to be > > negative. > > This leads to the rejection of valid code and ICEs (like segfault) > > in the > > release mode. In the debug mode, it is possible to show as an > > assertion failure > > (when creating a tree_vec with a negative size). > > > > This patch resolves PR114915 by replacing the logic that fills in > > the > > missing levels in do_auto_deduction in cp/pt.cc. > > The new approach now trims targs if the depth of targs is deeper > > than desired > > (this will only happen in specific contexts), and still fills targs > > with empty > > layers if it has fewer depths than expected. > > I would prefer to set outer_targs correctly in the first place, where > it's currently set a few lines above. And to factor that out so > other > callers can use it as well instead of DECL_TI_ARGS. > > It seems like we want something close to outer_template_args, but it > doesn't currently handle function scope decls or full > specializations. > > Jason >