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. Fourteen bundles are standalone.
The rest apply only in the order recorded in
patchsets/<version>/gcc-<major>.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. |
| 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. |
| Vector types | 13.2–16.2 | Replaces invalid vector placeholders with usable Ada machine-vector types and profiles. |
Staged: C++ object layout and vtable identity
These bundles are not part of patchset 1.2.0. 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, 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.
| 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 |
|---|---|---|---|
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 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 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 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 |