aaronpuchert marked an inline comment as done. aaronpuchert added inline comments.
================ Comment at: clang/lib/Sema/TreeTransform.h:12162 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); I != NumParams; ++I) { ---------------- aaronpuchert wrote: > rsmith wrote: > > rsmith wrote: > > > This logic shouldn't even be here in the first place.. this should all be > > > handled by `SubstParmVarDecl` in `SemaTemplateInstantiate`. It's wrong > > > for `TreeTransform` to be assuming that `TransformFunctionProtoType` will > > > have built new function parameters -- it doesn't do so by default, so in > > > the non-template-instantiation case, this is clobbering the default > > > argument information on the original lambda. And in the template > > > instantiation case, this is clobbering the default argument information > > > (including initialization) that `SubstParmVarDecl` already did. > > > > > > Please try deleting this loop entirely. If there are still problems (and > > > I think there are: I don't think we handle delayed instantiation for > > > default argument in generic lambdas properly), we should address them by > > > changing how we do default argument instantiation in `SubstParmVarDecl`. > > > In particular, where that function calls `SetParamDefaultArgument` after > > > calling `SubstExpr`, we should presumably instead be calling > > > `setUninstantiatedDefaultArg` on the parameter if it's a parameter of a > > > generic lambda (we still need to instantiate the default argument with > > > the template arguments of the actual lambda call operator). > > Hmm, what I wrote above isn't entirely true -- `TreeTransform` does create > > new parameters by default. But nonetheless, it's the responsibility of > > `TransformFunctionTypeParam` to set up the default argument, not the > > responsibility of this code, so we shouldn't be partially overwriting its > > results here. (Perhaps we should move the substitution into default > > arguments from `SubstParmVarDecl` into > > `TreeTransform::TransformFunctionTypeParam`, though I think that can be > > done separately from this bugfix.) > Thanks for your hints! I was already somewhat suspicious of that loop. > Removing it works indeed pretty well, but I'm running into an issue with > variable templates. Default arguments are usually only instantiated when > needed by a call, which happens in `Sema::CheckCXXDefaultArgExpr`. Now in the > following code, the `MultiLevelTemplateArgumentList` returned from > `Sema::getTemplateInstantiationArgs` is empty instead of being `[int]`: > > ``` > template <typename T> > int k = [](T x = 0.0) -> int { return x; }(); > > template int k<int>; > ``` > > Looking at `getTemplateInstantiationArgs`, that's not very surprising: if we > are a `DeclContext`, we go through the contexts and collect all template > arguments from those, but a variable template is not a context. The variable > template case is handled right at the beginning, but only if the declaration > itself is a variable template. > > Meaning that deep inside the initializer of a variable template, we don't get > its template parameters. Or maybe default arguments need to instantiated immediately similar to the situation from DR1484? It says "Within a template declaration ...", which would seem to apply here. There is no enclosing scope though, so I'm not sure we can call this a local class. So I guess we need to instantiate in more cases in `SubstParmVarDecl`, as you indicated. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D76038/new/ https://reviews.llvm.org/D76038 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits