Skip to content

Bump libClangSharp.runtime.linux-x64 from 21.1.8.2 to 23.1.5 - #29

Closed
dependabot[bot] wants to merge 226 commits into
masterfrom
dependabot/nuget/gen/libClangSharp.runtime.linux-x64-22.1.8.2
Closed

dependabot[bot] wants to merge 226 commits into
masterfrom
dependabot/nuget/gen/libClangSharp.runtime.linux-x64-22.1.8.2

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

Updated libClangSharp.runtime.linux-x64 from 21.1.8.2 to 23.1.5.

Release notes

Sourced from libClangSharp.runtime.linux-x64's releases.

22.1.8

What's Changed

New Contributors

Full Changelog: dotnet/ClangSharp@v21.1.8.4...v22.1.8

21.1.8.4

What's Changed

21.1.8.3

What's Changed

New Contributors

Full Changelog: dotnet/ClangSharp@v21.1.8.2...v21.1.8.3

Commits viewable in compare view.

…d: HasHeightForWidth=>True); exec() event-loop crash TODO
…ods generate; fix dtor hook (graceful native-created objects)
…ort + phantom-symbol filter); value types (QSize) runnable
…st TypeMap; fix default-expr printing (float/enum/QFlags/char/QList/QString), dedupe default-value overloads
…mo (Split => string[], new QApplication(args))
…ue (QtSharp_signals.cpp) + PyQt-style .XxxSignal.Connect(); calculator demo
…itance this-adjust; AnalogClock demo

- GenerateNativeToManaged = true; force-ignore QFileDevice (broken base chain)
- Runtime/VTables.cs: fix CloneTable secondary-vtable source (*(IntPtr*)(instance+offset))
- CSharpSources.cs: vtable hook this-adjust (GetVTableThisOffset) + GetInstanceParam interface-impl vs virtual-override
- gen: add QPainter/QTimer/QTime roots + qtimer.h (QTimer.TimeoutSignal)
- testbind: AnalogClock (QWidget subclass, paintEvent + QPainter draw), Calculator rewritten as QWidget subclass; [STAThread] main
…dits/ShapedClock/Calendar/SystemTray

