[clang-tools-extra] 0e54581 - [include-cleaner] Handle dependent type members in AST.
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.
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.
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.
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
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.
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
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.
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).
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
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."
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."
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.""
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."
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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)
@@ -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)
@@ -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)
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)
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)
@@ -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)
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)
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)
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)
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)
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)
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)
@@ -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)
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)
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)
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)
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)
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)
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)
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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
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)
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)
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)
@@ -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)
@@ -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)
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)
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)
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)
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)
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)
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)
@@ -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)
@@ -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)
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)
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)
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)
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)
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)
@@ -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)
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)
@@ -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)
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)
@@ -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)
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)
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)
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)
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