[clang] [lldb] [clang] Add -ast-dump-filter-path to filter AST dump by file path (PR #194266)
Taufiq Rahman via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 2 17:50:58 PDT 2026
https://github.com/Inconnu08 updated https://github.com/llvm/llvm-project/pull/194266
>From 19488bbb1206fb149042c42636433bc9a910c795 Mon Sep 17 00:00:00 2001
From: inconnu08 <taufiqrx8 at gmail.com>
Date: Sun, 26 Apr 2026 16:41:03 -0400
Subject: [PATCH 1/4] [clang] Add -ast-dump-filter-path to filter AST dump by
file path
---
clang/include/clang/Frontend/ASTConsumers.h | 11 ++--
.../include/clang/Frontend/FrontendOptions.h | 3 +
clang/include/clang/Options/Options.td | 7 ++
clang/lib/Frontend/ASTConsumers.cpp | 65 ++++++++++++++-----
clang/lib/Frontend/FrontendActions.cpp | 6 +-
clang/tools/clang-check/ClangCheck.cpp | 1 +
.../clang-import-test/clang-import-test.cpp | 2 +-
.../TypeSystem/Clang/TypeSystemClang.cpp | 1 +
8 files changed, 70 insertions(+), 26 deletions(-)
diff --git a/clang/include/clang/Frontend/ASTConsumers.h b/clang/include/clang/Frontend/ASTConsumers.h
index 890701b6ff188..0650f16df3aab 100644
--- a/clang/include/clang/Frontend/ASTConsumers.h
+++ b/clang/include/clang/Frontend/ASTConsumers.h
@@ -32,13 +32,14 @@ std::unique_ptr<ASTConsumer> CreateASTPrinter(std::unique_ptr<raw_ostream> OS,
// stream, or stdout if OS is nullptr.
std::unique_ptr<ASTConsumer>
CreateASTDumper(std::unique_ptr<raw_ostream> OS, StringRef FilterString,
- bool DumpDecls, bool Deserialize, bool DumpLookups,
- bool DumpDeclTypes, ASTDumpOutputFormat Format);
+ StringRef FilterPath, bool DumpDecls, bool Deserialize,
+ bool DumpLookups, bool DumpDeclTypes,
+ ASTDumpOutputFormat Format);
std::unique_ptr<ASTConsumer>
-CreateASTDumper(raw_ostream &OS, StringRef FilterString, bool DumpDecls,
- bool Deserialize, bool DumpLookups, bool DumpDeclTypes,
- ASTDumpOutputFormat Format);
+CreateASTDumper(raw_ostream &OS, StringRef FilterString, StringRef FilterPath,
+ bool DumpDecls, bool Deserialize, bool DumpLookups,
+ bool DumpDeclTypes, ASTDumpOutputFormat Format);
// AST Decl node lister: prints qualified names of all filterable AST Decl
// nodes.
diff --git a/clang/include/clang/Frontend/FrontendOptions.h b/clang/include/clang/Frontend/FrontendOptions.h
index b85cf4c007862..cb32509aa09e2 100644
--- a/clang/include/clang/Frontend/FrontendOptions.h
+++ b/clang/include/clang/Frontend/FrontendOptions.h
@@ -461,6 +461,9 @@ class FrontendOptions {
/// If given, filter dumped AST Decl nodes by this substring.
std::string ASTDumpFilter;
+ /// If given, filter dumped AST Decl nodes by source file path (glob pattern).
+ std::string ASTDumpFilterPath;
+
/// If given, enable code completion at the provided location.
ParsedSourceLocation CodeCompletionAt;
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index 5fb5b75e15a19..c6c73afb698f9 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -8658,6 +8658,13 @@ def ast_dump_filter : Separate<["-"], "ast-dump-filter">,
MarshallingInfoString<FrontendOpts<"ASTDumpFilter">>;
def ast_dump_filter_EQ : Joined<["-"], "ast-dump-filter=">,
Alias<ast_dump_filter>;
+def ast_dump_filter_path : Separate<["-"], "ast-dump-filter-path">,
+ MetaVarName<"<path_filter>">,
+ HelpText<"Use with -ast-dump or -ast-print to dump/print only AST declaration"
+ " nodes whose source file path matches a glob pattern.">,
+ MarshallingInfoString<FrontendOpts<"ASTDumpFilterPath">>;
+def ast_dump_filter_path_EQ : Joined<["-"], "ast-dump-filter-path=">,
+ Alias<ast_dump_filter_path>;
def fno_modules_global_index : Flag<["-"], "fno-modules-global-index">,
HelpText<"Do not automatically generate or update the global module index">,
MarshallingInfoNegativeFlag<FrontendOpts<"UseGlobalModuleIndex">>;
diff --git a/clang/lib/Frontend/ASTConsumers.cpp b/clang/lib/Frontend/ASTConsumers.cpp
index 40995e32b67fa..e7f4e00c2c5b7 100644
--- a/clang/lib/Frontend/ASTConsumers.cpp
+++ b/clang/lib/Frontend/ASTConsumers.cpp
@@ -18,8 +18,11 @@
#include "clang/AST/RecordLayout.h"
#include "clang/AST/RecursiveASTVisitor.h"
#include "clang/Basic/Diagnostic.h"
-#include "llvm/Support/Timer.h"
+#include "clang/Basic/SourceManager.h"
+#include "llvm/Support/Error.h"
+#include "llvm/Support/GlobPattern.h"
#include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/Timer.h"
using namespace clang;
//===----------------------------------------------------------------------===//
@@ -34,22 +37,24 @@ namespace {
enum Kind { DumpFull, Dump, Print, None };
ASTPrinter(std::unique_ptr<raw_ostream> Out, Kind K,
ASTDumpOutputFormat Format, StringRef FilterString,
- bool DumpLookups = false, bool DumpDeclTypes = false)
+ StringRef FilterPath, bool DumpLookups = false,
+ bool DumpDeclTypes = false)
: Out(Out ? *Out : llvm::outs()), OwnedOut(std::move(Out)),
OutputKind(K), OutputFormat(Format), FilterString(FilterString),
- DumpLookups(DumpLookups), DumpDeclTypes(DumpDeclTypes) {}
+ FilterPath(FilterPath), DumpLookups(DumpLookups),
+ DumpDeclTypes(DumpDeclTypes) {}
ASTPrinter(raw_ostream &Out, Kind K, ASTDumpOutputFormat Format,
- StringRef FilterString, bool DumpLookups = false,
- bool DumpDeclTypes = false)
+ StringRef FilterString, StringRef FilterPath,
+ bool DumpLookups = false, bool DumpDeclTypes = false)
: Out(Out), OwnedOut(nullptr), OutputKind(K), OutputFormat(Format),
- FilterString(FilterString), DumpLookups(DumpLookups),
- DumpDeclTypes(DumpDeclTypes) {}
+ FilterString(FilterString), FilterPath(FilterPath),
+ DumpLookups(DumpLookups), DumpDeclTypes(DumpDeclTypes) {}
void HandleTranslationUnit(ASTContext &Context) override {
TranslationUnitDecl *D = Context.getTranslationUnitDecl();
- if (FilterString.empty())
+ if (FilterString.empty() && FilterPath.empty())
return print(D);
TraverseDecl(D);
@@ -84,7 +89,28 @@ namespace {
return "";
}
bool filterMatches(Decl *D) {
- return getName(D).find(FilterString) != std::string::npos;
+ if (!FilterString.empty() &&
+ getName(D).find(FilterString) == std::string::npos)
+ return false;
+
+ if (!FilterPath.empty()) {
+ const SourceManager &SM = D->getASTContext().getSourceManager();
+
+ SourceLocation Loc = SM.getSpellingLoc(D->getLocation());
+ if (Loc.isInvalid())
+ return false;
+
+ auto Pattern = llvm::GlobPattern::create(FilterPath);
+ if (!Pattern) {
+ llvm::consumeError(Pattern.takeError());
+ return false;
+ }
+
+ if (!Pattern->match(SM.getFilename(Loc)))
+ return false;
+ }
+
+ return true;
}
void print(Decl *D) {
if (DumpLookups) {
@@ -134,6 +160,9 @@ namespace {
/// Which declarations or DeclContexts to display.
std::string FilterString;
+ /// Which source file paths to display.
+ std::string FilterPath;
+
/// Whether the primary output is lookup results or declarations. Individual
/// results will be output with a format determined by OutputKind. This is
/// incompatible with OutputKind == Print.
@@ -170,32 +199,34 @@ std::unique_ptr<ASTConsumer>
clang::CreateASTPrinter(std::unique_ptr<raw_ostream> Out,
StringRef FilterString) {
return std::make_unique<ASTPrinter>(std::move(Out), ASTPrinter::Print,
- ADOF_Default, FilterString);
+ ADOF_Default, FilterString, "");
}
std::unique_ptr<ASTConsumer>
clang::CreateASTDumper(std::unique_ptr<raw_ostream> Out, StringRef FilterString,
- bool DumpDecls, bool Deserialize, bool DumpLookups,
+ StringRef FilterPath, bool DumpDecls,
+ bool Deserialize, bool DumpLookups,
bool DumpDeclTypes, ASTDumpOutputFormat Format) {
assert((DumpDecls || Deserialize || DumpLookups) && "nothing to dump");
return std::make_unique<ASTPrinter>(
std::move(Out),
Deserialize ? ASTPrinter::DumpFull
: DumpDecls ? ASTPrinter::Dump : ASTPrinter::None,
- Format, FilterString, DumpLookups, DumpDeclTypes);
+ Format, FilterString, FilterPath, DumpLookups, DumpDeclTypes);
}
std::unique_ptr<ASTConsumer>
-clang::CreateASTDumper(raw_ostream &Out, StringRef FilterString, bool DumpDecls,
- bool Deserialize, bool DumpLookups, bool DumpDeclTypes,
- ASTDumpOutputFormat Format) {
+clang::CreateASTDumper(raw_ostream &Out, StringRef FilterString,
+ StringRef FilterPath, bool DumpDecls,
+ bool Deserialize, bool DumpLookups,
+ bool DumpDeclTypes, ASTDumpOutputFormat Format) {
assert((DumpDecls || Deserialize || DumpLookups) && "nothing to dump");
return std::make_unique<ASTPrinter>(Out,
Deserialize ? ASTPrinter::DumpFull
: DumpDecls ? ASTPrinter::Dump
: ASTPrinter::None,
- Format, FilterString, DumpLookups,
- DumpDeclTypes);
+ Format, FilterString, FilterPath,
+ DumpLookups, DumpDeclTypes);
}
std::unique_ptr<ASTConsumer> clang::CreateASTDeclNodeLister() {
diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp
index a7859aeb8e130..4e041ee875b9a 100644
--- a/clang/lib/Frontend/FrontendActions.cpp
+++ b/clang/lib/Frontend/FrontendActions.cpp
@@ -88,9 +88,9 @@ std::unique_ptr<ASTConsumer>
ASTDumpAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
const FrontendOptions &Opts = CI.getFrontendOpts();
return CreateASTDumper(nullptr /*Dump to stdout.*/, Opts.ASTDumpFilter,
- Opts.ASTDumpDecls, Opts.ASTDumpAll,
- Opts.ASTDumpLookups, Opts.ASTDumpDeclTypes,
- Opts.ASTDumpFormat);
+ Opts.ASTDumpFilterPath, Opts.ASTDumpDecls,
+ Opts.ASTDumpAll, Opts.ASTDumpLookups,
+ Opts.ASTDumpDeclTypes, Opts.ASTDumpFormat);
}
std::unique_ptr<ASTConsumer>
diff --git a/clang/tools/clang-check/ClangCheck.cpp b/clang/tools/clang-check/ClangCheck.cpp
index 7672b59b35482..eee50759671bc 100644
--- a/clang/tools/clang-check/ClangCheck.cpp
+++ b/clang/tools/clang-check/ClangCheck.cpp
@@ -178,6 +178,7 @@ class ClangCheckActionFactory {
return clang::CreateASTDeclNodeLister();
if (ASTDump)
return clang::CreateASTDumper(nullptr /*Dump to stdout.*/, ASTDumpFilter,
+ /*FilterPath=*/"",
/*DumpDecls=*/true,
/*Deserialize=*/false,
/*DumpLookups=*/false,
diff --git a/clang/tools/clang-import-test/clang-import-test.cpp b/clang/tools/clang-import-test/clang-import-test.cpp
index d555ecffee9fb..21350cf7cd322 100644
--- a/clang/tools/clang-import-test/clang-import-test.cpp
+++ b/clang/tools/clang-import-test/clang-import-test.cpp
@@ -324,7 +324,7 @@ llvm::Expected<CIAndOrigins> Parse(const std::string &Path,
auto &CG = *static_cast<CodeGenerator *>(ASTConsumers.back().get());
if (ShouldDumpAST)
- ASTConsumers.push_back(CreateASTDumper(nullptr /*Dump to stdout.*/, "",
+ ASTConsumers.push_back(CreateASTDumper(nullptr /*Dump to stdout.*/, "", "",
true, false, false, false,
clang::ADOF_Default));
diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
index f17209d890aa0..f3e8baaf38453 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -8534,6 +8534,7 @@ void TypeSystemClang::Dump(llvm::raw_ostream &output, llvm::StringRef filter,
auto consumer =
clang::CreateASTDumper(output, filter,
+ /*FilterPath=*/"",
/*DumpDecls=*/true,
/*Deserialize=*/false,
/*DumpLookups=*/false,
>From 29a27ebd2829dbc085de47c1514988ae2c41418a Mon Sep 17 00:00:00 2001
From: inconnu08 <taufiqrx8 at gmail.com>
Date: Thu, 7 May 2026 23:03:39 -0400
Subject: [PATCH 2/4] [clang] Address review feedback: use presumed loc, add
tests and release note
---
clang/docs/ReleaseNotes.md | 391 +-----------------
clang/include/clang/Options/Options.td | 2 +-
clang/lib/Frontend/ASTConsumers.cpp | 11 +-
clang/test/AST/ast-dump-filter-path-include.c | 7 +
clang/test/AST/ast-dump-filter-path.c | 8 +
clang/test/AST/filter-header.h | 1 +
6 files changed, 40 insertions(+), 380 deletions(-)
create mode 100644 clang/test/AST/ast-dump-filter-path-include.c
create mode 100644 clang/test/AST/ast-dump-filter-path.c
create mode 100644 clang/test/AST/filter-header.h
diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 929892fd34f7f..007e1f8131ab9 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -12,6 +12,10 @@ myst:
{#clang-release-releasenotestitle}
# Clang {{ (('(In-Progress) ' if env.app.tags.has('PreRelease') else '') ~ 'Release Notes') if env.config.project == 'Clang' else '|ReleaseNotesTitle|' }}
+```{contents}
+:depth: 2
+:local:
+```
Written by the [LLVM Team](https://llvm.org/)
@@ -50,11 +54,6 @@ in a future version of Clang.
### C++ Specific Potentially Breaking Changes
-- The `[[carries_dependency]]` attribute is no longer recognized, in any language
- mode, as it was removed from the standard by
- [P3475R2](https://wg21.link/P3475R2).
-
-
### Objective-C Specific Potentially Breaking Changes
- Fixed an issue where AST consumers based on `RecursiveASTVisitor` would bypass
@@ -74,7 +73,7 @@ features cannot lower the translation-unit ABI level;
- On SPARC, a `_Complex` value with an integer element type is now passed and
returned packed into the one or two integer registers it fits in, matching GCC.
Clang previously passed such a value indirectly and returned it with one part
- per register.
+ per register.
`-fclang-abi-compat=23` restores the previous behavior. (#GH212340)
- On SPARC64, a `_Complex char` or `_Complex short` is now
@@ -97,31 +96,12 @@ features cannot lower the translation-unit ABI level;
- On MIPS N32/N64, an `__int128` now correctly start in an even-numbered register
or 16-byte aligned stack slot, matching GCC.
-- Except on PlayStation, on x86-64 System V a non-zero-width unnamed bit-field
- now classifies the eightbytes it occupies as INTEGER, like a named bit-field,
- matching GCC. Aggregates where this changes the classification may be passed
- or returned differently -- a struct holding a run of `__int128` bit-fields,
- for example, now travels in the two integer registers the ABI assigns it.
- This also fixes a crash when such a struct was passed or returned.
- `-fclang-abi-compat=23` restores the previous behavior. (#GH202205)
-
-- Clang now considers matrix types in its isHomogeneousAggregate() handling,
- which can lead to differences in how structures containing matrix types are
- classified for ABI purposes. The previous exclusion of matrix types appears
- to have been accidental. Matrix types now follow the same rules as arrays
- for homogeneous aggregate classification.
- `-fclang-abi-compat=23` restores the previous behavior. (#GH218799)
-
### AST Dumping Potentially Breaking Changes
### Clang Frontend Potentially Breaking Changes
- Templight support has been removed.
-- `-fstack-clash-protection` has been enabled implicitly by default for android
- target triples (except 32b arm targets). Can be disabled via
- `-fno-stack-clash-protection`.
-
### Clang Python Bindings Potentially Breaking Changes
- `CompletionChunkKind` instance's `__str__` representation has been adapted to be consistent with other enums in the library.
@@ -139,9 +119,7 @@ features cannot lower the translation-unit ABI level;
- `CompletionString.availability` now returns instances of `AvailabilityKind`.
As a result, the `__str__` representation of its return values changed.
- Like other libclang enums, it now follows the `CompletionChunkKind.VARIANT_NAME` scheme instead of `VariantName`.
-
-- `Cursor` instance's `enum_value` method now returns 1 instead of -1 for `true` bool enumeration values
+ Like other libclang enums, it now follows the `CompletionChunkKind.VARIANT_NAME` scheme instead of `VariantName`.
### OpenCL Potentially Breaking Changes
@@ -172,17 +150,10 @@ features cannot lower the translation-unit ABI level;
- Clang now supports [P3533R2](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3533r2.html) (constexpr virtual inheritance).
-- Implemented the language part of [P3475R2](https://wg21.link/P3475R2) (Defang
- and deprecate `memory_order::consume`) by removing support for the
- `[[carries_dependency]]` attribute.
-
#### C++23 Feature Support
#### C++20 Feature Support
-- Now clang-scan-deps in P1689 format can find the dependencies described in
- module map file. See the documents of standard C++ modules for details.
-
#### C++17 Feature Support
#### Resolutions to C++ Defect Reports
@@ -190,10 +161,6 @@ features cannot lower the translation-unit ABI level;
- Clang now falls back to alignment-aware allocation functions for
non-overaligned types, implementing [CWG2282](https://wg21.link/cwg2282).
-- Clang now converts floating-point values to boolean first when converting
- them to an enumeration type with a fixed `bool` underlying type. This
- resolves [CWG1094](https://wg21.link/cwg1094).
-
### C Language Changes
#### C2y Feature Support
@@ -238,18 +205,9 @@ features cannot lower the translation-unit ABI level;
- Clang tools now resolve tool names without a path in compilation databases
through `PATH`.
-- On musl targets, the driver now links ``libssp_nonshared.a`` when stack
- protection is enabled and the library is present in the toolchain library
- paths, matching what musl distributions configure GCC to do.
-
- Clang now allows GNU computed `goto` extension in `constexpr` functions, matching the relaxed
`constexpr` function body rules introduced in C++23.
-- Added support for the `__builtin_strlcat` and `__builtin_strlcpy` builtins.
-
-- Added `__builtin_sort_pack` to sort a pack of types using the same
- order as `__builtin_type_order`.
-
### New Compiler Flags
- New option `-fdefined-pointer-subtraction` added to preserve stable semantics
@@ -276,43 +234,25 @@ features cannot lower the translation-unit ABI level;
unit to be emitted into the object file, even when they are inlined into all
callers or are otherwise unused.
+- Added a new `-ast-dump-filter-path` option to filter AST dump output
+ based on the source file path of declarations. The filter uses glob-style
+ matching on the presumed source location (accounting for macro expansions
+ and `#line` directives). (#GH194210)
+
### Deprecated Compiler Flags
### Modified Compiler Flags
- All options of the `-fzero-call-used-regs` compiler flag are now allowed on RISC-V.
-- `-ftrivial-auto-var-init=` now initializes variables whose declaration is
- bypassed by a `goto` or `switch`, which were previously left uninitialized.
- The initialization is emitted at each bypassing jump. See the
- `-ftrivial-auto-var-init=` entry in the User's Manual for the details,
- including where C deliberately departs from C 6.2.4p6.
-
### Removed Compiler Flags
### Attribute Changes in Clang
- Clang now properly propagates attributes on class and variable templates to their redeclarations, which will result in redeclarations not interfering with diagnostics. (#GH209812)
-- Clang now recognizes the `[[gnu::flag_enum]]` attribute and treats it equivalent to `[[clang::flag_enum]]`
-
-- Clang now accepts `_single_inheritance` under `-fms-compatibility` as an alias for `__single_inheritance`; `_multiple_inheritance` and `_virtual_inheritance` were already correctly supported as aliases.
-
### Improvements to Clang's diagnostics
-- `-Wfortify-source` now diagnoses when `strlcat`, `__builtin_strlcat`, `strlcpy`, or
- `__builtin_strlcpy` is called with a size argument larger than the destination buffer.
-
-- `-Wfortify-source` now diagnoses when `recv` or `recvfrom` is called with a
- size argument larger than the destination buffer.
-
-- `-Wfortify-source` now diagnoses when `poll`, `ppoll`, or `ppoll64` is called
- with a descriptor count whose total size exceeds the `fds` array size.
-
-- The `cannot overload a member function` diagnostic now describes the previous
- declaration first, matching the order in which the declarations appear in the
- source. (#GH219803)
-
- More consistent rendering of Unicode characters in diagnostic messages.
- Fixed `-Wunused-parameter` to diagnose coroutine parameters that are only
@@ -320,20 +260,9 @@ features cannot lower the translation-unit ABI level;
initialization, while not diagnosing parameters passed to the selected
allocation function or promise constructor. (#GH217501)
-- The `wb` and `uwb` `_BitInt` literal suffixes are no longer diagnosed by default
- before C23. They stay in `-Wc23-extensions` and are still reported under
- `-pedantic` or when that group is enabled explicitly, matching how the `_BitInt`
- type itself is already handled.
-
- Fixed bug in `-Wdocumentation` so that it correctly handles explicit
function template instantiations (#64087).
-- When a `constexpr` range-based for loop variable cannot be initialized by a
- constant expression, Clang now emits a single note identifying the read of
- the loop's implicit `__begin` variable, instead of a generic note about
- reading a non-constexpr variable followed by a `declared here` note.
- (#GH211926)
-
- Fixed concept template parameters not being recognized in `-Wdocumentation`
when mentioned in tparam comments. (#GH64087)
@@ -401,9 +330,6 @@ features cannot lower the translation-unit ABI level;
};
```
-- Lifetime safety analysis is now enabled for C by default. The `-fexperimental-lifetime-safety-c`
- flag is renamed to `-flifetime-safety-c`. Use `-fno-lifetime-safety-c` to disable it.
-
- Improved `-Wassign-enum` performance by caching enum enumerator values. (#GH176454)
- Fixed a false negative in `-Warray-bounds` where the warning was suppressed
@@ -482,9 +408,6 @@ features cannot lower the translation-unit ABI level;
- Diagnostics for the C++11 range-based for statement now report the correct
iterator type in notes for invalid iterator types.
-- `-Wfortify-source` now diagnoses calls to `fread`, `fwrite`, and `fgets`
- when the requested size exceeds the corresponding buffer. (#GH204337)
-
- `-Wfortify-source` now warns when the constant-evaluated argument to
`umask` has bits set outside `0777`. Those bits are silently discarded
by the kernel, so setting them is almost always a typo (matching the
@@ -510,42 +433,8 @@ features cannot lower the translation-unit ABI level;
- `-Wc++98-compat` now diagnoses explicit conversion functions in C++20 and
later, matching the behavior in C++11 through C++17. (#GH161689)
-- Added `-Wcounter-extension` as a diagnostic group under `-Wc2y-extensions` to
- control `__COUNTER__` being diagnosed as an extension. This allows `-pedantic`
- users to disable the diagnostic with `-Wno-counter-extension` without having
- to disable all pedantic diagnostics. (#GH196557)
-
- Clang now diagnoses more details when a constraint evaluates to false.
-- `-Wpointer-arith` no longer reports subtraction of pointers to a variably
- modified type, such as `int[n]`, as a subtraction of pointers to a type of
- zero size, unless the size is provably zero: a zero-sized base element or a
- dimension that is a zero integer constant, as in `struct Empty vla[n]` or
- `int vla[n][0]`. (#GH28328)
-
-- Fixed a missing `-Wconstant-conversion` diagnostic for signed `char` arrays.
-
-- Clang now diagnoses passing wrong vector type as a mask to `__builtin_shufflevector`. (#GH218132)
-
-- `-Wdelete-abstract-non-virtual-dtor` and `-Wdelete-non-abstract-non-virtual-dtor`
- no longer warn when the selected deallocation function is a destroying
- `operator delete`, since such a delete expression never invokes the
- destructor. (#GH65524)
-
-- Fixed a false-positive `-Wshadow` warning when a variable in an
- inline-defined friend function shares the name of a non-static class
- member variable. (#GH221190)
-
-- Clang now diagnoses matrix logical operations are only supported for HLSL. (#GH222381)
-
-- Improve the input size mismatch diagnostic when calling `__builtin_shufflevector` with valid
- vector element types but different sizes. (#GH221791)
-
-- Suggests the correct location for an attribute written before the `using`
- keyword of an alias-declaration. (#GH155787)
-
-- Improve Clang diagnoses when unary `__imag` operator with non-complex type operand is used as lvalue. (#GH222383)
-
### Improvements to Clang's time-trace
### Improvements to Coverage Mapping
@@ -553,7 +442,6 @@ features cannot lower the translation-unit ABI level;
### Bug Fixes in This Version
- Fixed incorrect handling of C++ import preprocessing token when a digraph character after import. (#GH190693)
-- Fixed a crash when emitting RTTI for a `dllexport` class, or the fundamental type descriptors for `__cxxabiv1::__fundamental_type_info`, under `-fvisibility=hidden`. (#GH207963)
- Fixed an assertion failure when passing a wide string literal to `__builtin_nan`. (#GH212108)
- Fixed a constraint comparison bug in partial ordering. (#GH182671)
- Fixed a rejected-valid case that used an explicit object parameter in an out-of-line definition of a nested class member. (#GH136472)
@@ -562,9 +450,7 @@ features cannot lower the translation-unit ABI level;
- Fixed USR generation for declarations whose signature mentions a class-type
non-type template parameter. (#GH212351)
- Fixed an assertion caused by Microsoft integer literals exceeding the maximum value. (#GH212504)
-- Fixed an assertion failure when a value of a Unicode character type (`char8_t`, `char16_t`, `char32_t`) was implicitly splatted to a vector of the same element type, e.g. when comparing an `ext_vector_type` of `char32_t` with one of its elements. (#GH202317)
- Fixed a crash when checking scalar type with excess braces. (#GH69213), (#GH137845), (#GH198767), (#GH207566), (#GH106180)
-- Fixed an assertion failure when a global variable in a non-default address space, such as one declared with `__seg_gs`, is mapped into an OpenMP `target` region. (#GH140069)
- Fixed an assertion crash when instantiating a nested requirement with an invalid constraint. (#GH213575)
- Clang now defines the GCC-compatible predefined macro `__SIG_ATOMIC_TYPE__`. (#GH213895)
- Fixed IEEE f128 complex mul/div using the IBM f128 libcalls on powerpc. (#GH216820)
@@ -572,46 +458,20 @@ features cannot lower the translation-unit ABI level;
- Fixed a bug where a stray closing curley brace in an OpenMP/OpenACC pragma could cause pragma parsing issues when inside of a member function. (#GH214195)
- Fixed a bug where preprocessor directives following comments were not correctly recognized when using -C. (#GH48361)
- Fixed a crash when declaring a member template within a local class inside an OpenMP region. (#GH216052)
-- Fixed an assertion failure when a variable implicitly mapped by an OpenMP `target` directive has a class type
- (such as `std::map`) whose mapper lookup instantiates a class template specialization. (#GH154704)
- Fixed a bug where repeated #imports of modular headers in non-modular compilation were translated to #pragma clang module import. (#GH216924)
- Fixed an assertion when `#pragma omp declare simd` or `#pragma omp declare variant` is followed by another OpenMP declarative directive containing a qualified identifier. (#GH217204)
-- Fixed crashes on an OpenMP `target` region inside a lambda or block at namespace scope, including when the region used a global reference. (#GH223397)
-- Fixed a crash when an `asm` label names the register for a global variable of incomplete type. (#GH219746)
-- Fixed an ICE hat occurred when using `__imag int/float` as lvalue in assignment. (#GH119498)
-- Fixed an assertion failure in `-Wsign-compare` when a negated or complemented vector of unsigned integers was compared against a signed constant. (#GH203575)
-- Fixed an assertion failure when a constant statement expression that declares a variable is used as a bound of an OpenMP loop. A statement expression in a bound of a non-rectangular loop is now diagnosed. (#GH153987)
-- Fixed a bug where a bit-field accessed as the result of a statement expression
- (e.g. `({ s.b; })`) was not subject to integer promotion, unlike an ordinary
- bit-field access. (#GH221542)
-- No longer crashing due to follow-on diagnostics when there is an invalid operand in a logical operator involving a vector operand. (#GH227588)
-- Fixed assertion failures caused by stale linkage information when an extern variable or function declaration is merged with a preceding static declaration. (#GH204759, #GH204754)
-- Fixed a crash due to typo correction mishandling custom keywords `_virtual_inheritance` and `_multiple_inheritance` in `-fms-compatibility` mode. (#GH228003)
-
+
#### Bug Fixes to Compiler Builtins
- Fixed a crash when classifying a call to a builtin with dependent arguments,
such as when the call is used as an `auto` non-type template argument.
-- Fixed an assertion failure when diagnosing a constant evaluation failure
- inside a member function call synthesized by ``__builtin_invoke``. (#GH185241)
- Fixed a crash in ``__builtin_dump_struct`` when ``-Werror`` promotes
format warnings to errors. (#GH211943)
-- Fixed wrong code generation in `__builtin_clear_padding` wherein the wrong
- bits of the following types were cleared: `_BitInt`, struct bitfields, and
- packed boolean vectors. (#GH215809), (#GH216063), (#GH224033)
-- Fixed an assertion failure when `__builtin_vectorelements` is applied to a
- reference to a vector type; `vec_step` (in C++ for OpenCL) and
- `__builtin_ptrauth_type_discriminator` similarly no longer accept reference
- types that their evaluation silently mishandled. (#GH216997)
#### Bug Fixes to Attribute Support
- Fixed crash (assertion) when the `alloc_align` attribute was applied to a declaration whose type has a `FunctionProtoType` but which is not itself a `FunctionDecl`, such as a function-pointer variable. (#GH122058)
-- Fixed a crash on `bool` vectors declared with `ext_vector_type` and more than
- 2^23 elements; `ext_vector_type` and `vector_size` now both reject vectors
- with more than 2^23 elements or larger than 2^28 bytes. (#GH165458)
-
- The `counted_by`/`counted_by_or_null` diagnostic that rejects a pointer whose
pointee is a struct with a flexible array member (e.g.
``struct with_fam * __sized_by(size) ptr;``) was incorrectly also applied to
@@ -625,41 +485,15 @@ features cannot lower the translation-unit ABI level;
#### Bug Fixes to C++ Support
-- Fixed lambdas with specifiers or attributes after the capture list being
- misparsed as function declarations in direct-initialization contexts under
- `-fms-extensions` or in HLSL mode.
-
-- Fixed the destruction timing of temporaries created by default member
- initializers during aggregate initialization. Such an initializer is part of
- the full-expression containing the aggregate initialization. (#GH85601)
-
-- Fixed false-positive module ODR diagnostics when a type is found through a
- using-declaration in one definition and directly in another. ODR hashing also
- now distinguishes differently qualified uses of types found through
- using-declarations. (#GH78850)
-- Fixed an assertion when diagnosing module ODR violations for enum underlying
- types found through using-declarations with the same name but different types.
-
-- Fixed a false type mismatch when a typedef naming an anonymous enumeration
- was used through a C++20 named module and its defining header was subsequently
- included. (#GH213299)
-
- Fixed an issue where `__typeof__` incorrectly rejected cv-qualified function types.
-- Fixed an assertion failure when `#embed` was used in the braced initializer
- of an array new-expression, or of an array whose elements are of class type.
- (#GH128985)
-
- Fixed a bug where top-level CV qualifiers (such as ``const``) were dropped from pointers modified by Microsoft pointer attributes (like ``__ptr32`` and ``__ptr64``) and WebAssembly's ``__funcref``.
-- Fixed a bug where we accepted ``__super`` being qualified by a scope specifier, causing codegen to assertion fail elsewhere. (#GH212988)
- Fixed an issue where we tried to compare invalid NTTPs for variable declarations, which ended up in hitting an assertion with a constrained non-plain-auto NTTP, which we don't quite implement yet. (#GH208658)
- Fixed a crash when a using-declaration naming an unresolvable member of a
dependent base was shadowed by an invalid using-declaration. (#GH209427)
-- Fixed a CTAD bug when combining with concepts. (#GH124715)
-
- Fixed a regression where an internal-linkage function (e.g. a `static` or
anonymous-namespace helper) declared in the global module fragment of the
current translation unit was removed from the overload set when the calling
@@ -670,9 +504,6 @@ features cannot lower the translation-unit ABI level;
- Fixed a crash when module directive export module foo not following a
semicolon and there are no rest pp-tokens in current module file. (#GH187771)
-- Fixed concept evaluation bugs where some declarations were not added to
- the current instantiation scope. (#GH198052)
-
- Fixed a crash when a lambda parameter pack was given a default argument that
is a pack expansion referencing an enclosing function's parameter pack (e.g.
`[](Types... = args...) {}`). Clang now diagnoses the illegal default
@@ -690,11 +521,6 @@ features cannot lower the translation-unit ABI level;
operator required an access check that ran while an enclosing declaration
was still being parsed. (#GH210692)
-- Fixed an assertion when a call to a class object was resolved through a
- conversion function to a function pointer that was introduced into the class
- by a using-declaration (e.g. `using Base::operator auto;`). Such a conversion
- function is now also diagnosed if it is deleted. (#GH189146)
-
- A workaround that was introduced to fix an issue with the `<format>` header present in some versions of
libstdc++15 has been extended to support preprocessed input. Previously, splitting the preprocessing and
compilation step would result in the fix not being applied. (#GH160314)
@@ -709,16 +535,6 @@ features cannot lower the translation-unit ABI level;
affect C++26 constexpr structured bindings and expansion statements, but
also affects some uses of plain structured bindings. (#GH211930)
-- Fixed an assertion when instantiating the body of a C++26 expansion
- statement after a fatal error had occurred. (#GH214917)
-
-- Fixed an assertion when an invalid statement appeared in a ``switch``
- statement nested inside a C++26 expansion statement. (#GH210575)
-
-- Fixed an assertion when a ``matrix_type`` with constant dimensions and a
- dependent element type was instantiated with an invalid element type.
- (#GH202744)
-
- Fixed friend declarations sometimes making non-visible default arguments
incorrectly visible to default argument redefinition checks across modules.
@@ -727,13 +543,6 @@ features cannot lower the translation-unit ABI level;
using ``__is_constructible`` on a nested class template inside the definition
of the containing class. (#GH215166)
-- Fixed a crash issue when a value dependent recovery init appeared in constant
- evaluation context in default constant evaluator.
-
-- Fixed a bug where Clang incorrectly required `promise.return_value()` for a
- dependent `co_return` operand that inits to `void`, instead of using
- `promise.return_void()`. (#GH218368)
-
- Fixed merging of lambdas across modules in the case where neither lambda is
imported from an AST file. (#GH214560)
@@ -741,75 +550,17 @@ features cannot lower the translation-unit ABI level;
to a subobject and is used in a context that requires an implicit conversion.
(#GH215900)
-- Fixed an assertion when mangling an abbreviated function template whose
- return type has an ABI tag. (#GH204178)
-
- Fixed an assertion during template argument deduction where a function parameter pack is referenced by other types in the function type. (#GH28877), (#GH213760)
-- Fixed a regression where deprecation warnings were omitted for synthesized
- deduction guide. (#GH160543)
-
- Fixed an assertion when a redeclaration of a function template or an out-of-line
definition of a member of a class template added a default argument to a
parameter that follows a parameter pack (e.g.
`template <typename... T> S::S(T..., int = 10) {}`). (#GH216211)
-- Fixed an assertion failure when instantiating a late-parsed function template defined in an earlier translation unit with -fdelayed-template-parsing. (#GH217073)
-
-- Allow redeclaration lookup to consider conversion function templates, allowing
- Clang to match an in-class specialization such as `template<> operator int()`
- against a prior conversion function template `template<class T> operator T()`.
- (#GH218261)
- Fixed an assertion when an ill-formed qualified member function definition
inside a union caused the union to be treated as a polymorphic class.
(#GH213854)
-- Fixed a crash, a miscompile and a rejected-valid case when instantiating a
- constructor whose mem-initializer used parenthesized aggregate initialization,
- e.g. ``: agg({1, 2})`` or ``: arr(1, 2)``. (#GH176161, #GH189005, #GH213284)
-
-- Fixed an assertion when a type-trait keyword that had already been made
- available as an identifier (e.g. `struct __make_unsigned`) was seen again
- in a token that was lexed and cached before the first occurrence was parsed.
- (#GH214128)
-- Fixed a crash when a coroutine keyword appeared inside a mem-initializer on a
- function that is not a constructor. (#GH194298)
-
-- Fixed an assertion when a defaulted comparison operator was synthesized for a
- class with an invalid non-static data member, such as one qualified with an
- address space. (#GH194605)
-
-- Fixed deduction of the template parameters appearing in the type of a
- constant template parameter of reference type. (#GH40328)
-
-- Fixed an issue where an explicit specialization of a constexpr variable would
- result in a link error. (#GH219796)
-
-- Fixed ambiguous overload where two non-static member functions with
- different signatures could be incorrectly considered equivalent. (#GH224499)
-
-- Fixed an assertion failure when explicitly instantiating a nested member with
- an ill-formed template argument. Clang now checks for a failed declaration
- lookup before asserting that the name is not dependent, avoiding an assertion
- after an earlier diagnostic has caused the declaration to be unavailable. (#GH220525)
-
-- Fixed a crash in constant evaluation when a new-expression selects a
- user-declared allocation function that takes std::nothrow_t by value. Such
- a new-expression is now correctly rejected in a constant expression because
- it does not select a replaceable global allocation function. (#GH212211)
-
-- Fixed `__attribute__((used))` and `-fkeep-inline-functions` being
- incorrectly ignored for complete constructors and destructors (C1/D1 variants)
- when `-mconstructor-aliases` is active. C1/D1 variants were previously
- replaced with their base variants (C2/D2) in the IR before retention could
- take effect, causing them to be dropped from llvm.used and omitted from
- the object file. (#GH226572)
-
-- Fixed an assertion failure when the initializer of a variable template
- specialization with a deduced type is instantiated from inside a lambda in
- the initializer of another specialization of the same variable template.
- (#GH134148)
-
#### Bug Fixes to AST Handling
- Fixed a non-deterministic ordering of unused local typedefs that made
@@ -819,9 +570,6 @@ features cannot lower the translation-unit ABI level;
- `FunctionDecl::getReturnTypeSourceRange()` now returns correct source
location of a trailing return type. (#GH162649)
-- Added missed information to the AST node representing the member function
- when calling a explicit object member function. (#GH218829)
-
#### Miscellaneous Bug Fixes
#### Miscellaneous Clang Crashes Fixed
@@ -835,25 +583,6 @@ features cannot lower the translation-unit ABI level;
threshold to the target's `size_t` width instead of using a fixed
threshold of `1 << 60` regardless of the target.
- Fixed a crash when generating fake uses for parameters of bodyless destructors with `-fextend-variable-liveness`.
-- Fixed a crash when filling in the ``TypeLoc`` for an ``AttributedType``
- that was inherited from a different declarator, for example when
- ``__typeof__`` resolves to the type of another, already-processed
- declaration. (#GH217489)
-- Fixed a crash when the constant evaluator default-constructed or copied a
- very large array, such as a local ``T s[0xFFFFFFFF][0]`` of an empty class
- ``T``. Such evaluations now fail once the element count exceeds the
- ``-fconstexpr-steps`` limit, as they already did for ``new``. (#GH173728)
-- Fixed an assertion failure when instantiating a block that captures
- `this` via a member access through a dependent base class.
-- Fixed `DiagnoseUnguardedAvailability::TraverseIfStmt` dereferencing a nullptr
- on `if consteval {}`. (#GH220004)
-- Fixed an assertion when the `dim` argument to an OpenACC `gang` clause
- evaluated to a value not representable by a signed integer, such as an
- unsigned wrap around. (#GH221418)
-- Fixed an assertion failure when a method or function definition follows an
- Objective-C `@implementation` that was ended by a nested `@interface`,
- `@protocol` or `@implementation` before its `@end`. (#GH209503)
-- Fixed use-after-free with annotate attribute on a C++ class method with a this-adjusting thunk.
### OpenACC Specific Changes
@@ -877,17 +606,10 @@ features cannot lower the translation-unit ABI level;
- `__builtin_amdgcn_fcmp`
- `__builtin_amdgcn_fcmpf`
-#### DirectX Support
-
-- `clang-dxc` and HLSL support are now enabled by default, following the
- promotion of the DirectX backend to an official LLVM target.
-
#### NVPTX Support
#### X86 Support
-- Support `AVX10_V2_AUX` ISA (`-mavx10v2aux`).
-
#### Arm and AArch64 Support
- Added support for pointer authentication discrimination of C++ virtual table
@@ -900,16 +622,6 @@ features cannot lower the translation-unit ABI level;
#### Windows Support
-- Clang now accepts ``_except`` as an alias for ``__except`` in SEH handler
- position when ``-fms-compatibility`` is enabled, matching the existing
- ``_try``, ``_finally``, and ``_leave`` aliases. ``_except`` remains an ordinary
- identifier outside that context.
-
-- Fixed ``setjmp`` on 32-bit Arm passing the frame pointer, rather than the
- stack pointer as it was on entry to the function, as the frame value the CRT
- stores in the ``jmp_buf``. Clang now uses ``llvm.sponentry`` there, as it
- already did on AArch64.
-
- Fixed a bug where Clang did not match the MSVC ABI on Arm64 when an
over-aligned base class is followed by another base class. MSVC on Arm64 (but
not Arm64EC or x64) reuses the tail padding of the over-aligned base for the
@@ -918,11 +630,6 @@ features cannot lower the translation-unit ABI level;
#### LoongArch Support
-- `loongarch32-*-none-elf` and `loongarch64-*-none-elf` targets now use the
- bare-metal toolchain, like other bare-metal targets. The linker is run
- directly instead of through `gcc`, and host include directories are no
- longer searched.
-
#### RISC-V Support
- Fixed a bug where the `interrupt` attribute did not accept `machine` together
@@ -931,7 +638,8 @@ features cannot lower the translation-unit ABI level;
- Added a new warning when the same interrupt type is specified more than
once in a RISC-V `interrupt` attribute.
-- SiFive CLIC preemptible interrupt handlers now support frame pointers.
+- SiFive CLIC preemptible interrupt handlers now diagnose unsupported frame
+ pointers instead of producing a backend fatal error.
- Added `-march=native` for better compatibility with ARM, AArch64, and X86. This
option will be treated like `-mcpu=native` if `-mcpu` is not present. If
@@ -951,26 +659,12 @@ features cannot lower the translation-unit ABI level;
- Added `--cuda-emit-nvcc-abi` to emit the NVCC-compatible host registration ABI
(`__cudaRegisterLinkedBinary`).
-- Fixed CUDA built-in variables such as `threadIdx` and `blockDim` being incorrectly treated as having side effects in assumptions. (#GH181340)
-
-- Clang now provides device-side definitions of `__cxa_pure_virtual()` and
- `__cxa_deleted_virtual()`; previously, any (potential) call to a pure/deleted
- virtual function that could not be optimised out would cause the program to
- fail to assemble. This is now fixed. (#GH49183) (#GH67533)
-
#### AIX Support
#### NetBSD Support
#### WebAssembly Support
-- Added `__builtin_wasm_memory_copy` and `__builtin_wasm_memory_fill` builtins
- for the WebAssembly `memory.copy` and `memory.fill` bulk memory instructions.
-
-- Fixed a "function signature mismatch" trap at program exit when destroying a
- temporary that is bound to a reference with static or thread storage
- duration. (#GH45221)
-
#### AVR Support
#### SystemZ Support
@@ -990,8 +684,7 @@ features cannot lower the translation-unit ABI level;
- Add `AfterRequiresExpression` sub-option of `BraceWrapping` to wrap the
body of requires expressions. It is enabled by the `Allman`, `Whitesmiths`,
and `GNU` styles of `BreakBeforeBraces`.
-- Add `AtEndOfBlock` sub-option of `KeepEmptyLines` to control the number of
- empty lines kept at end of blocks.
+
- `QualifierOrder` now supports `typedef`, `consteval`, `constinit`,
`thread_local`, `extern`, `mutable`, `signed`, `unsigned`, `long`, `short`,
and `explicit` declaration specifiers.
@@ -999,18 +692,9 @@ features cannot lower the translation-unit ABI level;
### libclang
- visit identifier initializers in lambda capture as VarDecl instead of VariableRef. Warning: this changes behaviour.
-- add unary operator handling to `clang_getCursorSpelling()`.
### Code Completion
-- Parameters declared with a `decltype` are now presented as the type the
- `decltype` resolves to, e.g. `set_x(int val)` rather than
- `set_x(decltype(x) val)`. This affects the completion strings produced by
- libclang as well as those used by clangd.
-
-- Members inherited from a dependent base class that is named through an alias
- template are suggested by code completion when relevant.
-
### Static Analyzer
#### Crash and bug fixes
@@ -1043,33 +727,8 @@ The `alpha.cplusplus.UseAfterLifetimeEnd` checker was renamed to `alpha.core.Use
### Python Binding Changes
-- Fixed a crash (`SIGFPE`) when traversing an AST via the visitor callbacks
- (e.g. `Cursor.get_children`) on s390x. The callbacks now return a full
- register word so the return value is correctly extended, working around a
- `ctypes` bug (https://github.com/python/cpython/issues/156933) that left the
- high bytes of the return register uninitialized.
-- Add support for retrieving unary operator information through `Cursor.unary_operator()`.
-
### OpenMP Support
-- Fixed an OpenMP `requires` directive read from a PCH or module losing its effect on
- semantic checks, which caused spurious `reverse_offload` errors.
-- Added the OpenMP 6.1 `#pragma omp flatten` loop transformation and the
- `depth` clause. Flatten combines perfectly nested canonical loops into one
- loop. `depth(k)` selects how many outermost loops to combine (default 2).
-- Canonicalize intra-tiles in loop tiling. `#pragma omp tile` still emits a
- min-bounded inner loop, which vectorizes well. When a parent directive such as
- `for collapse(n)` needs a constant per-tile trip count, Clang rereads a
- droppable hint and treats that inner loop as rectangular, with an overshoot
- guard only if the last tile can be partial.
-
- Not yet supported (diagnosed, left as follow-up):
-
- - `collapse` through stacked `#pragma omp tile` (the inner floor is not a
- collapsed counter).
- - A loop transformation (`tile`, `unroll`, `interchange`, ...) that consumes
- another tile's intra-tile loop.
-
- Added parsing and semantic support for `dims` modifier in `num_teams`,
`thread_limit` and `num_threads` clauses for OpenMP 6.1 or later.
- Map-type-modifying modifiers applied to a list item with a user-defined mapper
@@ -1077,26 +736,6 @@ The `alpha.cplusplus.UseAfterLifetimeEnd` checker was renamed to `alpha.core.Use
- Mapping of expressions with base-pointers through a user-defined mapper (e.g.
`map(s.p[0:n])`) now conforms to OpenMP's conditional pointer-attachment,
matching the behavior of such maps outside a mapper.
-- The `holds` clause on the `assume` directive now lowers side-effect-free
- conditions to `llvm.assume`, enabling downstream optimizations. Previously
- the clause was parsed but its condition was discarded without effect.
-- Fixed a crash when the loop variable or a loop bound of an OpenMP loop has a
- `_BitInt` type wider than any standard integer type. (#GH140074)
-
-- Added support for capturing structured bindings in OpenMP regions
- (a C++20 extension; warned as an extension in C++17). Individual bindings
- form aggregate decompositions(structs, classes, and arrays) can now be used
- in data-sharing clauses (``private``, ``firstprivate``, ``lastprivate``,
- ``shared``, ``linear``) and ``map`` clauses for target directives.
- Tuple-like bindings (types using the tuple protocol with ``get<N>()``,
- such as ``std::pair`` or ``std::tuple``) are not yet supported and
- will produce a compilation error. Reduction clauses with structured bindings
- are not yet supported.
- When the original variable is explicitly mapped in a target region
- but only bindings from it are used (not the original variable itself),
- modifications to the bindings will not be reflected in the original variable.
- To ensure correct behavior, either use the original variable directly in the
- target region or map the bindings explicitly instead.
### SYCL Support
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index c6c73afb698f9..95bcac1b010c6 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -8660,7 +8660,7 @@ def ast_dump_filter_EQ : Joined<["-"], "ast-dump-filter=">,
Alias<ast_dump_filter>;
def ast_dump_filter_path : Separate<["-"], "ast-dump-filter-path">,
MetaVarName<"<path_filter>">,
- HelpText<"Use with -ast-dump or -ast-print to dump/print only AST declaration"
+ HelpText<"Use with '-ast-dump' or '-ast-print' to dump/print only AST declaration"
" nodes whose source file path matches a glob pattern.">,
MarshallingInfoString<FrontendOpts<"ASTDumpFilterPath">>;
def ast_dump_filter_path_EQ : Joined<["-"], "ast-dump-filter-path=">,
diff --git a/clang/lib/Frontend/ASTConsumers.cpp b/clang/lib/Frontend/ASTConsumers.cpp
index e7f4e00c2c5b7..cf01056f8ffac 100644
--- a/clang/lib/Frontend/ASTConsumers.cpp
+++ b/clang/lib/Frontend/ASTConsumers.cpp
@@ -96,17 +96,22 @@ namespace {
if (!FilterPath.empty()) {
const SourceManager &SM = D->getASTContext().getSourceManager();
- SourceLocation Loc = SM.getSpellingLoc(D->getLocation());
+ SourceLocation Loc = D->getLocation();
if (Loc.isInvalid())
return false;
- auto Pattern = llvm::GlobPattern::create(FilterPath);
+ PresumedLoc PLoc = SM.getPresumedLoc(Loc);
+ if (PLoc.isInvalid())
+ return false;
+
+ llvm::Expected<llvm::GlobPattern> Pattern =
+ llvm::GlobPattern::create(FilterPath);
if (!Pattern) {
llvm::consumeError(Pattern.takeError());
return false;
}
- if (!Pattern->match(SM.getFilename(Loc)))
+ if (!Pattern->match(PLoc.getFilename()))
return false;
}
diff --git a/clang/test/AST/ast-dump-filter-path-include.c b/clang/test/AST/ast-dump-filter-path-include.c
new file mode 100644
index 0000000000000..97a82302285d7
--- /dev/null
+++ b/clang/test/AST/ast-dump-filter-path-include.c
@@ -0,0 +1,7 @@
+// RUN: %clang_cc1 -ast-dump -ast-dump-filter-path %s %s | FileCheck %s
+
+#include "filter-header.h"
+
+MAKE_VAR(z)
+
+// CHECK: VarDecl {{.*}} z
diff --git a/clang/test/AST/ast-dump-filter-path.c b/clang/test/AST/ast-dump-filter-path.c
new file mode 100644
index 0000000000000..d24eeea52d3b1
--- /dev/null
+++ b/clang/test/AST/ast-dump-filter-path.c
@@ -0,0 +1,8 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -ast-dump -ast-dump-filter-path "*ast-dump-filter-path.c" %s | FileCheck %s
+
+int x;
+// CHECK: VarDecl {{.*}} x
+
+#define MAKE_VAR(name) int name;
+MAKE_VAR(y)
+// CHECK: VarDecl {{.*}} y
\ No newline at end of file
diff --git a/clang/test/AST/filter-header.h b/clang/test/AST/filter-header.h
new file mode 100644
index 0000000000000..8b54743ed8692
--- /dev/null
+++ b/clang/test/AST/filter-header.h
@@ -0,0 +1 @@
+#define MAKE_VAR(name) int name;
>From 00769f2653ec64f706e3c5d65ddcf2c4d6d7ed3a Mon Sep 17 00:00:00 2001
From: inconnu08 <taufiqrx8 at gmail.com>
Date: Mon, 31 Aug 2026 01:38:34 -0400
Subject: [PATCH 3/4] [clang] Make ast-dump-filter-path include test portable
---
clang/test/AST/ast-dump-filter-path-include.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/test/AST/ast-dump-filter-path-include.c b/clang/test/AST/ast-dump-filter-path-include.c
index 97a82302285d7..9394c153cc8e7 100644
--- a/clang/test/AST/ast-dump-filter-path-include.c
+++ b/clang/test/AST/ast-dump-filter-path-include.c
@@ -1,7 +1,7 @@
-// RUN: %clang_cc1 -ast-dump -ast-dump-filter-path %s %s | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -ast-dump -ast-dump-filter-path "*ast-dump-filter-path-include.c" %s | FileCheck %s
#include "filter-header.h"
MAKE_VAR(z)
-// CHECK: VarDecl {{.*}} z
+// CHECK: VarDecl {{.*}} z
\ No newline at end of file
>From fe4f0bfa6db38a39335b448204299ed0d20b3f12 Mon Sep 17 00:00:00 2001
From: inconnu08 <taufiqrx8 at gmail.com>
Date: Fri, 2 Oct 2026 20:49:10 -0400
Subject: [PATCH 4/4] [clang] Address AST dump filter review comments
---
clang/test/AST/ast-dump-filter-path-include.c | 2 +-
clang/test/AST/ast-dump-filter-path.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/test/AST/ast-dump-filter-path-include.c b/clang/test/AST/ast-dump-filter-path-include.c
index 9394c153cc8e7..efb5901911803 100644
--- a/clang/test/AST/ast-dump-filter-path-include.c
+++ b/clang/test/AST/ast-dump-filter-path-include.c
@@ -4,4 +4,4 @@
MAKE_VAR(z)
-// CHECK: VarDecl {{.*}} z
\ No newline at end of file
+// CHECK: VarDecl {{.*}} z
diff --git a/clang/test/AST/ast-dump-filter-path.c b/clang/test/AST/ast-dump-filter-path.c
index d24eeea52d3b1..7867f6a2503cc 100644
--- a/clang/test/AST/ast-dump-filter-path.c
+++ b/clang/test/AST/ast-dump-filter-path.c
@@ -5,4 +5,4 @@ int x;
#define MAKE_VAR(name) int name;
MAKE_VAR(y)
-// CHECK: VarDecl {{.*}} y
\ No newline at end of file
+// CHECK: VarDecl {{.*}} y
More information about the cfe-commits
mailing list