<div dir="ltr"><div>Hi all,</div><div><br></div><div>I'm new to the clang code base. I decided to take a look at bug <a href="https://bugs.llvm.org/show_bug.cgi?id=23029">https://bugs.llvm.org/show_bug.cgi?id=23029</a>, as it is affecting one of my daily projects.</div><div><br></div><div>I came up with two different solutions for it, but I have no idea which one is the best.</div><div><br></div><div>The problem:</div><div>If I have a template declaration like:</div><div><br></div>template <typename... T><br><div>void f(int i = 0, T ...args) {}</div><div><br></div><div>I cannot instantiate with `f(1, 1);` as clang will complain that there is no default value for `args`.</div><div><br></div><div>The first solution is to avoid calling the function `CheckCXXDefaultArguments(NewFD)` in file `SemaDecl.cpp`, in the function `Sema::CheckFunctionDeclaration()` when it is a template instantiation, assuming the check was already done in the template definition.</div><div><br></div><div>The second one is to modify the check in `Sema::CheckCXXDefaultArguments()` in file `SemaDeclCXX.cpp`, to check if a parameter is a template substitution, and if so, check if the original parameter is a parameter pack.</div><div><br></div><div>Can someone with more knowledge about this part of the code give me some advice? Is the assumption for solution one always valid? And which solution would be preferred?<br></div><div><br></div><div>Regards,</div><div>Mario<br></div></div>