[clang] [clang][Sema] Fix a CTAD regression after 42239d2e9 (PR #86914)
Younan Zhang via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 29 08:10:33 PDT 2024
================
@@ -1836,7 +1836,19 @@ static TemplateParameterList *GetTemplateParameterList(TemplateDecl *TD) {
// Make sure we get the template parameter list from the most
// recent declaration, since that is the only one that is guaranteed to
// have all the default template argument information.
- return cast<TemplateDecl>(TD->getMostRecentDecl())->getTemplateParameters();
+ Decl *ND = TD->getMostRecentDecl();
+ // Skip past friend Decls because they are not supposed to contain default
+ // template arguments. Moreover, these declarations may introduce template
+ // parameters living in different template depths than the corresponding
+ // template parameters in TD, causing unmatched constraint substitution.
+ //
+ // C++23 N4950 [temp.param]p12
----------------
zyn0217 wrote:
> In that case it’d make sense to add a test for a friend function template as well if there isn’t already one to make sure this change doesn’t break that.
I think the change is probably fine for friend function templates with default template parameters: they're unique across one TU, and we have ensured the next declaration we visit is non-null. So in such cases, I think ND would be the equivalent to "the most recent Decl".
> but maybe cite the C++20 then in this case if it was added in C++20.
Finally, I decided to use N3337 (aka C++11) since I couldn't find any related words prior to that draft, although gcc and clang don't allow such default arguments even in 98/03 mode.
https://github.com/llvm/llvm-project/pull/86914
More information about the cfe-commits
mailing list