Catalog
Bundles.
This directory contains reviewable GCC/GNAT fixes, one problem per bundle. Each bundle has a manifest, one or more source patches, an executable regression, and a README showing the offending input, the broken output, and the corrected output. Patchsets select applicable variants by exact GCC release; the bundle README is the best starting point for reviewing an individual change.
Each bundle addresses an independent problem, but the patches are not all
independent of each other. standalone_patch in the manifest records whether a
bundle's patch applies with zero fuzz to pristine upstream source;
scripts/check-standalone.sh proves it in CI. Sixteen bundles are standalone.
The rest apply only in the order recorded in the applicable
patchsets/<version>/gcc-<target>.toml, because their patch text is expressed
against the accumulated tree — sometimes only as line-offset context, sometimes
because they genuinely extend a helper an earlier bundle introduced.
A bundle is either accepted, meaning every patchset for an affected GCC
major must contain it, or staged, meaning it is curated and validated to the
same standard but deliberately held out of the published patchset. A staged
bundle records why in its manifest, and scripts/manifest.py validate refuses
to let one appear in a patchset.
The tables below summarize the bundles. “GCC releases” describes the pinned releases covered by the bundle, not every possible upstream revision.
Ada expansion and runtime semantics
These bundles fix GNAT expansion paths outside the C++ binding generator.
| Bundle | GCC releases | Summary |
|---|---|---|
Protected Duration validity | 13.2–16.2 | Removes invalid Duration validity checks retained by automatically selected lock-free protected bodies. |
| Controlled allocator named subpools | 13.2, 14.2, 15.1 | Preserves an allocator's explicit subpool while building the controlled object's custom allocation procedure. |
| Storage-model actuals | 14.2–16.2 | Routes selected and indexed designated-storage-model actuals through Copy_From and Copy_To. |
C++ to Ada mapper
GCC's C++ to Ada mapper must translate more than C++ spelling. A usable binding has to preserve namespace and overload identity, emit legal Ada declarations, match the C++ object and call ABI, and retain virtual dispatch relationships. Several C++ constructs have no direct Ada equivalent, so the mapper sometimes needs an explicit storage view or a documented interoperability boundary.
The comprehensive feature panel and its remaining limits are documented in the C++ to Ada mapper panel.
Names, namespaces, and profiles
| Bundle | GCC releases | Summary |
|---|---|---|
| Namespace identity | 13.2–16.2 | Maps named C++ namespaces to nested Ada packages instead of flattening and colliding declarations. |
| Case-fold identity | 13.2–16.2 | Disambiguates C++ identifiers that differ only by case in Ada. |
| Qualified method names | 13.2–16.2 | Separates cv/ref-qualified overloads and copy/move assignment names. |
| Enclosing-type method names | 13.2–16.2 | Avoids a case-insensitive collision between a method and its enclosing type. |
| Visible-type method names | 13.2–16.2 | Avoids method collisions with types made visible from another generated class package. |
| Profile formal/type names | 13.2–16.2 | Prevents a formal parameter from hiding a type used later in the same Ada profile. |
Templates and declarations
| Bundle | GCC releases | Summary |
|---|---|---|
| Template qualification | 13.2–16.2 | Retains generated package qualification on references to concrete template instances. |
| Template record termination | 13.2–16.2 | Terminates trivial records emitted inside concrete template packages. |
| Template nested types | 13.2–16.2 | Declares anonymous nested field types used by concrete class-template packages. |
| Anonymous enums | 13.2–16.2 | Emits top-level anonymous-enum constants instead of incomplete internal types. |
Types and non-inheritance layout
| Bundle | GCC releases | Summary |
|---|---|---|
| Explicit alignment | 13.2–16.2 | Emits user-specified record alignment even without packing or bit fields. |
char8_t type | 13.2–16.2 | Maps char8_t without referring to a nonexistent Interfaces.C type. |
| 128-bit integers | 13.2–14.2 | Replaces GCC's internal unsigned 128-bit name with a valid Ada type. |
| Member pointers | 13.2–16.2 | Emits usable representations for data-member and member-function pointers. |
Staged: unproven vector method ABI
This bundle is not part of patchset 1.2.0. Its patch is standalone — it
applies to pristine upstream source — and the free-function half of it is
proven: fixed-size vectors become exact Ada machine-vector arrays that
round-trip by value at -O0 and -O2. But the same VECTOR_TYPE printer fix
also makes a vector-bearing C++ method print as a callable Convention => CPP
binding, and no tested GNAT release classifies that method ABI consistently.
Where the unpatched mapper rejected the spec at compile time, that binding
compiles and can return a wrong value; direct dispatch needs an extern "C"
C++ wrapper.
The same patch already fails closed for scalable SVE/RVV vectors, which have no
compile-time lane count, by emitting an explicit <scalable_vector> marker. The
bundle ships once the method binding it cannot prove fails closed the same way.
Removing the declaration outright is not that fix: primitive declaration order
assigns the dispatch slot, so dropping a virtual would displace every virtual
declared after it.
It applies before the layout series: cxx-ada-generated-name-identity rewrites
the declaration terminator immediately above the alignment emission this patch
adds, so that bundle does not apply without this one.
| Staged bundle | GCC releases | Summary |
|---|---|---|
| Vector types | 13.2–16.2 | Replaces invalid vector placeholders with exact Ada machine-vector types, proven for free-function and extern "C" profiles. |
Staged: C++ object layout and vtable identity
These bundles are not part of patchset 1.2.0 either. They are coupled to
Itanium
C++ ABI facts—as-base versus complete-object sizes, secondary base offsets,
virtual-base sharing, and vtable slot identity—and cannot be expressed as
native Ada inheritance, so they need separate upstream review before they ship
in a toolchain. The patches use fixed nested storage views where the ABI
position is static; dynamic virtual-base conversion remains a wrapper or thunk
boundary.
They form one ordered series and apply, in the order below, after the vector
bundle above, on top of a tree that already carries the complete patchset. Two
are here by dependency rather than by ABI judgement:
cxx-ada-inherited-tail-padding selects a nested primary-base component that
the virtual-base layout path emits, and cxx-ada-generated-name-identity
renames entities the layout bundles introduce and rewrites the declaration
terminator the vector bundle's alignment emission sits under.
| Staged bundle | GCC releases | Summary |
|---|---|---|
| Inherited tail padding | 13.2–16.2 | Separates complete-object and as-base sizes and nests a primary base only when C++ actually reuses its tail. |
| Empty-class storage | 13.2–16.2 | Gives complete empty objects one byte, preserves EBO, and omits only an actually overlapping [[no_unique_address]] selector. |
| Virtual inheritance layout | 13.2–16.2 | Restores complete size, alignment, and component positions for classes with virtual bases. |
| Virtual diamond layout | 13.2–16.2 | Uses shortened as-base views for direct diamond legs instead of duplicating their shared virtual base. |
| Concrete multiple inheritance | 13.2–16.2 | Keeps the primary base as Ada inheritance and emits concrete secondary bases as exact nested as-base storage. |
| Derived virtual slots | 13.2–16.2 | Stabilizes destructor identities so new derived virtuals retain their C++ vtable slots, including through nested secondary bases. |
| Generated-name identity | 13.2–16.2 | Allocates readable synthesized names without colliding with source names or other generated entities. |
Accepted.
| Bundle | Problem | Application | Patchset |
|---|---|---|---|
Controlled allocator named subpools
controlled-subpool-allocator |
Controlled aggregate allocators drop an explicitly named subpool while synthesizing their custom allocation procedure. | Standalone | 1.2.0 |
C++ Ada anonymous enums
cxx-ada-anonymous-enums |
Top-level C++ anonymous enumerations lose their constants and appear as incomplete internal types in generated Ada specifications. | Standalone | 1.2.0 |
C++ Ada casefold identity
cxx-ada-casefold-identity |
The C++ Ada spec dumper emits case-distinct C++ identifiers as duplicate Ada identifiers. | Ordered | 1.2.0 |
C++ Ada char8_t mapping
cxx-ada-char8-type |
The C++ Ada spec dumper emits char8_t references even though GNAT's Interfaces.C has no such Ada type. | Standalone | 1.2.0 |
C++ Ada enclosing-type method names
cxx-ada-enclosing-type-method-names |
The C++ Ada mapper emits a method whose name differs from its enclosing type only by case as an illegal duplicate Ada identifier. | Ordered | 1.2.0 |
C++ Ada explicit alignment
cxx-ada-explicit-alignment |
The C++ Ada spec dumper omits user-specified record alignment unless the layout is also packed or contains bit fields. | Standalone | 1.2.0 |
C++ Ada unsigned __int128 types
cxx-ada-int128-types |
GCC 13 and 14 emit the internal C++ name for unsigned __int128 as an undefined Ada identifier. | Standalone | 1.2.0 |
C++ Ada pointers to members
cxx-ada-member-pointers |
C++ data-member and member-function pointer representations contain blank underlying Ada types and make the generated specification invalid. | Standalone | 1.2.0 |
C++ Ada namespace identity
cxx-ada-namespace-identity |
The C++ Ada spec dumper flattens named namespaces, causing unrelated declarations with the same unqualified name to collide in Ada. | Standalone | 1.2.0 |
C++ Ada profile formal/type names
cxx-ada-profile-formal-type-names |
A C++ formal parameter can hide a type used later in the generated Ada subprogram profile, causing GNAT to reject the binding. | Standalone | 1.2.0 |
C++ Ada qualified method names
cxx-ada-qualified-method-names |
The C++ Ada spec dumper emits colliding names for cv/ref-qualified methods and for copy/move assignment operators. | Standalone | 1.2.0 |
C++ Ada template nested types
cxx-ada-template-nested-types |
Concrete C++ class-template packages reference anonymous array field types without declaring them in the generated Ada specification. | Standalone | 1.2.0 |
C++ Ada template-instance qualification
cxx-ada-template-qualification |
The C++ Ada spec dumper drops the generated package qualifier from references to concrete template instances, making specs with multiple instantiations ambiguous. | Standalone | 1.2.0 |
C++ Ada template record termination
cxx-ada-template-record-termination |
The C++ Ada spec dumper omits the terminating semicolon from trivial record declarations emitted for concrete class-template instances. | Standalone | 1.2.0 |
C++ Ada visible type/method names
cxx-ada-visible-type-method-names |
A C++ method can collide with a type made use-visible from another generated class package, making later Ada profiles ambiguous. | Ordered | 1.2.0 |
Boxed aggregate in a predicated conditional expression
predicate-conditional-aggregate-box |
Relocating a delayed conditional expression into a reference for a predicate check leaves its boxed aggregates unexpanded. | Standalone | 1.2.0 |
Protected Duration validity checks
protected-duration-validity |
Automatically selected lock-free protected bodies retain invalid Duration validity checks. | Standalone | 1.1.0 |
Storage-model component actuals
storage-model-actuals |
Selected and indexed actuals rooted at Designated_Storage_Model dereferences bypass Copy_From and Copy_To. | Standalone | 1.0.0 |
Staged.
These carry complete evidence but are held out of the published patchset. See Unreleased for why.
| Bundle | Problem | Application | Patchset |
|---|---|---|---|
C++ Ada concrete multiple inheritance
cxx-ada-concrete-multiple-inheritance |
The C++ Ada mapper emits multiple concrete tagged bases as illegal Ada progenitors and omits their secondary subobject storage. | Ordered | 1.2.0 |
C++ Ada derived virtual slots
cxx-ada-derived-virtual-slots |
Class-specific Ada destructor names consume new dispatch slots in derived classes and displace virtual methods introduced after them from their C++ vtable indices. | Ordered | 1.2.0 |
C++ Ada empty-class storage
cxx-ada-empty-class-storage |
The C++ Ada mapper gives complete empty-class objects zero storage and maps overlapping no_unique_address members as ordinary Ada storage. | Ordered | 1.2.0 |
C++ Ada generated-name identity
cxx-ada-generated-name-identity |
Readable Ada names synthesized for C++ entities can collide with user-written identifiers and with each other. | Ordered | 1.2.0 |
C++ Ada inherited tail padding
cxx-ada-inherited-tail-padding |
The C++ Ada mapper loses reusable base-class tail padding, including non-polymorphic and multiple-base layouts, so an Ada view can have a larger size and different field offsets than C++. | Ordered | 1.2.0 |
C++ Ada machine vector types
cxx-ada-vector-types |
Fixed-size C++ vector typedefs and signatures are emitted as invalid <vector> placeholders, with no usable Ada machine type or calling convention. | Standalone | 1.2.0 |
C++ Ada virtual-diamond base storage
cxx-ada-virtual-diamond-layout |
The C++ Ada mapper uses complete virtual-base class types for shortened direct base subobjects in a virtual diamond. | Ordered | 1.2.0 |
C++ Ada virtual-inheritance layout
cxx-ada-virtual-inheritance-layout |
The C++ Ada mapper drops the size, alignment, and component positions of classes with virtual bases. | Ordered | 1.2.0 |