@@ -4540,6 +4540,63 @@ NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4540
4540
return SS.getWithLocInContext(SemaRef.Context);
4541
4541
}
4542
4542
4543
+ /// Iterator adaptor that invents template argument location information
4544
+ /// for each of the template arguments in its underlying iterator.
4545
+ template <typename Derived, typename InputIterator>
4546
+ class TemplateArgumentLocInventIterator {
4547
+ TreeTransform<Derived> &Self;
4548
+ InputIterator Iter;
4549
+
4550
+ public:
4551
+ typedef TemplateArgumentLoc value_type;
4552
+ typedef TemplateArgumentLoc reference;
4553
+ typedef typename std::iterator_traits<InputIterator>::difference_type
4554
+ difference_type;
4555
+ typedef std::input_iterator_tag iterator_category;
4556
+
4557
+ class pointer {
4558
+ TemplateArgumentLoc Arg;
4559
+
4560
+ public:
4561
+ explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) {}
4562
+
4563
+ const TemplateArgumentLoc *operator->() const { return &Arg; }
4564
+ };
4565
+
4566
+ explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4567
+ InputIterator Iter)
4568
+ : Self(Self), Iter(Iter) {}
4569
+
4570
+ TemplateArgumentLocInventIterator &operator++() {
4571
+ ++Iter;
4572
+ return *this;
4573
+ }
4574
+
4575
+ TemplateArgumentLocInventIterator operator++(int) {
4576
+ TemplateArgumentLocInventIterator Old(*this);
4577
+ ++(*this);
4578
+ return Old;
4579
+ }
4580
+
4581
+ reference operator*() const {
4582
+ TemplateArgumentLoc Result;
4583
+ Self.InventTemplateArgumentLoc(*Iter, Result);
4584
+ return Result;
4585
+ }
4586
+
4587
+ pointer operator->() const { return pointer(**this); }
4588
+
4589
+ friend bool operator==(const TemplateArgumentLocInventIterator &X,
4590
+ const TemplateArgumentLocInventIterator &Y) {
4591
+ return X.Iter == Y.Iter;
4592
+ }
4593
+
4594
+ friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4595
+ const TemplateArgumentLocInventIterator &Y) {
4596
+ return X.Iter != Y.Iter;
4597
+ }
4598
+ };
4599
+
4543
4600
template<typename Derived>
4544
4601
DeclarationNameInfo
4545
4602
TreeTransform<Derived>
@@ -4661,6 +4718,42 @@ TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4661
4718
ObjectType, AllowInjectedClassName);
4662
4719
}
4663
4720
4721
+ if (DeducedTemplateStorage *DTN = Name.getAsDeducedTemplateName()) {
4722
+ TemplateName Underlying = DTN->getUnderlying();
4723
+ TemplateName TransUnderlying = getDerived().TransformTemplateName(
4724
+ SS, Underlying, NameLoc, ObjectType, FirstQualifierInScope,
4725
+ AllowInjectedClassName);
4726
+ if (TransUnderlying.isNull())
4727
+ return TemplateName();
4728
+
4729
+ DefaultArguments DefArgs = DTN->getDefaultArguments();
4730
+
4731
+ TemplateArgumentListInfo TransArgsInfo;
4732
+ using Iterator =
4733
+ TemplateArgumentLocInventIterator<Derived, TemplateArgument *>;
4734
+ if (getDerived().TransformTemplateArguments(
4735
+ Iterator(*this,
4736
+ const_cast<TemplateArgument *>(DefArgs.Args.begin())),
4737
+ Iterator(*this, const_cast<TemplateArgument *>(DefArgs.Args.end())),
4738
+ TransArgsInfo))
4739
+ return TemplateName();
4740
+
4741
+ SmallVector<TemplateArgument, 4> TransArgs(
4742
+ TransArgsInfo.arguments().size());
4743
+ for (unsigned I = 0; I < TransArgs.size(); ++I)
4744
+ TransArgs[I] = TransArgsInfo.arguments()[I].getArgument();
4745
+
4746
+ return getSema().Context.getDeducedTemplateName(
4747
+ TransUnderlying, DefaultArguments{DefArgs.StartPos, TransArgs});
4748
+ }
4749
+
4750
+ // FIXME: Preserve SubstTemplateTemplateParm.
4751
+ if (SubstTemplateTemplateParmStorage *STN =
4752
+ Name.getAsSubstTemplateTemplateParm())
4753
+ return getDerived().TransformTemplateName(
4754
+ SS, STN->getReplacement(), NameLoc, ObjectType, FirstQualifierInScope,
4755
+ AllowInjectedClassName);
4756
+
4664
4757
// FIXME: Try to preserve more of the TemplateName.
4665
4758
if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4666
4759
TemplateDecl *TransTemplate
@@ -4807,63 +4900,6 @@ bool TreeTransform<Derived>::TransformTemplateArgument(
4807
4900
return true;
4808
4901
}
4809
4902
4810
- /// Iterator adaptor that invents template argument location information
4811
- /// for each of the template arguments in its underlying iterator.
4812
- template<typename Derived, typename InputIterator>
4813
- class TemplateArgumentLocInventIterator {
4814
- TreeTransform<Derived> &Self;
4815
- InputIterator Iter;
4816
-
4817
- public:
4818
- typedef TemplateArgumentLoc value_type;
4819
- typedef TemplateArgumentLoc reference;
4820
- typedef typename std::iterator_traits<InputIterator>::difference_type
4821
- difference_type;
4822
- typedef std::input_iterator_tag iterator_category;
4823
-
4824
- class pointer {
4825
- TemplateArgumentLoc Arg;
4826
-
4827
- public:
4828
- explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4829
-
4830
- const TemplateArgumentLoc *operator->() const { return &Arg; }
4831
- };
4832
-
4833
- explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4834
- InputIterator Iter)
4835
- : Self(Self), Iter(Iter) { }
4836
-
4837
- TemplateArgumentLocInventIterator &operator++() {
4838
- ++Iter;
4839
- return *this;
4840
- }
4841
-
4842
- TemplateArgumentLocInventIterator operator++(int) {
4843
- TemplateArgumentLocInventIterator Old(*this);
4844
- ++(*this);
4845
- return Old;
4846
- }
4847
-
4848
- reference operator*() const {
4849
- TemplateArgumentLoc Result;
4850
- Self.InventTemplateArgumentLoc(*Iter, Result);
4851
- return Result;
4852
- }
4853
-
4854
- pointer operator->() const { return pointer(**this); }
4855
-
4856
- friend bool operator==(const TemplateArgumentLocInventIterator &X,
4857
- const TemplateArgumentLocInventIterator &Y) {
4858
- return X.Iter == Y.Iter;
4859
- }
4860
-
4861
- friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4862
- const TemplateArgumentLocInventIterator &Y) {
4863
- return X.Iter != Y.Iter;
4864
- }
4865
- };
4866
-
4867
4903
template<typename Derived>
4868
4904
template<typename InputIterator>
4869
4905
bool TreeTransform<Derived>::TransformTemplateArguments(
0 commit comments