- New examples (C#, PyQt-style signals, QWidget subclassing): Sliders, Spin Boxes,
  Window Flags, Line Edits, Shaped Clock, Calendar Widget, System Tray Icon
- Bindings: add QSystemTrayIcon/QShortcut/QIntValidator/QDoubleValidator/QRegularExpressionValidator/
  QCommonStyle/QProxyStyle/QStylePainter/QStyleFactory roots; qsystemtrayicon.h/qstyle.h/etc headers;
  QAction + QSystemTrayIcon signal scan (TriggeredSignal, MessageClickedSignal); un-ignore QHeaderView;
  ForceIgnore QLayoutItemInternal::tr (broken default-arg overload)
- Drop 'unsafe partial' from user example classes (not required for subclassing)
SymbolsCodeGenerator.WriteMethodWrapper emits extern C wrapper calling self->method(args) for NeedsSymbol non-operator methods, handling MS-ABI sret and stripping default args; GenerateDef prefers Qt re-export then wrapper alias (220 inline methods now exported). WindowFlags restores QPoint.Pos X/Y usage.
…s, abstract ctors

ABI: GatherInternalParams gains realAbiOrder so vtable hooks use the real MS ABI order (this before sret); sret hooks now return the return-slot pointer in RAX and copy non-trivial value types via the copy ctor instead of a bitwise memcpy.

Types: TagType.Equals/GetHashCode compare declarations by clang USR so duplicate declarations produced across translation units are recognised as the same type (fixes QCommonStyle not overriding QStyle pure virtuals -> CS0534).

QFlags: allow QAbstractItemModel::flags through a whitelist and emit an int return buffer for QFlags sret returns.

Symbols: generate concrete subclass wrappers for abstract-class constructors.

gen: extra item-view headers/types, QSettings root, Qt enum roots.

native: hand-written shims for QString/QKeySequence/QAction/QSettings/dataChanged/QPixmap.
Shortcut Editor: hierarchical read-write QAbstractItemModel (context/category/action) plus a QStyledItemDelegate whose editor is a QKeySequenceEdit, an ActionManager and the official MainWindow layout.

Document Viewer: official app shell (File/Edit/Help menus, toolbar, status bar, QSplitter with west QTabWidget and a widgetResizable QScrollArea), QSettings-backed recent files, and inline text/JSON/image viewers (system JSON parser + custom tree model).

Calculator, Scribble, CalendarWidget, ShapedClock, SpinBoxes, SystemTray and WidgetsGallery rewritten against the official sources. AllDemos tiles every demo in one process.

QtCompat re-exposes pruned helpers and wraps the hand-written native shims.
native/CrashTracer.cpp installs a vectored exception handler, walks the stack with StackWalk64 and dumps registers plus disassembly bytes to crash_stack.txt; build_crashtracer.bat builds it; tools/disasm.py disassembles by RVA with capstone.
…highlighting, image IO

New roots/headers: QAbstractAnimation/QPropertyAnimation/QEasingCurve, QSortFilterProxyModel, QStringListModel, QStandardItem, QSyntaxHighlighter, QImageReader/Writer, QPainterPath, QCompleter, QFileSystemModel, QDataWidgetMapper, QItemDelegate, QWizard/QWizardPage, QErrorMessage, QFocusFrame, QScroller, QUndoStack/QUndoCommand/QUndoView.

Signal generator: parse unnamed parameters, ignore QPrivateSignal markers (exposed neither in the managed signature nor the connect lambda), and only use the disambiguating member-pointer cast for overloaded signals (QPrivateSignal cannot be named).

Demos: QSpinBox/QDoubleSpinBox valueChanged now carries the value, so the sliders/spinboxes connections take the argument. Document Viewer uses the QSettings Scope overload (the (string,string) ctor is not generated reliably).
Adds QInputEvent/QContextMenuEvent/QHoverEvent/QDragEnterEvent/QDragMoveEvent/QDragLeaveEvent/QDropEvent/QHelpEvent/QActionEvent and QMimeData (qmimedata.h) so widgets can override those handlers.
Menus (examples/widgets/mainwindows/menus): menu bar with File/Edit/Format/Help, checkable format actions, status tips, a right-click context menu built from QContextMenuEvent and a status label that reports the invoked action.

Basic Layouts (examples/widgets/layouts/basiclayouts): menu bar inside the layout, horizontal/grid/form group boxes, a big editor, a QDialogButtonBox wired to accept/reject and a scroll area with a custom vertical scrollbar style.

AllDemos now tiles 15 windows.
…gnal)

native/QtSharp_meta.cpp installs a single QtPrivate::QSlotObjectBase forwarder via QObjectPrivate::connect(sender, signal_index, slotObj, type) and resolves the signal at runtime from the sender's QMetaObject, so no per-signal compile-time glue is needed.

Verified by 'testapp metasig': int/QString/bool delivery, a parameter that is unnamed in the header, two overloads of QCompleter::activated resolving to distinct indices, rejection of a bogus signature, and QTimer::timeout.

Diagnostic finding: moc strips the QPrivateSignal marker from the runtime signature (QTimer::timeout is recorded as 'timeout()', and QObject::destroyed appears as both 'destroyed(QObject*)' and 'destroyed()'), so the type we could not even name in generated glue never appears at runtime.
…nmanagedCallersOnly)

native/QtSharp_vdispatch.cpp emits real C++ subclasses of QWidget and QAbstractItemModel whose overrides forward to one managed entry point through a function pointer obtained from an [UnmanagedCallersOnly] static method.

