[PATCH] D125986: [clang][ASTImporter] Add support for import of UsingPackDecl.

2022-06-01 Thread Balázs Kéri via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGd597a461e0f5: [clang][ASTImporter] Add support for import of 
UsingPackDecl. (authored by balazske).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D125986/new/

https://reviews.llvm.org/D125986

Files:
  clang/lib/AST/ASTImporter.cpp
  clang/unittests/AST/ASTImporterTest.cpp

Index: clang/unittests/AST/ASTImporterTest.cpp
===
--- clang/unittests/AST/ASTImporterTest.cpp
+++ clang/unittests/AST/ASTImporterTest.cpp
@@ -910,6 +910,20 @@
  functionDecl(hasDescendant(usingEnumDecl(hasName("bar");
 }
 
+const internal::VariadicDynCastAllOfMatcher usingPackDecl;
+
+TEST_P(ImportDecl, ImportUsingPackDecl) {
+  MatchVerifier Verifier;
+  testImport(
+  "struct A { int operator()() { return 1; } };"
+  "struct B { int operator()() { return 2; } };"
+  "template struct C : T... { using T::operator()...; };"
+  "C declToImport;",
+  Lang_CXX20, "", Lang_CXX20, Verifier,
+  varDecl(hasType(templateSpecializationType(hasDeclaration(
+  classTemplateSpecializationDecl(hasDescendant(usingPackDecl(;
+}
+
 /// \brief Matches shadow declarations introduced into a scope by a
 ///(resolved) using declaration.
 ///
@@ -1022,6 +1036,31 @@
  has(fieldDecl(hasType(dependentSizedArrayType(;
 }
 
+TEST_P(ASTImporterOptionSpecificTestBase, ImportUsingPackDecl) {
+  Decl *FromTU = getTuDecl(
+  "struct A { int operator()() { return 1; } };"
+  "struct B { int operator()() { return 2; } };"
+  "template struct C : T... { using T::operator()...; };"
+  "C Var;",
+  Lang_CXX20);
+
+  auto From = FirstDeclMatcher().match(FromTU, usingPackDecl());
+  ASSERT_TRUE(From);
+  auto To = cast(Import(From, Lang_CXX20));
+  ASSERT_TRUE(To);
+
+  ArrayRef FromExpansions = From->expansions();
+  ArrayRef ToExpansions = To->expansions();
+  ASSERT_EQ(FromExpansions.size(), ToExpansions.size());
+  for (unsigned int I = 0; I < FromExpansions.size(); ++I) {
+auto ImportedExpansion = Import(FromExpansions[I], Lang_CXX20);
+EXPECT_EQ(ImportedExpansion, ToExpansions[I]);
+  }
+
+  auto ImportedDC = cast(Import(From->getDeclContext(), Lang_CXX20));
+  EXPECT_EQ(ImportedDC, cast(To->getDeclContext()));
+}
+
 TEST_P(ASTImporterOptionSpecificTestBase, TemplateTypeParmDeclNoDefaultArg) {
   Decl *FromTU = getTuDecl("template struct X {};", Lang_CXX03);
   auto From = FirstDeclMatcher().match(
Index: clang/lib/AST/ASTImporter.cpp
===
--- clang/lib/AST/ASTImporter.cpp
+++ clang/lib/AST/ASTImporter.cpp
@@ -548,6 +548,7 @@
 ExpectedDecl VisitUsingDecl(UsingDecl *D);
 ExpectedDecl VisitUsingShadowDecl(UsingShadowDecl *D);
 ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
+ExpectedDecl VisitUsingPackDecl(UsingPackDecl *D);
 ExpectedDecl ImportUsingShadowDecls(BaseUsingDecl *D, BaseUsingDecl *ToSI);
 ExpectedDecl VisitUsingEnumDecl(UsingEnumDecl *D);
 ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
@@ -4832,6 +4833,35 @@
   return ToUsingDir;
 }
 
+ExpectedDecl ASTNodeImporter::VisitUsingPackDecl(UsingPackDecl *D) {
+  DeclContext *DC, *LexicalDC;
+  DeclarationName Name;
+  SourceLocation Loc;
+  NamedDecl *ToD = nullptr;
+  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
+return std::move(Err);
+  if (ToD)
+return ToD;
+
+  auto ToInstantiatedFromUsingOrErr =
+  Importer.Import(D->getInstantiatedFromUsingDecl());
+  if (!ToInstantiatedFromUsingOrErr)
+return ToInstantiatedFromUsingOrErr.takeError();
+  SmallVector Expansions(D->expansions().size());
+  if (Error Err = ImportArrayChecked(D->expansions(), Expansions.begin()))
+return std::move(Err);
+
+  UsingPackDecl *ToUsingPack;
+  if (GetImportedOrCreateDecl(ToUsingPack, D, Importer.getToContext(), DC,
+  cast(*ToInstantiatedFromUsingOrErr),
+  Expansions))
+return ToUsingPack;
+
+  addDeclToContexts(D, ToUsingPack);
+
+  return ToUsingPack;
+}
+
 ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingValueDecl(
 UnresolvedUsingValueDecl *D) {
   DeclContext *DC, *LexicalDC;
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D125986: [clang][ASTImporter] Add support for import of UsingPackDecl.

2022-05-26 Thread Gabor Marton via Phabricator via cfe-commits
martong accepted this revision.
martong added a comment.
This revision is now accepted and ready to land.

LGTM! Thanks! And sorry for the delay in the review, please ping me next time.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D125986/new/

https://reviews.llvm.org/D125986

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D125986: [clang][ASTImporter] Add support for import of UsingPackDecl.

2022-05-20 Thread Balázs Kéri via Phabricator via cfe-commits
balazske updated this revision to Diff 430990.
balazske added a comment.

Use of addDeclToContexts, added new test.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D125986/new/

https://reviews.llvm.org/D125986

Files:
  clang/lib/AST/ASTImporter.cpp
  clang/unittests/AST/ASTImporterTest.cpp

Index: clang/unittests/AST/ASTImporterTest.cpp
===
--- clang/unittests/AST/ASTImporterTest.cpp
+++ clang/unittests/AST/ASTImporterTest.cpp
@@ -910,6 +910,20 @@
  functionDecl(hasDescendant(usingEnumDecl(hasName("bar");
 }
 
+const internal::VariadicDynCastAllOfMatcher usingPackDecl;
+
+TEST_P(ImportDecl, ImportUsingPackDecl) {
+  MatchVerifier Verifier;
+  testImport(
+  "struct A { int operator()() { return 1; } };"
+  "struct B { int operator()() { return 2; } };"
+  "template struct C : T... { using T::operator()...; };"
+  "C declToImport;",
+  Lang_CXX20, "", Lang_CXX20, Verifier,
+  varDecl(hasType(templateSpecializationType(hasDeclaration(
+  classTemplateSpecializationDecl(hasDescendant(usingPackDecl(;
+}
+
 /// \brief Matches shadow declarations introduced into a scope by a
 ///(resolved) using declaration.
 ///
@@ -1022,6 +1036,31 @@
  has(fieldDecl(hasType(dependentSizedArrayType(;
 }
 
+TEST_P(ASTImporterOptionSpecificTestBase, ImportUsingPackDecl) {
+  Decl *FromTU = getTuDecl(
+  "struct A { int operator()() { return 1; } };"
+  "struct B { int operator()() { return 2; } };"
+  "template struct C : T... { using T::operator()...; };"
+  "C Var;",
+  Lang_CXX20);
+
+  auto From = FirstDeclMatcher().match(FromTU, usingPackDecl());
+  ASSERT_TRUE(From);
+  auto To = cast(Import(From, Lang_CXX20));
+  ASSERT_TRUE(To);
+
+  ArrayRef FromExpansions = From->expansions();
+  ArrayRef ToExpansions = To->expansions();
+  ASSERT_EQ(FromExpansions.size(), ToExpansions.size());
+  for (unsigned int I = 0; I < FromExpansions.size(); ++I) {
+auto ImportedExpansion = Import(FromExpansions[I], Lang_CXX20);
+EXPECT_EQ(ImportedExpansion, ToExpansions[I]);
+  }
+
+  auto ImportedDC = cast(Import(From->getDeclContext(), Lang_CXX20));
+  EXPECT_EQ(ImportedDC, cast(To->getDeclContext()));
+}
+
 TEST_P(ASTImporterOptionSpecificTestBase, TemplateTypeParmDeclNoDefaultArg) {
   Decl *FromTU = getTuDecl("template struct X {};", Lang_CXX03);
   auto From = FirstDeclMatcher().match(
Index: clang/lib/AST/ASTImporter.cpp
===
--- clang/lib/AST/ASTImporter.cpp
+++ clang/lib/AST/ASTImporter.cpp
@@ -548,6 +548,7 @@
 ExpectedDecl VisitUsingDecl(UsingDecl *D);
 ExpectedDecl VisitUsingShadowDecl(UsingShadowDecl *D);
 ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
+ExpectedDecl VisitUsingPackDecl(UsingPackDecl *D);
 ExpectedDecl ImportUsingShadowDecls(BaseUsingDecl *D, BaseUsingDecl *ToSI);
 ExpectedDecl VisitUsingEnumDecl(UsingEnumDecl *D);
 ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
@@ -4832,6 +4833,35 @@
   return ToUsingDir;
 }
 
+ExpectedDecl ASTNodeImporter::VisitUsingPackDecl(UsingPackDecl *D) {
+  DeclContext *DC, *LexicalDC;
+  DeclarationName Name;
+  SourceLocation Loc;
+  NamedDecl *ToD = nullptr;
+  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
+return std::move(Err);
+  if (ToD)
+return ToD;
+
+  auto ToInstantiatedFromUsingOrErr =
+  Importer.Import(D->getInstantiatedFromUsingDecl());
+  if (!ToInstantiatedFromUsingOrErr)
+return ToInstantiatedFromUsingOrErr.takeError();
+  SmallVector Expansions(D->expansions().size());
+  if (Error Err = ImportArrayChecked(D->expansions(), Expansions.begin()))
+return std::move(Err);
+
+  UsingPackDecl *ToUsingPack;
+  if (GetImportedOrCreateDecl(ToUsingPack, D, Importer.getToContext(), DC,
+  cast(*ToInstantiatedFromUsingOrErr),
+  Expansions))
+return ToUsingPack;
+
+  addDeclToContexts(D, ToUsingPack);
+
+  return ToUsingPack;
+}
+
 ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingValueDecl(
 UnresolvedUsingValueDecl *D) {
   DeclContext *DC, *LexicalDC;
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D125986: [clang][ASTImporter] Add support for import of UsingPackDecl.

2022-05-20 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a reviewer: martong.
balazske added inline comments.
Herald added a subscriber: rnkovacs.



Comment at: clang/lib/AST/ASTImporter.cpp:4861
+  ToUsingPack->setLexicalDeclContext(LexicalDC);
+  LexicalDC->addDeclInternal(ToUsingPack);
+

martong wrote:
> Why don't we use `addDeclToContexts`?
I do not know, it is not used in the other import functions of `using` related 
declarations. Probably only lexical DC is applicable for these, or the code is 
older than `addDeclToContexts` and was not updated. But then the other import 
functions should be changed too.



Comment at: clang/unittests/AST/ASTImporterTest.cpp:925
+  classTemplateSpecializationDecl(hasDescendant(usingPackDecl(;
+}
+

martong wrote:
> Should we also check if the DeclContext and the Extensions are properly set?
I will add a more detailed test.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D125986/new/

https://reviews.llvm.org/D125986

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D125986: [clang][ASTImporter] Add support for import of UsingPackDecl.

2022-05-20 Thread Gabor Marton via Phabricator via cfe-commits
martong added inline comments.



Comment at: clang/lib/AST/ASTImporter.cpp:4861
+  ToUsingPack->setLexicalDeclContext(LexicalDC);
+  LexicalDC->addDeclInternal(ToUsingPack);
+

Why don't we use `addDeclToContexts`?



Comment at: clang/unittests/AST/ASTImporterTest.cpp:925
+  classTemplateSpecializationDecl(hasDescendant(usingPackDecl(;
+}
+

Should we also check if the DeclContext and the Extensions are properly set?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D125986/new/

https://reviews.llvm.org/D125986

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D125986: [clang][ASTImporter] Add support for import of UsingPackDecl.

2022-05-19 Thread Balázs Kéri via Phabricator via cfe-commits
balazske created this revision.
Herald added subscribers: steakhal, martong, gamesh411, Szelethus, dkrupp.
Herald added a reviewer: a.sidorin.
Herald added a reviewer: shafik.
Herald added a project: All.
balazske requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D125986

Files:
  clang/lib/AST/ASTImporter.cpp
  clang/unittests/AST/ASTImporterTest.cpp


Index: clang/unittests/AST/ASTImporterTest.cpp
===
--- clang/unittests/AST/ASTImporterTest.cpp
+++ clang/unittests/AST/ASTImporterTest.cpp
@@ -910,6 +910,20 @@
  functionDecl(hasDescendant(usingEnumDecl(hasName("bar");
 }
 
+const internal::VariadicDynCastAllOfMatcher usingPackDecl;
+
+TEST_P(ImportDecl, ImportUsingPackDecl) {
+  MatchVerifier Verifier;
+  testImport(
+  "struct A { int operator()() { return 1; } };"
+  "struct B { int operator()() { return 2; } };"
+  "template struct C : T... { using T::operator()...; };"
+  "C declToImport;",
+  Lang_CXX20, "", Lang_CXX20, Verifier,
+  varDecl(hasType(templateSpecializationType(hasDeclaration(
+  classTemplateSpecializationDecl(hasDescendant(usingPackDecl(;
+}
+
 /// \brief Matches shadow declarations introduced into a scope by a
 ///(resolved) using declaration.
 ///
Index: clang/lib/AST/ASTImporter.cpp
===
--- clang/lib/AST/ASTImporter.cpp
+++ clang/lib/AST/ASTImporter.cpp
@@ -548,6 +548,7 @@
 ExpectedDecl VisitUsingDecl(UsingDecl *D);
 ExpectedDecl VisitUsingShadowDecl(UsingShadowDecl *D);
 ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
+ExpectedDecl VisitUsingPackDecl(UsingPackDecl *D);
 ExpectedDecl ImportUsingShadowDecls(BaseUsingDecl *D, BaseUsingDecl *ToSI);
 ExpectedDecl VisitUsingEnumDecl(UsingEnumDecl *D);
 ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
@@ -4832,6 +4833,36 @@
   return ToUsingDir;
 }
 
+ExpectedDecl ASTNodeImporter::VisitUsingPackDecl(UsingPackDecl *D) {
+  DeclContext *DC, *LexicalDC;
+  DeclarationName Name;
+  SourceLocation Loc;
+  NamedDecl *ToD = nullptr;
+  if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
+return std::move(Err);
+  if (ToD)
+return ToD;
+
+  auto ToInstantiatedFromUsingOrErr =
+  Importer.Import(D->getInstantiatedFromUsingDecl());
+  if (!ToInstantiatedFromUsingOrErr)
+return ToInstantiatedFromUsingOrErr.takeError();
+  SmallVector Expansions(D->expansions().size());
+  if (Error Err = ImportArrayChecked(D->expansions(), Expansions.begin()))
+return std::move(Err);
+
+  UsingPackDecl *ToUsingPack;
+  if (GetImportedOrCreateDecl(ToUsingPack, D, Importer.getToContext(), DC,
+  cast(*ToInstantiatedFromUsingOrErr),
+  Expansions))
+return ToUsingPack;
+
+  ToUsingPack->setLexicalDeclContext(LexicalDC);
+  LexicalDC->addDeclInternal(ToUsingPack);
+
+  return ToUsingPack;
+}
+
 ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingValueDecl(
 UnresolvedUsingValueDecl *D) {
   DeclContext *DC, *LexicalDC;


Index: clang/unittests/AST/ASTImporterTest.cpp
===
--- clang/unittests/AST/ASTImporterTest.cpp
+++ clang/unittests/AST/ASTImporterTest.cpp
@@ -910,6 +910,20 @@
  functionDecl(hasDescendant(usingEnumDecl(hasName("bar");
 }
 
+const internal::VariadicDynCastAllOfMatcher usingPackDecl;
+
+TEST_P(ImportDecl, ImportUsingPackDecl) {
+  MatchVerifier Verifier;
+  testImport(
+  "struct A { int operator()() { return 1; } };"
+  "struct B { int operator()() { return 2; } };"
+  "template struct C : T... { using T::operator()...; };"
+  "C declToImport;",
+  Lang_CXX20, "", Lang_CXX20, Verifier,
+  varDecl(hasType(templateSpecializationType(hasDeclaration(
+  classTemplateSpecializationDecl(hasDescendant(usingPackDecl(;
+}
+
 /// \brief Matches shadow declarations introduced into a scope by a
 ///(resolved) using declaration.
 ///
Index: clang/lib/AST/ASTImporter.cpp
===
--- clang/lib/AST/ASTImporter.cpp
+++ clang/lib/AST/ASTImporter.cpp
@@ -548,6 +548,7 @@
 ExpectedDecl VisitUsingDecl(UsingDecl *D);
 ExpectedDecl VisitUsingShadowDecl(UsingShadowDecl *D);
 ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
+ExpectedDecl VisitUsingPackDecl(UsingPackDecl *D);
 ExpectedDecl ImportUsingShadowDecls(BaseUsingDecl *D, BaseUsingDecl *ToSI);
 ExpectedDecl VisitUsingEnumDecl(UsingEnumDecl *D);
 ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
@@ -4832,6 +4833,36 @@
   return ToUsingDir;
 }
 
+ExpectedDecl ASTNodeImporter::VisitUsingPackDecl(UsingPackDecl