diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index a32a585531873..7389a48fe56fc 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -6561,7 +6561,11 @@ TreeTransform::TransformPackIndexingType(TypeLocBuilder &TLB, return QualType(); if (!ShouldExpand) { Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); - QualType Pack = getDerived().TransformType(T); + // FIXME: should we keep TypeLoc for individual expansions in + // PackIndexingTypeLoc? + TypeSourceInfo *TI = + SemaRef.getASTContext().getTrivialTypeSourceInfo(T, TL.getBeginLoc()); + QualType Pack = getDerived().TransformType(TLB, TI->getTypeLoc()); if (Pack.isNull()) return QualType(); if (NotYetExpanded) { diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp index 625a56031598b..e13635383b6ca 100644 --- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp +++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp @@ -135,3 +135,22 @@ using Splice = typename SpliceImpl::type; using type = Splice, IL<1, 2>>; static_assert(is_same>); } + + +namespace GH81697 { + +template struct tuple { + int __x0; +}; + +template +Ts...[I]& get(tuple& t) { + return t.__x0; +} + +void f() { + tuple x; + get<0>(x); +} + +}