Because the C++ compiler emits the override, the ABI (including sret / return-by-value) is the compiler's job; managed code only sees plain pointers. Verified by 'testapp vdispatch': sizeHint() (QSize by value) and paintEvent reach C# and the values come back correctly, rowCount() reaches C#, dispatch still works after GC.Collect() (no delegate keep-alive), and Qt's own QAbstractItemModel::match() calls the managed data() and gets the managed QVariant - the exact path that previously required the sret/RAX workaround.
Qt-owned objects are held by the managed side as a bare IntPtr (no SafeHandle, no finalizer) so the GC never frees them; QObject::destroyed invalidates the managed wrapper and later access throws ObjectDisposedException instead of dereferencing freed memory (the PySide RuntimeError analogue). Objects .NET owns are released exactly once through a SafeHandle.

Verified by 'testapp own': a Qt parent destroys its children and their wrappers are invalidated; GC.Collect() leaves Qt-owned objects alive and usable from native; disposing is exactly-once and idempotent; an abandoned managed-owned object is finalised exactly once.
model/qtsharp.api.json is now the checked-in source of truth: a clang-extracted, sorted, minimal API model (QObject: methods, virtuals, signals). The extractor ignores the legacy pipeline's IsGenerated pruning and decides by its own type whitelist, handles value returns (hidden indirect-return params) and references.

gen/ApiCodeGen.cs turns the model into C# bindings, a C++ wrapper (virtual overrides forwarded to one managed entry point) and P/Invoke declarations - a pure function: two runs produce byte-identical output.

native/QtSharpApiRuntime.cpp is the hand-written runtime that ships with the bindings (generic moc signal forwarder + QString bridge); build_api.bat produces QtSharp.Api.dll; tools/regen-api.ps1 runs extract -> diff gate -> codegen -> determinism gate -> build -> smoke test.

Verified: 'testapp api' passes (generated accessors, a generated signal property delivered through the moc dispatcher, and a native call into the generated virtual reaching the managed override). 15 legacy demos and the three PoCs still pass.
extract2 (gen/ApiModel2.cs) reads the same model out of one libclang translation unit. The CppSharp AST projection, its pass chain and the chunked double-parse self-check are gone, so the 44-class model comes back byte-identical in ~2.5s instead of ~165s, and three runs hash the same - the reproducibility machinery existed to work around a layer that no longer exists. Both front ends share everything downstream of 'the AST has been read', which is what let the replacement be diffed against the checked-in model before the Roots table grew.

With that in place the Roots table went from 44 to 221 classes (QtWidgets 121, QtGui 69, QtCore 31): 5439 methods, 478 virtuals, 385 constructors, 210 signals, 269 enums. The model gained 'subclassable' (a private destructor means C++ will not let us derive, so no native wrapper) and 'pure' on virtuals (QAbstractButton::paintEvent = 0 has no body to chain to), and virtuals outside the override whitelist are now published as callable methods instead of being dropped.

The code generator needed the rest: null-safe boxed parameters, dropping optional boxed parameters whose default cannot be expressed (they used to reach the glue as a null handle and crash - the api-lineedits regression), no CallBase/__base for pure slots, an ownership path only where constructors exist, QStringList signal decoding, and skipping function templates without defaulted template parameters.

tools/clangprobe is the probe the migration was validated with (fact extraction, --all, --index for choosing Roots rows).

Verified: tools/regen-api.ps1 is green - model diff gate, codegen determinism, native build, C# build, and four self-tests (api 6, api-analogclock 10, api-lineedits 9, api-widgets 44 assertions, the last one new). The 15 legacy demos and the three PoCs are untouched.
The type vocabulary was the bottleneck: with 225 classes in the model, everything still blocked on the handful of types Qt spells differently.

