Skip to content

Commit

Permalink
[clang] fix transformation of template arguments of 'auto' type const…
Browse files Browse the repository at this point in the history
…raints

See PR48617.

When assigning the new template arguments to the new TypeLoc, we were looping
on the argument count of the original TypeLoc instead of the new one,
which can be different when packs are present.

Signed-off-by: Matheus Izvekov <mizvekov@gmail.com>

Reviewed By: rsmith

Differential Revision: https://reviews.llvm.org/D109406

(cherry picked from commit 68b9d8e)
  • Loading branch information
mizvekov authored and tstellar committed Sep 8, 2021
1 parent 297e923 commit 02dece0
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
2 changes: 1 addition & 1 deletion clang/lib/Sema/TreeTransform.h
Original file line number Diff line number Diff line change
Expand Up @@ -6578,7 +6578,7 @@ QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
NewTL.setFoundDecl(TL.getFoundDecl());
NewTL.setLAngleLoc(TL.getLAngleLoc());
NewTL.setRAngleLoc(TL.getRAngleLoc());
for (unsigned I = 0; I < TL.getNumArgs(); ++I)
for (unsigned I = 0; I < NewTL.getNumArgs(); ++I)
NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());

return Result;
Expand Down
22 changes: 22 additions & 0 deletions clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,3 +76,25 @@ namespace PR48593 {
template<class> concept d = true;
d<,> auto e = 0; // expected-error{{expected expression}}
}

namespace PR48617 {
template <typename...> concept C = true;
template <typename...> class A {};

template <typename... Ts> C<Ts...> auto e(A<Ts...>) { return 0; }

// FIXME: The error here does not make sense.
template auto e<>(A<>);
// expected-error@-1 {{explicit instantiation of 'e' does not refer to a function template}}
// expected-note@-5 {{candidate template ignored: failed template argument deduction}}

// FIXME: Should be able to instantiate this with no errors.
template C<int> auto e<int>(A<int>);
// expected-error@-1 {{explicit instantiation of 'e' does not refer to a function template}}
// expected-note@-10 {{candidate template ignored: could not match 'C<int, Ts...> auto' against 'C<int> auto'}}

template C<> auto e<>(A<>);

template <typename... Ts> A<Ts...> c(Ts...);
int f = e(c(1, 2));
}

0 comments on commit 02dece0

Please sign in to comment.