[clang-tools-extra] 0e54581 - [include-cleaner] Handle dependent type members in AST.

2022-12-19 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2022-12-19T12:45:41Z
New Revision: 0e545816a9e582af29ea4b9441fea8ed376cf52a

URL: 
https://github.com/llvm/llvm-project/commit/0e545816a9e582af29ea4b9441fea8ed376cf52a
DIFF: 
https://github.com/llvm/llvm-project/commit/0e545816a9e582af29ea4b9441fea8ed376cf52a.diff

LOG: [include-cleaner] Handle dependent type members in AST.

Handles dependent type members in AST.

Fix: https://github.com/llvm/llvm-project/issues/59354
Differential Revision: https://reviews.llvm.org/D139409

Added: 


Modified: 
clang-tools-extra/include-cleaner/lib/WalkAST.cpp
clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp

Removed: 




diff  --git a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp 
b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp
index 639add8f5c4be..cf2373d43389d 100644
--- a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp
+++ b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp
@@ -84,6 +84,10 @@ class ASTWalker : public RecursiveASTVisitor {
 report(E->getMemberLoc(), getMemberProvider(Type));
 return true;
   }
+  bool VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E) {
+report(E->getMemberLoc(), getMemberProvider(E->getBaseType()));
+return true;
+  }
 
   bool VisitCXXConstructExpr(CXXConstructExpr *E) {
 report(E->getLocation(), E->getConstructor(),

diff  --git a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp 
b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
index cb41ebb35cd58..2a2fbc438ab9b 100644
--- a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
+++ b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
@@ -229,6 +229,13 @@ TEST(WalkAST, MemberExprs) {
   namespace ns { template struct Foo { int a; }; }
   using ns::$explicit^Foo;)cpp",
"void k(Foo b) { b.^a; }");
+  // Test the dependent-type case (CXXDependentScopeMemberExpr)
+  testWalk("template struct $explicit^Base { void method(); };",
+   "template void k(Base t) { t.^method(); }");
+  testWalk("template struct $explicit^Base { void method(); };",
+   "template void k(Base& t) { t.^method(); }");
+  testWalk("template struct $explicit^Base { void method(); };",
+   "template void k(Base* t) { t->^method(); }");
 }
 
 TEST(WalkAST, ConstructExprs) {



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


[clang-tools-extra] 81c3739 - [include-cleaner] Use expansion locations for macros.

2022-12-19 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2022-12-19T14:18:16Z
New Revision: 81c3739156fe2e98160fb4364ed78edacc293a68

URL: 
https://github.com/llvm/llvm-project/commit/81c3739156fe2e98160fb4364ed78edacc293a68
DIFF: 
https://github.com/llvm/llvm-project/commit/81c3739156fe2e98160fb4364ed78edacc293a68.diff

LOG: [include-cleaner] Use expansion locations for macros.

Use expansion locations for target symbol decls when finding headers for macros.
Fix: https://github.com/llvm/llvm-project/issues/59392
Differential Revision: https://reviews.llvm.org/D139716

Added: 


Modified: 
clang-tools-extra/include-cleaner/lib/FindHeaders.cpp
clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp

Removed: 




diff  --git a/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp 
b/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp
index b9e6e29a00667..8f38c95375fc3 100644
--- a/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp
+++ b/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp
@@ -18,8 +18,7 @@ llvm::SmallVector findHeaders(const SymbolLocation 
&Loc,
   llvm::SmallVector Results;
   switch (Loc.kind()) {
   case SymbolLocation::Physical: {
-// FIXME: Handle macro locations.
-FileID FID = SM.getFileID(Loc.physical());
+FileID FID = SM.getFileID(SM.getExpansionLoc(Loc.physical()));
 const FileEntry *FE = SM.getFileEntryForID(FID);
 if (!PI) {
   return FE ? llvm::SmallVector{Header(FE)}

diff  --git a/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp 
b/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp
index d1a21ab685346..ad5961699834c 100644
--- a/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp
+++ b/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp
@@ -7,11 +7,17 @@
 
//===--===//
 
 #include "AnalysisInternal.h"
+#include "clang-include-cleaner/Analysis.h"
 #include "clang-include-cleaner/Record.h"
+#include "clang-include-cleaner/Types.h"
+#include "clang/AST/RecursiveASTVisitor.h"
 #include "clang/Basic/FileEntry.h"
 #include "clang/Basic/FileManager.h"
 #include "clang/Frontend/FrontendActions.h"
 #include "clang/Testing/TestAST.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/Support/raw_ostream.h"
+#include "llvm/Testing/Support/Annotations.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include 
@@ -31,7 +37,7 @@ class FindHeadersTest : public testing::Test {
   std::unique_ptr AST;
   FindHeadersTest() {
 Inputs.MakeAction = [this] {
-  struct Hook : public PreprocessOnlyAction {
+  struct Hook : public SyntaxOnlyAction {
   public:
 Hook(PragmaIncludes *Out) : Out(Out) {}
 bool BeginSourceFileAction(clang::CompilerInstance &CI) override {
@@ -153,5 +159,60 @@ TEST_F(FindHeadersTest, NonSelfContainedTraverseExporter) {
physicalHeader("exporter.h")));
 }
 
+TEST_F(FindHeadersTest, TargetIsExpandedFromMacroInHeader) {
+  struct CustomVisitor : RecursiveASTVisitor {
+const Decl *Out = nullptr;
+bool VisitNamedDecl(const NamedDecl *ND) {
+  if (ND->getName() == "FLAG_foo" || ND->getName() == "Foo") {
+EXPECT_TRUE(Out == nullptr);
+Out = ND;
+  }
+  return true;
+}
+  };
+
+  struct {
+llvm::StringRef MacroHeader;
+llvm::StringRef DeclareHeader;
+  } TestCases[] = {
+  {/*MacroHeader=*/R"cpp(
+#define DEFINE_CLASS(name) class name {};
+  )cpp",
+   /*DeclareHeader=*/R"cpp(
+#include "macro.h"
+DEFINE_CLASS(Foo)
+  )cpp"},
+  {/*MacroHeader=*/R"cpp(
+#define DEFINE_Foo class Foo {};
+  )cpp",
+   /*DeclareHeader=*/R"cpp(
+#include "macro.h"
+DEFINE_Foo
+  )cpp"},
+  {/*MacroHeader=*/R"cpp(
+#define DECLARE_FLAGS(name) extern int FLAG_##name
+  )cpp",
+   /*DeclareHeader=*/R"cpp(
+#include "macro.h"
+DECLARE_FLAGS(foo);
+  )cpp"},
+  };
+
+  for (const auto &T : TestCases) {
+Inputs.Code = R"cpp(#include "declare.h")cpp";
+Inputs.ExtraFiles["declare.h"] = guard(T.DeclareHeader);
+Inputs.ExtraFiles["macro.h"] = guard(T.MacroHeader);
+buildAST();
+
+CustomVisitor Visitor;
+Visitor.TraverseDecl(AST->context().getTranslationUnitDecl());
+
+llvm::SmallVector Headers = clang::include_cleaner::findHeaders(
+Visitor.Out->getLocation(), AST->sourceManager(),
+/*PragmaIncludes=*/nullptr);
+EXPECT_THAT(Headers, UnorderedElementsAre(physicalHeader("declare.h")));
+  }
+}
+
 } // namespace
 } // namespace clang::include_cleaner



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


[clang-tools-extra] de81dc8 - [include-cleaner] Filter template instantiations from AST roots.

2023-01-09 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-01-09T12:54:20Z
New Revision: de81dc8fdf2764fb14a3c70e5e845cfd7f3b366c

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

LOG: [include-cleaner] Filter template instantiations from AST roots.

Fix: https://github.com/llvm/llvm-project/issues/59825
Differential Revision: https://reviews.llvm.org/D141271

Added: 


Modified: 
clang-tools-extra/include-cleaner/lib/Record.cpp
clang-tools-extra/include-cleaner/unittests/RecordTest.cpp

Removed: 




diff  --git a/clang-tools-extra/include-cleaner/lib/Record.cpp 
b/clang-tools-extra/include-cleaner/lib/Record.cpp
index ab5a2415cbf9..4df65959011c 100644
--- a/clang-tools-extra/include-cleaner/lib/Record.cpp
+++ b/clang-tools-extra/include-cleaner/lib/Record.cpp
@@ -12,6 +12,7 @@
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/DeclGroup.h"
 #include "clang/Basic/SourceManager.h"
+#include "clang/Basic/Specifiers.h"
 #include "clang/Frontend/CompilerInstance.h"
 #include "clang/Lex/MacroInfo.h"
 #include "clang/Lex/PPCallbacks.h"
@@ -352,6 +353,14 @@ bool PragmaIncludes::isPrivate(const FileEntry *FE) const {
   return IWYUPublic.find(FE->getUniqueID()) != IWYUPublic.end();
 }
 
+namespace {
+template  bool isImplicitTemplateSpecialization(const Decl *D) {
+  if (const auto *TD = dyn_cast(D))
+return TD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation;
+  return false;
+}
+} // namespace
+
 std::unique_ptr RecordedAST::record() {
   class Recorder : public ASTConsumer {
 RecordedAST *Out;
@@ -364,7 +373,11 @@ std::unique_ptr RecordedAST::record() {
   for (Decl *D : DG) {
 if (!SM.isWrittenInMainFile(SM.getExpansionLoc(D->getLocation(
   continue;
-// FIXME: Filter out certain Obj-C and template-related decls.
+if (isImplicitTemplateSpecialization(D) ||
+isImplicitTemplateSpecialization(D) ||
+isImplicitTemplateSpecialization(D))
+  continue;
+// FIXME: Filter out certain Obj-C as well.
 Out->Roots.push_back(D);
   }
   return ASTConsumer::HandleTopLevelDecl(DG);

diff  --git a/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp 
b/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp
index 919d6bdc0d68..cc99146c4419 100644
--- a/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp
+++ b/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp
@@ -101,6 +101,29 @@ TEST_F(RecordASTTest, Macros) {
   EXPECT_THAT(Recorded.Roots, testing::ElementsAre(named("x")));
 }
 
+// Decl from template instantiation is filtered out from roots.
+TEST_F(RecordASTTest, ImplicitTemplates) {
+  Inputs.ExtraFiles["dispatch.h"] = R"cpp(
+  struct A {
+static constexpr int value = 1;
+  };
+  template 
+  int dispatch() {
+return Getter::template get();
+  }
+  )cpp";
+  Inputs.Code = R"cpp(
+  #include "dispatch.h"  
+  struct MyGetter {
+template  static int get() { return T::value; }
+  };
+  int v = dispatch();
+  )cpp";
+  auto AST = build();
+  EXPECT_THAT(Recorded.Roots,
+  testing::ElementsAre(named("MyGetter"), named("v")));
+}
+
 class RecordPPTest : public ::testing::Test {
 protected:
   TestInputs Inputs;



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


[clang] 83c5040 - [include-mapping] Fix the instructions for running stdlib recognizer. Mention python command explicitly. Remove angle brackets.

2023-01-11 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-01-11T11:35:53Z
New Revision: 83c5040f6f3234a1fbf705b4aebe3ec1cf9d3bf6

URL: 
https://github.com/llvm/llvm-project/commit/83c5040f6f3234a1fbf705b4aebe3ec1cf9d3bf6
DIFF: 
https://github.com/llvm/llvm-project/commit/83c5040f6f3234a1fbf705b4aebe3ec1cf9d3bf6.diff

LOG: [include-mapping] Fix the instructions for running stdlib recognizer. 
Mention python command explicitly. Remove angle brackets.

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

Added: 


Modified: 
clang/tools/include-mapping/gen_std.py

Removed: 




diff  --git a/clang/tools/include-mapping/gen_std.py 
b/clang/tools/include-mapping/gen_std.py
index f3dabe13471fb..f494ff0b88679 100755
--- a/clang/tools/include-mapping/gen_std.py
+++ b/clang/tools/include-mapping/gen_std.py
@@ -24,13 +24,13 @@

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-beautiful-soup
   2. Download cppreference offline HTML files (e.g. html_book_20181028.zip) at
https://en.cppreference.com/w/Cppreference:Archives
-  3. Unzip the zip file from step 2 to directory , you should
- get a "reference" directory in 
+  3. Unzip the zip file from step 2 (e.g., to a "cppreference" directory). You 
should
+ get a "cppreference/reference" directory.
   4. Run the command:
// Generate C++ symbols
-   gen_std.py -cppreference  -language=cpp > 
StdSymbolMap.inc
+   python3 gen_std.py -cppreference cppreference/reference -language=cpp > 
StdSymbolMap.inc
// Generate C symbols
-   gen_std.py -cppreference  -language=c > 
CSymbolMap.inc
+   python3 gen_std.py -cppreference cppreference/reference -language=c > 
CSymbolMap.inc
 """
 
 



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


[clang] 301123c - [include-mapping] Fix parsing of html_book_20190607.zip (https://en.cppreference.com/w/File:html_book_20190607.zip). Skip entries that have been added to the index (C++20 symbols), b

2023-01-12 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-01-12T09:48:27Z
New Revision: 301123c7a8b5f5dd415e336ff933576279b0e868

URL: 
https://github.com/llvm/llvm-project/commit/301123c7a8b5f5dd415e336ff933576279b0e868
DIFF: 
https://github.com/llvm/llvm-project/commit/301123c7a8b5f5dd415e336ff933576279b0e868.diff

LOG: [include-mapping] Fix parsing of html_book_20190607.zip 
(https://en.cppreference.com/w/File:html_book_20190607.zip). Skip entries that 
have been added to the index (C++20 symbols), but the corresponding pages for 
which have not been created yet.

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

Added: 


Modified: 
clang/tools/include-mapping/cppreference_parser.py

Removed: 




diff  --git a/clang/tools/include-mapping/cppreference_parser.py 
b/clang/tools/include-mapping/cppreference_parser.py
index e56c8a5f1331a..137d310491bd1 100644
--- a/clang/tools/include-mapping/cppreference_parser.py
+++ b/clang/tools/include-mapping/cppreference_parser.py
@@ -142,7 +142,8 @@ def _GetSymbols(pool, root_dir, index_page_name, namespace, 
variants_to_accept):
   if variant and variant not in variants_for_symbol:
 continue
   path = os.path.join(root_dir, symbol_page_path)
-  results.append((symbol_name,
+  if os.path.isfile(path):
+results.append((symbol_name,
   pool.apply_async(_ReadSymbolPage, (path, symbol_name
 
 # Build map from symbol name to a set of headers.



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


[clang] ed00101 - [include-mapping] Print an error message in case the symbol index points to a non-existent page.

2023-01-12 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-01-12T15:59:32Z
New Revision: ed001018a02b3d8da699317cad7f7727d126f01d

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

LOG: [include-mapping] Print an error message in case the symbol index points 
to a non-existent page.

Fix: https://github.com/llvm/llvm-project/issues/59610
Differential Revision: https://reviews.llvm.org/D141611

Added: 


Modified: 
clang/tools/include-mapping/cppreference_parser.py

Removed: 




diff  --git a/clang/tools/include-mapping/cppreference_parser.py 
b/clang/tools/include-mapping/cppreference_parser.py
index 137d310491bd1..759269bffaa96 100644
--- a/clang/tools/include-mapping/cppreference_parser.py
+++ b/clang/tools/include-mapping/cppreference_parser.py
@@ -145,6 +145,9 @@ def _GetSymbols(pool, root_dir, index_page_name, namespace, 
variants_to_accept):
   if os.path.isfile(path):
 results.append((symbol_name,
   pool.apply_async(_ReadSymbolPage, (path, symbol_name
+  else:
+sys.stderr.write("Discarding information for symbol: %s. Page %s does 
not exist.\n" 
+  % (symbol_name, path))
 
 # Build map from symbol name to a set of headers.
 symbol_headers = collections.defaultdict(set)



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


[clang] 0aaeb25 - [include-mapping] Fix gen_std.py test

2023-01-18 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-01-18T13:07:41Z
New Revision: 0aaeb25525ecbc667a9029a4be0d87085392954a

URL: 
https://github.com/llvm/llvm-project/commit/0aaeb25525ecbc667a9029a4be0d87085392954a
DIFF: 
https://github.com/llvm/llvm-project/commit/0aaeb25525ecbc667a9029a4be0d87085392954a.diff

LOG: [include-mapping] Fix gen_std.py test

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

Added: 


Modified: 
clang/tools/include-mapping/test.py

Removed: 




diff  --git a/clang/tools/include-mapping/test.py 
b/clang/tools/include-mapping/test.py
index 9fad952b2e97c..507e462e75273 100755
--- a/clang/tools/include-mapping/test.py
+++ b/clang/tools/include-mapping/test.py
@@ -24,11 +24,11 @@ def testParseIndexPage(self):
 
 actual = _ParseIndexPage(html)
 expected = [
-  ("abs", "abs.html", True),
-  ("abs", "complex/abs.html", True),
-  ("acos", "acos.html", False),
-  ("acosh", "acosh.html", False),
-  ("as_bytes", "as_bytes.html", False),
+  ("abs", "abs.html", 'int'),
+  ("abs", "complex/abs.html", 'std::complex'),
+  ("acos", "acos.html", None),
+  ("acosh", "acosh.html", None),
+  ("as_bytes", "as_bytes.html", None),
 ]
 self.assertEqual(len(actual), len(expected))
 for i in range(0, len(actual)):



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


[clang] e74f9e7 - [include-mapping] Parse zombie_names.html into a removed symbols map.

2023-01-20 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-01-20T08:53:31Z
New Revision: e74f9e7885078e7c847b2672a70b6743731aa53a

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

LOG: [include-mapping] Parse zombie_names.html into a removed symbols map.

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

Added: 


Modified: 
clang/tools/include-mapping/gen_std.py

Removed: 




diff  --git a/clang/tools/include-mapping/gen_std.py 
b/clang/tools/include-mapping/gen_std.py
index f494ff0b88679..db70771e0f52b 100755
--- a/clang/tools/include-mapping/gen_std.py
+++ b/clang/tools/include-mapping/gen_std.py
@@ -28,9 +28,11 @@
  get a "cppreference/reference" directory.
   4. Run the command:
// Generate C++ symbols
-   python3 gen_std.py -cppreference cppreference/reference -language=cpp > 
StdSymbolMap.inc
+   python3 gen_std.py -cppreference cppreference/reference -symbols=cpp > 
StdSymbolMap.inc
+   // Generate C++ removed symbols
+   python3 gen_std.py -cppreference cppreference/reference 
-symbols=cpp_removed > RemovedSymbolMap.inc
// Generate C symbols
-   python3 gen_std.py -cppreference cppreference/reference -language=c > 
CSymbolMap.inc
+   python3 gen_std.py -cppreference cppreference/reference -symbols=c > 
CSymbolMap.inc
 """
 
 
@@ -60,16 +62,16 @@ def ParseArg():
   help='path to the cppreference offline HTML directory',
   required=True
  )
-  parser.add_argument('-language',
+  parser.add_argument('-symbols',
   default='cpp',
-  help='Generate c or cpp symbols',
-  required=True)
+  help='Generate c or cpp (removed) symbols. One of {cpp, 
c, cpp_removed}.',
+  required=True) 
   return parser.parse_args()
 
 
 def main():
   args = ParseArg()
-  if args.language == 'cpp':
+  if args.symbols == 'cpp':
 page_root = os.path.join(args.cppreference, "en", "cpp")
 symbol_index_root = os.path.join(page_root, "symbol_index")
 parse_pages =  [
@@ -87,22 +89,26 @@ def main():
   (symbol_index_root, "regex_constants.html", "std::regex_constants::"),
   (symbol_index_root, "this_thread.html", "std::this_thread::"),
 ]
-  elif args.language == 'c':
+  elif args.symbols == 'cpp_removed':
+page_root = os.path.join(args.cppreference, "en", "cpp")
+symbol_index_root = os.path.join(page_root, "symbol_index")
+parse_pages = [(symbol_index_root, "zombie_names.html", "std::")]
+  elif args.symbols == 'c':
 page_root = os.path.join(args.cppreference, "en", "c")
 symbol_index_root = page_root
-parse_pages = [(page_root, "index.html", None)]
-
+parse_pages = [(page_root, "index.html", None)]  
+
   if not os.path.exists(symbol_index_root):
 exit("Path %s doesn't exist!" % symbol_index_root)
 
   symbols = cppreference_parser.GetSymbols(parse_pages)
-
+  
   # We don't have version information from the unzipped offline HTML files.
   # so we use the modified time of the symbol_index.html as the version.
   index_page_path = os.path.join(page_root, "index.html")
   cppreference_modified_date = datetime.datetime.fromtimestamp(
 os.stat(index_page_path).st_mtime).strftime('%Y-%m-%d')
-  print(CODE_PREFIX % (args.language.upper(), cppreference_modified_date))
+  print(CODE_PREFIX % (args.symbols.upper(), cppreference_modified_date))
   for symbol in symbols:
 if len(symbol.headers) == 1:
   # SYMBOL(unqualified_name, namespace, header)



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


[clang-tools-extra] 22605f5 - [clangd] Make an include always refer to itself. Background: clang-review expects all referents to have definition, declaration or reference(s).

2023-07-19 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-07-19T08:32:53Z
New Revision: 22605f5f1bf8a6e4a18171ea76e8fcfa7fa783fd

URL: 
https://github.com/llvm/llvm-project/commit/22605f5f1bf8a6e4a18171ea76e8fcfa7fa783fd
DIFF: 
https://github.com/llvm/llvm-project/commit/22605f5f1bf8a6e4a18171ea76e8fcfa7fa783fd.diff

LOG: [clangd] Make an include always refer to itself. Background: clang-review 
expects all referents to have definition, declaration or reference(s).

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

Added: 


Modified: 
clang-tools-extra/clangd/XRefs.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/XRefs.cpp 
b/clang-tools-extra/clangd/XRefs.cpp
index 29ce1f3e0d0e3b..80a7d028ddf902 100644
--- a/clang-tools-extra/clangd/XRefs.cpp
+++ b/clang-tools-extra/clangd/XRefs.cpp
@@ -1367,9 +1367,6 @@ maybeFindIncludeReferences(ParsedAST &AST, Position Pos,
   rangeTillEOL(SM.getBufferData(SM.getMainFileID()), Inc.HashOffset);
   Result.Loc.uri = URIMainFile;
   Results.References.push_back(std::move(Result));
-
-  if (Results.References.empty())
-return std::nullopt;
   return Results;
 }
 } // namespace



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


[clang-tools-extra] 1f7c7d4 - [clangd] Update symbol collector to use include-cleaner.

2023-07-19 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-07-19T13:47:02Z
New Revision: 1f7c7d4bdd7b847d82b19bcd097029fabb449b90

URL: 
https://github.com/llvm/llvm-project/commit/1f7c7d4bdd7b847d82b19bcd097029fabb449b90
DIFF: 
https://github.com/llvm/llvm-project/commit/1f7c7d4bdd7b847d82b19bcd097029fabb449b90.diff

LOG: [clangd] Update symbol collector to use include-cleaner.

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

Added: 


Modified: 
clang-tools-extra/clangd/ClangdServer.cpp
clang-tools-extra/clangd/Hover.cpp
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/ParsedAST.cpp
clang-tools-extra/clangd/ParsedAST.h
clang-tools-extra/clangd/Preamble.cpp
clang-tools-extra/clangd/Preamble.h
clang-tools-extra/clangd/TUScheduler.cpp
clang-tools-extra/clangd/TUScheduler.h
clang-tools-extra/clangd/XRefs.cpp
clang-tools-extra/clangd/index/CanonicalIncludes.cpp
clang-tools-extra/clangd/index/CanonicalIncludes.h
clang-tools-extra/clangd/index/FileIndex.cpp
clang-tools-extra/clangd/index/FileIndex.h
clang-tools-extra/clangd/index/IndexAction.cpp
clang-tools-extra/clangd/index/SymbolCollector.cpp
clang-tools-extra/clangd/index/SymbolCollector.h
clang-tools-extra/clangd/tool/Check.cpp
clang-tools-extra/clangd/unittests/CanonicalIncludesTests.cpp
clang-tools-extra/clangd/unittests/FileIndexTests.cpp
clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
clang-tools-extra/clangd/unittests/TUSchedulerTests.cpp
clang-tools-extra/clangd/unittests/TestTU.cpp
clang-tools-extra/clangd/unittests/TestWorkspace.cpp
clang-tools-extra/include-cleaner/include/clang-include-cleaner/Types.h

Removed: 




diff  --git a/clang-tools-extra/clangd/ClangdServer.cpp 
b/clang-tools-extra/clangd/ClangdServer.cpp
index 1451adcbf4d4fe..af002e0cb2d689 100644
--- a/clang-tools-extra/clangd/ClangdServer.cpp
+++ b/clang-tools-extra/clangd/ClangdServer.cpp
@@ -23,7 +23,7 @@
 #include "SourceCode.h"
 #include "TUScheduler.h"
 #include "XRefs.h"
-#include "index/CanonicalIncludes.h"
+#include "clang-include-cleaner/Record.h"
 #include "index/FileIndex.h"
 #include "index/Merge.h"
 #include "index/StdLib.h"
@@ -53,6 +53,7 @@
 #include 
 #include 
 #include 
+#include 
 
 namespace clang {
 namespace clangd {
@@ -69,13 +70,13 @@ struct UpdateIndexCallbacks : public ParsingCallbacks {
const ThreadsafeFS &TFS, AsyncTaskRunner *Tasks,
bool CollectInactiveRegions,
const ClangdServer::Options &Opts)
-  : FIndex(FIndex), ServerCallbacks(ServerCallbacks),
-TFS(TFS), Stdlib{std::make_shared()}, Tasks(Tasks),
+  : FIndex(FIndex), ServerCallbacks(ServerCallbacks), TFS(TFS),
+Stdlib{std::make_shared()}, Tasks(Tasks),
 CollectInactiveRegions(CollectInactiveRegions), Opts(Opts) {}
 
   void onPreambleAST(
   PathRef Path, llvm::StringRef Version, CapturedASTCtx ASTCtx,
-  const std::shared_ptr CanonIncludes) override {
+  std::shared_ptr PI) override {
 
 if (!FIndex)
   return;
@@ -87,11 +88,10 @@ struct UpdateIndexCallbacks : public ParsingCallbacks {
 
 // FIndex outlives the UpdateIndexCallbacks.
 auto Task = [FIndex(FIndex), Path(Path.str()), Version(Version.str()),
- ASTCtx(std::move(ASTCtx)),
- CanonIncludes(CanonIncludes)]() mutable {
+ ASTCtx(std::move(ASTCtx)), PI(std::move(PI))]() mutable {
   trace::Span Tracer("PreambleIndexing");
   FIndex->updatePreamble(Path, Version, ASTCtx.getASTContext(),
- ASTCtx.getPreprocessor(), *CanonIncludes);
+ ASTCtx.getPreprocessor(), *PI);
 };
 
 if (Opts.AsyncPreambleIndexing && Tasks) {

diff  --git a/clang-tools-extra/clangd/Hover.cpp 
b/clang-tools-extra/clangd/Hover.cpp
index fbd0be07961651..ceae563131c13f 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -21,7 +21,6 @@
 #include "clang-include-cleaner/IncludeSpeller.h"
 #include "clang-include-cleaner/Types.h"
 #include "index/SymbolCollector.h"
-#include "support/Logger.h"
 #include "support/Markup.h"
 #include "support/Trace.h"
 #include "clang/AST/ASTContext.h"
@@ -1190,7 +1189,7 @@ void maybeAddSymbolProviders(ParsedAST &AST, HoverInfo 
&HI,
 
   const SourceManager &SM = AST.getSourceManager();
   llvm::SmallVector RankedProviders =
-  include_cleaner::headersForSymbol(Sym, SM, AST.getPragmaIncludes());
+  include_cleaner::headersForSymbol(Sym, SM, 
AST.getPragmaIncludes().get());
   if (RankedProviders.empty())
 return;
 
@@ -1254,7 +1253,7 @@ void maybeAddUsedSymbols(ParsedAST &AST, HoverInfo &HI, 
const Inclusion &Inc) {
   llvm::DenseSet UsedSymbols;
   include_cleaner::walkUsed(
   AST.getLocalTopLevelDecls(), collectMacroReferences(AST),
-  A

[clang-tools-extra] 3c6a7b0 - [clangd] Revert the symbol collector behavior to old pre-include-cleaner-library behavior due to a regression.

2023-07-27 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-07-27T10:34:35Z
New Revision: 3c6a7b0045afe9a230346e476bf07f88c145fdb5

URL: 
https://github.com/llvm/llvm-project/commit/3c6a7b0045afe9a230346e476bf07f88c145fdb5
DIFF: 
https://github.com/llvm/llvm-project/commit/3c6a7b0045afe9a230346e476bf07f88c145fdb5.diff

LOG: [clangd] Revert the symbol collector behavior to old 
pre-include-cleaner-library behavior due to a regression.

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

Added: 


Modified: 
clang-tools-extra/clangd/index/SymbolCollector.cpp
clang-tools-extra/clangd/index/SymbolCollector.h
clang-tools-extra/clangd/unittests/FileIndexTests.cpp
clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/index/SymbolCollector.cpp 
b/clang-tools-extra/clangd/index/SymbolCollector.cpp
index e9522171d70b75..c9a211b9c4fc2c 100644
--- a/clang-tools-extra/clangd/index/SymbolCollector.cpp
+++ b/clang-tools-extra/clangd/index/SymbolCollector.cpp
@@ -36,6 +36,7 @@
 #include "clang/Lex/Preprocessor.h"
 #include "clang/Lex/Token.h"
 #include "clang/Tooling/Inclusions/HeaderAnalysis.h"
+#include "clang/Tooling/Inclusions/StandardLibrary.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/SmallVector.h"
@@ -836,14 +837,25 @@ void SymbolCollector::setIncludeLocation(const Symbol &S, 
SourceLocation DefLoc,
   // Use the expansion location to get the #include header since this is
   // where the symbol is exposed.
   IncludeFiles[S.ID] = SM.getDecomposedExpansionLoc(DefLoc).first;
+}
 
-  auto [It, Inserted] = SymbolProviders.try_emplace(S.ID);
-  if (Inserted) {
-auto Headers =
-include_cleaner::headersForSymbol(Sym, SM, Opts.PragmaIncludes);
-if (!Headers.empty())
-  It->second = Headers.front();
-  }
+llvm::StringRef getStdHeader(const Symbol *S, const LangOptions &LangOpts) {
+  tooling::stdlib::Lang Lang = tooling::stdlib::Lang::CXX;
+if (LangOpts.C11)
+  Lang = tooling::stdlib::Lang::C;
+else if(!LangOpts.CPlusPlus)
+  return "";
+
+if (S->Scope == "std::" && S->Name == "move") {
+  if (!S->Signature.contains(','))
+return "";
+  return "";
+}
+   
+if (auto StdSym = tooling::stdlib::Symbol::named(S->Scope, S->Name, Lang))
+ if (auto Header = StdSym->header())
+   return Header->name();
+return "";
 }
 
 void SymbolCollector::finish() {
@@ -869,16 +881,13 @@ void SymbolCollector::finish() {
 }
   }
   llvm::DenseMap FileToContainsImportsOrObjC;
-  llvm::DenseMap HeaderSpelling;
   // Fill in IncludeHeaders.
   // We delay this until end of TU so header guards are all resolved.
-  for (const auto &[SID, OptionalProvider] : SymbolProviders) {
+  for (const auto &[SID, FID] : IncludeFiles) {
 const Symbol *S = Symbols.find(SID);
 if (!S)
   continue;
-assert(IncludeFiles.find(SID) != IncludeFiles.end());
 
-const auto FID = IncludeFiles.at(SID);
 // Determine if the FID is #include'd or #import'ed.
 Symbol::IncludeDirective Directives = Symbol::Invalid;
 auto CollectDirectives = shouldCollectIncludePath(S->SymInfo.Kind);
@@ -898,54 +907,20 @@ void SymbolCollector::finish() {
 if (Directives == Symbol::Invalid)
   continue;
 
-// Use the include location-based logic for Objective-C symbols.
-if (Directives & Symbol::Import) {
-  if (auto IncludeHeader = HeaderFileURIs->getIncludeHeader(FID);
-  !IncludeHeader.empty()) {
-auto NewSym = *S;
-NewSym.IncludeHeaders.push_back({IncludeHeader, 1, Directives});
-Symbols.insert(NewSym);
-  }
-  // FIXME: use providers from include-cleaner library once it's polished
-  // for Objective-C.
-  continue;
-}
-
-assert(Directives == Symbol::Include);
-// For #include's, use the providers computed by the include-cleaner
-// library.
-if (!OptionalProvider)
-  continue;
-const auto &H = *OptionalProvider;
-const auto [SpellingIt, Inserted] = HeaderSpelling.try_emplace(H);
-if (Inserted) {
-  auto &SM = ASTCtx->getSourceManager();
-  if (H.kind() == include_cleaner::Header::Kind::Physical) {
-if (auto Canonical =
-HeaderFileURIs->mapCanonical(H.physical()->getName());
-!Canonical.empty())
-  SpellingIt->second = Canonical;
-else if (tooling::isSelfContainedHeader(H.physical(), SM,
-PP->getHeaderSearchInfo()))
-  SpellingIt->second =
-  HeaderFileURIs->toURI(H.physical()->getLastRef());
-  } else {
-SpellingIt->second = include_cleaner::spellHeader(
-{H, PP->getHeaderSearchInfo(),
- SM.getFileEntryForID(SM.getMainFileID())});
-  }
-}
+// FIXME: Use the include-cleaner library instead.
+llvm::StringRef IncludeHeade

[clang] 5d49276 - [clangd][clang-tidy][stdlib] Add a missing symbol to the mapping.

2023-08-04 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-08-04T14:15:01Z
New Revision: 5d492766a8fbfadb39c9830ebb64137edddfe0e5

URL: 
https://github.com/llvm/llvm-project/commit/5d492766a8fbfadb39c9830ebb64137edddfe0e5
DIFF: 
https://github.com/llvm/llvm-project/commit/5d492766a8fbfadb39c9830ebb64137edddfe0e5.diff

LOG: [clangd][clang-tidy][stdlib] Add a missing symbol to the mapping.

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

Added: 


Modified: 
clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc

Removed: 




diff  --git a/clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc 
b/clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc
index ae620a0b995816..aa0bc50445f473 100644
--- a/clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc
+++ b/clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc
@@ -360,6 +360,10 @@ SYMBOL(index_sequence_for, std::, )
 SYMBOL(make_index_sequence, std::, )
 SYMBOL(make_integer_sequence, std::, )
 
+// Symbols missing from the generated symbol map as reported by users.
+// Remove when the generator starts producing them.
+SYMBOL(make_any, std::, )
+
 // The std::placeholder symbols (_1, ..., _N) are listed in the cppreference
 // placeholder.html, but the index only contains a single entry with "_1, _2, 
..., _N"
 // text, which are not handled by the script.



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


[clang] 8a5c0cc - [clangd][clang-tidy][std_symbol_map] Add missing symbol.

2023-08-07 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-08-07T08:41:58Z
New Revision: 8a5c0ccee2938dfec0082024aea664e7338adbe7

URL: 
https://github.com/llvm/llvm-project/commit/8a5c0ccee2938dfec0082024aea664e7338adbe7
DIFF: 
https://github.com/llvm/llvm-project/commit/8a5c0ccee2938dfec0082024aea664e7338adbe7.diff

LOG: [clangd][clang-tidy][std_symbol_map] Add missing symbol.

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

Added: 


Modified: 
clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc

Removed: 




diff  --git a/clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc 
b/clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc
index aa0bc50445f473..77578baef80a1c 100644
--- a/clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc
+++ b/clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc
@@ -363,6 +363,7 @@ SYMBOL(make_integer_sequence, std::, )
 // Symbols missing from the generated symbol map as reported by users.
 // Remove when the generator starts producing them.
 SYMBOL(make_any, std::, )
+SYMBOL(any_cast, std::, )
 
 // The std::placeholder symbols (_1, ..., _N) are listed in the cppreference
 // placeholder.html, but the index only contains a single entry with "_1, _2, 
..., _N"



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


[clang-tools-extra] c3ad4b7 - [include-cleaner] Follow `IWYU pragma: export` links transitively.

2023-08-09 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-08-09T12:10:13Z
New Revision: c3ad4b7636022db387e33ab03247a93aa63d7488

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

LOG: [include-cleaner] Follow `IWYU pragma: export` links transitively.

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

Added: 


Modified: 
clang-tools-extra/include-cleaner/lib/FindHeaders.cpp
clang-tools-extra/include-cleaner/lib/Record.cpp
clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp

Removed: 




diff  --git a/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp 
b/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp
index a1d9d3b5fb2154..f9438a2c8c49e4 100644
--- a/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp
+++ b/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp
@@ -25,6 +25,8 @@
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/ErrorHandling.h"
 #include 
+#include 
+#include 
 #include 
 
 namespace clang::include_cleaner {
@@ -188,13 +190,13 @@ llvm::SmallVector> findHeaders(const 
SymbolLocation &Loc,
 if (!PI)
   return {{FE, Hints::PublicHeader | Hints::OriginHeader}};
 bool IsOrigin = true;
+std::queue Exporters;
 while (FE) {
   Results.emplace_back(FE,
isPublicHeader(FE, *PI) |
(IsOrigin ? Hints::OriginHeader : Hints::None));
-  // FIXME: compute transitive exporter headers.
   for (const auto *Export : PI->getExporters(FE, SM.getFileManager()))
-Results.emplace_back(Export, isPublicHeader(Export, *PI));
+Exporters.push(Export);
 
   if (auto Verbatim = PI->getPublic(FE); !Verbatim.empty()) {
 Results.emplace_back(Verbatim,
@@ -209,6 +211,20 @@ llvm::SmallVector> findHeaders(const 
SymbolLocation &Loc,
   FE = SM.getFileEntryForID(FID);
   IsOrigin = false;
 }
+// Now traverse provider trees rooted at exporters.
+// Note that we only traverse export edges, and ignore private -> public
+// mappings, as those pragmas apply to exporter, and not the main provider
+// being exported in this header.
+std::set SeenExports;
+while (!Exporters.empty()) {
+  auto *Export = Exporters.front();
+  Exporters.pop();
+  if (!SeenExports.insert(Export).second) // In case of cyclic exports
+continue;
+  Results.emplace_back(Export, isPublicHeader(Export, *PI));
+  for (const auto *Export : PI->getExporters(Export, SM.getFileManager()))
+Exporters.push(Export);
+}
 return Results;
   }
   case SymbolLocation::Standard: {

diff  --git a/clang-tools-extra/include-cleaner/lib/Record.cpp 
b/clang-tools-extra/include-cleaner/lib/Record.cpp
index 62eaa16dbf3373..d7237325f701bb 100644
--- a/clang-tools-extra/include-cleaner/lib/Record.cpp
+++ b/clang-tools-extra/include-cleaner/lib/Record.cpp
@@ -12,6 +12,7 @@
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/DeclGroup.h"
 #include "clang/Basic/FileEntry.h"
+#include "clang/Basic/FileManager.h"
 #include "clang/Basic/LLVM.h"
 #include "clang/Basic/SourceLocation.h"
 #include "clang/Basic/SourceManager.h"
@@ -24,16 +25,21 @@
 #include "clang/Tooling/Inclusions/HeaderAnalysis.h"
 #include "clang/Tooling/Inclusions/StandardLibrary.h"
 #include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/iterator_range.h"
 #include "llvm/Support/Allocator.h"
 #include "llvm/Support/Error.h"
+#include "llvm/Support/FileSystem/UniqueID.h"
 #include "llvm/Support/StringSaver.h"
 #include 
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 

diff  --git a/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp 
b/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp
index cbe1f67d9bf7e5..be97eb13a704ee 100644
--- a/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp
+++ b/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp
@@ -481,6 +481,55 @@ TEST_F(HeadersForSymbolTest, 
PublicOverPrivateWithoutUmbrella) {
   ElementsAre(physicalHeader("bar.h"), physicalHeader("foo.h")));
 }
 
+TEST_F(HeadersForSymbolTest, IWYUTransitiveExport) {
+  Inputs.Code = R"cpp(
+#include "export1.h"
+  )cpp";
+  Inputs.ExtraFiles["export1.h"] = guard(R"cpp(
+#include "export2.h" // IWYU pragma: export
+  )cpp");
+  Inputs.ExtraFiles["export2.h"] = guard(R"cpp(
+#include "foo.h" // IWYU pragma: export
+  )cpp");
+  Inputs.ExtraFiles["foo.h"] = guard(R"cpp(
+struct foo {};
+  )cpp");
+  buildAST();
+  EXPECT_THAT(headersForFoo(),
+  ElementsAre(physicalHeader("foo.h"), physicalHeader("export1.h"),
+

[clang-tools-extra] 64366d4 - [clangd] Rollforward include-cleaner library usage in symbol collector.

2023-09-11 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-09-11T07:57:35Z
New Revision: 64366d4935d3c56ce5906a321edb2e91d4f886bc

URL: 
https://github.com/llvm/llvm-project/commit/64366d4935d3c56ce5906a321edb2e91d4f886bc
DIFF: 
https://github.com/llvm/llvm-project/commit/64366d4935d3c56ce5906a321edb2e91d4f886bc.diff

LOG: [clangd] Rollforward include-cleaner library usage in symbol collector.

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

Added: 


Modified: 
clang-tools-extra/clangd/index/SymbolCollector.cpp
clang-tools-extra/clangd/index/SymbolCollector.h
clang-tools-extra/clangd/unittests/FileIndexTests.cpp
clang-tools-extra/clangd/unittests/IndexActionTests.cpp
clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/index/SymbolCollector.cpp 
b/clang-tools-extra/clangd/index/SymbolCollector.cpp
index e843413601f5a29..699370fe1adf3af 100644
--- a/clang-tools-extra/clangd/index/SymbolCollector.cpp
+++ b/clang-tools-extra/clangd/index/SymbolCollector.cpp
@@ -821,25 +821,45 @@ void SymbolCollector::setIncludeLocation(const Symbol &S, 
SourceLocation DefLoc,
   // Use the expansion location to get the #include header since this is
   // where the symbol is exposed.
   IncludeFiles[S.ID] = SM.getDecomposedExpansionLoc(DefLoc).first;
+
+  // We update providers for a symbol with each occurence, as SymbolCollector
+  // might run while parsing, rather than at the end of a translation unit.
+  // Hence we see more and more redecls over time.
+  auto [It, Inserted] = SymbolProviders.try_emplace(S.ID);
+  auto Headers =
+  include_cleaner::headersForSymbol(Sym, SM, Opts.PragmaIncludes);
+  if (Headers.empty())
+return;
+
+  auto *HeadersIter = Headers.begin();
+  include_cleaner::Header H = *HeadersIter;
+  while (HeadersIter != Headers.end() &&
+ H.kind() == include_cleaner::Header::Physical &&
+ !tooling::isSelfContainedHeader(H.physical(), SM,
+ PP->getHeaderSearchInfo())) {
+H = *HeadersIter;
+HeadersIter++;
+  }
+  It->second = H;
 }
 
 llvm::StringRef getStdHeader(const Symbol *S, const LangOptions &LangOpts) {
   tooling::stdlib::Lang Lang = tooling::stdlib::Lang::CXX;
-if (LangOpts.C11)
-  Lang = tooling::stdlib::Lang::C;
-else if(!LangOpts.CPlusPlus)
-  return "";
-
-if (S->Scope == "std::" && S->Name == "move") {
-  if (!S->Signature.contains(','))
-return "";
-  return "";
-}
-   
-if (auto StdSym = tooling::stdlib::Symbol::named(S->Scope, S->Name, Lang))
- if (auto Header = StdSym->header())
-   return Header->name();
+  if (LangOpts.C11)
+Lang = tooling::stdlib::Lang::C;
+  else if(!LangOpts.CPlusPlus)
 return "";
+
+  if (S->Scope == "std::" && S->Name == "move") {
+if (!S->Signature.contains(','))
+  return "";
+return "";
+  }
+
+  if (auto StdSym = tooling::stdlib::Symbol::named(S->Scope, S->Name, Lang))
+if (auto Header = StdSym->header())
+  return Header->name();
+  return "";
 }
 
 void SymbolCollector::finish() {
@@ -865,13 +885,16 @@ void SymbolCollector::finish() {
 }
   }
   llvm::DenseMap FileToContainsImportsOrObjC;
+  llvm::DenseMap HeaderSpelling;
   // Fill in IncludeHeaders.
   // We delay this until end of TU so header guards are all resolved.
-  for (const auto &[SID, FID] : IncludeFiles) {
+  for (const auto &[SID, OptionalProvider] : SymbolProviders) {
 const Symbol *S = Symbols.find(SID);
 if (!S)
   continue;
+assert(IncludeFiles.find(SID) != IncludeFiles.end());
 
+const auto FID = IncludeFiles.at(SID);
 // Determine if the FID is #include'd or #import'ed.
 Symbol::IncludeDirective Directives = Symbol::Invalid;
 auto CollectDirectives = shouldCollectIncludePath(S->SymInfo.Kind);
@@ -891,20 +914,61 @@ void SymbolCollector::finish() {
 if (Directives == Symbol::Invalid)
   continue;
 
-// FIXME: Use the include-cleaner library instead.
-llvm::StringRef IncludeHeader = getStdHeader(S, ASTCtx->getLangOpts());
-if (IncludeHeader.empty())
-  IncludeHeader = HeaderFileURIs->getIncludeHeader(FID);
+// Use the include location-based logic for Objective-C symbols.
+if (Directives & Symbol::Import) {
+  llvm::StringRef IncludeHeader = getStdHeader(S, ASTCtx->getLangOpts());
+  if (IncludeHeader.empty())
+IncludeHeader = HeaderFileURIs->getIncludeHeader(FID);
+
+  if (!IncludeHeader.empty()) {
+auto NewSym = *S;
+NewSym.IncludeHeaders.push_back({IncludeHeader, 1, Directives});
+Symbols.insert(NewSym);
+  }
+  // FIXME: use providers from include-cleaner library once it's polished
+  // for Objective-C.
+  continue;
+}
+
+assert(Directives == Symbol::Include);
+// For #include's, use the providers computed by the include-cleaner
+// library.
+

[clang-tools-extra] 13e5faf - [clangd] Fix buildbot breakages from stemming from 64366d4935d3c56ce5906a321edb2e91d4f886bc

2023-09-11 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-09-11T08:30:06Z
New Revision: 13e5fafb5548caf52fc067ec443604d20bf60684

URL: 
https://github.com/llvm/llvm-project/commit/13e5fafb5548caf52fc067ec443604d20bf60684
DIFF: 
https://github.com/llvm/llvm-project/commit/13e5fafb5548caf52fc067ec443604d20bf60684.diff

LOG: [clangd] Fix buildbot breakages from stemming from 
64366d4935d3c56ce5906a321edb2e91d4f886bc

Added: 


Modified: 
clang-tools-extra/clangd/index/SymbolCollector.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/index/SymbolCollector.cpp 
b/clang-tools-extra/clangd/index/SymbolCollector.cpp
index 699370fe1adf3af..8fe1146bc2752c3 100644
--- a/clang-tools-extra/clangd/index/SymbolCollector.cpp
+++ b/clang-tools-extra/clangd/index/SymbolCollector.cpp
@@ -943,7 +943,7 @@ void SymbolCollector::finish() {
 // FIXME: Get rid of this once include-cleaner has support for system
 // headers.
 if (auto Canonical =
-HeaderFileURIs->mapCanonical(H.physical()->getName());
+HeaderFileURIs->mapCanonical(H.physical().getName());
 !Canonical.empty())
   SpellingIt->second = Canonical;
 // For physical files, prefer URIs as spellings might change
@@ -951,7 +951,7 @@ void SymbolCollector::finish() {
 else if (tooling::isSelfContainedHeader(H.physical(), SM,
 PP->getHeaderSearchInfo()))
   SpellingIt->second =
-  HeaderFileURIs->toURI(H.physical()->getLastRef());
+  HeaderFileURIs->toURI(H.physical());
   } else {
 SpellingIt->second = include_cleaner::spellHeader(
 {H, PP->getHeaderSearchInfo(),



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


[clang-tools-extra] 7322f2d - [clangd] Use canonical path as resolved path for includes.

2023-07-11 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-07-11T15:36:20Z
New Revision: 7322f2d5ed547f7281af2d79a229f6620b1708ac

URL: 
https://github.com/llvm/llvm-project/commit/7322f2d5ed547f7281af2d79a229f6620b1708ac
DIFF: 
https://github.com/llvm/llvm-project/commit/7322f2d5ed547f7281af2d79a229f6620b1708ac.diff

LOG: [clangd] Use canonical path as resolved path for includes.

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

Added: 


Modified: 
clang-tools-extra/clangd/Headers.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Headers.cpp 
b/clang-tools-extra/clangd/Headers.cpp
index f1838931f5a4d2..c3414571170b72 100644
--- a/clang-tools-extra/clangd/Headers.cpp
+++ b/clang-tools-extra/clangd/Headers.cpp
@@ -21,6 +21,7 @@
 #include "llvm/Support/Path.h"
 #include 
 #include 
+#include 
 
 namespace clang {
 namespace clangd {
@@ -53,8 +54,9 @@ class IncludeStructure::RecordHeaders : public PPCallbacks {
   auto &Inc = Out->MainFileIncludes.back();
   Inc.Written =
   (IsAngled ? "<" + FileName + ">" : "\"" + FileName + "\"").str();
-  Inc.Resolved =
-  std::string(File ? File->getFileEntry().tryGetRealPathName() : "");
+  Inc.Resolved = std::string(
+  File ? getCanonicalPath(*File, SM.getFileManager()).value_or("")
+   : "");
   Inc.HashOffset = SM.getFileOffset(HashLoc);
   Inc.HashLine =
   SM.getLineNumber(SM.getFileID(HashLoc), Inc.HashOffset) - 1;



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


[clang-tools-extra] 96e5079 - [clangd] Fix the range for include reference to itself.

2023-07-14 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-07-14T12:51:14Z
New Revision: 96e50797d6ea39d561fc90511152fd30b77c1e62

URL: 
https://github.com/llvm/llvm-project/commit/96e50797d6ea39d561fc90511152fd30b77c1e62
DIFF: 
https://github.com/llvm/llvm-project/commit/96e50797d6ea39d561fc90511152fd30b77c1e62.diff

LOG: [clangd] Fix the range for include reference to itself.

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

Added: 


Modified: 
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/IncludeCleaner.h
clang-tools-extra/clangd/SourceCode.cpp
clang-tools-extra/clangd/SourceCode.h
clang-tools-extra/clangd/XRefs.cpp
clang-tools-extra/clangd/unittests/XRefsTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/IncludeCleaner.cpp 
b/clang-tools-extra/clangd/IncludeCleaner.cpp
index 2a8499dade84c0..9a910e5850a9f1 100644
--- a/clang-tools-extra/clangd/IncludeCleaner.cpp
+++ b/clang-tools-extra/clangd/IncludeCleaner.cpp
@@ -60,20 +60,6 @@ void setIncludeCleanerAnalyzesStdlib(bool B) { AnalyzeStdlib 
= B; }
 
 namespace {
 
-// Returns the range starting at '#' and ending at EOL. Escaped newlines are 
not
-// handled.
-clangd::Range getDiagnosticRange(llvm::StringRef Code, unsigned HashOffset) {
-  clangd::Range Result;
-  Result.end = Result.start = offsetToPosition(Code, HashOffset);
-
-  // Span the warning until the EOL or EOF.
-  Result.end.character +=
-  lspLength(Code.drop_front(HashOffset).take_until([](char C) {
-return C == '\n' || C == '\r';
-  }));
-  return Result;
-}
-
 bool isIgnored(llvm::StringRef HeaderPath, HeaderFilter IgnoreHeaders) {
   // Convert the path to Unix slashes and try to match against the filter.
   llvm::SmallString<64> NormalizedPath(HeaderPath);
@@ -224,7 +210,7 @@ std::vector generateUnusedIncludeDiagnostics(
 D.InsideMainFile = true;
 D.Severity = DiagnosticsEngine::Warning;
 D.Tags.push_back(Unnecessary);
-D.Range = getDiagnosticRange(Code, Inc->HashOffset);
+D.Range = rangeTillEOL(Code, Inc->HashOffset);
 // FIXME(kirillbobyrev): Removing inclusion might break the code if the
 // used headers are only reachable transitively through this one. Suggest
 // including them directly instead.

diff  --git a/clang-tools-extra/clangd/IncludeCleaner.h 
b/clang-tools-extra/clangd/IncludeCleaner.h
index edd89777faf3d0..b1acbdd5484345 100644
--- a/clang-tools-extra/clangd/IncludeCleaner.h
+++ b/clang-tools-extra/clangd/IncludeCleaner.h
@@ -21,6 +21,7 @@
 #include "Diagnostics.h"
 #include "Headers.h"
 #include "ParsedAST.h"
+#include "Protocol.h"
 #include "clang-include-cleaner/Types.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/Tooling/Syntax/Tokens.h"

diff  --git a/clang-tools-extra/clangd/SourceCode.cpp 
b/clang-tools-extra/clangd/SourceCode.cpp
index 474570cb6459f7..eb0a578b0f4a12 100644
--- a/clang-tools-extra/clangd/SourceCode.cpp
+++ b/clang-tools-extra/clangd/SourceCode.cpp
@@ -1242,5 +1242,17 @@ SourceLocation 
translatePreamblePatchLocation(SourceLocation Loc,
   }
   return Loc;
 }
+
+clangd::Range rangeTillEOL(llvm::StringRef Code, unsigned HashOffset) {
+  clangd::Range Result;
+  Result.end = Result.start = offsetToPosition(Code, HashOffset);
+
+  // Span the warning until the EOL or EOF.
+  Result.end.character +=
+  lspLength(Code.drop_front(HashOffset).take_until([](char C) {
+return C == '\n' || C == '\r';
+  }));
+  return Result;
+}
 } // namespace clangd
 } // namespace clang

diff  --git a/clang-tools-extra/clangd/SourceCode.h 
b/clang-tools-extra/clangd/SourceCode.h
index 3ba6f8b80ef373..a1bb44c1761202 100644
--- a/clang-tools-extra/clangd/SourceCode.h
+++ b/clang-tools-extra/clangd/SourceCode.h
@@ -337,6 +337,10 @@ inline bool isReservedName(llvm::StringRef Name) {
 /// using presumed locations. Returns \p Loc if it isn't inside preamble patch.
 SourceLocation translatePreamblePatchLocation(SourceLocation Loc,
   const SourceManager &SM);
+
+/// Returns the range starting at offset and spanning the whole line. Escaped
+/// newlines are not handled.
+clangd::Range rangeTillEOL(llvm::StringRef Code, unsigned HashOffset);
 } // namespace clangd
 } // namespace clang
 #endif

diff  --git a/clang-tools-extra/clangd/XRefs.cpp 
b/clang-tools-extra/clangd/XRefs.cpp
index b608296deefad5..29ce1f3e0d0e3b 100644
--- a/clang-tools-extra/clangd/XRefs.cpp
+++ b/clang-tools-extra/clangd/XRefs.cpp
@@ -1362,10 +1362,9 @@ maybeFindIncludeReferences(ParsedAST &AST, Position Pos,
 return std::nullopt;
 
   // Add the #include line to the references list.
-  auto IncludeLen = std::string{"#include"}.length() + Inc.Written.length() + 
1;
   ReferencesResult::Reference Result;
-  Result.Loc.range = clangd::Range{Position{Inc.HashLine, 0},
-   Position{Inc.HashLine, (int)IncludeLen}};
+  Result

[clang-tools-extra] d71adeb - [include-cleaner] Map the 4-argument move overload to the algorithm header.

2023-09-06 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-09-06T11:38:56Z
New Revision: d71adebb9fb875a5fd23acdbe0cf0799092fa4ca

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

LOG: [include-cleaner] Map the 4-argument move overload to the algorithm header.

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

Added: 


Modified: 
clang-tools-extra/include-cleaner/lib/FindHeaders.cpp
clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp

Removed: 




diff  --git a/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp 
b/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp
index f9438a2c8c49e48..f46dae3b3d50cbb 100644
--- a/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp
+++ b/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp
@@ -125,8 +125,10 @@ headerForAmbiguousStdSymbol(const NamedDecl *ND) {
 if (FD->getNumParams() == 1)
   // move(T&& t)
   return tooling::stdlib::Header::named("");
-if (FD->getNumParams() == 3)
+if (FD->getNumParams() == 3 || FD->getNumParams() == 4)
   // move(InputIt first, InputIt last, OutputIt dest);
+  // move(ExecutionPolicy&& policy, ForwardIt1 first,
+  // ForwardIt1 last, ForwardIt2 d_first);
   return tooling::stdlib::Header::named("");
   } else if (FName == "remove") {
 if (FD->getNumParams() == 1)

diff  --git a/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp 
b/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp
index be97eb13a704eef..b8f30c25e5c11b2 100644
--- a/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp
+++ b/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp
@@ -546,6 +546,16 @@ TEST_F(HeadersForSymbolTest, AmbiguousStdSymbols) {
   "move",
   "",
   },
+  {
+  R"cpp(
+namespace std {
+ template
+ ForwardIt2 move(ExecutionPolicy&& policy,
+ ForwardIt1 first, ForwardIt1 last, ForwardIt2 d_first);
+})cpp",
+  "move",
+  "",
+  },
   {
   R"cpp(
 namespace std {



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


[clang] 6258912 - [clangd][clang-tidy] Add missing symbols to the symbol map.

2023-09-06 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-09-06T13:42:12Z
New Revision: 6258912880876edd44944e130aef01b33480168b

URL: 
https://github.com/llvm/llvm-project/commit/6258912880876edd44944e130aef01b33480168b
DIFF: 
https://github.com/llvm/llvm-project/commit/6258912880876edd44944e130aef01b33480168b.diff

LOG: [clangd][clang-tidy] Add missing symbols to the symbol map.

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

Added: 


Modified: 
clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc

Removed: 




diff  --git a/clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc 
b/clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc
index 77578baef80a1ce..165c1fc2eebc2c3 100644
--- a/clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc
+++ b/clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc
@@ -364,6 +364,8 @@ SYMBOL(make_integer_sequence, std::, )
 // Remove when the generator starts producing them.
 SYMBOL(make_any, std::, )
 SYMBOL(any_cast, std::, )
+SYMBOL(div, std::, )
+SYMBOL(abort, std::, )
 
 // The std::placeholder symbols (_1, ..., _N) are listed in the cppreference
 // placeholder.html, but the index only contains a single entry with "_1, _2, 
..., _N"



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


[clang-tools-extra] 43c2036 - [include-cleaner][clangd][clang-tidy] Ignore resource dir during include-cleaner analysis.

2023-09-07 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-09-07T11:39:18Z
New Revision: 43c20367f417410a736959d4ae53f374e0d5b500

URL: 
https://github.com/llvm/llvm-project/commit/43c20367f417410a736959d4ae53f374e0d5b500
DIFF: 
https://github.com/llvm/llvm-project/commit/43c20367f417410a736959d4ae53f374e0d5b500.diff

LOG: [include-cleaner][clangd][clang-tidy] Ignore resource dir during 
include-cleaner analysis.

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

Added: 


Modified: 
clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/test/include-cleaner-batch-fix.test
clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
clang-tools-extra/include-cleaner/lib/Analysis.cpp
clang-tools-extra/include-cleaner/unittests/AnalysisTest.cpp

Removed: 




diff  --git a/clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp 
b/clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
index 8d5f400acfef8bc..8e460cb38826eb1 100644
--- a/clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
@@ -26,6 +26,7 @@
 #include "clang/Basic/LangOptions.h"
 #include "clang/Basic/SourceLocation.h"
 #include "clang/Format/Format.h"
+#include "clang/Lex/HeaderSearchOptions.h"
 #include "clang/Lex/Preprocessor.h"
 #include "clang/Tooling/Core/Replacement.h"
 #include "clang/Tooling/Inclusions/HeaderIncludes.h"
@@ -119,6 +120,8 @@ void IncludeCleanerCheck::check(const 
MatchFinder::MatchResult &Result) {
 MainFileDecls.push_back(D);
   }
   llvm::DenseSet SeenSymbols;
+  const DirectoryEntry *ResourceDir =
+  PP->getHeaderSearchInfo().getModuleMap().getBuiltinDir();
   // FIXME: Find a way to have less code duplication between include-cleaner
   // analysis implementation and the below code.
   walkUsed(MainFileDecls, RecordedPreprocessor.MacroReferences, &RecordedPI,
@@ -141,8 +144,11 @@ void IncludeCleanerCheck::check(const 
MatchFinder::MatchResult &Result) {
  bool Satisfied = false;
  for (const include_cleaner::Header &H : Providers) {
if (H.kind() == include_cleaner::Header::Physical &&
-   H.physical() == MainFile)
+   (H.physical() == MainFile ||
+H.physical()->getDir() == ResourceDir)) {
  Satisfied = true;
+ continue;
+   }
 
for (const include_cleaner::Include *I :
 RecordedPreprocessor.Includes.match(H)) {
@@ -159,7 +165,7 @@ void IncludeCleanerCheck::check(const 
MatchFinder::MatchResult &Result) {
   std::vector Unused;
   for (const include_cleaner::Include &I :
RecordedPreprocessor.Includes.all()) {
-if (Used.contains(&I) || !I.Resolved)
+if (Used.contains(&I) || !I.Resolved || I.Resolved->getDir() == 
ResourceDir)
   continue;
 if (RecordedPI.shouldKeep(*I.Resolved))
   continue;

diff  --git a/clang-tools-extra/clangd/IncludeCleaner.cpp 
b/clang-tools-extra/clangd/IncludeCleaner.cpp
index 1fcb5c7228fb639..a6e01eb72821d22 100644
--- a/clang-tools-extra/clangd/IncludeCleaner.cpp
+++ b/clang-tools-extra/clangd/IncludeCleaner.cpp
@@ -75,6 +75,11 @@ bool mayConsiderUnused(const Inclusion &Inc, ParsedAST &AST,
   auto FE = AST.getSourceManager().getFileManager().getFileRef(
   AST.getIncludeStructure().getRealPath(HID));
   assert(FE);
+  if (FE->getDir() == AST.getPreprocessor()
+  .getHeaderSearchInfo()
+  .getModuleMap()
+  .getBuiltinDir()) 
+return false;
   if (PI && PI->shouldKeep(*FE))
 return false;
   // FIXME(kirillbobyrev): We currently do not support the umbrella headers.
@@ -392,6 +397,10 @@ IncludeCleanerFindings 
computeIncludeCleanerFindings(ParsedAST &AST) {
   std::vector MissingIncludes;
   llvm::DenseSet Used;
   trace::Span Tracer("include_cleaner::walkUsed");
+  const DirectoryEntry *ResourceDir = AST.getPreprocessor()
+.getHeaderSearchInfo()
+.getModuleMap()
+.getBuiltinDir();
   include_cleaner::walkUsed(
   AST.getLocalTopLevelDecls(), /*MacroRefs=*/Macros,
   AST.getPragmaIncludes().get(), AST.getPreprocessor(),
@@ -400,7 +409,8 @@ IncludeCleanerFindings 
computeIncludeCleanerFindings(ParsedAST &AST) {
 bool Satisfied = false;
 for (const auto &H : Providers) {
   if (H.kind() == include_cleaner::Header::Physical &&
-  (H.physical() == MainFile || H.physical() == PreamblePatch)) {
+  (H.physical() == MainFile || H.physical() == PreamblePatch ||
+   H.physical()->getLastRef().getDir() == ResourceDir)) {
 Satisfied = true;
 continue;
   }

diff  --git a/clang-tools-extra/clangd/test/include-clean

[clang-tools-extra] 7452e05 - [include-cleaner] Implement IWYU begin_keep/end_keep pragma support.

2022-11-29 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2022-11-29T14:51:20Z
New Revision: 7452e053e5921113ef59ccab04acc0999bf2ecc2

URL: 
https://github.com/llvm/llvm-project/commit/7452e053e5921113ef59ccab04acc0999bf2ecc2
DIFF: 
https://github.com/llvm/llvm-project/commit/7452e053e5921113ef59ccab04acc0999bf2ecc2.diff

LOG: [include-cleaner] Implement IWYU begin_keep/end_keep pragma support.

Implement support for begin_keep/end_keep pragmas.

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

Added: 


Modified: 
clang-tools-extra/include-cleaner/lib/Record.cpp
clang-tools-extra/include-cleaner/unittests/RecordTest.cpp

Removed: 




diff  --git a/clang-tools-extra/include-cleaner/lib/Record.cpp 
b/clang-tools-extra/include-cleaner/lib/Record.cpp
index ac3315abb882c..5a9ec6d0aadcf 100644
--- a/clang-tools-extra/include-cleaner/lib/Record.cpp
+++ b/clang-tools-extra/include-cleaner/lib/Record.cpp
@@ -187,9 +187,7 @@ class PragmaIncludes::RecordPragma : public PPCallbacks, 
public CommentHandler {
 FileID HashFID = SM.getFileID(HashLoc);
 int HashLine = SM.getLineNumber(HashFID, SM.getFileOffset(HashLoc));
 checkForExport(HashFID, HashLine, File ? &File->getFileEntry() : nullptr);
-
-if (InMainFile && LastPragmaKeepInMainFileLine == HashLine)
-  Out->ShouldKeep.insert(HashLine);
+checkForKeep(HashLine);
   }
 
   void checkForExport(FileID IncludingFile, int HashLine,
@@ -213,6 +211,18 @@ class PragmaIncludes::RecordPragma : public PPCallbacks, 
public CommentHandler {
   ExportStack.pop_back();
   }
 
+  void checkForKeep(int HashLine) {
+if (!InMainFile || KeepStack.empty())
+  return;
+KeepPragma &Top = KeepStack.back();
+// Check if the current include is covered by a keep pragma.
+if ((Top.Block && HashLine > Top.SeenAtLine) || Top.SeenAtLine == HashLine)
+  Out->ShouldKeep.insert(HashLine);
+
+if (!Top.Block)
+  KeepStack.pop_back(); // Pop immediately for single-line keep pragma.
+  }
+
   bool HandleComment(Preprocessor &PP, SourceRange Range) override {
 auto &SM = PP.getSourceManager();
 auto Pragma =
@@ -257,23 +267,14 @@ class PragmaIncludes::RecordPragma : public PPCallbacks, 
public CommentHandler {
 }
 
 if (InMainFile) {
-  if (!Pragma->startswith("keep"))
-return false;
-  // Given:
-  //
-  // #include "foo.h"
-  // #include "bar.h" // IWYU pragma: keep
-  //
-  // The order in which the callbacks will be triggered:
-  //
-  // 1. InclusionDirective("foo.h")
-  // 2. handleCommentInMainFile("// IWYU pragma: keep")
-  // 3. InclusionDirective("bar.h")
-  //
-  // This code stores the last location of "IWYU pragma: keep" comment in
-  // the main file, so that when next InclusionDirective is called, it will
-  // know that the next inclusion is behind the IWYU pragma.
-  LastPragmaKeepInMainFileLine = CommentLine;
+  if (Pragma->startswith("keep")) {
+KeepStack.push_back({CommentLine, false});
+  } else if (Pragma->starts_with("begin_keep")) {
+KeepStack.push_back({CommentLine, true});
+  } else if (Pragma->starts_with("end_keep") && !KeepStack.empty()) {
+assert(KeepStack.back().Block);
+KeepStack.pop_back();
+  }
 }
 return false;
   }
@@ -288,8 +289,7 @@ class PragmaIncludes::RecordPragma : public PPCallbacks, 
public CommentHandler {
   llvm::BumpPtrAllocator Arena;
   /// Intern table for strings. Contents are on the arena.
   llvm::StringSaver UniqueStrings;
-  // Track the last line "IWYU pragma: keep" was seen in the main file, 
1-based.
-  int LastPragmaKeepInMainFileLine = -1;
+
   struct ExportPragma {
 // The line number where we saw the begin_exports or export pragma.
 int SeenAtLine = 0; // 1-based line number.
@@ -303,6 +303,16 @@ class PragmaIncludes::RecordPragma : public PPCallbacks, 
public CommentHandler {
   };
   // A stack for tracking all open begin_exports or single-line export.
   std::vector ExportStack;
+
+  struct KeepPragma {
+// The line number where we saw the begin_keep or keep pragma.
+int SeenAtLine = 0; // 1-based line number.
+// true if it is a block begin/end_keep pragma; false if it is a
+// single-line keep pragma.
+bool Block = false;
+  };
+  // A stack for tracking all open begin_keep pragmas or single-line keeps.
+  std::vector KeepStack;
 };
 
 void PragmaIncludes::record(const CompilerInstance &CI) {

diff  --git a/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp 
b/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp
index 0cc163751fd70..1076891473431 100644
--- a/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp
+++ b/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp
@@ -311,35 +311,68 @@ class PragmaIncludeTest : public ::testing::Test {
 };
 
 TEST_F(PragmaIncludeTest, IWYUKeep) {
-  Inputs.Code = R"c

[clang-tools-extra] 2bececb - [clangd] Add provider info on symbol hover.

2023-03-23 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-03-23T16:21:51Z
New Revision: 2bececb8bed1f8fcd8d54dba831ceb117717bfcc

URL: 
https://github.com/llvm/llvm-project/commit/2bececb8bed1f8fcd8d54dba831ceb117717bfcc
DIFF: 
https://github.com/llvm/llvm-project/commit/2bececb8bed1f8fcd8d54dba831ceb117717bfcc.diff

LOG: [clangd] Add provider info on symbol hover.

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

Added: 


Modified: 
clang-tools-extra/clangd/Hover.cpp
clang-tools-extra/clangd/Hover.h
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/IncludeCleaner.h
clang-tools-extra/clangd/Preamble.cpp
clang-tools-extra/clangd/unittests/HoverTests.cpp
clang-tools-extra/include-cleaner/include/clang-include-cleaner/Analysis.h
clang-tools-extra/include-cleaner/lib/AnalysisInternal.h

Removed: 




diff  --git a/clang-tools-extra/clangd/Hover.cpp 
b/clang-tools-extra/clangd/Hover.cpp
index c5436141adbf..e240c22259f3 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -12,11 +12,16 @@
 #include "CodeCompletionStrings.h"
 #include "Config.h"
 #include "FindTarget.h"
+#include "IncludeCleaner.h"
 #include "ParsedAST.h"
 #include "Selection.h"
 #include "SourceCode.h"
+#include "clang-include-cleaner/Analysis.h"
+#include "clang-include-cleaner/Types.h"
 #include "index/SymbolCollector.h"
+#include "support/Logger.h"
 #include "support/Markup.h"
+#include "support/Trace.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/ASTDiagnostic.h"
 #include "clang/AST/ASTTypeTraits.h"
@@ -43,11 +48,13 @@
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/Casting.h"
+#include "llvm/Support/Error.h"
 #include "llvm/Support/Format.h"
 #include "llvm/Support/ScopedPrinter.h"
 #include "llvm/Support/raw_ostream.h"
 #include 
 #include 
+#include 
 
 namespace clang {
 namespace clangd {
@@ -1084,6 +1091,49 @@ const NamedDecl *pickDeclToUse(llvm::ArrayRef Candidates) {
   return Candidates.front();
 }
 
+void maybeAddSymbolProviders(ParsedAST &AST, HoverInfo &HI,
+ include_cleaner::Symbol Sym) {
+  trace::Span Tracer("Hover::maybeAddSymbolProviders");
+
+  const SourceManager &SM = AST.getSourceManager();
+  llvm::SmallVector RankedProviders =
+  include_cleaner::headersForSymbol(Sym, SM, AST.getPragmaIncludes());
+  if (RankedProviders.empty())
+return;
+
+  std::string Result;
+  include_cleaner::Includes ConvertedIncludes =
+  convertIncludes(SM, AST.getIncludeStructure().MainFileIncludes);
+  for (const auto &P : RankedProviders) {
+if (P.kind() == include_cleaner::Header::Physical &&
+P.physical() == SM.getFileEntryForID(SM.getMainFileID()))
+  // Main file ranked higher than any #include'd file
+  break;
+
+// Pick the best-ranked #include'd provider
+auto Matches = ConvertedIncludes.match(P);
+if (!Matches.empty()) {
+  Result = Matches[0]->quote();
+  break;
+}
+  }
+
+  if (!Result.empty()) {
+HI.Provider = std::move(Result);
+return;
+  }
+
+  // Pick the best-ranked non-#include'd provider
+  const auto &H = RankedProviders.front();
+  if (H.kind() == include_cleaner::Header::Physical &&
+  H.physical() == SM.getFileEntryForID(SM.getMainFileID()))
+// Do not show main file as provider, otherwise we'll show provider info
+// on local variables, etc.
+return;
+
+  HI.Provider = spellHeader(AST, SM.getFileEntryForID(SM.getMainFileID()), H);
+}
+
 } // namespace
 
 std::optional getHover(ParsedAST &AST, Position Pos,
@@ -1131,6 +1181,12 @@ std::optional getHover(ParsedAST &AST, 
Position Pos,
   HighlightRange = Tok.range(SM).toCharRange(SM);
   if (auto M = locateMacroAt(Tok, AST.getPreprocessor())) {
 HI = getHoverContents(*M, Tok, AST);
+if (auto DefLoc = M->Info->getDefinitionLoc(); DefLoc.isValid()) {
+  include_cleaner::Macro IncludeCleanerMacro{
+  AST.getPreprocessor().getIdentifierInfo(Tok.text(SM)), DefLoc};
+  maybeAddSymbolProviders(AST, *HI,
+  
include_cleaner::Symbol{IncludeCleanerMacro});
+}
 break;
   }
 } else if (Tok.kind() == tok::kw_auto || Tok.kind() == tok::kw_decltype) {
@@ -1168,6 +1224,7 @@ std::optional getHover(ParsedAST &AST, 
Position Pos,
 if (!HI->Value)
   HI->Value = printExprValue(N, AST.getASTContext());
 maybeAddCalleeArgInfo(N, *HI, PP);
+maybeAddSymbolProviders(AST, *HI, include_cleaner::Symbol{*DeclToUse});
   } else if (const Expr *E = N->ASTNode.get()) {
 HI = getHoverContents(N, E, AST, PP, Index);
   } else if (const Attr *A = N->ASTNode.get()) {
@@ -1217,6 +1274,14 @@ markup::Document HoverInfo::present() const {
   assert(!Name.empty() && "hover triggered on a nameless symbol");
   Header.appendCode(Nam

[clang-tools-extra] 40e5d21 - [clangd] Fix indentation in HoverTests.cpp

2023-03-23 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-03-23T17:27:10Z
New Revision: 40e5d212cffd2b87f688dd441cd7c7f4084d407d

URL: 
https://github.com/llvm/llvm-project/commit/40e5d212cffd2b87f688dd441cd7c7f4084d407d
DIFF: 
https://github.com/llvm/llvm-project/commit/40e5d212cffd2b87f688dd441cd7c7f4084d407d.diff

LOG: [clangd] Fix indentation in HoverTests.cpp

Added: 


Modified: 
clang-tools-extra/clangd/unittests/HoverTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp 
b/clang-tools-extra/clangd/unittests/HoverTests.cpp
index 6ee938420403..728f5444014d 100644
--- a/clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -2892,50 +2892,50 @@ TEST(Hover, Providers) {
 const char *Code;
 const std::function ExpectedBuilder;
   } Cases[] = {{R"cpp(
-struct Foo {}; 
-Foo F = Fo^o{};
-  )cpp",
+  struct Foo {}; 
+  Foo F = Fo^o{};
+)cpp",
 [](HoverInfo &HI) { HI.Provider = ""; }},
{R"cpp(
-#include "foo.h"   
-Foo F = Fo^o{};
-  )cpp",
+  #include "foo.h"   
+  Foo F = Fo^o{};
+)cpp",
 [](HoverInfo &HI) { HI.Provider = "\"foo.h\""; }},
{R"cpp(
-#include "all.h"  
-Foo F = Fo^o{};
-  )cpp",
+  #include "all.h"  
+  Foo F = Fo^o{};
+)cpp",
 [](HoverInfo &HI) { HI.Provider = "\"foo.h\""; }},
{R"cpp(
-#define FOO 5
-int F = ^FOO;
-  )cpp",
+  #define FOO 5
+  int F = ^FOO;
+)cpp",
 [](HoverInfo &HI) { HI.Provider = ""; }},
{R"cpp(
-#include "foo.h"
-int F = ^FOO;
-  )cpp",
+  #include "foo.h"
+  int F = ^FOO;
+)cpp",
 [](HoverInfo &HI) { HI.Provider = "\"foo.h\""; }},
{R"cpp(
-#include "all.h"
-int F = ^FOO;
-  )cpp",
+  #include "all.h"
+  int F = ^FOO;
+)cpp",
 [](HoverInfo &HI) { HI.Provider = "\"foo.h\""; }},
{R"cpp(
-#include "foo.h"
-Foo A;
-Foo B;
-Foo C = A ^+ B;
-  )cpp",
+  #include "foo.h"
+  Foo A;
+  Foo B;
+  Foo C = A ^+ B;
+)cpp",
 [](HoverInfo &HI) { HI.Provider = "\"foo.h\""; }},
// Hover selects the underlying decl of the using decl
{R"cpp(
-#include "foo.h"
-namespace ns {
-  using ::Foo;
-}
-ns::F^oo d;
-  )cpp",
+  #include "foo.h"
+  namespace ns {
+using ::Foo;
+  }
+  ns::F^oo d;
+)cpp",
 [](HoverInfo &HI) { HI.Provider = "\"foo.h\""; }}};
 
   for (const auto &Case : Cases) {
@@ -2946,10 +2946,10 @@ TEST(Hover, Providers) {
 TU.Filename = "foo.cpp";
 TU.Code = Code.code();
 TU.AdditionalFiles["foo.h"] = guard(R"cpp(
-#define FOO 1
-class Foo {};
-Foo& operator+(const Foo, 
const Foo);
-  )cpp");
+  #define FOO 1
+  class Foo {};
+  Foo& operator+(const Foo, const Foo);
+)cpp");
 TU.AdditionalFiles["all.h"] = guard("#include \"foo.h\"");
 
 auto AST = TU.build();



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


[clang-tools-extra] 481f888 - [clangd] Use expansion location for missing include diagnostics.

2023-03-27 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-03-27T14:26:12Z
New Revision: 481f88853685bcf604c79059e890553831588e8b

URL: 
https://github.com/llvm/llvm-project/commit/481f88853685bcf604c79059e890553831588e8b
DIFF: 
https://github.com/llvm/llvm-project/commit/481f88853685bcf604c79059e890553831588e8b.diff

LOG: [clangd] Use expansion location for missing include diagnostics.

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

Added: 


Modified: 
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
clang-tools-extra/include-cleaner/lib/Analysis.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/IncludeCleaner.cpp 
b/clang-tools-extra/clangd/IncludeCleaner.cpp
index ab7c05eb834c0..8a433b0fe88d7 100644
--- a/clang-tools-extra/clangd/IncludeCleaner.cpp
+++ b/clang-tools-extra/clangd/IncludeCleaner.cpp
@@ -78,7 +78,6 @@ clangd::Range getDiagnosticRange(llvm::StringRef Code, 
unsigned HashOffset) {
   return Result;
 }
 
-
 bool isFilteredByConfig(const Config &Cfg, llvm::StringRef HeaderPath) {
   // Convert the path to Unix slashes and try to match against the filter.
   llvm::SmallString<64> NormalizedPath(HeaderPath);
@@ -390,15 +389,17 @@ IncludeCleanerFindings 
computeIncludeCleanerFindings(ParsedAST &AST) {
 Ref.RT != include_cleaner::RefType::Explicit)
   return;
 
-auto &Tokens = AST.getTokens();
-auto SpelledForExpanded =
-Tokens.spelledForExpanded(Tokens.expandedTokens(Ref.RefLocation));
-if (!SpelledForExpanded)
-  return;
-
-auto Range = syntax::Token::range(SM, SpelledForExpanded->front(),
-  SpelledForExpanded->back());
-MissingIncludeDiagInfo DiagInfo{Ref.Target, Range, Providers};
+// We actually always want to map usages to their spellings, but
+// spelling locations can point into preamble section. Using these
+// offsets could lead into crashes in presence of stale preambles. 
Hence
+// we use "getFileLoc" instead to make sure it always points into main
+// file.
+// FIXME: Use presumed locations to map such usages back to patched
+// locations safely.
+auto Loc = SM.getFileLoc(Ref.RefLocation);
+const auto *Token = AST.getTokens().spelledTokenAt(Loc);
+MissingIncludeDiagInfo DiagInfo{Ref.Target, Token->range(SM),
+Providers};
 MissingIncludes.push_back(std::move(DiagInfo));
   });
   std::vector UnusedIncludes =

diff  --git a/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp 
b/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
index 69b4e07439c38..de45da02bfe87 100644
--- a/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
+++ b/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
@@ -178,27 +178,39 @@ TEST(IncludeCleaner, GenerateMissingHeaderDiags) {
   WithContextValue Ctx(Config::Key, std::move(Cfg));
   Annotations MainFile(R"cpp(
 #include "a.h"
+#include "all.h"
 $insert_b[[]]#include "baz.h"
 #include "dir/c.h"
-$insert_d[[]]#include "fuzz.h"
+$insert_d[[]]$insert_foo[[]]#include "fuzz.h"
 #include "header.h"
 $insert_foobar[[]]#include 
 $insert_f[[]]$insert_vector[[]]
 
-void foo() {
-  $b[[b]]();
+#define DEF(X) const Foo *X;
+#define BAZ(X) const X x
 
-  ns::$bar[[Bar]] bar;
-  bar.d();
-  $f[[f]](); 
+  void foo() {
+$b[[b]]();
 
-  // this should not be diagnosed, because it's ignored in the config
-  buzz(); 
+ns::$bar[[Bar]] bar;
+bar.d();
+$f[[f]](); 
 
-  $foobar[[foobar]]();
+// this should not be diagnosed, because it's ignored in the config
+buzz(); 
 
-  std::$vector[[vector]] v;
-})cpp");
+$foobar[[foobar]]();
+
+std::$vector[[vector]] v;
+
+int var = $FOO[[FOO]];
+
+$DEF[[DEF]](a);
+
+$BAR[[BAR]](b);
+
+BAZ($Foo[[Foo]]);
+})cpp");
 
   TestTU TU;
   TU.Filename = "foo.cpp";
@@ -225,6 +237,13 @@ TEST(IncludeCleaner, GenerateMissingHeaderDiags) {
   namespace std { class vector {}; }
   )cpp");
 
+  TU.AdditionalFiles["all.h"] = guard("#include \"foo.h\"");
+  TU.AdditionalFiles["foo.h"] = guard(R"cpp(
+#define BAR(x) Foo *x
+#define FOO 1
+struct Foo{}; 
+  )cpp");
+
   TU.Code = MainFile.code();
   ParsedAST AST = TU.build();
 
@@ -254,7 +273,23 @@ TEST(IncludeCleaner, GenerateMissingHeaderDiags) {
   Diag(MainFile.range("vector"),
"No header providing \"std::vector\" is directly included"),
   withFix(Fix(MainFile.range("insert_vector"),
-  "#include \n", "#include ");
+  "#include \n", "#include "))),
+  AllOf(Diag(MainFile.range("FOO"),
+ "No header providing \"FOO\" is directly included"),
+wit

[clang-tools-extra] 655baae - [clangd] Show used symbols on #include line hover.

2023-03-28 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-03-28T14:05:34Z
New Revision: 655baae2af0b805a1c3e6d6338a32de05e342357

URL: 
https://github.com/llvm/llvm-project/commit/655baae2af0b805a1c3e6d6338a32de05e342357
DIFF: 
https://github.com/llvm/llvm-project/commit/655baae2af0b805a1c3e6d6338a32de05e342357.diff

LOG: [clangd] Show used symbols on #include line hover.

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

Added: 


Modified: 
clang-tools-extra/clangd/Hover.cpp
clang-tools-extra/clangd/Hover.h
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/IncludeCleaner.h
clang-tools-extra/clangd/unittests/HoverTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Hover.cpp 
b/clang-tools-extra/clangd/Hover.cpp
index 27663991a7f3c..b399a12cd90cf 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -12,6 +12,7 @@
 #include "CodeCompletionStrings.h"
 #include "Config.h"
 #include "FindTarget.h"
+#include "Headers.h"
 #include "IncludeCleaner.h"
 #include "ParsedAST.h"
 #include "Selection.h"
@@ -38,11 +39,15 @@
 #include "clang/AST/RecordLayout.h"
 #include "clang/AST/Type.h"
 #include "clang/Basic/CharInfo.h"
+#include "clang/Basic/LLVM.h"
 #include "clang/Basic/SourceLocation.h"
+#include "clang/Basic/SourceManager.h"
 #include "clang/Basic/Specifiers.h"
 #include "clang/Basic/TokenKinds.h"
 #include "clang/Index/IndexSymbol.h"
 #include "clang/Tooling/Syntax/Tokens.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/DenseSet.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringExtras.h"
@@ -52,6 +57,7 @@
 #include "llvm/Support/Format.h"
 #include "llvm/Support/ScopedPrinter.h"
 #include "llvm/Support/raw_ostream.h"
+#include 
 #include 
 #include 
 #include 
@@ -1134,11 +1140,66 @@ void maybeAddSymbolProviders(ParsedAST &AST, HoverInfo 
&HI,
   HI.Provider = spellHeader(AST, SM.getFileEntryForID(SM.getMainFileID()), H);
 }
 
+// FIXME: similar functions are present in FindHeaders.cpp (symbolName)
+// and IncludeCleaner.cpp (getSymbolName). Introduce a name() method into
+// include_cleaner::Symbol instead.
+std::string getSymbolName(include_cleaner::Symbol Sym) {
+  std::string Name;
+  switch (Sym.kind()) {
+  case include_cleaner::Symbol::Declaration:
+if (const auto *ND = llvm::dyn_cast(&Sym.declaration()))
+  Name = ND->getDeclName().getAsString();
+break;
+  case include_cleaner::Symbol::Macro:
+Name = Sym.macro().Name->getName();
+break;
+  }
+  return Name;
+}
+
+void maybeAddUsedSymbols(ParsedAST &AST, HoverInfo &HI, const Inclusion &Inc) {
+  const SourceManager &SM = AST.getSourceManager();
+  const auto &ConvertedMainFileIncludes =
+  convertIncludes(SM, AST.getIncludeStructure().MainFileIncludes);
+  const auto &HoveredInclude = convertIncludes(SM, llvm::ArrayRef{Inc});
+  llvm::DenseSet UsedSymbols;
+  include_cleaner::walkUsed(
+  AST.getLocalTopLevelDecls(), collectMacroReferences(AST),
+  AST.getPragmaIncludes(), SM,
+  [&](const include_cleaner::SymbolReference &Ref,
+  llvm::ArrayRef Providers) {
+if (Ref.RT != include_cleaner::RefType::Explicit ||
+UsedSymbols.find(Ref.Target) != UsedSymbols.end())
+  return;
+
+for (const include_cleaner::Header &H : Providers) {
+  auto MatchingIncludes = ConvertedMainFileIncludes.match(H);
+  // No match for this provider in the main file.
+  if (MatchingIncludes.empty())
+continue;
+
+  // Check if the hovered include matches this provider.
+  if (!HoveredInclude.match(H).empty())
+UsedSymbols.insert(Ref.Target);
+
+  // Don't look for rest of the providers once we've found a match
+  // in the main file.
+  break;
+}
+  });
+
+  for (const auto &UsedSymbolDecl : UsedSymbols)
+HI.UsedSymbolNames.push_back(getSymbolName(UsedSymbolDecl));
+  llvm::sort(HI.UsedSymbolNames);
+}
+
 } // namespace
 
 std::optional getHover(ParsedAST &AST, Position Pos,
   const format::FormatStyle &Style,
   const SymbolIndex *Index) {
+  static constexpr trace::Metric HoverCountMetric(
+  "hover", trace::Metric::Counter, "case");
   PrintingPolicy PP =
   getPrintingPolicy(AST.getASTContext().getPrintingPolicy());
   const SourceManager &SM = AST.getSourceManager();
@@ -1157,12 +1218,14 @@ std::optional getHover(ParsedAST &AST, 
Position Pos,
   for (const auto &Inc : AST.getIncludeStructure().MainFileIncludes) {
 if (Inc.Resolved.empty() || Inc.HashLine != Pos.line)
   continue;
+HoverCountMetric.record(1, "include");
 HoverInfo HI;
 HI.Name = std::string(llvm::sys::path::filename(Inc.Resolved));
 // FIXME: We don't have a fitting value for Kind.
 HI.Definition =
 URIForFi

[clang-tools-extra] 2fccca8 - [clangd] Fix build by replacing unsigned long with std::vector::size_type.

2023-03-28 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-03-28T14:16:50Z
New Revision: 2fccca8d743613fac4d68f7b14799a672394f64b

URL: 
https://github.com/llvm/llvm-project/commit/2fccca8d743613fac4d68f7b14799a672394f64b
DIFF: 
https://github.com/llvm/llvm-project/commit/2fccca8d743613fac4d68f7b14799a672394f64b.diff

LOG: [clangd] Fix build by replacing unsigned long with std::vector::size_type.

Added: 


Modified: 
clang-tools-extra/clangd/Hover.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Hover.cpp 
b/clang-tools-extra/clangd/Hover.cpp
index b399a12cd90c..af4fbe58b864 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -1451,7 +1451,7 @@ markup::Document HoverInfo::present() const {
 markup::Paragraph &P = Output.addParagraph();
 P.appendText("provides ");
 
-const unsigned long SymbolNamesLimit = 5;
+const std::vector::size_type SymbolNamesLimit = 5;
 auto Front =
 llvm::ArrayRef(UsedSymbolNames)
 .take_front(std::min(UsedSymbolNames.size(), SymbolNamesLimit));



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


[clang-tools-extra] 38b9fb5 - [clangd] Add support for missing includes analysis.

2023-03-07 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-03-07T16:07:19Z
New Revision: 38b9fb5a129db3e086610d53b534833273c5b4d0

URL: 
https://github.com/llvm/llvm-project/commit/38b9fb5a129db3e086610d53b534833273c5b4d0
DIFF: 
https://github.com/llvm/llvm-project/commit/38b9fb5a129db3e086610d53b534833273c5b4d0.diff

LOG: [clangd] Add support for missing includes analysis.

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

Added: 


Modified: 
clang-tools-extra/clangd/Config.h
clang-tools-extra/clangd/ConfigCompile.cpp
clang-tools-extra/clangd/ConfigFragment.h
clang-tools-extra/clangd/ConfigYAML.cpp
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/IncludeCleaner.h
clang-tools-extra/clangd/ParsedAST.cpp
clang-tools-extra/clangd/Preamble.cpp
clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp
clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
clang-tools-extra/clangd/unittests/PreambleTests.cpp
clang-tools-extra/include-cleaner/include/clang-include-cleaner/Analysis.h
clang-tools-extra/include-cleaner/lib/Analysis.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Config.h 
b/clang-tools-extra/clangd/Config.h
index dffd54b01c459..ab346aab0e8ac 100644
--- a/clang-tools-extra/clangd/Config.h
+++ b/clang-tools-extra/clangd/Config.h
@@ -88,11 +88,12 @@ struct Config {
 bool StandardLibrary = true;
   } Index;
 
-  enum class UnusedIncludesPolicy {
-/// Diagnose unused includes.
+  enum class IncludesPolicy {
+/// Diagnose missing and unused includes.
 Strict,
 None,
-/// The same as Strict, but using the include-cleaner library.
+/// The same as Strict, but using the include-cleaner library for
+/// unused includes.
 Experiment,
   };
   /// Controls warnings and errors when parsing code.
@@ -107,11 +108,12 @@ struct Config {
   llvm::StringMap CheckOptions;
 } ClangTidy;
 
-UnusedIncludesPolicy UnusedIncludes = UnusedIncludesPolicy::None;
-
 /// Enable emitting diagnostics using stale preambles.
 bool AllowStalePreamble = false;
 
+IncludesPolicy UnusedIncludes = IncludesPolicy::None;
+IncludesPolicy MissingIncludes = IncludesPolicy::None;
+
 /// IncludeCleaner will not diagnose usages of these headers matched by
 /// these regexes.
 struct {

diff  --git a/clang-tools-extra/clangd/ConfigCompile.cpp 
b/clang-tools-extra/clangd/ConfigCompile.cpp
index 18de6e4d5c3b6..2f0ef892131ca 100644
--- a/clang-tools-extra/clangd/ConfigCompile.cpp
+++ b/clang-tools-extra/clangd/ConfigCompile.cpp
@@ -431,16 +431,16 @@ struct FragmentCompiler {
   });
 
 if (F.UnusedIncludes)
-  if (auto Val =
-  compileEnum("UnusedIncludes",
-**F.UnusedIncludes)
-  .map("Strict", Config::UnusedIncludesPolicy::Strict)
-  .map("Experiment", Config::UnusedIncludesPolicy::Experiment)
-  .map("None", Config::UnusedIncludesPolicy::None)
-  .value())
+  if (auto Val = compileEnum("UnusedIncludes",
+ **F.UnusedIncludes)
+ .map("Strict", Config::IncludesPolicy::Strict)
+ .map("Experiment", Config::IncludesPolicy::Experiment)
+ .map("None", Config::IncludesPolicy::None)
+ .value())
 Out.Apply.push_back([Val](const Params &, Config &C) {
   C.Diagnostics.UnusedIncludes = *Val;
 });
+
 if (F.AllowStalePreamble) {
   if (auto Val = F.AllowStalePreamble)
 Out.Apply.push_back([Val](const Params &, Config &C) {
@@ -448,6 +448,16 @@ struct FragmentCompiler {
 });
 }
 
+if (F.MissingIncludes)
+  if (auto Val = compileEnum("MissingIncludes",
+ **F.MissingIncludes)
+ .map("Strict", Config::IncludesPolicy::Strict)
+ .map("None", Config::IncludesPolicy::None)
+ .value())
+Out.Apply.push_back([Val](const Params &, Config &C) {
+  C.Diagnostics.MissingIncludes = *Val;
+});
+
 compile(std::move(F.Includes));
 compile(std::move(F.ClangTidy));
   }

diff  --git a/clang-tools-extra/clangd/ConfigFragment.h 
b/clang-tools-extra/clangd/ConfigFragment.h
index a5597596196fa..956e8a8599446 100644
--- a/clang-tools-extra/clangd/ConfigFragment.h
+++ b/clang-tools-extra/clangd/ConfigFragment.h
@@ -221,7 +221,7 @@ struct Fragment {
 /// This often has other advantages, such as skipping some analysis.
 std::vector> Suppress;
 
-/// Controls how clangd will correct "unnecessary #include directives.
+/// Controls how clangd will correct "unnecessary" #in

[clang-tools-extra] 85a5c17 - Re-land [clangd] Add support for missing includes analysis.

2023-03-08 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-03-08T11:02:12Z
New Revision: 85a5c17b66768353b7fff717904e42805bb6a547

URL: 
https://github.com/llvm/llvm-project/commit/85a5c17b66768353b7fff717904e42805bb6a547
DIFF: 
https://github.com/llvm/llvm-project/commit/85a5c17b66768353b7fff717904e42805bb6a547.diff

LOG: Re-land [clangd] Add support for missing includes analysis.

This reverts commit 2eb5ac99a76dbbf8ac68c538211fabeaa5ac0bfd.

Added: 


Modified: 
clang-tools-extra/clangd/Config.h
clang-tools-extra/clangd/ConfigCompile.cpp
clang-tools-extra/clangd/ConfigFragment.h
clang-tools-extra/clangd/ConfigYAML.cpp
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/IncludeCleaner.h
clang-tools-extra/clangd/ParsedAST.cpp
clang-tools-extra/clangd/Preamble.cpp
clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp
clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
clang-tools-extra/clangd/unittests/PreambleTests.cpp
clang-tools-extra/include-cleaner/include/clang-include-cleaner/Analysis.h
clang-tools-extra/include-cleaner/lib/Analysis.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Config.h 
b/clang-tools-extra/clangd/Config.h
index dffd54b01c459..ab346aab0e8ac 100644
--- a/clang-tools-extra/clangd/Config.h
+++ b/clang-tools-extra/clangd/Config.h
@@ -88,11 +88,12 @@ struct Config {
 bool StandardLibrary = true;
   } Index;
 
-  enum class UnusedIncludesPolicy {
-/// Diagnose unused includes.
+  enum class IncludesPolicy {
+/// Diagnose missing and unused includes.
 Strict,
 None,
-/// The same as Strict, but using the include-cleaner library.
+/// The same as Strict, but using the include-cleaner library for
+/// unused includes.
 Experiment,
   };
   /// Controls warnings and errors when parsing code.
@@ -107,11 +108,12 @@ struct Config {
   llvm::StringMap CheckOptions;
 } ClangTidy;
 
-UnusedIncludesPolicy UnusedIncludes = UnusedIncludesPolicy::None;
-
 /// Enable emitting diagnostics using stale preambles.
 bool AllowStalePreamble = false;
 
+IncludesPolicy UnusedIncludes = IncludesPolicy::None;
+IncludesPolicy MissingIncludes = IncludesPolicy::None;
+
 /// IncludeCleaner will not diagnose usages of these headers matched by
 /// these regexes.
 struct {

diff  --git a/clang-tools-extra/clangd/ConfigCompile.cpp 
b/clang-tools-extra/clangd/ConfigCompile.cpp
index 18de6e4d5c3b6..2f0ef892131ca 100644
--- a/clang-tools-extra/clangd/ConfigCompile.cpp
+++ b/clang-tools-extra/clangd/ConfigCompile.cpp
@@ -431,16 +431,16 @@ struct FragmentCompiler {
   });
 
 if (F.UnusedIncludes)
-  if (auto Val =
-  compileEnum("UnusedIncludes",
-**F.UnusedIncludes)
-  .map("Strict", Config::UnusedIncludesPolicy::Strict)
-  .map("Experiment", Config::UnusedIncludesPolicy::Experiment)
-  .map("None", Config::UnusedIncludesPolicy::None)
-  .value())
+  if (auto Val = compileEnum("UnusedIncludes",
+ **F.UnusedIncludes)
+ .map("Strict", Config::IncludesPolicy::Strict)
+ .map("Experiment", Config::IncludesPolicy::Experiment)
+ .map("None", Config::IncludesPolicy::None)
+ .value())
 Out.Apply.push_back([Val](const Params &, Config &C) {
   C.Diagnostics.UnusedIncludes = *Val;
 });
+
 if (F.AllowStalePreamble) {
   if (auto Val = F.AllowStalePreamble)
 Out.Apply.push_back([Val](const Params &, Config &C) {
@@ -448,6 +448,16 @@ struct FragmentCompiler {
 });
 }
 
+if (F.MissingIncludes)
+  if (auto Val = compileEnum("MissingIncludes",
+ **F.MissingIncludes)
+ .map("Strict", Config::IncludesPolicy::Strict)
+ .map("None", Config::IncludesPolicy::None)
+ .value())
+Out.Apply.push_back([Val](const Params &, Config &C) {
+  C.Diagnostics.MissingIncludes = *Val;
+});
+
 compile(std::move(F.Includes));
 compile(std::move(F.ClangTidy));
   }

diff  --git a/clang-tools-extra/clangd/ConfigFragment.h 
b/clang-tools-extra/clangd/ConfigFragment.h
index a5597596196fa..956e8a8599446 100644
--- a/clang-tools-extra/clangd/ConfigFragment.h
+++ b/clang-tools-extra/clangd/ConfigFragment.h
@@ -221,7 +221,7 @@ struct Fragment {
 /// This often has other advantages, such as skipping some analysis.
 std::vector> Suppress;
 
-/// Controls how clangd will correct "unnecessary #include directives.
+/// Controls how clangd will correct "un

[clang-tools-extra] 7bd56dd - Re-land [clangd] Add support for missing includes analysis.

2023-03-08 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-03-08T12:19:17Z
New Revision: 7bd56ddaeeb578331d3dfc0c4a2fe2727d0d1861

URL: 
https://github.com/llvm/llvm-project/commit/7bd56ddaeeb578331d3dfc0c4a2fe2727d0d1861
DIFF: 
https://github.com/llvm/llvm-project/commit/7bd56ddaeeb578331d3dfc0c4a2fe2727d0d1861.diff

LOG: Re-land [clangd] Add support for missing includes analysis.

This reverts commit 2eb5ac99a76dbbf8ac68c538211fabeaa5ac0bfd.

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

Added: 


Modified: 
clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp 
b/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
index 2e18c18a2662..85ac00a89e5c 100644
--- a/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
+++ b/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
@@ -461,7 +461,7 @@ TEST(IncludeCleaner, GenerateMissingHeaderDiags) {
   Config Cfg;
   Cfg.Diagnostics.MissingIncludes = Config::IncludesPolicy::Strict;
   Cfg.Diagnostics.Includes.IgnoreHeader = {[](llvm::StringRef Header) {
-return Header == testPath("buzz.h", llvm::sys::path::Style::posix);
+return Header.ends_with("buzz.h");
   }};
   WithContextValue Ctx(Config::Key, std::move(Cfg));
   Annotations MainFile(R"cpp(



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


[clang-tools-extra] 9814b4d - Revert "Re-land [clangd] Add support for missing includes analysis."

2023-03-08 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-03-08T12:24:51Z
New Revision: 9814b4d07f614e83e7a244f74fc562f2b5cc9b15

URL: 
https://github.com/llvm/llvm-project/commit/9814b4d07f614e83e7a244f74fc562f2b5cc9b15
DIFF: 
https://github.com/llvm/llvm-project/commit/9814b4d07f614e83e7a244f74fc562f2b5cc9b15.diff

LOG: Revert "Re-land [clangd] Add support for missing includes analysis."

This reverts commit 85a5c17b66768353b7fff717904e42805bb6a547.

Added: 


Modified: 
clang-tools-extra/clangd/Config.h
clang-tools-extra/clangd/ConfigCompile.cpp
clang-tools-extra/clangd/ConfigFragment.h
clang-tools-extra/clangd/ConfigYAML.cpp
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/IncludeCleaner.h
clang-tools-extra/clangd/ParsedAST.cpp
clang-tools-extra/clangd/Preamble.cpp
clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp
clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
clang-tools-extra/clangd/unittests/PreambleTests.cpp
clang-tools-extra/include-cleaner/include/clang-include-cleaner/Analysis.h
clang-tools-extra/include-cleaner/lib/Analysis.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Config.h 
b/clang-tools-extra/clangd/Config.h
index ab346aab0e8ac..dffd54b01c459 100644
--- a/clang-tools-extra/clangd/Config.h
+++ b/clang-tools-extra/clangd/Config.h
@@ -88,12 +88,11 @@ struct Config {
 bool StandardLibrary = true;
   } Index;
 
-  enum class IncludesPolicy {
-/// Diagnose missing and unused includes.
+  enum class UnusedIncludesPolicy {
+/// Diagnose unused includes.
 Strict,
 None,
-/// The same as Strict, but using the include-cleaner library for
-/// unused includes.
+/// The same as Strict, but using the include-cleaner library.
 Experiment,
   };
   /// Controls warnings and errors when parsing code.
@@ -108,12 +107,11 @@ struct Config {
   llvm::StringMap CheckOptions;
 } ClangTidy;
 
+UnusedIncludesPolicy UnusedIncludes = UnusedIncludesPolicy::None;
+
 /// Enable emitting diagnostics using stale preambles.
 bool AllowStalePreamble = false;
 
-IncludesPolicy UnusedIncludes = IncludesPolicy::None;
-IncludesPolicy MissingIncludes = IncludesPolicy::None;
-
 /// IncludeCleaner will not diagnose usages of these headers matched by
 /// these regexes.
 struct {

diff  --git a/clang-tools-extra/clangd/ConfigCompile.cpp 
b/clang-tools-extra/clangd/ConfigCompile.cpp
index 2f0ef892131ca..18de6e4d5c3b6 100644
--- a/clang-tools-extra/clangd/ConfigCompile.cpp
+++ b/clang-tools-extra/clangd/ConfigCompile.cpp
@@ -431,16 +431,16 @@ struct FragmentCompiler {
   });
 
 if (F.UnusedIncludes)
-  if (auto Val = compileEnum("UnusedIncludes",
- **F.UnusedIncludes)
- .map("Strict", Config::IncludesPolicy::Strict)
- .map("Experiment", Config::IncludesPolicy::Experiment)
- .map("None", Config::IncludesPolicy::None)
- .value())
+  if (auto Val =
+  compileEnum("UnusedIncludes",
+**F.UnusedIncludes)
+  .map("Strict", Config::UnusedIncludesPolicy::Strict)
+  .map("Experiment", Config::UnusedIncludesPolicy::Experiment)
+  .map("None", Config::UnusedIncludesPolicy::None)
+  .value())
 Out.Apply.push_back([Val](const Params &, Config &C) {
   C.Diagnostics.UnusedIncludes = *Val;
 });
-
 if (F.AllowStalePreamble) {
   if (auto Val = F.AllowStalePreamble)
 Out.Apply.push_back([Val](const Params &, Config &C) {
@@ -448,16 +448,6 @@ struct FragmentCompiler {
 });
 }
 
-if (F.MissingIncludes)
-  if (auto Val = compileEnum("MissingIncludes",
- **F.MissingIncludes)
- .map("Strict", Config::IncludesPolicy::Strict)
- .map("None", Config::IncludesPolicy::None)
- .value())
-Out.Apply.push_back([Val](const Params &, Config &C) {
-  C.Diagnostics.MissingIncludes = *Val;
-});
-
 compile(std::move(F.Includes));
 compile(std::move(F.ClangTidy));
   }

diff  --git a/clang-tools-extra/clangd/ConfigFragment.h 
b/clang-tools-extra/clangd/ConfigFragment.h
index 956e8a8599446..a5597596196fa 100644
--- a/clang-tools-extra/clangd/ConfigFragment.h
+++ b/clang-tools-extra/clangd/ConfigFragment.h
@@ -221,7 +221,7 @@ struct Fragment {
 /// This often has other advantages, such as skipping some analysis.
 std::vector> Suppress;
 
-/// Controls how clangd will correct "unnecessary" #include directives.
+/// Controls how clangd will c

[clang-tools-extra] df92d79 - Revert "Re-land [clangd] Add support for missing includes analysis."

2023-03-08 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-03-08T12:29:43Z
New Revision: df92d7911b9ce0221ebf60a937da3e9101150bc1

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

LOG: Revert "Re-land [clangd] Add support for missing includes analysis."

This reverts commit 7bd56ddaeeb578331d3dfc0c4a2fe2727d0d1861.

Added: 


Modified: 
clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp 
b/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
index 85ac00a89e5c..2e18c18a2662 100644
--- a/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
+++ b/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
@@ -461,7 +461,7 @@ TEST(IncludeCleaner, GenerateMissingHeaderDiags) {
   Config Cfg;
   Cfg.Diagnostics.MissingIncludes = Config::IncludesPolicy::Strict;
   Cfg.Diagnostics.Includes.IgnoreHeader = {[](llvm::StringRef Header) {
-return Header.ends_with("buzz.h");
+return Header == testPath("buzz.h", llvm::sys::path::Style::posix);
   }};
   WithContextValue Ctx(Config::Key, std::move(Cfg));
   Annotations MainFile(R"cpp(



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


[clang-tools-extra] 46447e0 - Revert "Revert "Re-land [clangd] Add support for missing includes analysis.""

2023-03-08 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-03-08T12:27:17Z
New Revision: 46447e0ba2e31f4da55c59794caa3200c990c535

URL: 
https://github.com/llvm/llvm-project/commit/46447e0ba2e31f4da55c59794caa3200c990c535
DIFF: 
https://github.com/llvm/llvm-project/commit/46447e0ba2e31f4da55c59794caa3200c990c535.diff

LOG: Revert "Revert "Re-land [clangd] Add support for missing includes 
analysis.""

This reverts commit 9814b4d07f614e83e7a244f74fc562f2b5cc9b15.

Added: 


Modified: 
clang-tools-extra/clangd/Config.h
clang-tools-extra/clangd/ConfigCompile.cpp
clang-tools-extra/clangd/ConfigFragment.h
clang-tools-extra/clangd/ConfigYAML.cpp
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/IncludeCleaner.h
clang-tools-extra/clangd/ParsedAST.cpp
clang-tools-extra/clangd/Preamble.cpp
clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp
clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
clang-tools-extra/clangd/unittests/PreambleTests.cpp
clang-tools-extra/include-cleaner/include/clang-include-cleaner/Analysis.h
clang-tools-extra/include-cleaner/lib/Analysis.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Config.h 
b/clang-tools-extra/clangd/Config.h
index dffd54b01c459..ab346aab0e8ac 100644
--- a/clang-tools-extra/clangd/Config.h
+++ b/clang-tools-extra/clangd/Config.h
@@ -88,11 +88,12 @@ struct Config {
 bool StandardLibrary = true;
   } Index;
 
-  enum class UnusedIncludesPolicy {
-/// Diagnose unused includes.
+  enum class IncludesPolicy {
+/// Diagnose missing and unused includes.
 Strict,
 None,
-/// The same as Strict, but using the include-cleaner library.
+/// The same as Strict, but using the include-cleaner library for
+/// unused includes.
 Experiment,
   };
   /// Controls warnings and errors when parsing code.
@@ -107,11 +108,12 @@ struct Config {
   llvm::StringMap CheckOptions;
 } ClangTidy;
 
-UnusedIncludesPolicy UnusedIncludes = UnusedIncludesPolicy::None;
-
 /// Enable emitting diagnostics using stale preambles.
 bool AllowStalePreamble = false;
 
+IncludesPolicy UnusedIncludes = IncludesPolicy::None;
+IncludesPolicy MissingIncludes = IncludesPolicy::None;
+
 /// IncludeCleaner will not diagnose usages of these headers matched by
 /// these regexes.
 struct {

diff  --git a/clang-tools-extra/clangd/ConfigCompile.cpp 
b/clang-tools-extra/clangd/ConfigCompile.cpp
index 18de6e4d5c3b6..2f0ef892131ca 100644
--- a/clang-tools-extra/clangd/ConfigCompile.cpp
+++ b/clang-tools-extra/clangd/ConfigCompile.cpp
@@ -431,16 +431,16 @@ struct FragmentCompiler {
   });
 
 if (F.UnusedIncludes)
-  if (auto Val =
-  compileEnum("UnusedIncludes",
-**F.UnusedIncludes)
-  .map("Strict", Config::UnusedIncludesPolicy::Strict)
-  .map("Experiment", Config::UnusedIncludesPolicy::Experiment)
-  .map("None", Config::UnusedIncludesPolicy::None)
-  .value())
+  if (auto Val = compileEnum("UnusedIncludes",
+ **F.UnusedIncludes)
+ .map("Strict", Config::IncludesPolicy::Strict)
+ .map("Experiment", Config::IncludesPolicy::Experiment)
+ .map("None", Config::IncludesPolicy::None)
+ .value())
 Out.Apply.push_back([Val](const Params &, Config &C) {
   C.Diagnostics.UnusedIncludes = *Val;
 });
+
 if (F.AllowStalePreamble) {
   if (auto Val = F.AllowStalePreamble)
 Out.Apply.push_back([Val](const Params &, Config &C) {
@@ -448,6 +448,16 @@ struct FragmentCompiler {
 });
 }
 
+if (F.MissingIncludes)
+  if (auto Val = compileEnum("MissingIncludes",
+ **F.MissingIncludes)
+ .map("Strict", Config::IncludesPolicy::Strict)
+ .map("None", Config::IncludesPolicy::None)
+ .value())
+Out.Apply.push_back([Val](const Params &, Config &C) {
+  C.Diagnostics.MissingIncludes = *Val;
+});
+
 compile(std::move(F.Includes));
 compile(std::move(F.ClangTidy));
   }

diff  --git a/clang-tools-extra/clangd/ConfigFragment.h 
b/clang-tools-extra/clangd/ConfigFragment.h
index a5597596196fa..956e8a8599446 100644
--- a/clang-tools-extra/clangd/ConfigFragment.h
+++ b/clang-tools-extra/clangd/ConfigFragment.h
@@ -221,7 +221,7 @@ struct Fragment {
 /// This often has other advantages, such as skipping some analysis.
 std::vector> Suppress;
 
-/// Controls how clangd will correct "unnecessary #include directives.
+/// Controls how clan

[clang-tools-extra] fd8c9ef - Revert "Re-land [clangd] Add support for missing includes analysis."

2023-03-08 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-03-08T12:34:15Z
New Revision: fd8c9ef20a9519dccd5b8178b29ed4574285d36f

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

LOG: Revert "Re-land [clangd] Add support for missing includes analysis."

This reverts commit 85a5c17b66768353b7fff717904e42805bb6a547.

Added: 


Modified: 
clang-tools-extra/clangd/Config.h
clang-tools-extra/clangd/ConfigCompile.cpp
clang-tools-extra/clangd/ConfigFragment.h
clang-tools-extra/clangd/ConfigYAML.cpp
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/IncludeCleaner.h
clang-tools-extra/clangd/ParsedAST.cpp
clang-tools-extra/clangd/Preamble.cpp
clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp
clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
clang-tools-extra/clangd/unittests/PreambleTests.cpp
clang-tools-extra/include-cleaner/include/clang-include-cleaner/Analysis.h
clang-tools-extra/include-cleaner/lib/Analysis.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Config.h 
b/clang-tools-extra/clangd/Config.h
index ab346aab0e8ac..dffd54b01c459 100644
--- a/clang-tools-extra/clangd/Config.h
+++ b/clang-tools-extra/clangd/Config.h
@@ -88,12 +88,11 @@ struct Config {
 bool StandardLibrary = true;
   } Index;
 
-  enum class IncludesPolicy {
-/// Diagnose missing and unused includes.
+  enum class UnusedIncludesPolicy {
+/// Diagnose unused includes.
 Strict,
 None,
-/// The same as Strict, but using the include-cleaner library for
-/// unused includes.
+/// The same as Strict, but using the include-cleaner library.
 Experiment,
   };
   /// Controls warnings and errors when parsing code.
@@ -108,12 +107,11 @@ struct Config {
   llvm::StringMap CheckOptions;
 } ClangTidy;
 
+UnusedIncludesPolicy UnusedIncludes = UnusedIncludesPolicy::None;
+
 /// Enable emitting diagnostics using stale preambles.
 bool AllowStalePreamble = false;
 
-IncludesPolicy UnusedIncludes = IncludesPolicy::None;
-IncludesPolicy MissingIncludes = IncludesPolicy::None;
-
 /// IncludeCleaner will not diagnose usages of these headers matched by
 /// these regexes.
 struct {

diff  --git a/clang-tools-extra/clangd/ConfigCompile.cpp 
b/clang-tools-extra/clangd/ConfigCompile.cpp
index 2f0ef892131ca..18de6e4d5c3b6 100644
--- a/clang-tools-extra/clangd/ConfigCompile.cpp
+++ b/clang-tools-extra/clangd/ConfigCompile.cpp
@@ -431,16 +431,16 @@ struct FragmentCompiler {
   });
 
 if (F.UnusedIncludes)
-  if (auto Val = compileEnum("UnusedIncludes",
- **F.UnusedIncludes)
- .map("Strict", Config::IncludesPolicy::Strict)
- .map("Experiment", Config::IncludesPolicy::Experiment)
- .map("None", Config::IncludesPolicy::None)
- .value())
+  if (auto Val =
+  compileEnum("UnusedIncludes",
+**F.UnusedIncludes)
+  .map("Strict", Config::UnusedIncludesPolicy::Strict)
+  .map("Experiment", Config::UnusedIncludesPolicy::Experiment)
+  .map("None", Config::UnusedIncludesPolicy::None)
+  .value())
 Out.Apply.push_back([Val](const Params &, Config &C) {
   C.Diagnostics.UnusedIncludes = *Val;
 });
-
 if (F.AllowStalePreamble) {
   if (auto Val = F.AllowStalePreamble)
 Out.Apply.push_back([Val](const Params &, Config &C) {
@@ -448,16 +448,6 @@ struct FragmentCompiler {
 });
 }
 
-if (F.MissingIncludes)
-  if (auto Val = compileEnum("MissingIncludes",
- **F.MissingIncludes)
- .map("Strict", Config::IncludesPolicy::Strict)
- .map("None", Config::IncludesPolicy::None)
- .value())
-Out.Apply.push_back([Val](const Params &, Config &C) {
-  C.Diagnostics.MissingIncludes = *Val;
-});
-
 compile(std::move(F.Includes));
 compile(std::move(F.ClangTidy));
   }

diff  --git a/clang-tools-extra/clangd/ConfigFragment.h 
b/clang-tools-extra/clangd/ConfigFragment.h
index 956e8a8599446..a5597596196fa 100644
--- a/clang-tools-extra/clangd/ConfigFragment.h
+++ b/clang-tools-extra/clangd/ConfigFragment.h
@@ -221,7 +221,7 @@ struct Fragment {
 /// This often has other advantages, such as skipping some analysis.
 std::vector> Suppress;
 
-/// Controls how clangd will correct "unnecessary" #include directives.
+/// Controls how clangd will c

[clang-tools-extra] 2e82eb1 - Re-land [clangd] Add support for missing includes analysis.

2023-03-08 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-03-08T13:29:52Z
New Revision: 2e82eb1f74aa268473c9eca27c3b8ddc91917a13

URL: 
https://github.com/llvm/llvm-project/commit/2e82eb1f74aa268473c9eca27c3b8ddc91917a13
DIFF: 
https://github.com/llvm/llvm-project/commit/2e82eb1f74aa268473c9eca27c3b8ddc91917a13.diff

LOG: Re-land [clangd] Add support for missing includes analysis.

This reverts commit fd8c9ef20a9519dccd5b8178b29ed4574285d36f.

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

Added: 


Modified: 
clang-tools-extra/clangd/Config.h
clang-tools-extra/clangd/ConfigCompile.cpp
clang-tools-extra/clangd/ConfigFragment.h
clang-tools-extra/clangd/ConfigYAML.cpp
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/IncludeCleaner.h
clang-tools-extra/clangd/ParsedAST.cpp
clang-tools-extra/clangd/Preamble.cpp
clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp
clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
clang-tools-extra/clangd/unittests/PreambleTests.cpp
clang-tools-extra/include-cleaner/include/clang-include-cleaner/Analysis.h
clang-tools-extra/include-cleaner/lib/Analysis.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Config.h 
b/clang-tools-extra/clangd/Config.h
index dffd54b01c459..ab346aab0e8ac 100644
--- a/clang-tools-extra/clangd/Config.h
+++ b/clang-tools-extra/clangd/Config.h
@@ -88,11 +88,12 @@ struct Config {
 bool StandardLibrary = true;
   } Index;
 
-  enum class UnusedIncludesPolicy {
-/// Diagnose unused includes.
+  enum class IncludesPolicy {
+/// Diagnose missing and unused includes.
 Strict,
 None,
-/// The same as Strict, but using the include-cleaner library.
+/// The same as Strict, but using the include-cleaner library for
+/// unused includes.
 Experiment,
   };
   /// Controls warnings and errors when parsing code.
@@ -107,11 +108,12 @@ struct Config {
   llvm::StringMap CheckOptions;
 } ClangTidy;
 
-UnusedIncludesPolicy UnusedIncludes = UnusedIncludesPolicy::None;
-
 /// Enable emitting diagnostics using stale preambles.
 bool AllowStalePreamble = false;
 
+IncludesPolicy UnusedIncludes = IncludesPolicy::None;
+IncludesPolicy MissingIncludes = IncludesPolicy::None;
+
 /// IncludeCleaner will not diagnose usages of these headers matched by
 /// these regexes.
 struct {

diff  --git a/clang-tools-extra/clangd/ConfigCompile.cpp 
b/clang-tools-extra/clangd/ConfigCompile.cpp
index 18de6e4d5c3b6..2f0ef892131ca 100644
--- a/clang-tools-extra/clangd/ConfigCompile.cpp
+++ b/clang-tools-extra/clangd/ConfigCompile.cpp
@@ -431,16 +431,16 @@ struct FragmentCompiler {
   });
 
 if (F.UnusedIncludes)
-  if (auto Val =
-  compileEnum("UnusedIncludes",
-**F.UnusedIncludes)
-  .map("Strict", Config::UnusedIncludesPolicy::Strict)
-  .map("Experiment", Config::UnusedIncludesPolicy::Experiment)
-  .map("None", Config::UnusedIncludesPolicy::None)
-  .value())
+  if (auto Val = compileEnum("UnusedIncludes",
+ **F.UnusedIncludes)
+ .map("Strict", Config::IncludesPolicy::Strict)
+ .map("Experiment", Config::IncludesPolicy::Experiment)
+ .map("None", Config::IncludesPolicy::None)
+ .value())
 Out.Apply.push_back([Val](const Params &, Config &C) {
   C.Diagnostics.UnusedIncludes = *Val;
 });
+
 if (F.AllowStalePreamble) {
   if (auto Val = F.AllowStalePreamble)
 Out.Apply.push_back([Val](const Params &, Config &C) {
@@ -448,6 +448,16 @@ struct FragmentCompiler {
 });
 }
 
+if (F.MissingIncludes)
+  if (auto Val = compileEnum("MissingIncludes",
+ **F.MissingIncludes)
+ .map("Strict", Config::IncludesPolicy::Strict)
+ .map("None", Config::IncludesPolicy::None)
+ .value())
+Out.Apply.push_back([Val](const Params &, Config &C) {
+  C.Diagnostics.MissingIncludes = *Val;
+});
+
 compile(std::move(F.Includes));
 compile(std::move(F.ClangTidy));
   }

diff  --git a/clang-tools-extra/clangd/ConfigFragment.h 
b/clang-tools-extra/clangd/ConfigFragment.h
index a5597596196fa..956e8a8599446 100644
--- a/clang-tools-extra/clangd/ConfigFragment.h
+++ b/clang-tools-extra/clangd/ConfigFragment.h
@@ -221,7 +221,7 @@ struct Fragment {
 /// This often has other advantages, such as skipping some analysis.
 std::vector> Suppress;
 
-/// Controls how clangd will correct "unnecessary #include 

[clang] 6b50e87 - [clang] Fix label (de-)serialization in ASM statements.

2023-05-22 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-05-22T15:53:45Z
New Revision: 6b50e87f21e131fb75d234acaa69b2386e3b6006

URL: 
https://github.com/llvm/llvm-project/commit/6b50e87f21e131fb75d234acaa69b2386e3b6006
DIFF: 
https://github.com/llvm/llvm-project/commit/6b50e87f21e131fb75d234acaa69b2386e3b6006.diff

LOG: [clang] Fix label (de-)serialization in ASM statements.

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

Added: 
clang/test/PCH/asm-label.cpp

Modified: 
clang/lib/Serialization/ASTReaderStmt.cpp
clang/lib/Serialization/ASTWriterStmt.cpp

Removed: 




diff  --git a/clang/lib/Serialization/ASTReaderStmt.cpp 
b/clang/lib/Serialization/ASTReaderStmt.cpp
index a96b1a2fa4f31..c3ccb6744ff61 100644
--- a/clang/lib/Serialization/ASTReaderStmt.cpp
+++ b/clang/lib/Serialization/ASTReaderStmt.cpp
@@ -400,8 +400,10 @@ void ASTStmtReader::VisitGCCAsmStmt(GCCAsmStmt *S) {
 Clobbers.push_back(cast_or_null(Record.readSubStmt()));
 
   // Labels
-  for (unsigned I = 0, N = NumLabels; I != N; ++I)
+  for (unsigned I = 0, N = NumLabels; I != N; ++I) {
+Names.push_back(Record.readIdentifier());
 Exprs.push_back(Record.readSubStmt());
+  }
 
   S->setOutputsAndInputsAndClobbers(Record.getContext(),
 Names.data(), Constraints.data(),

diff  --git a/clang/lib/Serialization/ASTWriterStmt.cpp 
b/clang/lib/Serialization/ASTWriterStmt.cpp
index 363f7569acd3e..9739d0b37fba1 100644
--- a/clang/lib/Serialization/ASTWriterStmt.cpp
+++ b/clang/lib/Serialization/ASTWriterStmt.cpp
@@ -317,7 +317,10 @@ void ASTStmtWriter::VisitGCCAsmStmt(GCCAsmStmt *S) {
 Record.AddStmt(S->getClobberStringLiteral(I));
 
   // Labels
-  for (auto *E : S->labels()) Record.AddStmt(E);
+  for (unsigned I = 0, N = S->getNumLabels(); I != N; ++I) {
+Record.AddIdentifierRef(S->getLabelIdentifier(I));
+Record.AddStmt(S->getLabelExpr(I));
+  }
 
   Code = serialization::STMT_GCCASM;
 }

diff  --git a/clang/test/PCH/asm-label.cpp b/clang/test/PCH/asm-label.cpp
new file mode 100644
index 0..dd68c11409ff5
--- /dev/null
+++ b/clang/test/PCH/asm-label.cpp
@@ -0,0 +1,23 @@
+// RUN: %clang_cc1 -emit-pch %s -o %t
+// RUN: %clang_cc1 -include-pch %t %s -verify
+#ifndef HEADER_H
+#define HEADER_H
+template 
+void MyMethod() {
+  void *bar;
+  some_path:
+  asm goto
+  (
+  "mov %w[foo], %w[foo]"
+  : [foo] "=r"(bar)
+  : [foo2] "r"(bar), [foo3] "r"(bar), [foo4] "r"(bar)
+  : 
+  : some_path
+  );
+  }
+#else
+void test() {
+ MyMethod();
+// expected-no-diagnostics
+}
+#endif



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


[clang-tools-extra] c28506b - [clang-tidy] Implement an include-cleaner check.

2023-06-02 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-06-02T15:21:20Z
New Revision: c28506ba4b6961950849f8fdecd0cf7e503a14f9

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

LOG: [clang-tidy] Implement an include-cleaner check.

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

Added: 
clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.h
clang-tools-extra/docs/clang-tidy/checks/misc/include-cleaner.rst
clang-tools-extra/test/clang-tidy/checkers/misc/Inputs/bar.h
clang-tools-extra/test/clang-tidy/checkers/misc/Inputs/baz.h
clang-tools-extra/test/clang-tidy/checkers/misc/Inputs/foo.h
clang-tools-extra/test/clang-tidy/checkers/misc/Inputs/private.h
clang-tools-extra/test/clang-tidy/checkers/misc/include-cleaner.cpp
clang-tools-extra/test/clang-tidy/checkers/misc/system/string.h
clang-tools-extra/test/clang-tidy/checkers/misc/system/vector.h
clang-tools-extra/unittests/clang-tidy/IncludeCleanerTest.cpp

Modified: 
clang-tools-extra/clang-tidy/misc/CMakeLists.txt
clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp
clang-tools-extra/clangd/TidyProvider.cpp
clang-tools-extra/docs/ReleaseNotes.rst
clang-tools-extra/docs/clang-tidy/checks/list.rst
clang-tools-extra/include-cleaner/include/clang-include-cleaner/Record.h
clang-tools-extra/include-cleaner/lib/Record.cpp
clang-tools-extra/unittests/clang-tidy/CMakeLists.txt

Removed: 




diff  --git a/clang-tools-extra/clang-tidy/misc/CMakeLists.txt 
b/clang-tools-extra/clang-tidy/misc/CMakeLists.txt
index a72362906e0b8..1703ff82b942d 100644
--- a/clang-tools-extra/clang-tidy/misc/CMakeLists.txt
+++ b/clang-tools-extra/clang-tidy/misc/CMakeLists.txt
@@ -7,6 +7,7 @@ setup_host_tool(clang-tidy-confusable-chars-gen 
CLANG_TIDY_CONFUSABLE_CHARS_GEN
 
 add_subdirectory(ConfusableTable)
 
+include_directories(BEFORE 
"${CMAKE_CURRENT_SOURCE_DIR}/../../include-cleaner/include")
 
 add_custom_command(
 OUTPUT Confusables.inc
@@ -19,6 +20,7 @@ add_clang_library(clangTidyMiscModule
   ConstCorrectnessCheck.cpp
   DefinitionsInHeadersCheck.cpp
   ConfusableIdentifierCheck.cpp
+  IncludeCleanerCheck.cpp
   MiscTidyModule.cpp
   MisleadingBidirectional.cpp
   MisleadingIdentifier.cpp
@@ -53,6 +55,7 @@ clang_target_link_libraries(clangTidyMiscModule
   clangAST
   clangASTMatchers
   clangBasic
+  clangIncludeCleaner
   clangLex
   clangSerialization
   clangTooling

diff  --git a/clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp 
b/clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
new file mode 100644
index 0..c7aca83f2ca8c
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
@@ -0,0 +1,202 @@
+//===--- IncludeCleanerCheck.cpp - clang-tidy 
-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#include "IncludeCleanerCheck.h"
+#include "../ClangTidyCheck.h"
+#include "../ClangTidyDiagnosticConsumer.h"
+#include "../ClangTidyOptions.h"
+#include "../utils/OptionsUtils.h"
+#include "clang-include-cleaner/Analysis.h"
+#include "clang-include-cleaner/Record.h"
+#include "clang-include-cleaner/Types.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/AST/Decl.h"
+#include "clang/AST/DeclBase.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/ASTMatchers/ASTMatchers.h"
+#include "clang/Basic/Diagnostic.h"
+#include "clang/Basic/FileEntry.h"
+#include "clang/Basic/LLVM.h"
+#include "clang/Basic/LangOptions.h"
+#include "clang/Basic/SourceLocation.h"
+#include "clang/Format/Format.h"
+#include "clang/Lex/Preprocessor.h"
+#include "clang/Tooling/Core/Replacement.h"
+#include "clang/Tooling/Inclusions/HeaderIncludes.h"
+#include "llvm/ADT/DenseSet.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/Regex.h"
+#include 
+#include 
+#include 
+
+using namespace clang::ast_matchers;
+
+namespace clang::tidy::misc {
+
+namespace {
+struct MissingIncludeInfo {
+  SourceLocation SymRefLocation;
+  include_cleaner::Header Missing;
+};
+} // namespace
+
+IncludeCleanerCheck::IncludeCleanerCheck(StringRef Name,
+ ClangTidyContext *Context)
+: ClangTidyCheck(Name, Context),
+  IgnoreHeaders(utils::options::parseStringList(
+  Options.getLocalOrGlobal("IgnoreHeaders", ""))) {
+  for (const auto &Header : IgnoreHeaders) {
+if (!llvm:

[clang-tools-extra] 5c2072e - [clang-tidy] Fix docs.

2023-06-02 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-06-02T15:31:55Z
New Revision: 5c2072e74b42d55e8bf7a9c8fee8800bad591f12

URL: 
https://github.com/llvm/llvm-project/commit/5c2072e74b42d55e8bf7a9c8fee8800bad591f12
DIFF: 
https://github.com/llvm/llvm-project/commit/5c2072e74b42d55e8bf7a9c8fee8800bad591f12.diff

LOG: [clang-tidy] Fix docs.

Added: 


Modified: 
clang-tools-extra/docs/clang-tidy/checks/misc/include-cleaner.rst

Removed: 




diff  --git a/clang-tools-extra/docs/clang-tidy/checks/misc/include-cleaner.rst 
b/clang-tools-extra/docs/clang-tidy/checks/misc/include-cleaner.rst
index 30865680ac023..3246fea78cd42 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/misc/include-cleaner.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc/include-cleaner.rst
@@ -10,6 +10,7 @@ Findings correspond to 
https://clangd.llvm.org/design/include-cleaner.
 Example:
 
 .. code-block:: c++
+   
// foo.h
class Foo{};
// bar.h



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


[clang-tools-extra] e028c97 - Move the BySpelling map to IncludeStructure.

2023-02-23 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-02-23T17:11:31Z
New Revision: e028c9742897cc14c47c426893fb40f571f6fad6

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

LOG: Move the BySpelling map to IncludeStructure.

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

Added: 


Modified: 
clang-tools-extra/clangd/Headers.cpp
clang-tools-extra/clangd/Headers.h
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/unittests/HeadersTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Headers.cpp 
b/clang-tools-extra/clangd/Headers.cpp
index 3e5fefb07130..7000c1cbf451 100644
--- a/clang-tools-extra/clangd/Headers.cpp
+++ b/clang-tools-extra/clangd/Headers.cpp
@@ -16,6 +16,7 @@
 #include "clang/Lex/PPCallbacks.h"
 #include "clang/Lex/Preprocessor.h"
 #include "clang/Tooling/Inclusions/HeaderAnalysis.h"
+#include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/Path.h"
 #include 
@@ -73,6 +74,8 @@ class IncludeStructure::RecordHeaders : public PPCallbacks,
   IDs.push_back(HID);
   }
   }
+  Out->MainFileIncludesBySpelling.try_emplace(Inc.Written)
+  .first->second.push_back(Out->MainFileIncludes.size() - 1);
 }
 
 // Record include graph (not just for main-file includes)
@@ -294,6 +297,14 @@ IncludeStructure::includeDepth(HeaderID Root) const {
   return Result;
 }
 
+llvm::SmallVector
+IncludeStructure::mainFileIncludesWithSpelling(llvm::StringRef Spelling) const 
{
+  llvm::SmallVector Includes;
+  for (auto Idx : MainFileIncludesBySpelling.lookup(Spelling))
+Includes.push_back(&MainFileIncludes[Idx]);
+  return Includes;
+}
+
 void IncludeInserter::addExisting(const Inclusion &Inc) {
   IncludedHeaders.insert(Inc.Written);
   if (!Inc.Resolved.empty())

diff  --git a/clang-tools-extra/clangd/Headers.h 
b/clang-tools-extra/clangd/Headers.h
index 8a5b885a680e..a21ea851831a 100644
--- a/clang-tools-extra/clangd/Headers.h
+++ b/clang-tools-extra/clangd/Headers.h
@@ -155,13 +155,16 @@ class IncludeStructure {
 return !NonSelfContained.contains(ID);
   }
 
-  bool hasIWYUExport(HeaderID ID) const {
-return HasIWYUExport.contains(ID);
-  }
+  bool hasIWYUExport(HeaderID ID) const { return HasIWYUExport.contains(ID); }
 
   // Return all transitively reachable files.
   llvm::ArrayRef allHeaders() const { return RealPathNames; }
 
+  // Returns includes inside the main file with the given spelling.
+  // Spelling should include brackets or quotes, e.g. .
+  llvm::SmallVector
+  mainFileIncludesWithSpelling(llvm::StringRef Spelling) const;
+
   // Return all transitively reachable files, and their minimum include depth.
   // All transitive includes (absolute paths), with their minimum include 
depth.
   // Root --> 0, #included file --> 1, etc.
@@ -202,6 +205,10 @@ class IncludeStructure {
   // Contains a set of headers that have either "IWYU pragma: export" or "IWYU
   // pragma: begin_exports".
   llvm::DenseSet HasIWYUExport;
+
+  // Maps written includes to indices in MainFileInclude for easier lookup by
+  // spelling.
+  llvm::StringMap> MainFileIncludesBySpelling;
 };
 
 // Calculates insertion edit for including a new header in a file.

diff  --git a/clang-tools-extra/clangd/IncludeCleaner.cpp 
b/clang-tools-extra/clangd/IncludeCleaner.cpp
index 5a7df2fc33f6..d9804abd82ee 100644
--- a/clang-tools-extra/clangd/IncludeCleaner.cpp
+++ b/clang-tools-extra/clangd/IncludeCleaner.cpp
@@ -85,7 +85,7 @@ class ReferencedLocationCrawler
 // Using templateName case is handled by the override TraverseTemplateName.
 if (TST->getTemplateName().getKind() == TemplateName::UsingTemplate)
   return true;
-add(TST->getAsCXXRecordDecl());  // Specialization
+add(TST->getAsCXXRecordDecl()); // Specialization
 return true;
   }
 
@@ -474,22 +474,16 @@ std::vector 
computeUnusedIncludes(ParsedAST &AST) {
   translateToHeaderIDs(ReferencedFiles, AST.getIncludeStructure(), SM);
   return getUnused(AST, ReferencedHeaders, ReferencedFiles.SpelledUmbrellas);
 }
-std::vector computeUnusedIncludesExperimental(ParsedAST 
&AST) {
-   const auto &SM = AST.getSourceManager();
-   const auto &Includes = AST.getIncludeStructure();
-   // FIXME: this map should probably be in IncludeStructure.
-   llvm::StringMap> BySpelling;
-   for (const auto &Inc : Includes.MainFileIncludes) {
-if (Inc.HeaderID)
-  BySpelling.try_emplace(Inc.Written)
-  .first->second.push_back(
-  static_cast(*Inc.HeaderID));
-   }
-   // FIXME: !!this is a hacky way to collect macro references.
-   std::vector Macros;
-auto& PP = AST.getPreprocessor();
-   for (const syntax::Token &Tok :
-AST.getTokens().spelledTokens(SM.getMainFileID()))

[clang-tools-extra] 5cb2770 - Add doc link to missing include diagnostics.

2023-05-16 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-05-16T16:10:58Z
New Revision: 5cb2770bd714105f5d65234b949ded0430604209

URL: 
https://github.com/llvm/llvm-project/commit/5cb2770bd714105f5d65234b949ded0430604209
DIFF: 
https://github.com/llvm/llvm-project/commit/5cb2770bd714105f5d65234b949ded0430604209.diff

LOG: Add doc link to missing include diagnostics.

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

Added: 


Modified: 
clang-tools-extra/clangd/Diagnostics.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Diagnostics.cpp 
b/clang-tools-extra/clangd/Diagnostics.cpp
index d1726142c5de..b708f9c3d3b0 100644
--- a/clang-tools-extra/clangd/Diagnostics.cpp
+++ b/clang-tools-extra/clangd/Diagnostics.cpp
@@ -918,7 +918,7 @@ std::optional 
getDiagnosticDocURI(Diag::DiagSource Source,
 .str();
   }
   case Diag::Clangd:
-if (Name == "unused-includes")
+if (Name == "unused-includes" || Name == "missing-includes")
   return {"https://clangd.llvm.org/guides/include-cleaner"};
 break;
   case Diag::ClangdConfig:



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


[clang-tools-extra] 76941b6 - [clangd] Fix test.

2023-05-16 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-05-16T16:50:56Z
New Revision: 76941b68ecd9a1f9ca337774b4082c2ca7577450

URL: 
https://github.com/llvm/llvm-project/commit/76941b68ecd9a1f9ca337774b4082c2ca7577450
DIFF: 
https://github.com/llvm/llvm-project/commit/76941b68ecd9a1f9ca337774b4082c2ca7577450.diff

LOG: [clangd] Fix test.

Added: 


Modified: 
clang-tools-extra/clangd/test/include-cleaner-batch-fix.test

Removed: 




diff  --git a/clang-tools-extra/clangd/test/include-cleaner-batch-fix.test 
b/clang-tools-extra/clangd/test/include-cleaner-batch-fix.test
index cfc84ad27a2b..bf9e5abca833 100644
--- a/clang-tools-extra/clangd/test/include-cleaner-batch-fix.test
+++ b/clang-tools-extra/clangd/test/include-cleaner-batch-fix.test
@@ -33,6 +33,9 @@
 # CHECK-NEXT: "diagnostics": [
 # CHECK-NEXT:   {
 # CHECK-NEXT: "code": "missing-includes",
+# CHECK-NEXT: "codeDescription": {
+# CHECK-NEXT:   "href": 
"https://clangd.llvm.org/guides/include-cleaner";
+# CHECK-NEXT: },
 # CHECK-NEXT: "message": "No header providing \"Foo\" is directly 
included (fixes available)",
 # CHECK-NEXT: "range": {
 # CHECK-NEXT:   "end": {
@@ -49,6 +52,9 @@
 # CHECK-NEXT:   },
 # CHECK-NEXT:   {
 # CHECK-NEXT: "code": "missing-includes",
+# CHECK-NEXT: "codeDescription": {
+# CHECK-NEXT:   "href": 
"https://clangd.llvm.org/guides/include-cleaner";
+# CHECK-NEXT: },
 # CHECK-NEXT: "message": "No header providing \"Bar\" is directly 
included (fixes available)",
 # CHECK-NEXT: "range": {
 # CHECK-NEXT:   "end": {



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


Re: [PATCH] D150668: Add doc link to missing include diagnostics.

2023-05-16 Thread Viktoriia Bakalova via cfe-commits
Thanks, I'm on it. Should be fixed within minutes.

On Tue, May 16, 2023 at 6:47 PM Nico Weber via Phabricator <
revi...@reviews.llvm.org> wrote:

> thakis added a comment.
>
> This seems to break tests: http://45.33.8.238/linux/107099/step_9.txt
>
> Please take a look, and revert for now if it takes a while to fix.
>
>
> Repository:
>   rG LLVM Github Monorepo
>
> CHANGES SINCE LAST ACTION
>   https://reviews.llvm.org/D150668/new/
>
> https://reviews.llvm.org/D150668
>
>
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] 9e9b1ef - [clangd] Implement cross reference request for #include lines.

2023-04-20 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-04-20T07:11:48Z
New Revision: 9e9b1effac34b75d22483955187b94418c12ebce

URL: 
https://github.com/llvm/llvm-project/commit/9e9b1effac34b75d22483955187b94418c12ebce
DIFF: 
https://github.com/llvm/llvm-project/commit/9e9b1effac34b75d22483955187b94418c12ebce.diff

LOG: [clangd] Implement cross reference request for #include lines.

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

Added: 


Modified: 
clang-tools-extra/clangd/Hover.cpp
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/IncludeCleaner.h
clang-tools-extra/clangd/XRefs.cpp
clang-tools-extra/clangd/unittests/HoverTests.cpp
clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp
clang-tools-extra/clangd/unittests/XRefsTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Hover.cpp 
b/clang-tools-extra/clangd/Hover.cpp
index 6a56553318b84..3eb0900715744 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -1172,20 +1172,12 @@ void maybeAddUsedSymbols(ParsedAST &AST, HoverInfo &HI, 
const Inclusion &Inc) {
 UsedSymbols.contains(Ref.Target))
   return;
 
-for (const include_cleaner::Header &H : Providers) {
-  auto MatchingIncludes = ConvertedMainFileIncludes.match(H);
-  // No match for this provider in the main file.
-  if (MatchingIncludes.empty())
-continue;
-
-  // Check if the hovered include matches this provider.
-  if (!HoveredInclude.match(H).empty())
-UsedSymbols.insert(Ref.Target);
-
-  // Don't look for rest of the providers once we've found a match
-  // in the main file.
-  break;
-}
+auto Provider =
+firstMatchedProvider(ConvertedMainFileIncludes, Providers);
+if (!Provider || HoveredInclude.match(*Provider).empty())
+  return;
+
+UsedSymbols.insert(Ref.Target);
   });
 
   for (const auto &UsedSymbolDecl : UsedSymbols)

diff  --git a/clang-tools-extra/clangd/IncludeCleaner.cpp 
b/clang-tools-extra/clangd/IncludeCleaner.cpp
index 168471a603ea4..d15dd70efdb70 100644
--- a/clang-tools-extra/clangd/IncludeCleaner.cpp
+++ b/clang-tools-extra/clangd/IncludeCleaner.cpp
@@ -444,5 +444,15 @@ std::vector issueIncludeCleanerDiagnostics(ParsedAST 
&AST,
   return Result;
 }
 
+std::optional
+firstMatchedProvider(const include_cleaner::Includes &Includes,
+ llvm::ArrayRef Providers) {
+  for (const auto &H : Providers) {
+if (!Includes.match(H).empty())
+  return H;
+  }
+  // No match for this provider in the includes list.
+  return std::nullopt;
+}
 } // namespace clangd
 } // namespace clang

diff  --git a/clang-tools-extra/clangd/IncludeCleaner.h 
b/clang-tools-extra/clangd/IncludeCleaner.h
index 035142c186b80..675c05a53d5f8 100644
--- a/clang-tools-extra/clangd/IncludeCleaner.h
+++ b/clang-tools-extra/clangd/IncludeCleaner.h
@@ -81,6 +81,11 @@ std::string spellHeader(ParsedAST &AST, const FileEntry 
*MainFile,
 
 std::vector
 collectMacroReferences(ParsedAST &AST);
+
+/// Find the first provider in the list that is matched by the includes.
+std::optional
+firstMatchedProvider(const include_cleaner::Includes &Includes,
+ llvm::ArrayRef Providers);
 } // namespace clangd
 } // namespace clang
 

diff  --git a/clang-tools-extra/clangd/XRefs.cpp 
b/clang-tools-extra/clangd/XRefs.cpp
index 23dd72d43d3bb..51a3ef894c540 100644
--- a/clang-tools-extra/clangd/XRefs.cpp
+++ b/clang-tools-extra/clangd/XRefs.cpp
@@ -9,13 +9,17 @@
 #include "AST.h"
 #include "FindSymbols.h"
 #include "FindTarget.h"
+#include "Headers.h"
 #include "HeuristicResolver.h"
+#include "IncludeCleaner.h"
 #include "ParsedAST.h"
 #include "Protocol.h"
 #include "Quality.h"
 #include "Selection.h"
 #include "SourceCode.h"
 #include "URI.h"
+#include "clang-include-cleaner/Analysis.h"
+#include "clang-include-cleaner/Types.h"
 #include "index/Index.h"
 #include "index/Merge.h"
 #include "index/Relation.h"
@@ -48,6 +52,7 @@
 #include "clang/Index/IndexingAction.h"
 #include "clang/Index/IndexingOptions.h"
 #include "clang/Index/USRGeneration.h"
+#include "clang/Lex/Lexer.h"
 #include "clang/Tooling/Syntax/Tokens.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/DenseMap.h"
@@ -61,6 +66,7 @@
 #include "llvm/Support/Path.h"
 #include "llvm/Support/raw_ostream.h"
 #include 
+#include 
 #include 
 
 namespace clang {
@@ -1310,6 +1316,63 @@ stringifyContainerForMainFileRef(const Decl *Container) {
 return printQualifiedName(*ND);
   return {};
 }
+
+std::optional
+maybeFindIncludeReferences(ParsedAST &AST, Position Pos,
+   URIForFile URIMainFile) {
+  const auto &Includes = AST.getIncludeStructure().MainFileIncludes;
+  auto IncludeOnLine = llvm::find_if(Includes, [&Pos](const Inclusion &Inc) {
+return Inc.

[clang-tools-extra] 90c5fe9 - [include-cleaner] Allow multiple strategies for spelling includes.

2023-06-05 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-06-05T09:47:12Z
New Revision: 90c5fe982190b826aab90c93db9ce0f7e25d

URL: 
https://github.com/llvm/llvm-project/commit/90c5fe982190b826aab90c93db9ce0f7e25d
DIFF: 
https://github.com/llvm/llvm-project/commit/90c5fe982190b826aab90c93db9ce0f7e25d.diff

LOG: [include-cleaner] Allow multiple strategies for spelling includes.

Summary:

Reviewers:

Subscribers:

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

Added: 

clang-tools-extra/include-cleaner/include/clang-include-cleaner/IncludeSpeller.h
clang-tools-extra/include-cleaner/lib/IncludeSpeller.cpp
clang-tools-extra/include-cleaner/unittests/IncludeSpellerTest.cpp

Modified: 
clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
clang-tools-extra/clangd/Hover.cpp
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/IncludeCleaner.h
clang-tools-extra/include-cleaner/include/clang-include-cleaner/Analysis.h
clang-tools-extra/include-cleaner/lib/Analysis.cpp
clang-tools-extra/include-cleaner/lib/CMakeLists.txt
clang-tools-extra/include-cleaner/unittests/CMakeLists.txt

Removed: 




diff  --git a/clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp 
b/clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
index c7aca83f2ca8c..49e7581d801d9 100644
--- a/clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
@@ -12,6 +12,7 @@
 #include "../ClangTidyOptions.h"
 #include "../utils/OptionsUtils.h"
 #include "clang-include-cleaner/Analysis.h"
+#include "clang-include-cleaner/IncludeSpeller.h"
 #include "clang-include-cleaner/Record.h"
 #include "clang-include-cleaner/Types.h"
 #include "clang/AST/ASTContext.h"
@@ -180,7 +181,7 @@ void IncludeCleanerCheck::check(const 
MatchFinder::MatchResult &Result) {
  FileStyle->IncludeStyle);
   for (const auto &Inc : Missing) {
 std::string Spelling =
-include_cleaner::spellHeader(Inc.Missing, *HS, MainFile);
+include_cleaner::spellHeader({Inc.Missing, *HS, MainFile});
 bool Angled = llvm::StringRef{Spelling}.starts_with("<");
 // We might suggest insertion of an existing include in edge cases, e.g.,
 // include is present in a PP-disabled region, or spelling of the header

diff  --git a/clang-tools-extra/clangd/Hover.cpp 
b/clang-tools-extra/clangd/Hover.cpp
index d1f6f3a7b06c0..80303267b31a0 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -18,6 +18,7 @@
 #include "Selection.h"
 #include "SourceCode.h"
 #include "clang-include-cleaner/Analysis.h"
+#include "clang-include-cleaner/IncludeSpeller.h"
 #include "clang-include-cleaner/Types.h"
 #include "index/SymbolCollector.h"
 #include "support/Logger.h"
@@ -1222,7 +1223,9 @@ void maybeAddSymbolProviders(ParsedAST &AST, HoverInfo 
&HI,
 // on local variables, etc.
 return;
 
-  HI.Provider = spellHeader(AST, SM.getFileEntryForID(SM.getMainFileID()), H);
+  HI.Provider = include_cleaner::spellHeader(
+  {H, AST.getPreprocessor().getHeaderSearchInfo(),
+   SM.getFileEntryForID(SM.getMainFileID())});
 }
 
 // FIXME: similar functions are present in FindHeaders.cpp (symbolName)

diff  --git a/clang-tools-extra/clangd/IncludeCleaner.cpp 
b/clang-tools-extra/clangd/IncludeCleaner.cpp
index a3e08bc56b31d..c9d32a00fc15f 100644
--- a/clang-tools-extra/clangd/IncludeCleaner.cpp
+++ b/clang-tools-extra/clangd/IncludeCleaner.cpp
@@ -16,6 +16,7 @@
 #include "SourceCode.h"
 #include "URI.h"
 #include "clang-include-cleaner/Analysis.h"
+#include "clang-include-cleaner/IncludeSpeller.h"
 #include "clang-include-cleaner/Record.h"
 #include "clang-include-cleaner/Types.h"
 #include "support/Logger.h"
@@ -197,8 +198,9 @@ std::vector generateMissingIncludeDiagnostics(
   continue;
 }
 
-std::string Spelling =
-spellHeader(AST, MainFile, SymbolWithMissingInclude.Providers.front());
+std::string Spelling = include_cleaner::spellHeader(
+{SymbolWithMissingInclude.Providers.front(),
+ AST.getPreprocessor().getHeaderSearchInfo(), MainFile});
 llvm::StringRef HeaderRef{Spelling};
 bool Angled = HeaderRef.starts_with("<");
 // We might suggest insertion of an existing include in edge cases, e.g.,
@@ -332,21 +334,6 @@ convertIncludes(const SourceManager &SM,
   return ConvertedIncludes;
 }
 
-std::string spellHeader(ParsedAST &AST, const FileEntry *MainFile,
-include_cleaner::Header Provider) {
-  if (Provider.kind() == include_cleaner::Header::Physical) {
-if (auto CanonicalPath = 
getCanonicalPath(Provider.physical()->getLastRef(),
-  
AST.getSourceManager().getFileManager())) {
-  std::string SpelledHeader =
-  llvm::cantFail(URI::includeSpelling(URI::create(*Cano

[clang-tools-extra] cd5fcea - [clangd] Revert to older include spelling approach.

2023-06-05 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-06-05T15:18:28Z
New Revision: cd5fcea6d4c70a7328ca9538c9098d9f5af69682

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

LOG: [clangd] Revert to older include spelling approach.

Added: 


Modified: 
clang-tools-extra/clangd/Hover.cpp
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/IncludeCleaner.h

Removed: 




diff  --git a/clang-tools-extra/clangd/Hover.cpp 
b/clang-tools-extra/clangd/Hover.cpp
index 80303267b31a0..d1f6f3a7b06c0 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -18,7 +18,6 @@
 #include "Selection.h"
 #include "SourceCode.h"
 #include "clang-include-cleaner/Analysis.h"
-#include "clang-include-cleaner/IncludeSpeller.h"
 #include "clang-include-cleaner/Types.h"
 #include "index/SymbolCollector.h"
 #include "support/Logger.h"
@@ -1223,9 +1222,7 @@ void maybeAddSymbolProviders(ParsedAST &AST, HoverInfo 
&HI,
 // on local variables, etc.
 return;
 
-  HI.Provider = include_cleaner::spellHeader(
-  {H, AST.getPreprocessor().getHeaderSearchInfo(),
-   SM.getFileEntryForID(SM.getMainFileID())});
+  HI.Provider = spellHeader(AST, SM.getFileEntryForID(SM.getMainFileID()), H);
 }
 
 // FIXME: similar functions are present in FindHeaders.cpp (symbolName)

diff  --git a/clang-tools-extra/clangd/IncludeCleaner.cpp 
b/clang-tools-extra/clangd/IncludeCleaner.cpp
index c9d32a00fc15f..fa30592e75807 100644
--- a/clang-tools-extra/clangd/IncludeCleaner.cpp
+++ b/clang-tools-extra/clangd/IncludeCleaner.cpp
@@ -198,9 +198,9 @@ std::vector generateMissingIncludeDiagnostics(
   continue;
 }
 
-std::string Spelling = include_cleaner::spellHeader(
-{SymbolWithMissingInclude.Providers.front(),
- AST.getPreprocessor().getHeaderSearchInfo(), MainFile});
+std::string Spelling =
+spellHeader(AST, MainFile, SymbolWithMissingInclude.Providers.front());
+
 llvm::StringRef HeaderRef{Spelling};
 bool Angled = HeaderRef.starts_with("<");
 // We might suggest insertion of an existing include in edge cases, e.g.,
@@ -334,6 +334,22 @@ convertIncludes(const SourceManager &SM,
   return ConvertedIncludes;
 }
 
+std::string spellHeader(ParsedAST &AST, const FileEntry *MainFile,
+include_cleaner::Header Provider) {
+  if (Provider.kind() == include_cleaner::Header::Physical) {
+if (auto CanonicalPath =
+getCanonicalPath(Provider.physical()->getLastRef(),
+ AST.getSourceManager().getFileManager())) {
+  std::string SpelledHeader =
+  llvm::cantFail(URI::includeSpelling(URI::create(*CanonicalPath)));
+  if (!SpelledHeader.empty())
+return SpelledHeader;
+}
+  }
+  return include_cleaner::spellHeader(
+  {Provider, AST.getPreprocessor().getHeaderSearchInfo(), MainFile});
+}
+
 std::vector
 getUnused(ParsedAST &AST,
   const llvm::DenseSet &ReferencedFiles,

diff  --git a/clang-tools-extra/clangd/IncludeCleaner.h 
b/clang-tools-extra/clangd/IncludeCleaner.h
index c4051b30ca317..675c05a53d5f8 100644
--- a/clang-tools-extra/clangd/IncludeCleaner.h
+++ b/clang-tools-extra/clangd/IncludeCleaner.h
@@ -74,6 +74,11 @@ include_cleaner::Includes
 convertIncludes(const SourceManager &SM,
 const llvm::ArrayRef Includes);
 
+/// Determines the header spelling of an include-cleaner header
+/// representation. The spelling contains the ""<> characters.
+std::string spellHeader(ParsedAST &AST, const FileEntry *MainFile,
+include_cleaner::Header Provider);
+
 std::vector
 collectMacroReferences(ParsedAST &AST);
 



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


[clang-tools-extra] 6a6c7ed - [clangd] Use include_cleaner spelling strategies in clangd.

2023-06-14 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-06-14T14:06:35Z
New Revision: 6a6c7ed5cd8d1a7e0991128e46abfd2b7d95f8e8

URL: 
https://github.com/llvm/llvm-project/commit/6a6c7ed5cd8d1a7e0991128e46abfd2b7d95f8e8
DIFF: 
https://github.com/llvm/llvm-project/commit/6a6c7ed5cd8d1a7e0991128e46abfd2b7d95f8e8.diff

LOG: [clangd] Use include_cleaner spelling strategies in clangd.

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

Added: 


Modified: 
clang-tools-extra/clangd/Hover.cpp
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/IncludeCleaner.h

Removed: 




diff  --git a/clang-tools-extra/clangd/Hover.cpp 
b/clang-tools-extra/clangd/Hover.cpp
index 0ae70dd121ebf..d7a249c6bc21f 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -18,6 +18,7 @@
 #include "Selection.h"
 #include "SourceCode.h"
 #include "clang-include-cleaner/Analysis.h"
+#include "clang-include-cleaner/IncludeSpeller.h"
 #include "clang-include-cleaner/Types.h"
 #include "index/SymbolCollector.h"
 #include "support/Logger.h"
@@ -1223,7 +1224,9 @@ void maybeAddSymbolProviders(ParsedAST &AST, HoverInfo 
&HI,
 // on local variables, etc.
 return;
 
-  HI.Provider = spellHeader(AST, SM.getFileEntryForID(SM.getMainFileID()), H);
+  HI.Provider = include_cleaner::spellHeader(
+  {H, AST.getPreprocessor().getHeaderSearchInfo(),
+   SM.getFileEntryForID(SM.getMainFileID())});
 }
 
 // FIXME: similar functions are present in FindHeaders.cpp (symbolName)

diff  --git a/clang-tools-extra/clangd/IncludeCleaner.cpp 
b/clang-tools-extra/clangd/IncludeCleaner.cpp
index 95585a61c023d..95f6064b769a7 100644
--- a/clang-tools-extra/clangd/IncludeCleaner.cpp
+++ b/clang-tools-extra/clangd/IncludeCleaner.cpp
@@ -182,8 +182,9 @@ std::vector generateMissingIncludeDiagnostics(
   continue;
 }
 
-std::string Spelling =
-spellHeader(AST, MainFile, SymbolWithMissingInclude.Providers.front());
+std::string Spelling = include_cleaner::spellHeader(
+{SymbolWithMissingInclude.Providers.front(),
+ AST.getPreprocessor().getHeaderSearchInfo(), MainFile});
 
 llvm::StringRef HeaderRef{Spelling};
 bool Angled = HeaderRef.starts_with("<");
@@ -412,22 +413,6 @@ convertIncludes(const SourceManager &SM,
   return ConvertedIncludes;
 }
 
-std::string spellHeader(ParsedAST &AST, const FileEntry *MainFile,
-include_cleaner::Header Provider) {
-  if (Provider.kind() == include_cleaner::Header::Physical) {
-if (auto CanonicalPath =
-getCanonicalPath(Provider.physical()->getLastRef(),
- AST.getSourceManager().getFileManager())) {
-  std::string SpelledHeader =
-  llvm::cantFail(URI::includeSpelling(URI::create(*CanonicalPath)));
-  if (!SpelledHeader.empty())
-return SpelledHeader;
-}
-  }
-  return include_cleaner::spellHeader(
-  {Provider, AST.getPreprocessor().getHeaderSearchInfo(), MainFile});
-}
-
 IncludeCleanerFindings computeIncludeCleanerFindings(ParsedAST &AST) {
   // Interaction is only polished for C/CPP.
   if (AST.getLangOpts().ObjC)

diff  --git a/clang-tools-extra/clangd/IncludeCleaner.h 
b/clang-tools-extra/clangd/IncludeCleaner.h
index 58849846e0df7..edd89777faf3d 100644
--- a/clang-tools-extra/clangd/IncludeCleaner.h
+++ b/clang-tools-extra/clangd/IncludeCleaner.h
@@ -75,11 +75,6 @@ include_cleaner::Includes
 convertIncludes(const SourceManager &SM,
 const llvm::ArrayRef Includes);
 
-/// Determines the header spelling of an include-cleaner header
-/// representation. The spelling contains the ""<> characters.
-std::string spellHeader(ParsedAST &AST, const FileEntry *MainFile,
-include_cleaner::Header Provider);
-
 std::vector
 collectMacroReferences(ParsedAST &AST);
 



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


[clang-tools-extra] c9888dc - [clangd] Skip function parameter decls when evaluating variables on hover.

2023-06-16 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2023-06-16T12:09:28Z
New Revision: c9888dce44748bfbf3719351c3feb3359eaba017

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

LOG: [clangd] Skip function parameter decls when evaluating variables on hover.

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

Added: 


Modified: 
clang-tools-extra/clangd/Hover.cpp
clang-tools-extra/clangd/unittests/HoverTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Hover.cpp 
b/clang-tools-extra/clangd/Hover.cpp
index d7a249c6bc21f..5184fcbe4b581 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -659,7 +659,7 @@ HoverInfo getHoverContents(const NamedDecl *D, const 
PrintingPolicy &PP,
 HI.Type = printType(TAT->getTemplatedDecl()->getUnderlyingType(), Ctx, PP);
 
   // Fill in value with evaluated initializer if possible.
-  if (const auto *Var = dyn_cast(D)) {
+  if (const auto *Var = dyn_cast(D); Var && !Var->isInvalidDecl()) {
 if (const Expr *Init = Var->getInit())
   HI.Value = printExprValue(Init, Ctx);
   } else if (const auto *ECD = dyn_cast(D)) {

diff  --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp 
b/clang-tools-extra/clangd/unittests/HoverTests.cpp
index 583310f29b63f..5338a680b787a 100644
--- a/clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -22,6 +22,7 @@
 
 #include "gtest/gtest.h"
 #include 
+#include 
 #include 
 #include 
 
@@ -3722,6 +3723,34 @@ TEST(Hover, ForwardStructNoCrash) {
   EXPECT_EQ(*HI->Value, "&bar");
 }
 
+TEST(Hover, FunctionParameterDefaulValueNotEvaluatedOnInvalidDecls) {
+  struct {
+const char *const Code;
+const std::optional HoverValue;
+  } Cases[] = {
+  {R"cpp(
+// error-ok testing behavior on invalid decl
+class Foo {};
+void foo(Foo p^aram = nullptr);
+)cpp",
+   std::nullopt},
+  {R"cpp(
+class Foo {};
+void foo(Foo *p^aram = nullptr);
+)cpp",
+   "nullptr"},
+  };
+
+  for (const auto &C : Cases) {
+Annotations T(C.Code);
+TestTU TU = TestTU::withCode(T.code());
+auto AST = TU.build();
+auto HI = getHover(AST, T.point(), format::getLLVMStyle(), nullptr);
+ASSERT_TRUE(HI);
+ASSERT_EQ(HI->Value, C.HoverValue);
+  }
+}
+
 TEST(Hover, DisableShowAKA) {
   Annotations T(R"cpp(
 using m_int = int;



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


[clang-tools-extra] 45659b3 - [include-cleaner] Remove filtering from UsingDecl visit.

2022-12-08 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2022-12-08T10:23:55Z
New Revision: 45659b3bd98ea3b8ce13516bcf719669b934b9ba

URL: 
https://github.com/llvm/llvm-project/commit/45659b3bd98ea3b8ce13516bcf719669b934b9ba
DIFF: 
https://github.com/llvm/llvm-project/commit/45659b3bd98ea3b8ce13516bcf719669b934b9ba.diff

LOG: [include-cleaner] Remove filtering from UsingDecl visit.

Removes filtering from the VisitUsingDecl method for implementation files.

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

Added: 


Modified: 
clang-tools-extra/include-cleaner/lib/WalkAST.cpp
clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp

Removed: 




diff  --git a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp 
b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp
index 3d338cd59b282..7fb3f5697b7ed 100644
--- a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp
+++ b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp
@@ -16,7 +16,6 @@
 #include "clang/AST/Type.h"
 #include "clang/AST/TypeLoc.h"
 #include "clang/Basic/SourceLocation.h"
-#include "clang/Basic/SourceManager.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/Support/Casting.h"
 
@@ -27,10 +26,6 @@ using DeclCallback =
 
 class ASTWalker : public RecursiveASTVisitor {
   DeclCallback Callback;
-  // Whether we're traversing declarations coming from a header file.
-  // This helps figure out whether certain symbols can be assumed as unused
-  // (e.g. overloads brought into an implementation file, but not used).
-  bool IsHeader = false;
 
   bool handleTemplateName(SourceLocation Loc, TemplateName TN) {
 // For using-templates, only mark the alias.
@@ -50,8 +45,7 @@ class ASTWalker : public RecursiveASTVisitor {
   }
 
 public:
-  ASTWalker(DeclCallback Callback, bool IsHeader)
-  : Callback(Callback), IsHeader(IsHeader) {}
+  ASTWalker(DeclCallback Callback) : Callback(Callback) {}
 
   bool VisitDeclRefExpr(DeclRefExpr *DRE) {
 report(DRE->getLocation(), DRE->getFoundDecl());
@@ -82,10 +76,6 @@ class ASTWalker : public RecursiveASTVisitor {
 for (const auto *Shadow : UD->shadows()) {
   auto *TD = Shadow->getTargetDecl();
   auto IsUsed = TD->isUsed() || TD->isReferenced();
-  // We ignore unused overloads inside implementation files, as the ones in
-  // headers might still be used by the dependents of the header.
-  if (!IsUsed && !IsHeader)
-continue;
   report(UD->getLocation(), TD,
  IsUsed ? RefType::Explicit : RefType::Ambiguous);
 }
@@ -151,14 +141,7 @@ class ASTWalker : public RecursiveASTVisitor {
 } // namespace
 
 void walkAST(Decl &Root, DeclCallback Callback) {
-  auto &AST = Root.getASTContext();
-  auto &SM = AST.getSourceManager();
-  // If decl isn't written in main file, assume it's coming from an include,
-  // hence written in a header.
-  bool IsRootedAtHeader =
-  AST.getLangOpts().IsHeaderFile ||
-  !SM.isWrittenInMainFile(SM.getSpellingLoc(Root.getLocation()));
-  ASTWalker(Callback, IsRootedAtHeader).TraverseDecl(&Root);
+  ASTWalker(Callback).TraverseDecl(&Root);
 }
 
 } // namespace clang::include_cleaner

diff  --git a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp 
b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
index 17d13018d1522..d9cf84dc7abe9 100644
--- a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
+++ b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
@@ -26,7 +26,6 @@ namespace clang::include_cleaner {
 namespace {
 
 // Specifies a test of which symbols are referenced by a piece of code.
-// If `// c++-header` is present, treats referencing code as a header file.
 // Target should contain points annotated with the reference kind.
 // Example:
 //   Target:  int $explicit^foo();
@@ -41,8 +40,6 @@ void testWalk(llvm::StringRef TargetCode, llvm::StringRef 
ReferencingCode) {
   Inputs.ExtraArgs.push_back("-include");
   Inputs.ExtraArgs.push_back("target.h");
   Inputs.ExtraArgs.push_back("-std=c++17");
-  if (Referencing.code().contains("// c++-header\n"))
-Inputs.ExtraArgs.push_back("-xc++-header");
   TestAST AST(Inputs);
   const auto &SM = AST.sourceManager();
 
@@ -88,12 +85,10 @@ void testWalk(llvm::StringRef TargetCode, llvm::StringRef 
ReferencingCode) {
 auto RTStr = llvm::to_string(RT);
 for (auto Expected : Target.points(RTStr))
   if (!llvm::is_contained(ReferencedOffsets[RT], Expected))
-DiagnosePoint("location not marked used with type " + RTStr,
-  Expected);
+DiagnosePoint("location not marked used with type " + RTStr, Expected);
 for (auto Actual : ReferencedOffsets[RT])
   if (!llvm::is_contained(Target.points(RTStr), Actual))
-DiagnosePoint("location unexpectedly used with type " + RTStr,
-  Actual);
+DiagnosePoint("location unexpectedly used with type " + RTStr, Actual);
   }
 
   // If th

[clang-tools-extra] d03e9f8 - [include-cleaner] Handle base class member access from derived class.

2022-12-08 Thread Viktoriia Bakalova via cfe-commits

Author: Viktoriia Bakalova
Date: 2022-12-08T10:39:18Z
New Revision: d03e9f8fb0741a510308be09b29a13d0a66a6e41

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

LOG: [include-cleaner] Handle base class member access from derived class.

Fix: https://github.com/llvm/llvm-project/issues/59251
Differential Revision: https://reviews.llvm.org/D139087

Added: 


Modified: 
clang-tools-extra/include-cleaner/lib/WalkAST.cpp
clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp

Removed: 




diff  --git a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp 
b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp
index 7fb3f5697b7e..ff15e62efdfd 100644
--- a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp
+++ b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp
@@ -44,6 +44,12 @@ class ASTWalker : public RecursiveASTVisitor {
 Callback(Loc, *cast(ND->getCanonicalDecl()), RT);
   }
 
+  NamedDecl *resolveType(QualType Type) {
+if (Type->isPointerType())
+  Type = Type->getPointeeType();
+return Type->getAsRecordDecl();
+  }
+
 public:
   ASTWalker(DeclCallback Callback) : Callback(Callback) {}
 
@@ -53,7 +59,12 @@ class ASTWalker : public RecursiveASTVisitor {
   }
 
   bool VisitMemberExpr(MemberExpr *E) {
-report(E->getMemberLoc(), E->getFoundDecl().getDecl());
+// A member expr implies a usage of the class type
+// (e.g., to prevent inserting a header of base class when using base
+// members from a derived object).
+// FIXME: support dependent types, e.g., "std::vector().size()".
+QualType Type = E->getBase()->IgnoreImpCasts()->getType();
+report(E->getMemberLoc(), resolveType(Type));
 return true;
   }
 

diff  --git a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp 
b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
index d9cf84dc7abe..551eb66bcdef 100644
--- a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
+++ b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
@@ -180,10 +180,22 @@ TEST(WalkAST, TemplateNames) {
 }
 
 TEST(WalkAST, MemberExprs) {
-  testWalk("struct S { void $explicit^foo(); };", "void foo() { S{}.^foo(); 
}");
+  testWalk("struct $explicit^S { void foo(); };", "void foo() { S{}.^foo(); 
}");
   testWalk(
-  "struct S { void foo(); }; struct X : S { using S::$explicit^foo; };",
+  "struct S { void foo(); }; struct $explicit^X : S { using S::foo; };",
   "void foo() { X{}.^foo(); }");
+  testWalk("struct Base { int a; }; struct $explicit^Derived : public Base 
{};",
+   "void fun(Derived d) { d.^a; }");
+  testWalk("struct Base { int a; }; struct $explicit^Derived : public Base 
{};",
+   "void fun(Derived* d) { d->^a; }");
+  testWalk("struct Base { int a; }; struct $explicit^Derived : public Base 
{};",
+   "void fun(Derived& d) { d.^a; }");
+  testWalk("struct Base { int a; }; struct $explicit^Derived : public Base 
{};",
+   "void fun() { Derived().^a; }");
+  testWalk("struct Base { int a; }; struct $explicit^Derived : public Base 
{};",
+   "Derived foo(); void fun() { foo().^a; }");
+  testWalk("struct Base { int a; }; struct $explicit^Derived : public Base 
{};",
+   "Derived& foo(); void fun() { foo().^a; }");
 }
 
 TEST(WalkAST, ConstructExprs) {



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


[clang] [llvm] [clang][LLVM Demangler] Add an assertion that validates that all mang… (PR #111391)

2024-10-08 Thread Viktoriia Bakalova via cfe-commits


@@ -1967,6 +1967,10 @@ def fclang_abi_compat_EQ : Joined<["-"], 
"fclang-abi-compat=">, Group,
   MetaVarName<"">, Values<".,latest">,
   HelpText<"Attempt to match the ABI of Clang ">;
+def fno_demangling_failures: Flag<["-"], "fno-demangling-failures">, 
Group,

VitaNuo wrote:

Yeah this flag turns on an assertion that validates that all the manglings 
produced by clang can be demangled. In this sense it on & off (off by default). 
Let me know if I misunderstand something. 

https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add an assertion that validates that all mang… (PR #111391)

2024-10-08 Thread Viktoriia Bakalova via cfe-commits


@@ -462,6 +462,9 @@ ENUM_CODEGENOPT(ZeroCallUsedRegs, 
llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind,
 /// non-deleting destructors. (No effect on Microsoft ABI.)
 CODEGENOPT(CtorDtorReturnThis, 1, 0)
 
+/// Whether to validate if a produced mangled name can be demangled with LLVM 
demangler.
+CODEGENOPT(NoDemanglingFailures, 1, 0)

VitaNuo wrote:

The macro signature is `CODEGENOPT(Name, Bits, Default)`, so I assume you're 
referring to the `Default` as being inverted (the bit count is 1, since this is 
a flag).

IIUC `0` means that the flag is off (= don't apply the assertion), `1` means 
the flag is on (= apply the assertion and validate that mangled names can be 
demangled). We don't want to set the flag to on by default, so `0` seems right.

Could you explain why you believe this inverted? I'm probably missing something.

https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add an assertion that validates that all mang… (PR #111391)

2024-10-08 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo edited 
https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add an assertion that validates that all mang… (PR #111391)

2024-10-08 Thread Viktoriia Bakalova via cfe-commits

VitaNuo wrote:

> Since this is being done as an assert, this is something that really only 
> applies during debug mode. I dont think this compiler flag makes sense 
> because of it.

The reason I am adding a flag on top of an assert is that there are 
unfortunately still many mangled names produced by `clang` that cannot be 
demangled. E.g., many of the existing codegen lit tests 
(`clang/test/CodeGenCXX/*`) fail in assertion-enabled builds without the flag. 
This is potentially disruptive to development workflows. The flag can be 
removed once the LLVM demangler can handle all the mangled names `clang` 
produces.

https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add an assertion that validates that all mang… (PR #111391)

2024-10-15 Thread Viktoriia Bakalova via cfe-commits


@@ -462,6 +462,9 @@ ENUM_CODEGENOPT(ZeroCallUsedRegs, 
llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind,
 /// non-deleting destructors. (No effect on Microsoft ABI.)
 CODEGENOPT(CtorDtorReturnThis, 1, 0)
 
+/// Whether to validate if a produced mangled name can be demangled with LLVM 
demangler.
+CODEGENOPT(NoDemanglingFailures, 1, 0)

VitaNuo wrote:

Thank you, I've changed it to `DemanglingFailures`, so that `true` means "turn 
the diagnostic on".

https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add an assertion that validates that all mang… (PR #111391)

2024-10-15 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo updated 
https://github.com/llvm/llvm-project/pull/111391

>From 54ee2e5d83a940b113f0fc326c511322605bfb78 Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Tue, 15 Oct 2024 09:48:09 +
Subject: [PATCH] [clang][LLVM Demangler] Add a diagnostic that validates that
 all mangled names produced by `clang` can be demangled by LLVM demangler.

Introduce the above warning behind the `-fdemangling-failures` flag, since:

a. the diagnostic cannot be fixed by an application developer.
b. the diagnostic is expected to be quite chatty.
---
 clang/include/clang/Basic/CodeGenOptions.def|  3 +++
 .../include/clang/Basic/DiagnosticFrontendKinds.td  |  4 
 clang/include/clang/Driver/Options.td   |  4 
 clang/lib/CodeGen/CodeGenModule.cpp | 13 +
 clang/test/CodeGenCXX/warn-demangling-failure.cpp   | 13 +
 llvm/include/llvm/Demangle/Demangle.h   |  7 +++
 llvm/lib/Demangle/Demangle.cpp  | 10 ++
 7 files changed, 54 insertions(+)
 create mode 100644 clang/test/CodeGenCXX/warn-demangling-failure.cpp

diff --git a/clang/include/clang/Basic/CodeGenOptions.def 
b/clang/include/clang/Basic/CodeGenOptions.def
index eac831278ee20d..d0e2393cbb5616 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -462,6 +462,9 @@ ENUM_CODEGENOPT(ZeroCallUsedRegs, 
llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind,
 /// non-deleting destructors. (No effect on Microsoft ABI.)
 CODEGENOPT(CtorDtorReturnThis, 1, 0)
 
+/// Whether to issue a diagnostic if a produced mangled name can not be 
demangled with the LLVM demangler.
+CODEGENOPT(DemanglingFailures, 1, 0)
+
 /// FIXME: Make DebugOptions its own top-level .def file.
 #include "DebugOptions.def"
 
diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td 
b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
index a6b17ccb6799d2..4cad78d5120d6d 100644
--- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -384,4 +384,8 @@ def warn_hlsl_langstd_minimal :
   Warning<"support for HLSL language version %0 is incomplete, "
   "recommend using %1 instead">,
   InGroup;
+
+def warn_name_cannot_be_demangled : Warning<
+  "cannot demangle the name '%0'">,
+  InGroup;
 }
diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 607ff47a857b8f..40d142555c85e1 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1967,6 +1967,10 @@ def fclang_abi_compat_EQ : Joined<["-"], 
"fclang-abi-compat=">, Group,
   MetaVarName<"">, Values<".,latest">,
   HelpText<"Attempt to match the ABI of Clang ">;
+def fdemangling_failures: Flag<["-"], "fdemangling-failures">, 
Group,
+  Visibility<[ClangOption, CC1Option]>,
+  HelpText<"Produce a diagnostic if clang cannot demangle all the mangled 
names it generates">,
+  MarshallingInfoFlag>;
 def fclasspath_EQ : Joined<["-"], "fclasspath=">, Group;
 def fcolor_diagnostics : Flag<["-"], "fcolor-diagnostics">, Group,
 
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp 
b/clang/lib/CodeGen/CodeGenModule.cpp
index 25c1c496a4f27f..420b39ff2c301d 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -41,7 +41,9 @@
 #include "clang/Basic/CharInfo.h"
 #include "clang/Basic/CodeGenOptions.h"
 #include "clang/Basic/Diagnostic.h"
+#include "clang/Basic/DiagnosticFrontend.h"
 #include "clang/Basic/FileManager.h"
+#include "clang/Basic/LangOptions.h"
 #include "clang/Basic/Module.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/TargetInfo.h"
@@ -54,6 +56,7 @@
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/Analysis/TargetLibraryInfo.h"
 #include "llvm/BinaryFormat/ELF.h"
+#include "llvm/Demangle/Demangle.h"
 #include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
 #include "llvm/IR/AttributeMask.h"
 #include "llvm/IR/CallingConv.h"
@@ -75,6 +78,7 @@
 #include "llvm/TargetParser/Triple.h"
 #include "llvm/TargetParser/X86TargetParser.h"
 #include "llvm/Transforms/Utils/BuildLibCalls.h"
+#include 
 #include 
 
 using namespace clang;
@@ -2044,6 +2048,15 @@ StringRef CodeGenModule::getMangledName(GlobalDecl GD) {
  GD.getWithKernelReferenceKind(KernelReferenceKind::Kernel),
  ND));
 
+  if (getCodeGenOpts().DemanglingFailures &&
+  getContext().getLangOpts().getClangABICompat() >
+  LangOptions::ClangABI::Ver19) {
+if (llvm::isMangledName(MangledName) &&
+llvm::demangle(MangledName) == MangledName)
+  Diags.Report(ND->getLocation(), diag::warn_name_cannot_be_demangled)
+  << MangledName;
+  }
+
   auto Result = Manglings.insert(std::make_pair(MangledName, GD));
   return MangledDeclNames[CanonicalGD] = Result.first->first();
 }
diff --git a/clang/test/CodeGenCXX/warn-demangling-failure.cpp 
b/clang/test/CodeGenCXX

[clang] [llvm] [clang][LLVM Demangler] Add an assertion that validates that all mang… (PR #111391)

2024-10-15 Thread Viktoriia Bakalova via cfe-commits

VitaNuo wrote:

> I am not super comfortable with enabling the diagnostic by default because 
> it's not something the user can do anything about aside from disable the 
> diagnostic (which means they'll report one issue and probably never report 
> another again because they disabled the warning due to chattiness) and I 
> don't think we want to train users to ignore diagnostics or force them to 
> turn off low-value ones. However, what about this as a compromise: we enable 
> the diagnostic without a diagnostic group (so it cannot be disabled) in all 
> builds up to the release candidate, and then we fully disable it for the 
> actual releases? This way, early adopters can help us find issues, but we're 
> not inflicting any pain on the general public once we release.

> (FWIW, I think this is something that should have an RFC for wider community 
> buy-in given the effects.)

Sounds good, I'll try to summarize this discussion as an RFC.

> collect issues that we hit in LLVM tests (there's plenty AFAIU) and also from 
> real projects (we can run with the warning internally over Google's codebase 
> to get a representative sample).

It might be a good idea to do this first, in order to collect more data for an 
RFC and the corresponding discussion.





https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [abi] [ItaniumMangle] Remove a test case that fails due to expected r… (PR #110467)

2024-09-30 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo closed 
https://github.com/llvm/llvm-project/pull/110467
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [abi] [ItaniumMangle] Remove a test case that fails due to expected r… (PR #110467)

2024-09-30 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo created 
https://github.com/llvm/llvm-project/pull/110467

…edefinition failures.

>From 1557e3b9d672bb1f2fce745d664c039d578e5d0c Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Mon, 30 Sep 2024 08:39:48 +
Subject: [PATCH] [abi] [ItaniumMangle] Remove a test case that fails due to
 expected redefinition failures.

---
 clang/test/CodeGenCXX/mangle-concept.cpp | 23 ---
 1 file changed, 23 deletions(-)

diff --git a/clang/test/CodeGenCXX/mangle-concept.cpp 
b/clang/test/CodeGenCXX/mangle-concept.cpp
index 966117544bfec1..6053511c00a7b5 100644
--- a/clang/test/CodeGenCXX/mangle-concept.cpp
+++ b/clang/test/CodeGenCXX/mangle-concept.cpp
@@ -52,7 +52,6 @@ namespace test2 {
   };
 
   A ai;
-  A aj;
 
   // CHECK-LABEL: define {{.*}}@{{.*}}test2{{.*}}use
   void use() {
@@ -77,28 +76,6 @@ namespace test2 {
 // CHECK: call {{.*}}@_ZN5test21lITk4TruevEEvz(
 // CLANG17: call {{.*}}@_ZN5test21lIvEEvz(
 l(ai);
-
-// CHECK: call {{.*}}@_ZN5test21AIbEF1fEzQ4TrueIT_E(
-// CLANG17: call {{.*}}@_ZN5test21fEz(
-f(aj);
-// CHECK: call {{.*}}@_ZN5test21AIbEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
-// CLANG17: call {{.*}}@_ZN5test21gIvEEvz(
-g(aj);
-// CHECK: call {{.*}}@_ZN5test21hIvEEvzQ4TrueITL0__E(
-// CLANG17: call {{.*}}@_ZN5test21hIvEEvz(
-h(aj);
-// CHECK: call {{.*}}@_ZN5test21AIbEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
-// CLANG17: call {{.*}}@_ZN5test21iIvEEvz(
-i(aj);
-// CHECK: call {{.*}}@_ZN5test21jIvQ4TrueITL0__EEEvz(
-// CLANG17: call {{.*}}@_ZN5test21jIvEEvz(
-j(aj);
-// CHECK: call {{.*}}@_ZN5test21AIbEF1kITk4TruevQ4TrueIT_EEEvz(
-// CLANG17: call {{.*}}@_ZN5test21kIvEEvz(
-k(aj);
-// CHECK: call {{.*}}@_ZN5test21lITk4TruevEEvz(
-// CLANG17: call {{.*}}@_ZN5test21lIvEEvz(
-l(aj);
   }
 }
 

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


[clang] [libcxxabi] [clang][ItaniumMangle] Mangle friend function templates with a constr… (PR #110247)

2024-09-30 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo closed 
https://github.com/llvm/llvm-project/pull/110247
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [libcxxabi] [clang][ItaniumMangle] Mangle friend function templates with a constr… (PR #110247)

2024-09-30 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo updated 
https://github.com/llvm/llvm-project/pull/110247

>From f8d897f5f3a89a5664e95a45948f9725101aa36f Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Fri, 27 Sep 2024 11:33:17 +
Subject: [PATCH 1/5] [clang][ItaniumMangle] Mangle friend function templates
 with a constraint that depends on a template parameter from an enclosing
 template as members of the enclosing class.

Such function templates should be considered member-like constrained friends 
per [temp.friend]p9 and 
https://github.com/itanium-cxx-abi/cxx-abi/issues/24#issuecomment-934977198).
---
 clang/lib/AST/ItaniumMangle.cpp  | 8 
 clang/test/CodeGenCXX/mangle-concept.cpp | 6 +++---
 libcxxabi/test/test_demangle.pass.cpp| 6 +++---
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index b6e1da0c3192da..172561f73b9a74 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -2270,6 +2270,14 @@ void CXXNameMangler::mangleTemplatePrefix(GlobalDecl GD,
 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
   } else {
 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
+if (const auto *FD = dyn_cast(GD.getDecl())) {
+  // Member-like constrained friends are mangled as if they were members of
+  // the enclosing class.
+  if (FD->getTemplatedDecl()->isMemberLikeConstrainedFriend() &&
+  getASTContext().getLangOpts().getClangABICompat() >
+  LangOptions::ClangABI::Ver17)
+  DC = GD.getDecl()->getLexicalDeclContext()->getRedeclContext();
+}
 manglePrefix(DC, NoFunction);
 if (isa(ND) || isa(ND))
   mangleUnqualifiedName(GD, DC, nullptr);
diff --git a/clang/test/CodeGenCXX/mangle-concept.cpp 
b/clang/test/CodeGenCXX/mangle-concept.cpp
index 91dc1b0e688e0d..6053511c00a7b5 100644
--- a/clang/test/CodeGenCXX/mangle-concept.cpp
+++ b/clang/test/CodeGenCXX/mangle-concept.cpp
@@ -58,19 +58,19 @@ namespace test2 {
 // CHECK: call {{.*}}@_ZN5test21AIiEF1fEzQ4TrueIT_E(
 // CLANG17: call {{.*}}@_ZN5test21fEz(
 f(ai);
-// CHECK: call {{.*}}@_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21gIvEEvz(
 g(ai);
 // CHECK: call {{.*}}@_ZN5test21hIvEEvzQ4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21hIvEEvz(
 h(ai);
-// CHECK: call {{.*}}@_ZN5test2F1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21iIvEEvz(
 i(ai);
 // CHECK: call {{.*}}@_ZN5test21jIvQ4TrueITL0__EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21jIvEEvz(
 j(ai);
-// CHECK: call {{.*}}@_ZN5test2F1kITk4TruevQ4TrueIT_EEEvz(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1kITk4TruevQ4TrueIT_EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21kIvEEvz(
 k(ai);
 // CHECK: call {{.*}}@_ZN5test21lITk4TruevEEvz(
diff --git a/libcxxabi/test/test_demangle.pass.cpp 
b/libcxxabi/test/test_demangle.pass.cpp
index 17786a3a486fcd..efe482aad1b76c 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -30128,11 +30128,11 @@ const char* cases[][2] =
 // C++20 concepts, see 
https://github.com/itanium-cxx-abi/cxx-abi/issues/24.
 {"_Z2f0IiE1SIX1CIT_EEEv", "S> f0()"},
 {"_ZN5test21AIiEF1fEzQ4TrueIT_E", "test2::A::friend f(...) requires 
True"},
-{"_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E", "void test2::friend 
g(...) requires True && True"},
+{"_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E", "void 
test2::A::friend g(...) requires True && True"},
 {"_ZN5test21hIvEEvzQ4TrueITL0__E", "void test2::h(...) requires 
True"},
-{"_ZN5test2F1iIvQaa4TrueIT_E4TrueITL0__EEEvz", "void test2::friend 
i(...)"},
+{"_ZN5test21AIiEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz", "void 
test2::A::friend i(...)"},
 {"_ZN5test21jIvQ4TrueITL0__EEEvz", "void test2::j(...)"},
-{"_ZN5test2F1kITk4TruevQ4TrueIT_EEEvz", "void test2::friend k(...)"},
+{"_ZN5test21AIiEF1kITk4TruevQ4TrueIT_EEEvz", "void test2::A::friend 
k(...)"},
 {"_ZN5test21lITk4TruevEEvz", "void test2::l(...)"},
 {"_ZN5test31dITnDaLi0EEEvv", "void test3::d<0>()"},
 {"_ZN5test31eITnDcLi0EEEvv", "void test3::e<0>()"},

>From 7f61556ecdef242043e24a7f514fe8f80d559200 Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Fri, 27 Sep 2024 11:42:04 +
Subject: [PATCH 2/5] fixup! [clang][ItaniumMangle] Mangle friend function
 templates with a constraint that depends on a template parameter from an
 enclosing template as members of the enclosing class.

---
 clang/lib/AST/ItaniumMangle.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 172561f73b9a74..0e5963b91f3253 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++

[clang] [libcxxabi] [clang][ItaniumMangle] Mangle friend function templates with a constr… (PR #110247)

2024-09-30 Thread Viktoriia Bakalova via cfe-commits


@@ -704,6 +704,15 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const 
Decl *D) {
   return D->getLexicalDeclContext()->getRedeclContext();
   }
 
+  if (const auto *FTD = dyn_cast(D)) {
+// Member-like constrained friends are mangled as if they were members of

VitaNuo wrote:

Great idea!

https://github.com/llvm/llvm-project/pull/110247
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add an assertion that validates that all mang… (PR #111391)

2024-10-07 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo updated 
https://github.com/llvm/llvm-project/pull/111391

>From 542558c9dc6e8b8d7e5f68b6f0fa74098b56fd3a Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Mon, 7 Oct 2024 15:10:28 +
Subject: [PATCH] [clang][LLVM Demangler] Add an assertion that validates that
 all mangled names produced by `clang` can be demangled by LLVM demangler.

Introduce the above assertion behind the `-fno-demangling-failures` flag to 
prevent unintended breakages.
---
 clang/include/clang/Basic/CodeGenOptions.def |  3 +++
 clang/include/clang/Driver/Options.td|  4 
 clang/lib/CodeGen/CodeGenModule.cpp  |  8 
 clang/test/CodeGenCXX/assert-demangle.cpp| 14 ++
 llvm/include/llvm/Demangle/Demangle.h|  7 +++
 llvm/lib/Demangle/Demangle.cpp   | 10 ++
 6 files changed, 46 insertions(+)
 create mode 100644 clang/test/CodeGenCXX/assert-demangle.cpp

diff --git a/clang/include/clang/Basic/CodeGenOptions.def 
b/clang/include/clang/Basic/CodeGenOptions.def
index eac831278ee20d..d3e150fe53f804 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -462,6 +462,9 @@ ENUM_CODEGENOPT(ZeroCallUsedRegs, 
llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind,
 /// non-deleting destructors. (No effect on Microsoft ABI.)
 CODEGENOPT(CtorDtorReturnThis, 1, 0)
 
+/// Whether to validate if a produced mangled name can be demangled with LLVM 
demangler.
+CODEGENOPT(NoDemanglingFailures, 1, 0)
+
 /// FIXME: Make DebugOptions its own top-level .def file.
 #include "DebugOptions.def"
 
diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 607ff47a857b8f..a6a8cfe21676c0 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1967,6 +1967,10 @@ def fclang_abi_compat_EQ : Joined<["-"], 
"fclang-abi-compat=">, Group,
   MetaVarName<"">, Values<".,latest">,
   HelpText<"Attempt to match the ABI of Clang ">;
+def fno_demangling_failures: Flag<["-"], "fno-demangling-failures">, 
Group,
+  Visibility<[ClangOption, CC1Option]>,
+  HelpText<"Assert that clang can demangle all the mangled names it 
generates">,
+  MarshallingInfoFlag>;
 def fclasspath_EQ : Joined<["-"], "fclasspath=">, Group;
 def fcolor_diagnostics : Flag<["-"], "fcolor-diagnostics">, Group,
 
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp 
b/clang/lib/CodeGen/CodeGenModule.cpp
index 25c1c496a4f27f..94b04df652d4b9 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -48,12 +48,14 @@
 #include "clang/Basic/Version.h"
 #include "clang/CodeGen/BackendUtil.h"
 #include "clang/CodeGen/ConstantInitBuilder.h"
+#include "clang/Driver/Driver.h"
 #include "clang/Frontend/FrontendDiagnostic.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/Analysis/TargetLibraryInfo.h"
 #include "llvm/BinaryFormat/ELF.h"
+#include "llvm/Demangle/Demangle.h"
 #include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
 #include "llvm/IR/AttributeMask.h"
 #include "llvm/IR/CallingConv.h"
@@ -75,6 +77,7 @@
 #include "llvm/TargetParser/Triple.h"
 #include "llvm/TargetParser/X86TargetParser.h"
 #include "llvm/Transforms/Utils/BuildLibCalls.h"
+#include 
 #include 
 
 using namespace clang;
@@ -2044,6 +2047,11 @@ StringRef CodeGenModule::getMangledName(GlobalDecl GD) {
  GD.getWithKernelReferenceKind(KernelReferenceKind::Kernel),
  ND));
 
+  if (getCodeGenOpts().NoDemanglingFailures)
+assert((!llvm::isMangledName(MangledName) ||
+llvm::demangle(MangledName) != MangledName) &&
+   "clang must demangle a mangled name it generates!");
+
   auto Result = Manglings.insert(std::make_pair(MangledName, GD));
   return MangledDeclNames[CanonicalGD] = Result.first->first();
 }
diff --git a/clang/test/CodeGenCXX/assert-demangle.cpp 
b/clang/test/CodeGenCXX/assert-demangle.cpp
new file mode 100644
index 00..86a7686f72d929
--- /dev/null
+++ b/clang/test/CodeGenCXX/assert-demangle.cpp
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -emit-llvm -fno-demangling-failures -triple 
%itanium_abi_triple -o - %s | FileCheck %s
+
+// CHECK: @_ZN6foobar3barEv
+// CHECK: @_ZN6foobar1A3fooEi
+namespace foobar {
+struct A {
+  void foo (int) {
+  }
+};
+
+void bar() {
+  A().foo(0);
+}
+} // namespace foobar
diff --git a/llvm/include/llvm/Demangle/Demangle.h 
b/llvm/include/llvm/Demangle/Demangle.h
index fe129603c0785d..910f0410d62db3 100644
--- a/llvm/include/llvm/Demangle/Demangle.h
+++ b/llvm/include/llvm/Demangle/Demangle.h
@@ -67,6 +67,13 @@ char *dlangDemangle(std::string_view MangledName);
 /// demangling occurred.
 std::string demangle(std::string_view MangledName);
 
+/// Determines if the argument string is a valid mangled name known to the
+/// demangler.
+/// \param Name - reference to a string that is potentially a mangled name.
+/// \returns - t

[clang] [llvm] [clang][LLVM Demangler] Add an assertion that validates that all mang… (PR #111391)

2024-10-07 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo created 
https://github.com/llvm/llvm-project/pull/111391

…led names produced by `clang` can be demangled by LLVM demangler.

Introduce the above assertion behind the `-fno-demangling-failures` flag to 
prevent unintended breakages.

>From 9c16570650e487e63ec887d61be478ecad5402c2 Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Mon, 7 Oct 2024 15:10:28 +
Subject: [PATCH] [clang][LLVM Demangler] Add an assertion that validates that
 all mangled names produced by `clang` can be demangled by LLVM demangler.

Introduce the above assertion behind the `-fno-demangling-failures` flag to 
prevent unintended breakages.
---
 clang/include/clang/Basic/CodeGenOptions.def |  3 +++
 clang/include/clang/Driver/Options.td|  4 
 clang/lib/CodeGen/CodeGenModule.cpp  |  7 +++
 clang/test/CodeGenCXX/assert-demangle.cpp| 14 ++
 llvm/include/llvm/Demangle/Demangle.h|  7 +++
 llvm/lib/Demangle/Demangle.cpp   | 10 ++
 6 files changed, 45 insertions(+)
 create mode 100644 clang/test/CodeGenCXX/assert-demangle.cpp

diff --git a/clang/include/clang/Basic/CodeGenOptions.def 
b/clang/include/clang/Basic/CodeGenOptions.def
index eac831278ee20d..d3e150fe53f804 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -462,6 +462,9 @@ ENUM_CODEGENOPT(ZeroCallUsedRegs, 
llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind,
 /// non-deleting destructors. (No effect on Microsoft ABI.)
 CODEGENOPT(CtorDtorReturnThis, 1, 0)
 
+/// Whether to validate if a produced mangled name can be demangled with LLVM 
demangler.
+CODEGENOPT(NoDemanglingFailures, 1, 0)
+
 /// FIXME: Make DebugOptions its own top-level .def file.
 #include "DebugOptions.def"
 
diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 607ff47a857b8f..a6a8cfe21676c0 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1967,6 +1967,10 @@ def fclang_abi_compat_EQ : Joined<["-"], 
"fclang-abi-compat=">, Group,
   MetaVarName<"">, Values<".,latest">,
   HelpText<"Attempt to match the ABI of Clang ">;
+def fno_demangling_failures: Flag<["-"], "fno-demangling-failures">, 
Group,
+  Visibility<[ClangOption, CC1Option]>,
+  HelpText<"Assert that clang can demangle all the mangled names it 
generates">,
+  MarshallingInfoFlag>;
 def fclasspath_EQ : Joined<["-"], "fclasspath=">, Group;
 def fcolor_diagnostics : Flag<["-"], "fcolor-diagnostics">, Group,
 
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp 
b/clang/lib/CodeGen/CodeGenModule.cpp
index 25c1c496a4f27f..6afbfa9ae45ed9 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -48,12 +48,14 @@
 #include "clang/Basic/Version.h"
 #include "clang/CodeGen/BackendUtil.h"
 #include "clang/CodeGen/ConstantInitBuilder.h"
+#include "clang/Driver/Driver.h"
 #include "clang/Frontend/FrontendDiagnostic.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/Analysis/TargetLibraryInfo.h"
 #include "llvm/BinaryFormat/ELF.h"
+#include "llvm/Demangle/Demangle.h"
 #include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
 #include "llvm/IR/AttributeMask.h"
 #include "llvm/IR/CallingConv.h"
@@ -75,6 +77,7 @@
 #include "llvm/TargetParser/Triple.h"
 #include "llvm/TargetParser/X86TargetParser.h"
 #include "llvm/Transforms/Utils/BuildLibCalls.h"
+#include 
 #include 
 
 using namespace clang;
@@ -2044,6 +2047,10 @@ StringRef CodeGenModule::getMangledName(GlobalDecl GD) {
  GD.getWithKernelReferenceKind(KernelReferenceKind::Kernel),
  ND));
 
+  if (getCodeGenOpts().NoDemanglingFailures) 
+assert((!llvm::isMangledName(MangledName) || llvm::demangle(MangledName) !=
+   MangledName) && "clang must demangle a mangled name it generates!");
+  
   auto Result = Manglings.insert(std::make_pair(MangledName, GD));
   return MangledDeclNames[CanonicalGD] = Result.first->first();
 }
diff --git a/clang/test/CodeGenCXX/assert-demangle.cpp 
b/clang/test/CodeGenCXX/assert-demangle.cpp
new file mode 100644
index 00..86a7686f72d929
--- /dev/null
+++ b/clang/test/CodeGenCXX/assert-demangle.cpp
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -emit-llvm -fno-demangling-failures -triple 
%itanium_abi_triple -o - %s | FileCheck %s
+
+// CHECK: @_ZN6foobar3barEv
+// CHECK: @_ZN6foobar1A3fooEi
+namespace foobar {
+struct A {
+  void foo (int) {
+  }
+};
+
+void bar() {
+  A().foo(0);
+}
+} // namespace foobar
diff --git a/llvm/include/llvm/Demangle/Demangle.h 
b/llvm/include/llvm/Demangle/Demangle.h
index fe129603c0785d..910f0410d62db3 100644
--- a/llvm/include/llvm/Demangle/Demangle.h
+++ b/llvm/include/llvm/Demangle/Demangle.h
@@ -67,6 +67,13 @@ char *dlangDemangle(std::string_view MangledName);
 /// demangling occurred.
 std::string demangle(std::string_view MangledName);
 
+/// Determines if th

[clang] [clang][Itanium Mangle] Enable mangling of enclosing class for member… (PR #110503)

2024-10-02 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo updated 
https://github.com/llvm/llvm-project/pull/110503

>From 27c2b3d4d2d9b54ed635a6b00dbb545241b498e8 Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Mon, 30 Sep 2024 12:50:09 +
Subject: [PATCH] [clang][Itanium Mangle] Enable mangling of enclosing class
 for member-like friend function templates only if ` -fclang-abi-compat>=19`.

---
 clang/docs/ReleaseNotes.rst  |  2 +-
 clang/include/clang/Basic/LangOptions.h  |  4 +++-
 clang/lib/AST/ItaniumMangle.cpp  | 11 +--
 clang/test/CodeGenCXX/mangle-concept.cpp |  4 
 4 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 35c31452cef411..2d457fba0686b4 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -104,6 +104,7 @@ ABI Changes in This Version
 
 - Fixed Microsoft name mangling of placeholder, auto and decltype(auto), 
return types for MSVC 1920+. This change resolves incompatibilities with code 
compiled by MSVC 1920+ but will introduce incompatibilities with code compiled 
by earlier versions of Clang unless such code is built with the compiler option 
-fms-compatibility-version=19.14 to imitate the MSVC 1914 mangling behavior.
 - Fixed the Itanium mangling of the construction vtable name. This change will 
introduce incompatibilities with code compiled by Clang 19 and earlier 
versions, unless the -fclang-abi-compat=19 option is used. (#GH108015)
+- Mangle member-like friend function templates as members of the enclosing 
class. (#GH110247, #GH110503)
 
 AST Dumping Potentially Breaking Changes
 
@@ -447,7 +448,6 @@ Bug Fixes to C++ Support
 - Fixed an assertion failure in debug mode, and potential crashes in release 
mode, when
   diagnosing a failed cast caused indirectly by a failed implicit conversion 
to the type of the constructor parameter.
 - Fixed an assertion failure by adjusting integral to boolean vector 
conversions (#GH108326)
-- Mangle friend function templates with a constraint that depends on a 
template parameter from an enclosing template as members of the enclosing 
class. (#GH110247)
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/include/clang/Basic/LangOptions.h 
b/clang/include/clang/Basic/LangOptions.h
index 8c605f6852016e..e2d4206c72cc96 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -241,8 +241,10 @@ class LangOptionsBase {
 
 /// Attempt to be ABI-compatible with code generated by Clang 19.0.x.
 /// This causes clang to:
-///   - Incorrectly mangles the 'base type' substitutions of the CXX
+///   - Incorrectly mangle the 'base type' substitutions of the CXX
 ///   construction vtable because it hasn't added 'type' as a substitution.
+///   - Skip mangling enclosing class templates of member-like friend
+///   function templates.
 Ver19,
 
 /// Conform to the underlying platform's C and C++ ABIs as closely
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 117255178eebb4..8a4709a100739a 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -693,14 +693,13 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const 
Decl *D) {
 if (VD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 
-  if (const auto *FD = D->getAsFunction()) {
-if (FD->isExternC())
-  return getASTContext().getTranslationUnitDecl();
+  if (const auto *FD = getASTContext().getLangOpts().getClangABICompat() >
+   LangOptions::ClangABI::Ver19
+   ? D->getAsFunction()
+   : dyn_cast(D)) {
 // Member-like constrained friends are mangled as if they were members of
 // the enclosing class.
-if (FD->isMemberLikeConstrainedFriend() &&
-getASTContext().getLangOpts().getClangABICompat() >
-LangOptions::ClangABI::Ver17)
+if (FD->isMemberLikeConstrainedFriend())
   return D->getLexicalDeclContext()->getRedeclContext();
   }
 
diff --git a/clang/test/CodeGenCXX/mangle-concept.cpp 
b/clang/test/CodeGenCXX/mangle-concept.cpp
index 6053511c00a7b5..aa0940c35b237a 100644
--- a/clang/test/CodeGenCXX/mangle-concept.cpp
+++ b/clang/test/CodeGenCXX/mangle-concept.cpp
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=latest | FileCheck %s
+// RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=19 | FileCheck %s --check-prefix=CLANG19
 // RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=17 | FileCheck %s --check-prefix=CLANG17
 // expected-no-diagnostics
 
@@ -59,18 +60,21 @@ namespace test2 {
 // CLANG17: call {{.*}}@_ZN5test21fEz(
 f(ai);
 // CHECK: call {{.*}}

[clang] [llvm] [clang][LLVM Demangler] Add an assertion that validates that all mang… (PR #111391)

2024-10-10 Thread Viktoriia Bakalova via cfe-commits

VitaNuo wrote:

Totally agree to 2 to 4.

Regarding the testing and => default enablement, I think we'll have to first 
see how many failures we'll see on LLVM + Google internal codebase. It's hard 
to tell at this point how many of those there will be, and so how feasible it 
is (or how soon it is feasible) to enable the warning by default.


https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-25 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo edited 
https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-30 Thread Viktoriia Bakalova via cfe-commits

VitaNuo wrote:

The RFC is published 
https://discourse.llvm.org/t/rfc-clang-diagnostic-for-demangling-failures/82835.


https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-28 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo updated 
https://github.com/llvm/llvm-project/pull/111391

>From 54ee2e5d83a940b113f0fc326c511322605bfb78 Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Tue, 15 Oct 2024 09:48:09 +
Subject: [PATCH 1/3] [clang][LLVM Demangler] Add a diagnostic that validates
 that all mangled names produced by `clang` can be demangled by LLVM
 demangler.

Introduce the above warning behind the `-fdemangling-failures` flag, since:

a. the diagnostic cannot be fixed by an application developer.
b. the diagnostic is expected to be quite chatty.
---
 clang/include/clang/Basic/CodeGenOptions.def|  3 +++
 .../include/clang/Basic/DiagnosticFrontendKinds.td  |  4 
 clang/include/clang/Driver/Options.td   |  4 
 clang/lib/CodeGen/CodeGenModule.cpp | 13 +
 clang/test/CodeGenCXX/warn-demangling-failure.cpp   | 13 +
 llvm/include/llvm/Demangle/Demangle.h   |  7 +++
 llvm/lib/Demangle/Demangle.cpp  | 10 ++
 7 files changed, 54 insertions(+)
 create mode 100644 clang/test/CodeGenCXX/warn-demangling-failure.cpp

diff --git a/clang/include/clang/Basic/CodeGenOptions.def 
b/clang/include/clang/Basic/CodeGenOptions.def
index eac831278ee20d..d0e2393cbb5616 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -462,6 +462,9 @@ ENUM_CODEGENOPT(ZeroCallUsedRegs, 
llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind,
 /// non-deleting destructors. (No effect on Microsoft ABI.)
 CODEGENOPT(CtorDtorReturnThis, 1, 0)
 
+/// Whether to issue a diagnostic if a produced mangled name can not be 
demangled with the LLVM demangler.
+CODEGENOPT(DemanglingFailures, 1, 0)
+
 /// FIXME: Make DebugOptions its own top-level .def file.
 #include "DebugOptions.def"
 
diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td 
b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
index a6b17ccb6799d2..4cad78d5120d6d 100644
--- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -384,4 +384,8 @@ def warn_hlsl_langstd_minimal :
   Warning<"support for HLSL language version %0 is incomplete, "
   "recommend using %1 instead">,
   InGroup;
+
+def warn_name_cannot_be_demangled : Warning<
+  "cannot demangle the name '%0'">,
+  InGroup;
 }
diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 607ff47a857b8f..40d142555c85e1 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1967,6 +1967,10 @@ def fclang_abi_compat_EQ : Joined<["-"], 
"fclang-abi-compat=">, Group,
   MetaVarName<"">, Values<".,latest">,
   HelpText<"Attempt to match the ABI of Clang ">;
+def fdemangling_failures: Flag<["-"], "fdemangling-failures">, 
Group,
+  Visibility<[ClangOption, CC1Option]>,
+  HelpText<"Produce a diagnostic if clang cannot demangle all the mangled 
names it generates">,
+  MarshallingInfoFlag>;
 def fclasspath_EQ : Joined<["-"], "fclasspath=">, Group;
 def fcolor_diagnostics : Flag<["-"], "fcolor-diagnostics">, Group,
 
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp 
b/clang/lib/CodeGen/CodeGenModule.cpp
index 25c1c496a4f27f..420b39ff2c301d 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -41,7 +41,9 @@
 #include "clang/Basic/CharInfo.h"
 #include "clang/Basic/CodeGenOptions.h"
 #include "clang/Basic/Diagnostic.h"
+#include "clang/Basic/DiagnosticFrontend.h"
 #include "clang/Basic/FileManager.h"
+#include "clang/Basic/LangOptions.h"
 #include "clang/Basic/Module.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/TargetInfo.h"
@@ -54,6 +56,7 @@
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/Analysis/TargetLibraryInfo.h"
 #include "llvm/BinaryFormat/ELF.h"
+#include "llvm/Demangle/Demangle.h"
 #include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
 #include "llvm/IR/AttributeMask.h"
 #include "llvm/IR/CallingConv.h"
@@ -75,6 +78,7 @@
 #include "llvm/TargetParser/Triple.h"
 #include "llvm/TargetParser/X86TargetParser.h"
 #include "llvm/Transforms/Utils/BuildLibCalls.h"
+#include 
 #include 
 
 using namespace clang;
@@ -2044,6 +2048,15 @@ StringRef CodeGenModule::getMangledName(GlobalDecl GD) {
  GD.getWithKernelReferenceKind(KernelReferenceKind::Kernel),
  ND));
 
+  if (getCodeGenOpts().DemanglingFailures &&
+  getContext().getLangOpts().getClangABICompat() >
+  LangOptions::ClangABI::Ver19) {
+if (llvm::isMangledName(MangledName) &&
+llvm::demangle(MangledName) == MangledName)
+  Diags.Report(ND->getLocation(), diag::warn_name_cannot_be_demangled)
+  << MangledName;
+  }
+
   auto Result = Manglings.insert(std::make_pair(MangledName, GD));
   return MangledDeclNames[CanonicalGD] = Result.first->first();
 }
diff --git a/clang/test/CodeGenCXX/warn-demangling-failure.cpp 
b/clang/test/CodeG

[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-28 Thread Viktoriia Bakalova via cfe-commits


@@ -1967,6 +1967,10 @@ def fclang_abi_compat_EQ : Joined<["-"], 
"fclang-abi-compat=">, Group,
   MetaVarName<"">, Values<".,latest">,
   HelpText<"Attempt to match the ABI of Clang ">;
+def fdemangling_failures: Flag<["-"], "fdemangling-failures">, 
Group,

VitaNuo wrote:

Thank you, good point. I've looked through the existing flags, there are 
multiple ones that start with `fdiagnostics_XXX`, so I have renamed the flag to 
`fdiagnostics_demangler_failures`. 
Let me know if this works.

https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-28 Thread Viktoriia Bakalova via cfe-commits


@@ -462,6 +462,9 @@ ENUM_CODEGENOPT(ZeroCallUsedRegs, 
llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind,
 /// non-deleting destructors. (No effect on Microsoft ABI.)
 CODEGENOPT(CtorDtorReturnThis, 1, 0)
 
+/// Whether to issue a diagnostic if a produced mangled name can not be 
demangled with the LLVM demangler.
+CODEGENOPT(DemanglingFailures, 1, 0)

VitaNuo wrote:

Thanks, mentioning diagnostics makes sense.

https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-28 Thread Viktoriia Bakalova via cfe-commits


@@ -41,7 +41,9 @@
 #include "clang/Basic/CharInfo.h"
 #include "clang/Basic/CodeGenOptions.h"
 #include "clang/Basic/Diagnostic.h"
+#include "clang/Basic/DiagnosticFrontend.h"

VitaNuo wrote:

Sorry, most of those are a result of multiple iterations of this patch. 
The only necessary one is `llvm/Demangle/Demangle.h`.
Is that all right to add one include or should I still extract the code? 
Removing all the other includes for now.

https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-28 Thread Viktoriia Bakalova via cfe-commits


@@ -384,4 +384,8 @@ def warn_hlsl_langstd_minimal :
   Warning<"support for HLSL language version %0 is incomplete, "
   "recommend using %1 instead">,
   InGroup;
+
+def warn_name_cannot_be_demangled : Warning<
+  "cannot demangle the name '%0'">,
+  InGroup;

VitaNuo wrote:

Added a new `Demangler` group.

https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-28 Thread Viktoriia Bakalova via cfe-commits


@@ -1967,6 +1967,10 @@ def fclang_abi_compat_EQ : Joined<["-"], 
"fclang-abi-compat=">, Group,
   MetaVarName<"">, Values<".,latest">,
   HelpText<"Attempt to match the ABI of Clang ">;
+def fno_demangling_failures: Flag<["-"], "fno-demangling-failures">, 
Group,

VitaNuo wrote:

This has turned into `-fdiagnostics-demangler-failures` now.

https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-28 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo edited 
https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-28 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo edited 
https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-28 Thread Viktoriia Bakalova via cfe-commits

VitaNuo wrote:

> Close for me, jsut a couple of small requests.
> 
> Thanks for your patience on this response, I've been at LLVMDev all week.

Thanks Erich for the approval. 
I will publish an RFC for this in the coming days as well, still gathering some 
data from test runs.

https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-28 Thread Viktoriia Bakalova via cfe-commits


@@ -41,7 +41,9 @@
 #include "clang/Basic/CharInfo.h"
 #include "clang/Basic/CodeGenOptions.h"
 #include "clang/Basic/Diagnostic.h"
+#include "clang/Basic/DiagnosticFrontend.h"

VitaNuo wrote:

Thanks!

https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-28 Thread Viktoriia Bakalova via cfe-commits


@@ -462,6 +462,9 @@ ENUM_CODEGENOPT(ZeroCallUsedRegs, 
llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind,
 /// non-deleting destructors. (No effect on Microsoft ABI.)
 CODEGENOPT(CtorDtorReturnThis, 1, 0)
 
+/// Whether to validate if a produced mangled name can be demangled with LLVM 
demangler.
+CODEGENOPT(NoDemanglingFailures, 1, 0)

VitaNuo wrote:

This has turned into `DiagnosticsDemanglerFailures` now. Resolving this thread 
to avoid duplicate discussions.

https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-31 Thread Viktoriia Bakalova via cfe-commits

VitaNuo wrote:

> Thanks! I thought i commented elsewhere, but I think `diagnose` vs 
> `diagnostics` for the flags/etc makes more sense: 
> `fdiagnostics_demangler_failures` should be `-fdiagnose_demangler_failures`, 
> it is the correct language-tense.

Thanks! I think it was `demangling` vs. `demangler`, and now it's `diagnostics` 
vs. `diagnose` :) I'll incorporate that.

> Else, the patch is good delta what happens with the RFC. Please make sure to 
> wait until Aaron calls the RFC.

Ofc. I am also OOO next week.


https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [libcxxabi] [clang][ItaniumMangle] Mangle friend function templates with a constr… (PR #110247)

2024-09-27 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo created 
https://github.com/llvm/llvm-project/pull/110247

…aint that depends on a template parameter from an enclosing template as 
members of the enclosing class.

Such function templates should be considered member-like constrained friends 
per [temp.friend]p9 and 
https://github.com/itanium-cxx-abi/cxx-abi/issues/24#issuecomment-934977198).

>From f8d897f5f3a89a5664e95a45948f9725101aa36f Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Fri, 27 Sep 2024 11:33:17 +
Subject: [PATCH] [clang][ItaniumMangle] Mangle friend function templates with
 a constraint that depends on a template parameter from an enclosing template
 as members of the enclosing class.

Such function templates should be considered member-like constrained friends 
per [temp.friend]p9 and 
https://github.com/itanium-cxx-abi/cxx-abi/issues/24#issuecomment-934977198).
---
 clang/lib/AST/ItaniumMangle.cpp  | 8 
 clang/test/CodeGenCXX/mangle-concept.cpp | 6 +++---
 libcxxabi/test/test_demangle.pass.cpp| 6 +++---
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index b6e1da0c3192da..172561f73b9a74 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -2270,6 +2270,14 @@ void CXXNameMangler::mangleTemplatePrefix(GlobalDecl GD,
 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
   } else {
 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
+if (const auto *FD = dyn_cast(GD.getDecl())) {
+  // Member-like constrained friends are mangled as if they were members of
+  // the enclosing class.
+  if (FD->getTemplatedDecl()->isMemberLikeConstrainedFriend() &&
+  getASTContext().getLangOpts().getClangABICompat() >
+  LangOptions::ClangABI::Ver17)
+  DC = GD.getDecl()->getLexicalDeclContext()->getRedeclContext();
+}
 manglePrefix(DC, NoFunction);
 if (isa(ND) || isa(ND))
   mangleUnqualifiedName(GD, DC, nullptr);
diff --git a/clang/test/CodeGenCXX/mangle-concept.cpp 
b/clang/test/CodeGenCXX/mangle-concept.cpp
index 91dc1b0e688e0d..6053511c00a7b5 100644
--- a/clang/test/CodeGenCXX/mangle-concept.cpp
+++ b/clang/test/CodeGenCXX/mangle-concept.cpp
@@ -58,19 +58,19 @@ namespace test2 {
 // CHECK: call {{.*}}@_ZN5test21AIiEF1fEzQ4TrueIT_E(
 // CLANG17: call {{.*}}@_ZN5test21fEz(
 f(ai);
-// CHECK: call {{.*}}@_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21gIvEEvz(
 g(ai);
 // CHECK: call {{.*}}@_ZN5test21hIvEEvzQ4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21hIvEEvz(
 h(ai);
-// CHECK: call {{.*}}@_ZN5test2F1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21iIvEEvz(
 i(ai);
 // CHECK: call {{.*}}@_ZN5test21jIvQ4TrueITL0__EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21jIvEEvz(
 j(ai);
-// CHECK: call {{.*}}@_ZN5test2F1kITk4TruevQ4TrueIT_EEEvz(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1kITk4TruevQ4TrueIT_EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21kIvEEvz(
 k(ai);
 // CHECK: call {{.*}}@_ZN5test21lITk4TruevEEvz(
diff --git a/libcxxabi/test/test_demangle.pass.cpp 
b/libcxxabi/test/test_demangle.pass.cpp
index 17786a3a486fcd..efe482aad1b76c 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -30128,11 +30128,11 @@ const char* cases[][2] =
 // C++20 concepts, see 
https://github.com/itanium-cxx-abi/cxx-abi/issues/24.
 {"_Z2f0IiE1SIX1CIT_EEEv", "S> f0()"},
 {"_ZN5test21AIiEF1fEzQ4TrueIT_E", "test2::A::friend f(...) requires 
True"},
-{"_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E", "void test2::friend 
g(...) requires True && True"},
+{"_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E", "void 
test2::A::friend g(...) requires True && True"},
 {"_ZN5test21hIvEEvzQ4TrueITL0__E", "void test2::h(...) requires 
True"},
-{"_ZN5test2F1iIvQaa4TrueIT_E4TrueITL0__EEEvz", "void test2::friend 
i(...)"},
+{"_ZN5test21AIiEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz", "void 
test2::A::friend i(...)"},
 {"_ZN5test21jIvQ4TrueITL0__EEEvz", "void test2::j(...)"},
-{"_ZN5test2F1kITk4TruevQ4TrueIT_EEEvz", "void test2::friend k(...)"},
+{"_ZN5test21AIiEF1kITk4TruevQ4TrueIT_EEEvz", "void test2::A::friend 
k(...)"},
 {"_ZN5test21lITk4TruevEEvz", "void test2::l(...)"},
 {"_ZN5test31dITnDaLi0EEEvv", "void test3::d<0>()"},
 {"_ZN5test31eITnDcLi0EEEvv", "void test3::e<0>()"},

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


[clang] [libcxxabi] [clang][ItaniumMangle] Mangle friend function templates with a constr… (PR #110247)

2024-09-27 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo updated 
https://github.com/llvm/llvm-project/pull/110247

>From f8d897f5f3a89a5664e95a45948f9725101aa36f Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Fri, 27 Sep 2024 11:33:17 +
Subject: [PATCH 1/2] [clang][ItaniumMangle] Mangle friend function templates
 with a constraint that depends on a template parameter from an enclosing
 template as members of the enclosing class.

Such function templates should be considered member-like constrained friends 
per [temp.friend]p9 and 
https://github.com/itanium-cxx-abi/cxx-abi/issues/24#issuecomment-934977198).
---
 clang/lib/AST/ItaniumMangle.cpp  | 8 
 clang/test/CodeGenCXX/mangle-concept.cpp | 6 +++---
 libcxxabi/test/test_demangle.pass.cpp| 6 +++---
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index b6e1da0c3192da..172561f73b9a74 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -2270,6 +2270,14 @@ void CXXNameMangler::mangleTemplatePrefix(GlobalDecl GD,
 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
   } else {
 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
+if (const auto *FD = dyn_cast(GD.getDecl())) {
+  // Member-like constrained friends are mangled as if they were members of
+  // the enclosing class.
+  if (FD->getTemplatedDecl()->isMemberLikeConstrainedFriend() &&
+  getASTContext().getLangOpts().getClangABICompat() >
+  LangOptions::ClangABI::Ver17)
+  DC = GD.getDecl()->getLexicalDeclContext()->getRedeclContext();
+}
 manglePrefix(DC, NoFunction);
 if (isa(ND) || isa(ND))
   mangleUnqualifiedName(GD, DC, nullptr);
diff --git a/clang/test/CodeGenCXX/mangle-concept.cpp 
b/clang/test/CodeGenCXX/mangle-concept.cpp
index 91dc1b0e688e0d..6053511c00a7b5 100644
--- a/clang/test/CodeGenCXX/mangle-concept.cpp
+++ b/clang/test/CodeGenCXX/mangle-concept.cpp
@@ -58,19 +58,19 @@ namespace test2 {
 // CHECK: call {{.*}}@_ZN5test21AIiEF1fEzQ4TrueIT_E(
 // CLANG17: call {{.*}}@_ZN5test21fEz(
 f(ai);
-// CHECK: call {{.*}}@_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21gIvEEvz(
 g(ai);
 // CHECK: call {{.*}}@_ZN5test21hIvEEvzQ4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21hIvEEvz(
 h(ai);
-// CHECK: call {{.*}}@_ZN5test2F1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21iIvEEvz(
 i(ai);
 // CHECK: call {{.*}}@_ZN5test21jIvQ4TrueITL0__EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21jIvEEvz(
 j(ai);
-// CHECK: call {{.*}}@_ZN5test2F1kITk4TruevQ4TrueIT_EEEvz(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1kITk4TruevQ4TrueIT_EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21kIvEEvz(
 k(ai);
 // CHECK: call {{.*}}@_ZN5test21lITk4TruevEEvz(
diff --git a/libcxxabi/test/test_demangle.pass.cpp 
b/libcxxabi/test/test_demangle.pass.cpp
index 17786a3a486fcd..efe482aad1b76c 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -30128,11 +30128,11 @@ const char* cases[][2] =
 // C++20 concepts, see 
https://github.com/itanium-cxx-abi/cxx-abi/issues/24.
 {"_Z2f0IiE1SIX1CIT_EEEv", "S> f0()"},
 {"_ZN5test21AIiEF1fEzQ4TrueIT_E", "test2::A::friend f(...) requires 
True"},
-{"_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E", "void test2::friend 
g(...) requires True && True"},
+{"_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E", "void 
test2::A::friend g(...) requires True && True"},
 {"_ZN5test21hIvEEvzQ4TrueITL0__E", "void test2::h(...) requires 
True"},
-{"_ZN5test2F1iIvQaa4TrueIT_E4TrueITL0__EEEvz", "void test2::friend 
i(...)"},
+{"_ZN5test21AIiEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz", "void 
test2::A::friend i(...)"},
 {"_ZN5test21jIvQ4TrueITL0__EEEvz", "void test2::j(...)"},
-{"_ZN5test2F1kITk4TruevQ4TrueIT_EEEvz", "void test2::friend k(...)"},
+{"_ZN5test21AIiEF1kITk4TruevQ4TrueIT_EEEvz", "void test2::A::friend 
k(...)"},
 {"_ZN5test21lITk4TruevEEvz", "void test2::l(...)"},
 {"_ZN5test31dITnDaLi0EEEvv", "void test3::d<0>()"},
 {"_ZN5test31eITnDcLi0EEEvv", "void test3::e<0>()"},

>From 7f61556ecdef242043e24a7f514fe8f80d559200 Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Fri, 27 Sep 2024 11:42:04 +
Subject: [PATCH 2/2] fixup! [clang][ItaniumMangle] Mangle friend function
 templates with a constraint that depends on a template parameter from an
 enclosing template as members of the enclosing class.

---
 clang/lib/AST/ItaniumMangle.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 172561f73b9a74..0e5963b91f3253 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++

[clang-tools-extra] [include-cleaner] Attach Header to AnalysisResults for misisng headers (PR #110272)

2024-09-27 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo approved this pull request.


https://github.com/llvm/llvm-project/pull/110272
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [libcxxabi] [clang][ItaniumMangle] Mangle friend function templates with a constr… (PR #110247)

2024-09-27 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo updated 
https://github.com/llvm/llvm-project/pull/110247

>From f8d897f5f3a89a5664e95a45948f9725101aa36f Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Fri, 27 Sep 2024 11:33:17 +
Subject: [PATCH 1/3] [clang][ItaniumMangle] Mangle friend function templates
 with a constraint that depends on a template parameter from an enclosing
 template as members of the enclosing class.

Such function templates should be considered member-like constrained friends 
per [temp.friend]p9 and 
https://github.com/itanium-cxx-abi/cxx-abi/issues/24#issuecomment-934977198).
---
 clang/lib/AST/ItaniumMangle.cpp  | 8 
 clang/test/CodeGenCXX/mangle-concept.cpp | 6 +++---
 libcxxabi/test/test_demangle.pass.cpp| 6 +++---
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index b6e1da0c3192da..172561f73b9a74 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -2270,6 +2270,14 @@ void CXXNameMangler::mangleTemplatePrefix(GlobalDecl GD,
 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
   } else {
 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
+if (const auto *FD = dyn_cast(GD.getDecl())) {
+  // Member-like constrained friends are mangled as if they were members of
+  // the enclosing class.
+  if (FD->getTemplatedDecl()->isMemberLikeConstrainedFriend() &&
+  getASTContext().getLangOpts().getClangABICompat() >
+  LangOptions::ClangABI::Ver17)
+  DC = GD.getDecl()->getLexicalDeclContext()->getRedeclContext();
+}
 manglePrefix(DC, NoFunction);
 if (isa(ND) || isa(ND))
   mangleUnqualifiedName(GD, DC, nullptr);
diff --git a/clang/test/CodeGenCXX/mangle-concept.cpp 
b/clang/test/CodeGenCXX/mangle-concept.cpp
index 91dc1b0e688e0d..6053511c00a7b5 100644
--- a/clang/test/CodeGenCXX/mangle-concept.cpp
+++ b/clang/test/CodeGenCXX/mangle-concept.cpp
@@ -58,19 +58,19 @@ namespace test2 {
 // CHECK: call {{.*}}@_ZN5test21AIiEF1fEzQ4TrueIT_E(
 // CLANG17: call {{.*}}@_ZN5test21fEz(
 f(ai);
-// CHECK: call {{.*}}@_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21gIvEEvz(
 g(ai);
 // CHECK: call {{.*}}@_ZN5test21hIvEEvzQ4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21hIvEEvz(
 h(ai);
-// CHECK: call {{.*}}@_ZN5test2F1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21iIvEEvz(
 i(ai);
 // CHECK: call {{.*}}@_ZN5test21jIvQ4TrueITL0__EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21jIvEEvz(
 j(ai);
-// CHECK: call {{.*}}@_ZN5test2F1kITk4TruevQ4TrueIT_EEEvz(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1kITk4TruevQ4TrueIT_EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21kIvEEvz(
 k(ai);
 // CHECK: call {{.*}}@_ZN5test21lITk4TruevEEvz(
diff --git a/libcxxabi/test/test_demangle.pass.cpp 
b/libcxxabi/test/test_demangle.pass.cpp
index 17786a3a486fcd..efe482aad1b76c 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -30128,11 +30128,11 @@ const char* cases[][2] =
 // C++20 concepts, see 
https://github.com/itanium-cxx-abi/cxx-abi/issues/24.
 {"_Z2f0IiE1SIX1CIT_EEEv", "S> f0()"},
 {"_ZN5test21AIiEF1fEzQ4TrueIT_E", "test2::A::friend f(...) requires 
True"},
-{"_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E", "void test2::friend 
g(...) requires True && True"},
+{"_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E", "void 
test2::A::friend g(...) requires True && True"},
 {"_ZN5test21hIvEEvzQ4TrueITL0__E", "void test2::h(...) requires 
True"},
-{"_ZN5test2F1iIvQaa4TrueIT_E4TrueITL0__EEEvz", "void test2::friend 
i(...)"},
+{"_ZN5test21AIiEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz", "void 
test2::A::friend i(...)"},
 {"_ZN5test21jIvQ4TrueITL0__EEEvz", "void test2::j(...)"},
-{"_ZN5test2F1kITk4TruevQ4TrueIT_EEEvz", "void test2::friend k(...)"},
+{"_ZN5test21AIiEF1kITk4TruevQ4TrueIT_EEEvz", "void test2::A::friend 
k(...)"},
 {"_ZN5test21lITk4TruevEEvz", "void test2::l(...)"},
 {"_ZN5test31dITnDaLi0EEEvv", "void test3::d<0>()"},
 {"_ZN5test31eITnDcLi0EEEvv", "void test3::e<0>()"},

>From 7f61556ecdef242043e24a7f514fe8f80d559200 Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Fri, 27 Sep 2024 11:42:04 +
Subject: [PATCH 2/3] fixup! [clang][ItaniumMangle] Mangle friend function
 templates with a constraint that depends on a template parameter from an
 enclosing template as members of the enclosing class.

---
 clang/lib/AST/ItaniumMangle.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 172561f73b9a74..0e5963b91f3253 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++

[clang] [libcxxabi] [clang][ItaniumMangle] Mangle friend function templates with a constr… (PR #110247)

2024-09-27 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo updated 
https://github.com/llvm/llvm-project/pull/110247

>From f8d897f5f3a89a5664e95a45948f9725101aa36f Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Fri, 27 Sep 2024 11:33:17 +
Subject: [PATCH 1/4] [clang][ItaniumMangle] Mangle friend function templates
 with a constraint that depends on a template parameter from an enclosing
 template as members of the enclosing class.

Such function templates should be considered member-like constrained friends 
per [temp.friend]p9 and 
https://github.com/itanium-cxx-abi/cxx-abi/issues/24#issuecomment-934977198).
---
 clang/lib/AST/ItaniumMangle.cpp  | 8 
 clang/test/CodeGenCXX/mangle-concept.cpp | 6 +++---
 libcxxabi/test/test_demangle.pass.cpp| 6 +++---
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index b6e1da0c3192da..172561f73b9a74 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -2270,6 +2270,14 @@ void CXXNameMangler::mangleTemplatePrefix(GlobalDecl GD,
 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
   } else {
 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
+if (const auto *FD = dyn_cast(GD.getDecl())) {
+  // Member-like constrained friends are mangled as if they were members of
+  // the enclosing class.
+  if (FD->getTemplatedDecl()->isMemberLikeConstrainedFriend() &&
+  getASTContext().getLangOpts().getClangABICompat() >
+  LangOptions::ClangABI::Ver17)
+  DC = GD.getDecl()->getLexicalDeclContext()->getRedeclContext();
+}
 manglePrefix(DC, NoFunction);
 if (isa(ND) || isa(ND))
   mangleUnqualifiedName(GD, DC, nullptr);
diff --git a/clang/test/CodeGenCXX/mangle-concept.cpp 
b/clang/test/CodeGenCXX/mangle-concept.cpp
index 91dc1b0e688e0d..6053511c00a7b5 100644
--- a/clang/test/CodeGenCXX/mangle-concept.cpp
+++ b/clang/test/CodeGenCXX/mangle-concept.cpp
@@ -58,19 +58,19 @@ namespace test2 {
 // CHECK: call {{.*}}@_ZN5test21AIiEF1fEzQ4TrueIT_E(
 // CLANG17: call {{.*}}@_ZN5test21fEz(
 f(ai);
-// CHECK: call {{.*}}@_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21gIvEEvz(
 g(ai);
 // CHECK: call {{.*}}@_ZN5test21hIvEEvzQ4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21hIvEEvz(
 h(ai);
-// CHECK: call {{.*}}@_ZN5test2F1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21iIvEEvz(
 i(ai);
 // CHECK: call {{.*}}@_ZN5test21jIvQ4TrueITL0__EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21jIvEEvz(
 j(ai);
-// CHECK: call {{.*}}@_ZN5test2F1kITk4TruevQ4TrueIT_EEEvz(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1kITk4TruevQ4TrueIT_EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21kIvEEvz(
 k(ai);
 // CHECK: call {{.*}}@_ZN5test21lITk4TruevEEvz(
diff --git a/libcxxabi/test/test_demangle.pass.cpp 
b/libcxxabi/test/test_demangle.pass.cpp
index 17786a3a486fcd..efe482aad1b76c 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -30128,11 +30128,11 @@ const char* cases[][2] =
 // C++20 concepts, see 
https://github.com/itanium-cxx-abi/cxx-abi/issues/24.
 {"_Z2f0IiE1SIX1CIT_EEEv", "S> f0()"},
 {"_ZN5test21AIiEF1fEzQ4TrueIT_E", "test2::A::friend f(...) requires 
True"},
-{"_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E", "void test2::friend 
g(...) requires True && True"},
+{"_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E", "void 
test2::A::friend g(...) requires True && True"},
 {"_ZN5test21hIvEEvzQ4TrueITL0__E", "void test2::h(...) requires 
True"},
-{"_ZN5test2F1iIvQaa4TrueIT_E4TrueITL0__EEEvz", "void test2::friend 
i(...)"},
+{"_ZN5test21AIiEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz", "void 
test2::A::friend i(...)"},
 {"_ZN5test21jIvQ4TrueITL0__EEEvz", "void test2::j(...)"},
-{"_ZN5test2F1kITk4TruevQ4TrueIT_EEEvz", "void test2::friend k(...)"},
+{"_ZN5test21AIiEF1kITk4TruevQ4TrueIT_EEEvz", "void test2::A::friend 
k(...)"},
 {"_ZN5test21lITk4TruevEEvz", "void test2::l(...)"},
 {"_ZN5test31dITnDaLi0EEEvv", "void test3::d<0>()"},
 {"_ZN5test31eITnDcLi0EEEvv", "void test3::e<0>()"},

>From 7f61556ecdef242043e24a7f514fe8f80d559200 Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Fri, 27 Sep 2024 11:42:04 +
Subject: [PATCH 2/4] fixup! [clang][ItaniumMangle] Mangle friend function
 templates with a constraint that depends on a template parameter from an
 enclosing template as members of the enclosing class.

---
 clang/lib/AST/ItaniumMangle.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 172561f73b9a74..0e5963b91f3253 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++

[clang] [libcxxabi] [clang][ItaniumMangle] Mangle friend function templates with a constr… (PR #110247)

2024-09-27 Thread Viktoriia Bakalova via cfe-commits


@@ -2270,6 +2270,14 @@ void CXXNameMangler::mangleTemplatePrefix(GlobalDecl GD,
 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
   } else {
 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
+if (const auto *FD = dyn_cast(GD.getDecl())) {

VitaNuo wrote:

Makes sense, thank you.

https://github.com/llvm/llvm-project/pull/110247
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [libcxxabi] [clang][ItaniumMangle] Mangle friend function templates with a constr… (PR #110247)

2024-09-27 Thread Viktoriia Bakalova via cfe-commits


@@ -58,19 +58,19 @@ namespace test2 {
 // CHECK: call {{.*}}@_ZN5test21AIiEF1fEzQ4TrueIT_E(
 // CLANG17: call {{.*}}@_ZN5test21fEz(
 f(ai);
-// CHECK: call {{.*}}@_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
+// CHECK: call {{.*}}@_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E(

VitaNuo wrote:

Sure.

https://github.com/llvm/llvm-project/pull/110247
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][Itanium Mangle] Enable mangling of enclosing class for member… (PR #110503)

2024-09-30 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo created 
https://github.com/llvm/llvm-project/pull/110503

…-like friend function templates only if ` -fclang-abi-compat>=19`.

>From 5bdf3b5814f90b953a8638e6024cd081bc300e8b Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Mon, 30 Sep 2024 12:50:09 +
Subject: [PATCH] [clang][Itanium Mangle] Enable mangling of enclosing class
 for member-like friend function templates only if ` -fclang-abi-compat>=19`.

---
 clang/lib/AST/ItaniumMangle.cpp  | 11 ++-
 clang/test/CodeGenCXX/mangle-concept.cpp |  4 
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 117255178eebb4..3d9d1e3f22f832 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -693,7 +693,7 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const 
Decl *D) {
 if (VD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 
-  if (const auto *FD = D->getAsFunction()) {
+  if (const auto *FD = dyn_cast(D)) {
 if (FD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 // Member-like constrained friends are mangled as if they were members of
@@ -704,6 +704,15 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const 
Decl *D) {
   return D->getLexicalDeclContext()->getRedeclContext();
   }
 
+  if (const auto *FTD = dyn_cast(D)) {
+// Member-like constrained friends are mangled as if they were members of
+// the enclosing class.
+if (FTD->getTemplatedDecl()->isMemberLikeConstrainedFriend() &&
+getASTContext().getLangOpts().getClangABICompat() >
+LangOptions::ClangABI::Ver19)
+  return D->getLexicalDeclContext()->getRedeclContext();
+  }
+
   return DC->getRedeclContext();
 }
 
diff --git a/clang/test/CodeGenCXX/mangle-concept.cpp 
b/clang/test/CodeGenCXX/mangle-concept.cpp
index 6053511c00a7b5..aa0940c35b237a 100644
--- a/clang/test/CodeGenCXX/mangle-concept.cpp
+++ b/clang/test/CodeGenCXX/mangle-concept.cpp
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=latest | FileCheck %s
+// RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=19 | FileCheck %s --check-prefix=CLANG19
 // RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=17 | FileCheck %s --check-prefix=CLANG17
 // expected-no-diagnostics
 
@@ -59,18 +60,21 @@ namespace test2 {
 // CLANG17: call {{.*}}@_ZN5test21fEz(
 f(ai);
 // CHECK: call {{.*}}@_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
+// CLANG19: call {{.*}}@_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21gIvEEvz(
 g(ai);
 // CHECK: call {{.*}}@_ZN5test21hIvEEvzQ4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21hIvEEvz(
 h(ai);
 // CHECK: call {{.*}}@_ZN5test21AIiEF1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
+// CLANG19: call {{.*}}@_ZN5test2F1iIvQaa4TrueIT_E4TrueITL0__EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21iIvEEvz(
 i(ai);
 // CHECK: call {{.*}}@_ZN5test21jIvQ4TrueITL0__EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21jIvEEvz(
 j(ai);
 // CHECK: call {{.*}}@_ZN5test21AIiEF1kITk4TruevQ4TrueIT_EEEvz(
+// CLANG19: call {{.*}}@_ZN5test2F1kITk4TruevQ4TrueIT_EEEvz(
 // CLANG17: call {{.*}}@_ZN5test21kIvEEvz(
 k(ai);
 // CHECK: call {{.*}}@_ZN5test21lITk4TruevEEvz(

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


[clang] [clang][Itanium Mangle] Enable mangling of enclosing class for member… (PR #110503)

2024-09-30 Thread Viktoriia Bakalova via cfe-commits

VitaNuo wrote:

> Thanks.
> 
> Can you update the comment 
> [here](https://github.com/llvm/llvm-project/blob/main/clang/include/clang/Basic/LangOptions.h#L242-L245)
>  to mention this case?
> 
> And I think it is better to move the release note `Mangle friend function 
> ...` from the `Bug Fixes to C++ Support` to `ABI Changes in This Version`.

Thank you, the comments should be addressed now.

https://github.com/llvm/llvm-project/pull/110503
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][Itanium Mangle] Enable mangling of enclosing class for member… (PR #110503)

2024-09-30 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo updated 
https://github.com/llvm/llvm-project/pull/110503

>From f22108bcbe97365a29e134ecd496533641f901fb Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Mon, 30 Sep 2024 12:50:09 +
Subject: [PATCH] [clang][Itanium Mangle] Enable mangling of enclosing class
 for member-like friend function templates only if ` -fclang-abi-compat>=19`.

---
 clang/docs/ReleaseNotes.rst  |  2 +-
 clang/include/clang/Basic/LangOptions.h  |  3 ++-
 clang/lib/AST/ItaniumMangle.cpp  | 11 ++-
 clang/test/CodeGenCXX/mangle-concept.cpp |  4 
 4 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 35c31452cef411..d824213d700905 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -104,6 +104,7 @@ ABI Changes in This Version
 
 - Fixed Microsoft name mangling of placeholder, auto and decltype(auto), 
return types for MSVC 1920+. This change resolves incompatibilities with code 
compiled by MSVC 1920+ but will introduce incompatibilities with code compiled 
by earlier versions of Clang unless such code is built with the compiler option 
-fms-compatibility-version=19.14 to imitate the MSVC 1914 mangling behavior.
 - Fixed the Itanium mangling of the construction vtable name. This change will 
introduce incompatibilities with code compiled by Clang 19 and earlier 
versions, unless the -fclang-abi-compat=19 option is used. (#GH108015)
+- Mangle friend function templates with a constraint that depends on a 
template parameter from an enclosing template as members of the enclosing 
class. (#GH110247, #GH110503)
 
 AST Dumping Potentially Breaking Changes
 
@@ -447,7 +448,6 @@ Bug Fixes to C++ Support
 - Fixed an assertion failure in debug mode, and potential crashes in release 
mode, when
   diagnosing a failed cast caused indirectly by a failed implicit conversion 
to the type of the constructor parameter.
 - Fixed an assertion failure by adjusting integral to boolean vector 
conversions (#GH108326)
-- Mangle friend function templates with a constraint that depends on a 
template parameter from an enclosing template as members of the enclosing 
class. (#GH110247)
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/include/clang/Basic/LangOptions.h 
b/clang/include/clang/Basic/LangOptions.h
index 8c605f6852016e..f5fa1bd8df1967 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -241,8 +241,9 @@ class LangOptionsBase {
 
 /// Attempt to be ABI-compatible with code generated by Clang 19.0.x.
 /// This causes clang to:
-///   - Incorrectly mangles the 'base type' substitutions of the CXX
+///   - Incorrectly mangle the 'base type' substitutions of the CXX
 ///   construction vtable because it hasn't added 'type' as a substitution.
+///   - Skip mangling enclosing class templates of member-like friend 
function templates.
 Ver19,
 
 /// Conform to the underlying platform's C and C++ ABIs as closely
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 117255178eebb4..3d9d1e3f22f832 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -693,7 +693,7 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const 
Decl *D) {
 if (VD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 
-  if (const auto *FD = D->getAsFunction()) {
+  if (const auto *FD = dyn_cast(D)) {
 if (FD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 // Member-like constrained friends are mangled as if they were members of
@@ -704,6 +704,15 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const 
Decl *D) {
   return D->getLexicalDeclContext()->getRedeclContext();
   }
 
+  if (const auto *FTD = dyn_cast(D)) {
+// Member-like constrained friends are mangled as if they were members of
+// the enclosing class.
+if (FTD->getTemplatedDecl()->isMemberLikeConstrainedFriend() &&
+getASTContext().getLangOpts().getClangABICompat() >
+LangOptions::ClangABI::Ver19)
+  return D->getLexicalDeclContext()->getRedeclContext();
+  }
+
   return DC->getRedeclContext();
 }
 
diff --git a/clang/test/CodeGenCXX/mangle-concept.cpp 
b/clang/test/CodeGenCXX/mangle-concept.cpp
index 6053511c00a7b5..aa0940c35b237a 100644
--- a/clang/test/CodeGenCXX/mangle-concept.cpp
+++ b/clang/test/CodeGenCXX/mangle-concept.cpp
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=latest | FileCheck %s
+// RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=19 | FileCheck %s --check-prefix=CLANG19
 // RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=17 | FileCheck %s --check-prefix=CL

[clang] [clang][Itanium Mangle] Enable mangling of enclosing class for member… (PR #110503)

2024-09-30 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo updated 
https://github.com/llvm/llvm-project/pull/110503

>From 53ef5a19100bdda3f6886cddaedf474cffd055b1 Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Mon, 30 Sep 2024 12:50:09 +
Subject: [PATCH] [clang][Itanium Mangle] Enable mangling of enclosing class
 for member-like friend function templates only if ` -fclang-abi-compat>=19`.

---
 clang/docs/ReleaseNotes.rst  |  2 +-
 clang/include/clang/Basic/LangOptions.h  |  4 +++-
 clang/lib/AST/ItaniumMangle.cpp  | 11 ++-
 clang/test/CodeGenCXX/mangle-concept.cpp |  4 
 4 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 35c31452cef411..2d457fba0686b4 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -104,6 +104,7 @@ ABI Changes in This Version
 
 - Fixed Microsoft name mangling of placeholder, auto and decltype(auto), 
return types for MSVC 1920+. This change resolves incompatibilities with code 
compiled by MSVC 1920+ but will introduce incompatibilities with code compiled 
by earlier versions of Clang unless such code is built with the compiler option 
-fms-compatibility-version=19.14 to imitate the MSVC 1914 mangling behavior.
 - Fixed the Itanium mangling of the construction vtable name. This change will 
introduce incompatibilities with code compiled by Clang 19 and earlier 
versions, unless the -fclang-abi-compat=19 option is used. (#GH108015)
+- Mangle member-like friend function templates as members of the enclosing 
class. (#GH110247, #GH110503)
 
 AST Dumping Potentially Breaking Changes
 
@@ -447,7 +448,6 @@ Bug Fixes to C++ Support
 - Fixed an assertion failure in debug mode, and potential crashes in release 
mode, when
   diagnosing a failed cast caused indirectly by a failed implicit conversion 
to the type of the constructor parameter.
 - Fixed an assertion failure by adjusting integral to boolean vector 
conversions (#GH108326)
-- Mangle friend function templates with a constraint that depends on a 
template parameter from an enclosing template as members of the enclosing 
class. (#GH110247)
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/include/clang/Basic/LangOptions.h 
b/clang/include/clang/Basic/LangOptions.h
index 8c605f6852016e..e2d4206c72cc96 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -241,8 +241,10 @@ class LangOptionsBase {
 
 /// Attempt to be ABI-compatible with code generated by Clang 19.0.x.
 /// This causes clang to:
-///   - Incorrectly mangles the 'base type' substitutions of the CXX
+///   - Incorrectly mangle the 'base type' substitutions of the CXX
 ///   construction vtable because it hasn't added 'type' as a substitution.
+///   - Skip mangling enclosing class templates of member-like friend
+///   function templates.
 Ver19,
 
 /// Conform to the underlying platform's C and C++ ABIs as closely
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 117255178eebb4..3d9d1e3f22f832 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -693,7 +693,7 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const 
Decl *D) {
 if (VD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 
-  if (const auto *FD = D->getAsFunction()) {
+  if (const auto *FD = dyn_cast(D)) {
 if (FD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 // Member-like constrained friends are mangled as if they were members of
@@ -704,6 +704,15 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const 
Decl *D) {
   return D->getLexicalDeclContext()->getRedeclContext();
   }
 
+  if (const auto *FTD = dyn_cast(D)) {
+// Member-like constrained friends are mangled as if they were members of
+// the enclosing class.
+if (FTD->getTemplatedDecl()->isMemberLikeConstrainedFriend() &&
+getASTContext().getLangOpts().getClangABICompat() >
+LangOptions::ClangABI::Ver19)
+  return D->getLexicalDeclContext()->getRedeclContext();
+  }
+
   return DC->getRedeclContext();
 }
 
diff --git a/clang/test/CodeGenCXX/mangle-concept.cpp 
b/clang/test/CodeGenCXX/mangle-concept.cpp
index 6053511c00a7b5..aa0940c35b237a 100644
--- a/clang/test/CodeGenCXX/mangle-concept.cpp
+++ b/clang/test/CodeGenCXX/mangle-concept.cpp
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=latest | FileCheck %s
+// RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=19 | FileCheck %s --check-prefix=CLANG19
 // RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=17 | FileCheck %s --check-prefix=CLANG17
 // expected-no-diagnostics
 
@@ -59,18 +60,21 @@ nam

[clang] [clang][Itanium Mangle] Enable mangling of enclosing class for member… (PR #110503)

2024-10-02 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo updated 
https://github.com/llvm/llvm-project/pull/110503

>From 27c2b3d4d2d9b54ed635a6b00dbb545241b498e8 Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Mon, 30 Sep 2024 12:50:09 +
Subject: [PATCH] [clang][Itanium Mangle] Enable mangling of enclosing class
 for member-like friend function templates only if ` -fclang-abi-compat>=19`.

---
 clang/docs/ReleaseNotes.rst  |  2 +-
 clang/include/clang/Basic/LangOptions.h  |  4 +++-
 clang/lib/AST/ItaniumMangle.cpp  | 11 +--
 clang/test/CodeGenCXX/mangle-concept.cpp |  4 
 4 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 35c31452cef411..2d457fba0686b4 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -104,6 +104,7 @@ ABI Changes in This Version
 
 - Fixed Microsoft name mangling of placeholder, auto and decltype(auto), 
return types for MSVC 1920+. This change resolves incompatibilities with code 
compiled by MSVC 1920+ but will introduce incompatibilities with code compiled 
by earlier versions of Clang unless such code is built with the compiler option 
-fms-compatibility-version=19.14 to imitate the MSVC 1914 mangling behavior.
 - Fixed the Itanium mangling of the construction vtable name. This change will 
introduce incompatibilities with code compiled by Clang 19 and earlier 
versions, unless the -fclang-abi-compat=19 option is used. (#GH108015)
+- Mangle member-like friend function templates as members of the enclosing 
class. (#GH110247, #GH110503)
 
 AST Dumping Potentially Breaking Changes
 
@@ -447,7 +448,6 @@ Bug Fixes to C++ Support
 - Fixed an assertion failure in debug mode, and potential crashes in release 
mode, when
   diagnosing a failed cast caused indirectly by a failed implicit conversion 
to the type of the constructor parameter.
 - Fixed an assertion failure by adjusting integral to boolean vector 
conversions (#GH108326)
-- Mangle friend function templates with a constraint that depends on a 
template parameter from an enclosing template as members of the enclosing 
class. (#GH110247)
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/include/clang/Basic/LangOptions.h 
b/clang/include/clang/Basic/LangOptions.h
index 8c605f6852016e..e2d4206c72cc96 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -241,8 +241,10 @@ class LangOptionsBase {
 
 /// Attempt to be ABI-compatible with code generated by Clang 19.0.x.
 /// This causes clang to:
-///   - Incorrectly mangles the 'base type' substitutions of the CXX
+///   - Incorrectly mangle the 'base type' substitutions of the CXX
 ///   construction vtable because it hasn't added 'type' as a substitution.
+///   - Skip mangling enclosing class templates of member-like friend
+///   function templates.
 Ver19,
 
 /// Conform to the underlying platform's C and C++ ABIs as closely
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 117255178eebb4..8a4709a100739a 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -693,14 +693,13 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const 
Decl *D) {
 if (VD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 
-  if (const auto *FD = D->getAsFunction()) {
-if (FD->isExternC())
-  return getASTContext().getTranslationUnitDecl();
+  if (const auto *FD = getASTContext().getLangOpts().getClangABICompat() >
+   LangOptions::ClangABI::Ver19
+   ? D->getAsFunction()
+   : dyn_cast(D)) {
 // Member-like constrained friends are mangled as if they were members of
 // the enclosing class.
-if (FD->isMemberLikeConstrainedFriend() &&
-getASTContext().getLangOpts().getClangABICompat() >
-LangOptions::ClangABI::Ver17)
+if (FD->isMemberLikeConstrainedFriend())
   return D->getLexicalDeclContext()->getRedeclContext();
   }
 
diff --git a/clang/test/CodeGenCXX/mangle-concept.cpp 
b/clang/test/CodeGenCXX/mangle-concept.cpp
index 6053511c00a7b5..aa0940c35b237a 100644
--- a/clang/test/CodeGenCXX/mangle-concept.cpp
+++ b/clang/test/CodeGenCXX/mangle-concept.cpp
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=latest | FileCheck %s
+// RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=19 | FileCheck %s --check-prefix=CLANG19
 // RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=17 | FileCheck %s --check-prefix=CLANG17
 // expected-no-diagnostics
 
@@ -59,18 +60,21 @@ namespace test2 {
 // CLANG17: call {{.*}}@_ZN5test21fEz(
 f(ai);
 // CHECK: call {{.*}}

[clang] [clang][Itanium Mangle] Enable mangling of enclosing class for member… (PR #110503)

2024-10-02 Thread Viktoriia Bakalova via cfe-commits


@@ -693,7 +693,7 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const 
Decl *D) {
 if (VD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 
-  if (const auto *FD = D->getAsFunction()) {
+  if (const auto *FD = dyn_cast(D)) {

VitaNuo wrote:

Thank you, simplified.

https://github.com/llvm/llvm-project/pull/110503
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][Itanium Mangle] Enable mangling of enclosing class for member… (PR #110503)

2024-10-02 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo closed 
https://github.com/llvm/llvm-project/pull/110503
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][Itanium Mangle] Enable mangling of enclosing class for member… (PR #110503)

2024-10-02 Thread Viktoriia Bakalova via cfe-commits


@@ -693,14 +693,13 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const 
Decl *D) {
 if (VD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 
-  if (const auto *FD = D->getAsFunction()) {
-if (FD->isExternC())

VitaNuo wrote:

It's back.

https://github.com/llvm/llvm-project/pull/110503
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][Itanium Mangle] Enable mangling of enclosing class for member… (PR #110503)

2024-10-02 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo edited 
https://github.com/llvm/llvm-project/pull/110503
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][Itanium Mangle] Enable mangling of enclosing class for member… (PR #110503)

2024-10-02 Thread Viktoriia Bakalova via cfe-commits


@@ -693,14 +693,13 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const 
Decl *D) {
 if (VD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 
-  if (const auto *FD = D->getAsFunction()) {
-if (FD->isExternC())
-  return getASTContext().getTranslationUnitDecl();
+  if (const auto *FD = getASTContext().getLangOpts().getClangABICompat() >
+   LangOptions::ClangABI::Ver19
+   ? D->getAsFunction()
+   : dyn_cast(D)) {
 // Member-like constrained friends are mangled as if they were members of
 // the enclosing class.
-if (FD->isMemberLikeConstrainedFriend() &&
-getASTContext().getLangOpts().getClangABICompat() >
-LangOptions::ClangABI::Ver17)
+if (FD->isMemberLikeConstrainedFriend())

VitaNuo wrote:

Yes sorry, I might have misinterpreted the comment above.

https://github.com/llvm/llvm-project/pull/110503
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][Itanium Mangle] Enable mangling of enclosing class for member… (PR #110503)

2024-10-02 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo updated 
https://github.com/llvm/llvm-project/pull/110503

>From 927a40fc58018f61eaf008672039faa233a6ce50 Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Mon, 30 Sep 2024 12:50:09 +
Subject: [PATCH] [clang][Itanium Mangle] Enable mangling of enclosing class
 for member-like friend function templates only if ` -fclang-abi-compat>=19`.

---
 clang/docs/ReleaseNotes.rst  | 2 +-
 clang/include/clang/Basic/LangOptions.h  | 4 +++-
 clang/lib/AST/ItaniumMangle.cpp  | 5 -
 clang/test/CodeGenCXX/mangle-concept.cpp | 4 
 4 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 35c31452cef411..2d457fba0686b4 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -104,6 +104,7 @@ ABI Changes in This Version
 
 - Fixed Microsoft name mangling of placeholder, auto and decltype(auto), 
return types for MSVC 1920+. This change resolves incompatibilities with code 
compiled by MSVC 1920+ but will introduce incompatibilities with code compiled 
by earlier versions of Clang unless such code is built with the compiler option 
-fms-compatibility-version=19.14 to imitate the MSVC 1914 mangling behavior.
 - Fixed the Itanium mangling of the construction vtable name. This change will 
introduce incompatibilities with code compiled by Clang 19 and earlier 
versions, unless the -fclang-abi-compat=19 option is used. (#GH108015)
+- Mangle member-like friend function templates as members of the enclosing 
class. (#GH110247, #GH110503)
 
 AST Dumping Potentially Breaking Changes
 
@@ -447,7 +448,6 @@ Bug Fixes to C++ Support
 - Fixed an assertion failure in debug mode, and potential crashes in release 
mode, when
   diagnosing a failed cast caused indirectly by a failed implicit conversion 
to the type of the constructor parameter.
 - Fixed an assertion failure by adjusting integral to boolean vector 
conversions (#GH108326)
-- Mangle friend function templates with a constraint that depends on a 
template parameter from an enclosing template as members of the enclosing 
class. (#GH110247)
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/include/clang/Basic/LangOptions.h 
b/clang/include/clang/Basic/LangOptions.h
index 8c605f6852016e..e2d4206c72cc96 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -241,8 +241,10 @@ class LangOptionsBase {
 
 /// Attempt to be ABI-compatible with code generated by Clang 19.0.x.
 /// This causes clang to:
-///   - Incorrectly mangles the 'base type' substitutions of the CXX
+///   - Incorrectly mangle the 'base type' substitutions of the CXX
 ///   construction vtable because it hasn't added 'type' as a substitution.
+///   - Skip mangling enclosing class templates of member-like friend
+///   function templates.
 Ver19,
 
 /// Conform to the underlying platform's C and C++ ABIs as closely
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 117255178eebb4..0183057610bca6 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -693,7 +693,10 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const 
Decl *D) {
 if (VD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 
-  if (const auto *FD = D->getAsFunction()) {
+  if (const auto *FD = getASTContext().getLangOpts().getClangABICompat() >
+   LangOptions::ClangABI::Ver19
+   ? D->getAsFunction()
+   : dyn_cast(D)) {
 if (FD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 // Member-like constrained friends are mangled as if they were members of
diff --git a/clang/test/CodeGenCXX/mangle-concept.cpp 
b/clang/test/CodeGenCXX/mangle-concept.cpp
index 6053511c00a7b5..aa0940c35b237a 100644
--- a/clang/test/CodeGenCXX/mangle-concept.cpp
+++ b/clang/test/CodeGenCXX/mangle-concept.cpp
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=latest | FileCheck %s
+// RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=19 | FileCheck %s --check-prefix=CLANG19
 // RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=17 | FileCheck %s --check-prefix=CLANG17
 // expected-no-diagnostics
 
@@ -59,18 +60,21 @@ namespace test2 {
 // CLANG17: call {{.*}}@_ZN5test21fEz(
 f(ai);
 // CHECK: call {{.*}}@_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
+// CLANG19: call {{.*}}@_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21gIvEEvz(
 g(ai);
 // CHECK: call {{.*}}@_ZN5test21hIvEEvzQ4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21hIvEEvz(
 h(ai);
 

[clang] [clang][Itanium Mangle] Enable mangling of enclosing class for member… (PR #110503)

2024-10-02 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo updated 
https://github.com/llvm/llvm-project/pull/110503

>From 927a40fc58018f61eaf008672039faa233a6ce50 Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Mon, 30 Sep 2024 12:50:09 +
Subject: [PATCH] [clang][Itanium Mangle] Enable mangling of enclosing class
 for member-like friend function templates only if ` -fclang-abi-compat>=19`.

---
 clang/docs/ReleaseNotes.rst  | 2 +-
 clang/include/clang/Basic/LangOptions.h  | 4 +++-
 clang/lib/AST/ItaniumMangle.cpp  | 5 -
 clang/test/CodeGenCXX/mangle-concept.cpp | 4 
 4 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 35c31452cef411..2d457fba0686b4 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -104,6 +104,7 @@ ABI Changes in This Version
 
 - Fixed Microsoft name mangling of placeholder, auto and decltype(auto), 
return types for MSVC 1920+. This change resolves incompatibilities with code 
compiled by MSVC 1920+ but will introduce incompatibilities with code compiled 
by earlier versions of Clang unless such code is built with the compiler option 
-fms-compatibility-version=19.14 to imitate the MSVC 1914 mangling behavior.
 - Fixed the Itanium mangling of the construction vtable name. This change will 
introduce incompatibilities with code compiled by Clang 19 and earlier 
versions, unless the -fclang-abi-compat=19 option is used. (#GH108015)
+- Mangle member-like friend function templates as members of the enclosing 
class. (#GH110247, #GH110503)
 
 AST Dumping Potentially Breaking Changes
 
@@ -447,7 +448,6 @@ Bug Fixes to C++ Support
 - Fixed an assertion failure in debug mode, and potential crashes in release 
mode, when
   diagnosing a failed cast caused indirectly by a failed implicit conversion 
to the type of the constructor parameter.
 - Fixed an assertion failure by adjusting integral to boolean vector 
conversions (#GH108326)
-- Mangle friend function templates with a constraint that depends on a 
template parameter from an enclosing template as members of the enclosing 
class. (#GH110247)
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/include/clang/Basic/LangOptions.h 
b/clang/include/clang/Basic/LangOptions.h
index 8c605f6852016e..e2d4206c72cc96 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -241,8 +241,10 @@ class LangOptionsBase {
 
 /// Attempt to be ABI-compatible with code generated by Clang 19.0.x.
 /// This causes clang to:
-///   - Incorrectly mangles the 'base type' substitutions of the CXX
+///   - Incorrectly mangle the 'base type' substitutions of the CXX
 ///   construction vtable because it hasn't added 'type' as a substitution.
+///   - Skip mangling enclosing class templates of member-like friend
+///   function templates.
 Ver19,
 
 /// Conform to the underlying platform's C and C++ ABIs as closely
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 117255178eebb4..0183057610bca6 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -693,7 +693,10 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const 
Decl *D) {
 if (VD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 
-  if (const auto *FD = D->getAsFunction()) {
+  if (const auto *FD = getASTContext().getLangOpts().getClangABICompat() >
+   LangOptions::ClangABI::Ver19
+   ? D->getAsFunction()
+   : dyn_cast(D)) {
 if (FD->isExternC())
   return getASTContext().getTranslationUnitDecl();
 // Member-like constrained friends are mangled as if they were members of
diff --git a/clang/test/CodeGenCXX/mangle-concept.cpp 
b/clang/test/CodeGenCXX/mangle-concept.cpp
index 6053511c00a7b5..aa0940c35b237a 100644
--- a/clang/test/CodeGenCXX/mangle-concept.cpp
+++ b/clang/test/CodeGenCXX/mangle-concept.cpp
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=latest | FileCheck %s
+// RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=19 | FileCheck %s --check-prefix=CLANG19
 // RUN: %clang_cc1 -verify -std=c++20 -emit-llvm -triple %itanium_abi_triple 
-o - %s -fclang-abi-compat=17 | FileCheck %s --check-prefix=CLANG17
 // expected-no-diagnostics
 
@@ -59,18 +60,21 @@ namespace test2 {
 // CLANG17: call {{.*}}@_ZN5test21fEz(
 f(ai);
 // CHECK: call {{.*}}@_ZN5test21AIiEF1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
+// CLANG19: call {{.*}}@_ZN5test2F1gIvEEvzQaa4TrueIT_E4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21gIvEEvz(
 g(ai);
 // CHECK: call {{.*}}@_ZN5test21hIvEEvzQ4TrueITL0__E(
 // CLANG17: call {{.*}}@_ZN5test21hIvEEvz(
 h(ai);
 

[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-24 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo edited 
https://github.com/llvm/llvm-project/pull/111391
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][LLVM Demangler] Add a diagnostic that validates that all mang… (PR #111391)

2024-10-24 Thread Viktoriia Bakalova via cfe-commits

https://github.com/VitaNuo updated 
https://github.com/llvm/llvm-project/pull/111391

>From 54ee2e5d83a940b113f0fc326c511322605bfb78 Mon Sep 17 00:00:00 2001
From: Viktoriia Bakalova 
Date: Tue, 15 Oct 2024 09:48:09 +
Subject: [PATCH 1/2] [clang][LLVM Demangler] Add a diagnostic that validates
 that all mangled names produced by `clang` can be demangled by LLVM
 demangler.

Introduce the above warning behind the `-fdemangling-failures` flag, since:

a. the diagnostic cannot be fixed by an application developer.
b. the diagnostic is expected to be quite chatty.
---
 clang/include/clang/Basic/CodeGenOptions.def|  3 +++
 .../include/clang/Basic/DiagnosticFrontendKinds.td  |  4 
 clang/include/clang/Driver/Options.td   |  4 
 clang/lib/CodeGen/CodeGenModule.cpp | 13 +
 clang/test/CodeGenCXX/warn-demangling-failure.cpp   | 13 +
 llvm/include/llvm/Demangle/Demangle.h   |  7 +++
 llvm/lib/Demangle/Demangle.cpp  | 10 ++
 7 files changed, 54 insertions(+)
 create mode 100644 clang/test/CodeGenCXX/warn-demangling-failure.cpp

diff --git a/clang/include/clang/Basic/CodeGenOptions.def 
b/clang/include/clang/Basic/CodeGenOptions.def
index eac831278ee20d..d0e2393cbb5616 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -462,6 +462,9 @@ ENUM_CODEGENOPT(ZeroCallUsedRegs, 
llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind,
 /// non-deleting destructors. (No effect on Microsoft ABI.)
 CODEGENOPT(CtorDtorReturnThis, 1, 0)
 
+/// Whether to issue a diagnostic if a produced mangled name can not be 
demangled with the LLVM demangler.
+CODEGENOPT(DemanglingFailures, 1, 0)
+
 /// FIXME: Make DebugOptions its own top-level .def file.
 #include "DebugOptions.def"
 
diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td 
b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
index a6b17ccb6799d2..4cad78d5120d6d 100644
--- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -384,4 +384,8 @@ def warn_hlsl_langstd_minimal :
   Warning<"support for HLSL language version %0 is incomplete, "
   "recommend using %1 instead">,
   InGroup;
+
+def warn_name_cannot_be_demangled : Warning<
+  "cannot demangle the name '%0'">,
+  InGroup;
 }
diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 607ff47a857b8f..40d142555c85e1 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1967,6 +1967,10 @@ def fclang_abi_compat_EQ : Joined<["-"], 
"fclang-abi-compat=">, Group,
   MetaVarName<"">, Values<".,latest">,
   HelpText<"Attempt to match the ABI of Clang ">;
+def fdemangling_failures: Flag<["-"], "fdemangling-failures">, 
Group,
+  Visibility<[ClangOption, CC1Option]>,
+  HelpText<"Produce a diagnostic if clang cannot demangle all the mangled 
names it generates">,
+  MarshallingInfoFlag>;
 def fclasspath_EQ : Joined<["-"], "fclasspath=">, Group;
 def fcolor_diagnostics : Flag<["-"], "fcolor-diagnostics">, Group,
 
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp 
b/clang/lib/CodeGen/CodeGenModule.cpp
index 25c1c496a4f27f..420b39ff2c301d 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -41,7 +41,9 @@
 #include "clang/Basic/CharInfo.h"
 #include "clang/Basic/CodeGenOptions.h"
 #include "clang/Basic/Diagnostic.h"
+#include "clang/Basic/DiagnosticFrontend.h"
 #include "clang/Basic/FileManager.h"
+#include "clang/Basic/LangOptions.h"
 #include "clang/Basic/Module.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/TargetInfo.h"
@@ -54,6 +56,7 @@
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/Analysis/TargetLibraryInfo.h"
 #include "llvm/BinaryFormat/ELF.h"
+#include "llvm/Demangle/Demangle.h"
 #include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
 #include "llvm/IR/AttributeMask.h"
 #include "llvm/IR/CallingConv.h"
@@ -75,6 +78,7 @@
 #include "llvm/TargetParser/Triple.h"
 #include "llvm/TargetParser/X86TargetParser.h"
 #include "llvm/Transforms/Utils/BuildLibCalls.h"
+#include 
 #include 
 
 using namespace clang;
@@ -2044,6 +2048,15 @@ StringRef CodeGenModule::getMangledName(GlobalDecl GD) {
  GD.getWithKernelReferenceKind(KernelReferenceKind::Kernel),
  ND));
 
+  if (getCodeGenOpts().DemanglingFailures &&
+  getContext().getLangOpts().getClangABICompat() >
+  LangOptions::ClangABI::Ver19) {
+if (llvm::isMangledName(MangledName) &&
+llvm::demangle(MangledName) == MangledName)
+  Diags.Report(ND->getLocation(), diag::warn_name_cannot_be_demangled)
+  << MangledName;
+  }
+
   auto Result = Manglings.insert(std::make_pair(MangledName, GD));
   return MangledDeclNames[CanonicalGD] = Result.first->first();
 }
diff --git a/clang/test/CodeGenCXX/warn-demangling-failure.cpp 
b/clang/test/CodeG

  1   2   3   >