const char* is the other string convention and now surfaces as a managed string - passed straight through to the LPUTF8Str marshalling, and copied into a QString on the way back so the existing QString bridge carries it. The 64-bit and unsigned typedefs resolve through their canonical types (qsizetype/qint64 -> long long, uint/QRgb -> unsigned int, quint64 -> unsigned long long), and char32_t becomes an unsigned code unit. QStringView and QAnyStringView are strings.

QStringList is the one container: a managed string[] becomes a native QStringList for the duration of the call (created and freed around the P/Invoke by the generated try/finally), and a returned list is copied out element by element. Model side it is recognised as QList<QString>, the only container spelling the model carries.

ApiTypes.Managed had to test for strings before pointers: 'char*' also ends in '*' and was mapping to IntPtr while the code generator rendered a string, which produced two C# overloads with the same signature. The generated constructor local named 'context' collided with QShortcut's parameter of that name and is now __context.

QMetaObject, QCalendar, QMimeData and QBitArray join the Roots table; QMetaObject makes metaObject().className() and indexOfSignal() usable.

Verified: regen-api.ps1 green (model gate, codegen determinism, native and C# builds) and api-widgets grew to 51 assertions covering a string[] argument and return, a const char* argument with a qsizetype return, the meta-object, QCalendar and QMimeData. The other three self-tests and the 15 legacy demos are unaffected.
ProxyCheng and others added 6 commits November 2, 2026 13:39
QFuture stays out of the API: the async surface is Task, CancellationToken
and IProgress<T>. RunAsync gains Action<CancellationToken>/Func<CancellationToken, T>
overloads (an OperationCanceledException after the token fires cancels the
task instead of faulting it) and Action<IProgress<int>>/Func<IProgress<int>, T>
overloads whose reports reach the caller's Progress<T> on the caller's thread
- the part QFutureWatcher::progressValueChanged used to carry.

Co-Authored-By: Claude Code <noreply@anthropic.com>
…Shot

QThread::create is bound through the same managed token as the other functor
helpers; the caller owns the returned thread, as Qt documents. QTimer gains
the std::chrono forms (TimeSpan with optional Qt.TimerType and context), with
a negative interval rejected instead of firing immediately.

Co-Authored-By: Claude Code <noreply@anthropic.com>
strings and tree both complete against the 0.25.0 packages (2.1 s and
1.3 s, offscreen); the QApplication-initialization timeout from 0.19.0 no
longer reproduces. api-gaps now reports Sender, FindChild and FindChildren
as present, and #57's GUI scenario is verified.

Co-Authored-By: Claude Code <noreply@anthropic.com>
The long/uchar*/nested-class/bare-enumerator items are now marked permanent
with the reason, so the tracking issue has a stable link per item instead of
a list of undecided gaps.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Co-Authored-By: Claude Code <noreply@anthropic.com>
The GL entry-point table (137 methods) joins the QtGui roots, which also
brings QOpenGLContext.functions() into the model. test-opengl-functions
initializes the table from a widget's initializeGL and checks that
glClearColor/glClear/glEnable leave no GL error; the offscreen platform has
no GL, so it reports a skip there.

Co-Authored-By: Claude Code <noreply@anthropic.com>
@dependabot
dependabot Bot force-pushed the dependabot/nuget/gen/libClangSharp.runtime.linux-x64-22.1.8.2 branch from e1281bc to 545948d Compare November 2, 2026 05:57
ProxyCheng and others added 17 commits November 2, 2026 13:59
QOpenGLShader joins the QtOpenGL roots: its ShaderType enum is the missing
parameter type that kept QOpenGLShaderProgram.AddShaderFromSourceCode out of
the model. examples/QtOpenGLWidgets holds Qt's opengl/hellogl2 - the logo
mesh, the VAO/VBO setup, the paint path and the slider rotations - with the
normal-matrix uniform folded into the vertex shader (QMatrix3x3 is not
published) and the Binder spelled Bind/Release. Offscreen it asserts the
mesh and rotation wrapping and skips the GL path; on a display it builds the
program and paints with no GL error.

Co-Authored-By: Claude Code <noreply@anthropic.com>
QEvent joins the bindable roots now that custom events are the point: a C#
subclass carries the payload, QEvent.RegisterEventType supplies the id, and
QCoreApplication.PostEvent's two-argument overload hands the instance to Qt
and invalidates the wrapper, so Dispose cannot double-free the object Qt
deletes after delivery. The generated three-argument overload stays for code
that needs a priority. test-custom-events covers construction, the transfer
and the receiver-side type dispatch.

Co-Authored-By: Claude Code <noreply@anthropic.com>
The process died inside qwindows.dll about a quarter of the time while the
runtime tore the application down with a shown window still alive. The test
now hides both windows, flushes the posted events and disposes them before
returning; on the windows QPA platform that is 0 crashes in 40 runs against
5 in 20 before. All 115 assertions run in the gate again.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Co-Authored-By: Claude Code <noreply@anthropic.com>
QSqlTableModel now reports Qt::ItemIsEditable for a valid index and emits
dataChanged(index, index, {EditRole, DisplayRole}) when SetData stages an
edit, the QAbstractItemModel::setData contract a view needs to open an editor
and repaint. The test connects to the native dataChanged signal and checks
that a staged edit emits once while rejected edits emit nothing.

The changelog bullet moves to Unreleased: it was swept into the hellogl2
commit while the code was still uncommitted, so 0.26.0 shipped without it.

Co-Authored-By: Claude Code <noreply@anthropic.com>
QSqlQueryModel.SetQuery/Select and QSqlTableModel.SubmitAll now return false
and leave the driver's exception in LastError(), Qt's lastError() contract.
Before, a failing SubmitAll from a button's Clicked handler unwound a
SqliteException into Qt's signal dispatch.

A failed SetQuery resets the model, as Qt's setQuery does. A failed SubmitAll
rolls its transaction back and keeps every staged edit, inserted row and
deletion so the caller can fix the offending row and submit again, matching
Qt's submitAll semantics.

Also stage insert/remove rows with the * and ! vertical headers, serve
EditRole from Data so a view's editor opens on the cell's value, repaint on
RevertAll, and read Record/Value through the staged value.

test-sqlmodel covers the failure paths and the staged row operations.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Marking a base row deleted emits headerDataChanged(Qt::Vertical, row, row),
as Qt's removeRows does in the manual-submit strategy; RevertAll emits it
when it restores the row. Before, the vertical header kept painting the old
number or "!" until something else forced a repaint.

test-sqlmodel checks both signals and the restored header value.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Co-Authored-By: Claude Code <noreply@anthropic.com>
Pull the upstream v0.20.0-v0.27.0 line: SQL model editing and provider
errors, QOpenGLFunctions and the hellogl2 port, async/await on the Qt
thread, functor and template bindings, the BCL interop bridges, WebView2,
and the documentation rewrite.

Resolution:
- FindChild/FindChildren follow upstream (generic, QRegularExpression and
  QMetaObject overloads, native walk); the parallel local implementation in
  runtime/QtCore/QObjectLookup.cs and its additions to ObjectLookupApi are
  dropped. That work remains in history at 11d715c.
- Conflicting docs and package versions take the upstream v0.27.0 files.
- The local interop review fixes (invalid QRegularExpression rejection,
  QTimeZone rule checks) are kept, with their changelog entries listed
  under Unreleased.

Co-Authored-By: Claude Code <noreply@anthropic.com>
QSet<T> surfaces as HashSet<T>; QPair/std::pair as ValueTuple; a container may
be a list element or map value (QHash<int, QHash<T, QVariant>> is a nested
Dictionary). A set element or map key may be a pair but not a container,
because an array/HashSet/Dictionary has no structural equality. The element
codec is recursive and the qtsharp.models are regenerated from extraction.

Co-Authored-By: Claude Code <noreply@anthropic.com>
QList<T> and QStringList returns are List<T> snapshots; a container parameter
is the read-only interface (IReadOnlyList<T>, IReadOnlySet<T>,
IReadOnlyDictionary<K,V>), so List<T>, T[], HashSet<T> and Dictionary<K,V>
all pass without overloads. std::optional<T> surfaces as T? or a nullable
reference, with heap-backed native helpers for value and reference payloads.
The generated helper bodies go through CodeWriter so indentation is structural
instead of hand-counted.

Co-Authored-By: Claude Code <noreply@anthropic.com>
The new generator is an instance-based pipeline: a model pass builds the
class/enum vocabulary and module closure, a regex-registered type/parameter
handler set owns the mapping decisions, and separate emitters produce the C#
declarations, metatype table and native glue. No per-run static state remains
below the driver.

It reproduces the old generator's output for all 18 modules, then takes over
codegen in tools/regen-api.ps1 and the CI/release workflows. The old qtgen
executable stays for model extraction, split-core and the module descriptor.

The switched pipeline exposed one real defect the old oracle shared: a
namespaced enum used as a container element was spelled QSortPolicy::SortType
inside the native helper, without Qt3DRender::, so Qt3DRender did not compile.
The container C++ spelling now qualifies enum elements. The QtPrintSupport
example also moves from List<T>.Length to Count after the container binding.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Bump the binding package versions and the sample/readme references, and mark
the container vocabulary changes as the 0.28.0 section.

Co-Authored-By: Claude Code <noreply@anthropic.com>
The method is declared only under Q_OS_WIN in qprinter.h, but the checked-in
model is extracted from the Windows headers. Emitting its forwarder made the
Linux native binding fail to compile. Treat it like the QProcess Windows-only
members and leave it out of the published surface on every platform.

Co-Authored-By: Claude Code <noreply@anthropic.com>
gen-next was the working name of the rewrite. The old ApiCodeGen, its emitters
and its generated-file helpers are removed; gen/ is now the single qtgen
project, owning codegen plus extract2, split-core and the module descriptor.

The generation scripts, CI and release workflows build one executable and call
qtgen for both model extraction and code generation. QtSharp.slnx keeps only
the one generator project, and the docs point at the merged layout.

Co-Authored-By: Claude Code <noreply@anthropic.com>
---
updated-dependencies:
- dependency-name: libClangSharp.runtime.linux-x64
  dependency-version: 22.1.8.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot changed the title Bump libClangSharp.runtime.linux-x64 from 21.1.8.2 to 22.1.8.2 Bump libClangSharp.runtime.linux-x64 from 21.1.8.2 to 23.1.5 Nov 7, 2026
@dependabot
dependabot Bot force-pushed the dependabot/nuget/gen/libClangSharp.runtime.linux-x64-22.1.8.2 branch from 545948d to ef8bfba Compare November 7, 2026 17:21
@ProxyCheng ProxyCheng closed this Nov 12, 2026
@ProxyCheng
ProxyCheng force-pushed the dependabot/nuget/gen/libClangSharp.runtime.linux-x64-22.1.8.2 branch from ef8bfba to af72813 Compare November 12, 2026 15:56
@dependabot @github

dependabot Bot commented on behalf of github Nov 12, 2026

Copy link
Copy Markdown
Contributor Author

OK, I won't notify you again about this release, but will get in touch when a new version is available. If you'd rather skip all updates until the next major or minor version, let me know by commenting @dependabot ignore this major version or @dependabot ignore this minor version. You can also ignore all major, minor, or patch releases for a dependency by adding an ignore condition with the desired update_types to your config file.

If you change your mind, just re-open this PR and I'll resolve any conflicts on it.

@dependabot
dependabot Bot deleted the dependabot/nuget/gen/libClangSharp.runtime.linux-x64-22.1.8.2 branch November 12, 2026 15:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file .NET Pull requests that update .NET code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant