When performing a substitution into a dependent alias template, mark the
authorRichard Smith <richard@metafoo.co.uk>
Wed, 17 Jun 2020 21:49:03 +0000 (14:49 -0700)
committerRichard Smith <richard@metafoo.co.uk>
Wed, 17 Jun 2020 22:12:04 +0000 (15:12 -0700)
outer levels as retained rather than omitting their arguments.

This better reflects what's going on (we're performing a substitution
while still inside a template). In theory this is also more correct, but
I've not found a testcase where it matters in practice (largely because
we don't allow alias templates to be declared inside a function).

clang/lib/Sema/SemaTemplate.cpp

index 073b4e8..3292284 100644 (file)
@@ -3558,9 +3558,8 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
     // Only substitute for the innermost template argument list.
     MultiLevelTemplateArgumentList TemplateArgLists;
     TemplateArgLists.addOuterTemplateArguments(&StackTemplateArgs);
-    unsigned Depth = AliasTemplate->getTemplateParameters()->getDepth();
-    for (unsigned I = 0; I < Depth; ++I)
-      TemplateArgLists.addOuterTemplateArguments(None);
+    TemplateArgLists.addOuterRetainedLevels(
+        AliasTemplate->getTemplateParameters()->getDepth());
 
     LocalInstantiationScope Scope(*this);
     InstantiatingTemplate Inst(*this, TemplateLoc, Template);