[clang] Reland: [clang] unified CWG2398 and P0522 changes; finishes implementation of P3310 (PR #124137)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 23 08:25:16 PST 2025
================
@@ -5570,60 +5570,73 @@ bool Sema::CheckTemplateArgumentList(
}
if (ArgIdx < NumArgs) {
- // Check the template argument we were given.
- if (CheckTemplateArgument(*Param, NewArgs[ArgIdx], Template, TemplateLoc,
- RAngleLoc, SugaredArgumentPack.size(),
- SugaredConverted, CanonicalConverted,
- CTAK_Specified))
- return true;
-
- CanonicalConverted.back().setIsDefaulted(
- clang::isSubstitutedDefaultArgument(
- Context, NewArgs[ArgIdx].getArgument(), *Param,
- CanonicalConverted, Params->getDepth()));
-
- bool PackExpansionIntoNonPack =
- NewArgs[ArgIdx].getArgument().isPackExpansion() &&
- (!(*Param)->isTemplateParameterPack() || getExpandedPackSize(*Param));
- // CWG1430: Don't diagnose this pack expansion when partial
- // ordering template template parameters. Some uses of the template could
- // be valid, and invalid uses will be diagnosed later during
- // instantiation.
- if (PackExpansionIntoNonPack && !PartialOrderingTTP &&
- (isa<TypeAliasTemplateDecl>(Template) ||
- isa<ConceptDecl>(Template))) {
- // CWG1430: we have a pack expansion as an argument to an
- // alias template, and it's not part of a parameter pack. This
- // can't be canonicalized, so reject it now.
- // As for concepts - we cannot normalize constraints where this
- // situation exists.
- Diag(NewArgs[ArgIdx].getLocation(),
- diag::err_template_expansion_into_fixed_list)
- << (isa<ConceptDecl>(Template) ? 1 : 0)
- << NewArgs[ArgIdx].getSourceRange();
- NoteTemplateParameterLocation(**Param);
- return true;
+ TemplateArgumentLoc &ArgLoc = NewArgs[ArgIdx];
+ bool NonPackParameter =
+ !(*Param)->isTemplateParameterPack() || getExpandedPackSize(*Param);
+ bool ArgIsExpansion = ArgLoc.getArgument().isPackExpansion();
+
+ if (ArgIsExpansion && PartialOrderingTTP) {
+ unsigned Num = ParamEnd - Param;
+ MutableArrayRef<TemplateArgument> Args = {
+ Context.Allocate<TemplateArgument>(Num), Num};
+
+ for (TemplateParameterList::iterator First = Param; Param != ParamEnd;
+ ++Param) {
+ TemplateArgument &Arg = Args[Param - First];
+ Arg = ArgLoc.getArgument();
+ if (!(*Param)->isTemplateParameterPack() ||
+ getExpandedPackSize(*Param))
+ Arg = Arg.getPackExpansionPattern();
+ TemplateArgumentLoc NewArgLoc(Arg, ArgLoc.getLocInfo());
+ if (CheckTemplateArgument(*Param, NewArgLoc, Template, TemplateLoc,
+ RAngleLoc, SugaredArgumentPack.size(),
+ SugaredConverted, CanonicalConverted,
+ CTAK_Specified, /*PartialOrdering=*/false,
+ MatchedPackOnParmToNonPackOnArg))
+ return true;
+ Arg = NewArgLoc.getArgument();
+ CanonicalConverted.back().setIsDefaulted(
+ clang::isSubstitutedDefaultArgument(Context, Arg, *Param,
+ CanonicalConverted,
+ Params->getDepth()));
+ }
+ ArgLoc =
+ TemplateArgumentLoc(TemplateArgument(Args), ArgLoc.getLocInfo());
+ } else {
+ if (CheckTemplateArgument(*Param, ArgLoc, Template, TemplateLoc,
+ RAngleLoc, SugaredArgumentPack.size(),
+ SugaredConverted, CanonicalConverted,
+ CTAK_Specified, /*PartialOrdering=*/false,
+ MatchedPackOnParmToNonPackOnArg))
+ return true;
+ CanonicalConverted.back().setIsDefaulted(
+ clang::isSubstitutedDefaultArgument(Context, ArgLoc.getArgument(),
+ *Param, CanonicalConverted,
+ Params->getDepth()));
+ if (ArgIsExpansion && NonPackParameter) {
+ // CWG1430: we have a pack expansion as an argument to an
+ // alias template, and it's not part of a parameter pack. This
+ // can't be canonicalized, so reject it now.
+ // As for concepts - we cannot normalize constraints where this
+ // situation exists.
+ if (isa<TypeAliasTemplateDecl, ConceptDecl>(Template)) {
----------------
cor3ntin wrote:
```suggestion
if (ArgIsExpansion && NonPackParameter) {
// CWG1430/CWG2686: we have a pack expansion as an argument to an
// alias template or concept, and it's not part of a parameter pack. This
// can't be canonicalized, so reject it now.
if (isa<TypeAliasTemplateDecl, ConceptDecl>(Template)) {
```
https://github.com/llvm/llvm-project/pull/124137
More information about the cfe-commits
mailing list