Author: Younan Zhang
Date: 2026-10-15T08:59:39Z
New Revision: 24b1279fad0c5b1174ea7f85ddd632776a2bb4dc

URL: 
https://github.com/llvm/llvm-project/commit/24b1279fad0c5b1174ea7f85ddd632776a2bb4dc
DIFF: 
https://github.com/llvm/llvm-project/commit/24b1279fad0c5b1174ea7f85ddd632776a2bb4dc.diff

LOG: [Clang] Fix build of PackIndexingTypeLocs (#232194)

Their typelocs were not built correctly.

Assisted-by: LLDB and my hands

Added: 
    

Modified: 
    clang/include/clang/Sema/Sema.h
    clang/lib/Parse/ParseDeclCXX.cpp
    clang/lib/Parse/ParseExprCXX.cpp
    clang/lib/Sema/DeclSpec.cpp
    clang/lib/Sema/SemaCXXScopeSpec.cpp
    clang/lib/Sema/SemaDeclCXX.cpp
    clang/lib/Sema/SemaExprCXX.cpp
    clang/lib/Sema/SemaType.cpp
    clang/lib/Sema/TreeTransform.h
    clang/test/SemaCXX/cxx2c-pack-indexing.cpp
    clang/unittests/AST/SourceLocationTest.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index 711e083e4cedd5..865defa98a1b33 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -3505,10 +3505,9 @@ class Sema final : public SemaBase {
   bool ActOnCXXNestedNameSpecifierDecltype(CXXScopeSpec &SS, const DeclSpec 
&DS,
                                            SourceLocation ColonColonLoc);
 
-  bool ActOnCXXNestedNameSpecifierIndexedPack(CXXScopeSpec &SS,
-                                              const DeclSpec &DS,
-                                              SourceLocation ColonColonLoc,
-                                              QualType Type);
+  ParsedType ActOnCXXNestedNameSpecifierIndexedPack(
+      CXXScopeSpec &SS, const DeclSpec &DS, TypeSourceInfo *PatternLoc,
+      SourceLocation ColonColonLoc, QualType Type);
 
   /// IsInvalidUnlessNestedName - This method is used for error recovery
   /// purposes to determine whether the specified identifier is only valid as
@@ -15627,10 +15626,9 @@ class Sema final : public SemaBase {
   QualType BuildDecltypeType(Expr *E, bool AsUnevaluated = true);
 
   QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr,
-                                 SourceLocation Loc,
-                                 SourceLocation EllipsisLoc);
+                                 SourceLocation Loc);
   QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr,
-                                 SourceLocation Loc, SourceLocation 
EllipsisLoc,
+                                 SourceLocation Loc,
                                  bool FullySubstituted = false,
                                  ArrayRef<QualType> Expansions = {});
 

diff  --git a/clang/lib/Parse/ParseDeclCXX.cpp 
b/clang/lib/Parse/ParseDeclCXX.cpp
index aded5d96aa83f4..4cf445d68bdbe4 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -1157,8 +1157,11 @@ SourceLocation Parser::ParsePackIndexingType(DeclSpec 
&DS) {
     return Tok.getEndLoc();
   }
 
-  ParsedType Ty = Actions.getTypeName(*Tok.getIdentifierInfo(),
-                                      Tok.getLocation(), getCurScope());
+  ParsedType Ty = Actions.getTypeName(
+      *Tok.getIdentifierInfo(), Tok.getLocation(), getCurScope(),
+      /*SS=*/nullptr, /*isClassName=*/false, /*HasTrailingDot=*/false,
+      /*ObjectType=*/nullptr, /*IsCtorOrDtorName=*/false,
+      /*WantNontrivialTypeSourceInfo=*/true);
   if (!Ty) {
     DS.SetTypeSpecError();
     return Tok.getEndLoc();

diff  --git a/clang/lib/Parse/ParseExprCXX.cpp 
b/clang/lib/Parse/ParseExprCXX.cpp
index ea71efc9c9358c..3745ea53fc6d0d 100644
--- a/clang/lib/Parse/ParseExprCXX.cpp
+++ b/clang/lib/Parse/ParseExprCXX.cpp
@@ -205,10 +205,11 @@ bool Parser::ParseOptionalCXXScopeSpecifier(
       if (DS.getTypeSpecType() == DeclSpec::TST_error)
         return false;
 
-      QualType Pattern = Sema::GetTypeFromParser(DS.getRepAsType());
-      QualType Type =
-          Actions.ActOnPackIndexingType(Pattern, DS.getPackIndexingExpr(),
-                                        DS.getBeginLoc(), DS.getEllipsisLoc());
+      TypeSourceInfo *PatternTSI = nullptr;
+      QualType Pattern =
+          Sema::GetTypeFromParser(DS.getRepAsType(), &PatternTSI);
+      QualType Type = Actions.ActOnPackIndexingType(
+          Pattern, DS.getPackIndexingExpr(), DS.getBeginLoc());
 
       if (Type.isNull())
         return false;
@@ -226,13 +227,14 @@ bool Parser::ParseOptionalCXXScopeSpecifier(
           getCurScope()->isFunctionDeclarationScope())
         Diag(Start, diag::warn_pre_cxx26_ambiguous_pack_indexing_type) << Type;
 
-      if (!TryConsumeToken(tok::coloncolon, CCLoc)) {
-        AnnotateExistingIndexedTypeNamePack(ParsedType::make(Type), Start,
-                                            EndLoc);
+      TryConsumeToken(tok::coloncolon, CCLoc);
+      ParsedType T = Actions.ActOnCXXNestedNameSpecifierIndexedPack(
+          SS, DS, PatternTSI, CCLoc, Type);
+      if (CCLoc.isInvalid()) {
+        AnnotateExistingIndexedTypeNamePack(T, Start, EndLoc);
         return false;
       }
-      if (Actions.ActOnCXXNestedNameSpecifierIndexedPack(SS, DS, CCLoc,
-                                                         std::move(Type)))
+      if (!T)
         SS.SetInvalid(SourceRange(Start, CCLoc));
       HasScopeSpecifier = true;
     }

diff  --git a/clang/lib/Sema/DeclSpec.cpp b/clang/lib/Sema/DeclSpec.cpp
index 1bc3bb45dc8979..e83ba3db9f1fd6 100644
--- a/clang/lib/Sema/DeclSpec.cpp
+++ b/clang/lib/Sema/DeclSpec.cpp
@@ -774,15 +774,6 @@ bool DeclSpec::SetTypeSpecType(TST T, SourceLocation 
TagKwLoc,
   TSTLoc = TagKwLoc;
   TSTNameLoc = TagNameLoc;
   TypeSpecOwned = false;
-
-  if (T == TST_typename_pack_indexing) {
-    // we got there from a an annotation. Reconstruct the type
-    // Ugly...
-    QualType QT = Rep.get();
-    const PackIndexingType *LIT = cast<PackIndexingType>(QT);
-    TypeRep = ParsedType::make(LIT->getPattern());
-    PackIndexingExpr = LIT->getIndexExpr();
-  }
   return false;
 }
 

diff  --git a/clang/lib/Sema/SemaCXXScopeSpec.cpp 
b/clang/lib/Sema/SemaCXXScopeSpec.cpp
index 8a8636ac4c4a6a..5c365de4308316 100644
--- a/clang/lib/Sema/SemaCXXScopeSpec.cpp
+++ b/clang/lib/Sema/SemaCXXScopeSpec.cpp
@@ -853,28 +853,27 @@ bool 
Sema::ActOnCXXNestedNameSpecifierDecltype(CXXScopeSpec &SS,
   return false;
 }
 
-bool Sema::ActOnCXXNestedNameSpecifierIndexedPack(CXXScopeSpec &SS,
-                                                  const DeclSpec &DS,
-                                                  SourceLocation ColonColonLoc,
-                                                  QualType Type) {
+ParsedType Sema::ActOnCXXNestedNameSpecifierIndexedPack(
+    CXXScopeSpec &SS, const DeclSpec &DS, TypeSourceInfo *PatternLoc,
+    SourceLocation ColonColonLoc, QualType Type) {
   if (SS.isInvalid() || DS.getTypeSpecType() == DeclSpec::TST_error)
-    return true;
+    return ParsedType();
 
   assert(DS.getTypeSpecType() == DeclSpec::TST_typename_pack_indexing);
 
   if (Type.isNull())
-    return true;
+    return ParsedType();
 
   assert(SS.isEmpty());
 
   TypeLocBuilder TLB;
-  TLB.pushTrivial(getASTContext(),
-                  cast<PackIndexingType>(Type.getTypePtr())->getPattern(),
-                  DS.getBeginLoc());
+  TLB.pushFullCopy(PatternLoc->getTypeLoc());
   PackIndexingTypeLoc PIT = TLB.push<PackIndexingTypeLoc>(Type);
   PIT.setEllipsisLoc(DS.getEllipsisLoc());
-  SS.Make(Context, TLB.getTypeLocInContext(Context, Type), ColonColonLoc);
-  return false;
+  TypeSourceInfo *TSI = TLB.getTypeSourceInfo(Context, Type);
+  if (ColonColonLoc.isValid())
+    SS.Make(Context, TSI->getTypeLoc(), ColonColonLoc);
+  return CreateParsedType(Type, TSI);
 }
 
 bool Sema::IsInvalidUnlessNestedName(Scope *S, CXXScopeSpec &SS,

diff  --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index f80fb2a3446b38..cd9771526bee37 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -4535,9 +4535,9 @@ Sema::BuildMemInitializer(Decl *ConstructorD,
     Diag(DS.getTypeSpecTypeLoc(), diag::err_decltype_auto_invalid);
     return true;
   } else if (DS.getTypeSpecType() == TST_typename_pack_indexing) {
-    BaseType =
-        BuildPackIndexingType(DS.getRepAsType().get(), 
DS.getPackIndexingExpr(),
-                              DS.getBeginLoc(), DS.getEllipsisLoc());
+    BaseType = GetTypeFromParser(DS.getRepAsType(), &TInfo);
+    if (BaseType.isNull())
+      return true;
   } else {
     LookupResult R(*this, MemberOrBase, IdLoc, LookupOrdinaryName);
     LookupParsedName(R, S, &SS, /*ObjectType=*/QualType());

diff  --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index d9bd060f7a0bf9..916c5308508f10 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -7548,11 +7548,10 @@ ExprResult Sema::ActOnPseudoDestructorExpr(Scope *S, 
Expr *Base,
     break;
   }
   case DeclSpec::TST_typename_pack_indexing: {
-    T = ActOnPackIndexingType(DS.getRepAsType().get(), 
DS.getPackIndexingExpr(),
-                              DS.getBeginLoc(), DS.getEllipsisLoc());
-    TLB.pushTrivial(getASTContext(),
-                    cast<PackIndexingType>(T.getTypePtr())->getPattern(),
-                    DS.getBeginLoc());
+    TypeSourceInfo *TSI = nullptr;
+    T = GetTypeFromParser(DS.getRepAsType(), &TSI);
+    T = ActOnPackIndexingType(T, DS.getPackIndexingExpr(), DS.getBeginLoc());
+    TLB.pushFullCopy(TSI->getTypeLoc());
     PackIndexingTypeLoc PITL = TLB.push<PackIndexingTypeLoc>(T);
     PITL.setEllipsisLoc(DS.getEllipsisLoc());
     break;

diff  --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index 1cb96b556971ad..3d444bfabc8c39 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -1298,11 +1298,7 @@ static QualType 
ConvertDeclSpecToType(TypeProcessingState &state) {
     break;
   }
   case DeclSpec::TST_typename_pack_indexing: {
-    Expr *E = DS.getPackIndexingExpr();
-    assert(E && "Didn't get an expression for pack indexing");
-    QualType Pattern = S.GetTypeFromParser(DS.getRepAsType());
-    Result = S.BuildPackIndexingType(Pattern, E, DS.getBeginLoc(),
-                                     DS.getEllipsisLoc());
+    Result = S.GetTypeFromParser(DS.getRepAsType());
     if (Result.isNull()) {
       declarator.setInvalidType(true);
       Result = Context.IntTy;
@@ -6121,7 +6117,9 @@ namespace {
     }
     void VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
       assert(DS.getTypeSpecType() == DeclSpec::TST_typename_pack_indexing);
-      TL.setEllipsisLoc(DS.getEllipsisLoc());
+      TypeSourceInfo *TInfo = nullptr;
+      Sema::GetTypeFromParser(DS.getRepAsType(), &TInfo);
+      TL.copy(TInfo->getTypeLoc());
     }
     void VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
       assert(DS.isTransformTypeTrait(DS.getTypeSpecType()));
@@ -10185,8 +10183,7 @@ QualType Sema::BuildDecltypeType(Expr *E, bool 
AsUnevaluated) {
 }
 
 QualType Sema::ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr,
-                                     SourceLocation Loc,
-                                     SourceLocation EllipsisLoc) {
+                                     SourceLocation Loc) {
   if (!IndexExpr)
     return QualType();
 
@@ -10194,7 +10191,7 @@ QualType Sema::ActOnPackIndexingType(QualType Pattern, 
Expr *IndexExpr,
   if (!Pattern->containsUnexpandedParameterPack())
     Diag(Loc, diag::err_expected_name_of_pack) << Pattern;
 
-  QualType Type = BuildPackIndexingType(Pattern, IndexExpr, Loc, EllipsisLoc);
+  QualType Type = BuildPackIndexingType(Pattern, IndexExpr, Loc);
 
   if (!Type.isNull())
     DiagCompat(Loc, diag_compat::pack_indexing);
@@ -10202,9 +10199,7 @@ QualType Sema::ActOnPackIndexingType(QualType Pattern, 
Expr *IndexExpr,
 }
 
 QualType Sema::BuildPackIndexingType(QualType Pattern, Expr *IndexExpr,
-                                     SourceLocation Loc,
-                                     SourceLocation EllipsisLoc,
-                                     bool FullySubstituted,
+                                     SourceLocation Loc, bool FullySubstituted,
                                      ArrayRef<QualType> Expansions) {
 
   UnsignedOrNone Index = std::nullopt;

diff  --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 8a071150ea20a1..25e9113aeb7a46 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -1137,9 +1137,7 @@ class TreeTransform {
   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
 
   QualType RebuildPackIndexingType(QualType Pattern, Expr *IndexExpr,
-                                   SourceLocation Loc,
-                                   SourceLocation EllipsisLoc,
-                                   bool FullySubstituted,
+                                   SourceLocation Loc, bool FullySubstituted,
                                    ArrayRef<QualType> Expansions = {});
 
   /// Build a new C++11 auto type.
@@ -7287,8 +7285,7 @@ 
TreeTransform<Derived>::TransformPackIndexingType(TypeLocBuilder &TLB,
       if (NotYetExpanded) {
         FullySubstituted = false;
         QualType Out = getDerived().RebuildPackIndexingType(
-            Pack, IndexExpr.get(), SourceLocation(), TL.getEllipsisLoc(),
-            FullySubstituted);
+            Pack, IndexExpr.get(), TL.getBeginLoc(), FullySubstituted);
         if (Out.isNull())
           return QualType();
 
@@ -7326,8 +7323,8 @@ 
TreeTransform<Derived>::TransformPackIndexingType(TypeLocBuilder &TLB,
   QualType Result = getDerived().TransformType(TLB, TL.getPatternLoc());
 
   QualType Out = getDerived().RebuildPackIndexingType(
-      Result, IndexExpr.get(), SourceLocation(), TL.getEllipsisLoc(),
-      FullySubstituted, SubtitutedTypes);
+      Result, IndexExpr.get(), TL.getBeginLoc(), FullySubstituted,
+      SubtitutedTypes);
   if (Out.isNull())
     return Out;
 
@@ -18339,9 +18336,8 @@ QualType 
TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) {
 template <typename Derived>
 QualType TreeTransform<Derived>::RebuildPackIndexingType(
     QualType Pattern, Expr *IndexExpr, SourceLocation Loc,
-    SourceLocation EllipsisLoc, bool FullySubstituted,
-    ArrayRef<QualType> Expansions) {
-  return SemaRef.BuildPackIndexingType(Pattern, IndexExpr, Loc, EllipsisLoc,
+    bool FullySubstituted, ArrayRef<QualType> Expansions) {
+  return SemaRef.BuildPackIndexingType(Pattern, IndexExpr, Loc,
                                        FullySubstituted, Expansions);
 }
 

diff  --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp 
b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp
index 0892394955a603..bbd708d3b63f52 100644
--- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp
+++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp
@@ -370,7 +370,7 @@ void foo(auto...x){
     //expected-error@-1 {{invalid index 4294967296 for pack 'x' of size 1}}
 
     using T1 = T...[(__int128)18446744073709551615U+1];
-    // expected-warning@-1 3{{implicit conversion from '__int128' to 
'__size_t'}}
+    // expected-warning@-1 2{{implicit conversion from '__int128' to 
'__size_t'}}
     // expected-error@-2   2{{evaluates to 18446744073709551616, which cannot 
be narrowed to type '__size_t' (aka 'unsigned long')}}
 }
 int test(){

diff  --git a/clang/unittests/AST/SourceLocationTest.cpp 
b/clang/unittests/AST/SourceLocationTest.cpp
index 021b2dfac40607..06993a0270300d 100644
--- a/clang/unittests/AST/SourceLocationTest.cpp
+++ b/clang/unittests/AST/SourceLocationTest.cpp
@@ -1091,6 +1091,26 @@ template <X::CCC<int> T> void print(T object);
   EXPECT_TRUE(Verifier.match(Code3, templateTypeParmDecl(), Lang_CXX20));
 }
 
+class PackIndexingTypeLocVerifier : public RangeVerifier<TypeLoc> {
+protected:
+  SourceRange getRange(const TypeLoc &Node) override {
+    PackIndexingTypeLoc TL = Node.getAs<PackIndexingTypeLoc>();
+    assert(!TL.isNull());
+    return SourceRange(TL.getPatternLoc().getBeginLoc(), TL.getEllipsisLoc());
+  }
+};
+
+TEST(PackIndexingTypeLoc, PatternAndEllipsisLoc) {
+  PackIndexingTypeLocVerifier Verifier;
+  // FIXME: There's no packIndexingType matcher yet.
+  Verifier.expectRange(2, 8, 2, 9);
+  EXPECT_TRUE(Verifier.match(
+      R"cpp(template <class... T> void foo() {
+       T...[0] x;
+  })cpp",
+      typeLoc(hasParent(varDecl(hasName("x")))), Lang_CXX26));
+}
+
 class ConceptSpecializationExprConceptReferenceRangeVerifier
     : public RangeVerifier<VarTemplateDecl> {
 protected:


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to