{
  "canonical_url": "https://gnat-patches.flyology.org/",
  "generated_at": "2026-08-20T17:38:49Z",
  "latest_patchset": "1.2.0",
  "latest_published_patchset": "1.1.0",
  "panel": {
    "coverage": {
      "generated": {
        "atomic_catalog": "panels/cxx-ada-spec/generated/catalog.py",
        "atomic_expectations": "panels/cxx-ada-spec/generated/catalog-expectations.toml",
        "grammar_generator": "panels/cxx-ada-spec/generated/grammar.py",
        "pairwise_expectations": "panels/cxx-ada-spec/generated/expectations.toml",
        "pairwise_generator": "panels/cxx-ada-spec/generated/pairwise.py"
      },
      "groups": [
        {
          "cases": [
            "anonymous_aggregates",
            "anonymous_enum",
            "bit_fields",
            "complex_and_vector",
            "extended_characters",
            "flexible_array",
            "fundamental_scalars",
            "incomplete_forward_declaration",
            "integer_128",
            "multidimensional_arrays",
            "multiple_indirection",
            "nullptr_type",
            "packing_alignment",
            "scoped_enums",
            "string_constant_array"
          ],
          "id": "types-layout"
        },
        {
          "cases": [
            "conversion_operators",
            "copy_move_constructors",
            "data_member_pointer",
            "deleted_defaulted",
            "free_overloads",
            "free_rvalue_references",
            "friend_function",
            "function_pointer",
            "member_function_pointer",
            "method_cv_overloads",
            "noexcept_default_arguments",
            "operators",
            "ref_qualified_methods",
            "variadic_function"
          ],
          "id": "pointers-references-functions"
        },
        {
          "cases": [
            "alias_template",
            "constrained_template",
            "default_template_arguments",
            "full_specialization",
            "function_template_instance",
            "member_template",
            "nested_template",
            "non_type_template",
            "partial_specialization",
            "template_template_parameter",
            "variable_template"
          ],
          "id": "templates"
        },
        {
          "cases": [
            "abstract_virtual_destructor",
            "concrete_multiple_inheritance",
            "covariant_return",
            "diamond_inheritance",
            "empty_base",
            "final_override",
            "nested_class",
            "nonpublic_inheritance",
            "virtual_inheritance"
          ],
          "id": "classes-inheritance"
        },
        {
          "cases": [
            "ada_reserved_names",
            "anonymous_namespace",
            "casefold_collision",
            "extern_c_linkage",
            "inline_namespace",
            "namespace_alias",
            "nested_namespace",
            "typedef_and_using"
          ],
          "id": "names-scopes-linkage"
        },
        {
          "cases": [
            "constexpr_consteval",
            "exception_throw",
            "globals_constants",
            "static_data_member",
            "thread_local_storage",
            "volatile_global"
          ],
          "id": "runtime-storage-modern"
        }
      ],
      "limits": {
        "not_yet_covered": [
          "C++ modules and header units",
          "coroutines",
          "lambda closure and local-class emission",
          "RTTI, typeid, and dynamic_cast runtime behavior",
          "direct ownership transfer and by-value ABI for nontrivial standard-library values beyond the tested facade boundary",
          "atomics and concurrency memory-order behavior",
          "Windows/MSVC ABI targets outside this repository's supported hosts",
          "three-way and higher feature interactions beyond the pairwise generator",
          "runtime ABI execution for every compile-only atomic catalog entry",
          "portable recovery of a propagated exception's C++ language identity across GNAT runtime versions",
          "Linux AArch64 long double call interoperability on GNAT releases whose Ada and C++ target conventions disagree",
          "direct Ada dispatch to vector-bearing C++ methods; use a C++ wrapper so method dispatch stays under the C++ ABI",
          "concrete base classes of a C++ class with no virtual destructor: the mapper emits no base list at all, so both base subobjects vanish from the Ada record even with the staged layout bundles applied",
          "instrumented branch coverage measurement for c-ada-spec.cc",
          "mutation testing that proves each mapper branch has a sensitive oracle",
          "coverage-guided grammar fuzzing with automatic failure minimization"
        ]
      },
      "mapper_tree_codes": {
        "ARRAY_TYPE": [
          "multidimensional_arrays",
          "flexible_array"
        ],
        "BOOLEAN_TYPE": [
          "fundamental_scalars"
        ],
        "COMPLEX_TYPE": [
          "complex_and_vector"
        ],
        "CONST_DECL": [
          "scoped_enums"
        ],
        "ENUMERAL_TYPE": [
          "scoped_enums",
          "anonymous_enum"
        ],
        "FIELD_DECL": [
          "anonymous_aggregates",
          "bit_fields"
        ],
        "FUNCTION_DECL": [
          "free_overloads"
        ],
        "INTEGER_CST": [
          "globals_constants",
          "scoped_enums"
        ],
        "INTEGER_TYPE": [
          "fundamental_scalars",
          "integer_128"
        ],
        "NAMESPACE_DECL": [
          "nested_namespace",
          "anonymous_namespace"
        ],
        "NULLPTR_TYPE": [
          "nullptr_type"
        ],
        "PARM_DECL": [
          "free_overloads"
        ],
        "POINTER_TYPE": [
          "multiple_indirection",
          "function_pointer"
        ],
        "REAL_CST": [
          "globals_constants"
        ],
        "REAL_TYPE": [
          "fundamental_scalars"
        ],
        "RECORD_TYPE": [
          "anonymous_aggregates",
          "empty_base"
        ],
        "REFERENCE_TYPE": [
          "free_rvalue_references"
        ],
        "STRING_CST": [
          "string_constant_array"
        ],
        "TEMPLATE": [
          "function_template_instance",
          "partial_specialization"
        ],
        "TREE_BINFO": [
          "diamond_inheritance",
          "virtual_inheritance"
        ],
        "TYPE_DECL": [
          "typedef_and_using"
        ],
        "UNION_TYPE": [
          "anonymous_aggregates"
        ],
        "VAR_DECL": [
          "globals_constants",
          "thread_local_storage"
        ],
        "VECTOR_TYPE": [
          "complex_and_vector"
        ],
        "VOID_TYPE": [
          "incomplete_forward_declaration"
        ]
      },
      "runtime": {
        "oracles": [
          "generated Ada compiles",
          "required Ada declarations are present",
          "C++ symbols link",
          "runtime values round-trip",
          "virtual and interface dispatch agree",
          "sizeof and Object_Size agree",
          "alignof and Alignment agree",
          "public field offsets agree",
          "accepted defects fail before and pass after their patches"
        ],
        "staged_suites": [
          "panels/cxx-ada-spec/cases/recursive-secondary-base",
          "bundles/cxx-ada-inherited-tail-padding",
          "bundles/cxx-ada-empty-class-storage",
          "bundles/cxx-ada-virtual-inheritance-layout",
          "bundles/cxx-ada-virtual-diamond-layout",
          "bundles/cxx-ada-concrete-multiple-inheritance",
          "bundles/cxx-ada-derived-virtual-slots",
          "bundles/cxx-ada-generated-name-identity",
          "bundles/cxx-ada-vector-types"
        ],
        "suites": [
          "panels/cxx-ada-spec/cases/core-language",
          "panels/cxx-ada-spec/cases/abi-layout",
          "panels/cxx-ada-spec/cases/call-abi",
          "panels/cxx-ada-spec/cases/interface-secondary-base",
          "panels/cxx-ada-spec/cases/exception-interoperability",
          "panels/cxx-ada-spec/cases/uninstantiated-templates",
          "panels/cxx-ada-spec/cases/stdlib-value-facade",
          "bundles/cxx-ada-template-qualification",
          "bundles/cxx-ada-template-record-termination",
          "bundles/cxx-ada-explicit-alignment",
          "bundles/cxx-ada-namespace-identity",
          "bundles/cxx-ada-qualified-method-names",
          "bundles/cxx-ada-casefold-identity",
          "bundles/cxx-ada-template-nested-types",
          "bundles/cxx-ada-anonymous-enums",
          "bundles/cxx-ada-char8-type",
          "bundles/cxx-ada-int128-types",
          "bundles/cxx-ada-member-pointers",
          "bundles/cxx-ada-enclosing-type-method-names",
          "bundles/cxx-ada-profile-formal-type-names",
          "bundles/cxx-ada-visible-type-method-names"
        ]
      },
      "schema": 1
    },
    "directory": "panels/cxx-ada-spec",
    "id": "cxx-ada-spec",
    "matrix": {
      "coverage": {
        "atomic_cases": 63,
        "dump_modes": [
          "full",
          "slim"
        ],
        "grammar_cases": 32,
        "manifest": "panels/cxx-ada-spec/coverage.toml",
        "pairwise_cases": 16,
        "pairwise_value_pairs": 88,
        "runtime_suites": 21,
        "staged_runtime_suites": 9
      },
      "driver_options": [
        "-fdump-ada-spec",
        "-fdump-ada-spec-slim"
      ],
      "features": [
        {
          "category": "class",
          "evidence": "panels/cxx-ada-spec/cases/core-language",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/cases/core-language"
            }
          ],
          "id": "constructors-destructors",
          "state": "verified-working"
        },
        {
          "category": "class",
          "evidence": "panels/cxx-ada-spec/cases/core-language",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/cases/core-language"
            }
          ],
          "id": "data-members-layout",
          "note": "Generated bindings expose layout. Compare Object_Size with compiler-produced sizeof values because Itanium mangling does not encode member layout.",
          "state": "verified-working-with-guard"
        },
        {
          "category": "function",
          "evidence": "panels/cxx-ada-spec/cases/core-language",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/cases/core-language"
            }
          ],
          "id": "overloaded-methods",
          "state": "verified-working"
        },
        {
          "category": "function",
          "evidence": "panels/cxx-ada-spec/cases/core-language",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/cases/core-language"
            }
          ],
          "id": "static-methods",
          "state": "verified-working"
        },
        {
          "category": "dispatch",
          "evidence": "panels/cxx-ada-spec/cases/core-language",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/cases/core-language"
            }
          ],
          "id": "virtual-methods",
          "state": "verified-working"
        },
        {
          "category": "inheritance",
          "evidence": "panels/cxx-ada-spec/cases/core-language",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/cases/core-language"
            }
          ],
          "id": "single-inheritance",
          "note": "The positive case avoids inherited tail-padding reuse and checks both Ada and C++ object sizes.",
          "state": "verified-working"
        },
        {
          "category": "data-layout",
          "evidence": "bundles/cxx-ada-inherited-tail-padding",
          "evidence_references": [
            {
              "bundle": "cxx-ada-inherited-tail-padding",
              "cases": [],
              "path": "bundles/cxx-ada-inherited-tail-padding"
            }
          ],
          "id": "inherited-tail-padding-layout",
          "note": "The staged bundle preserves the base subobject data size separately from its complete-object size and emits exact component positions for C++ tail-padding reuse. The nested primary-base component it selects is emitted by the staged virtual-base layout path, so patchset 1.2.0 does not ship it.",
          "state": "staged"
        },
        {
          "category": "data-layout",
          "evidence": "bundles/cxx-ada-empty-class-storage",
          "evidence_references": [
            {
              "bundle": "cxx-ada-empty-class-storage",
              "cases": [],
              "path": "bundles/cxx-ada-empty-class-storage"
            }
          ],
          "id": "empty-class-object-size",
          "note": "The staged bundle separates a zero-size empty value from its nonzero complete-object allocation. It omits artificial empty bases and only a no_unique_address selector that actually overlaps another field; naming that omitted C++ subobject requires an accessor wrapper. It reuses the staged tail-padding machinery, so patchset 1.2.0 does not ship it.",
          "state": "staged"
        },
        {
          "category": "template",
          "evidence": "bundles/cxx-ada-template-qualification",
          "evidence_references": [
            {
              "bundle": "cxx-ada-template-qualification",
              "cases": [],
              "path": "bundles/cxx-ada-template-qualification"
            }
          ],
          "id": "explicit-template-instantiations",
          "state": "verified-working"
        },
        {
          "category": "template",
          "evidence": "bundles/cxx-ada-template-qualification",
          "evidence_references": [
            {
              "bundle": "cxx-ada-template-qualification",
              "cases": [],
              "path": "bundles/cxx-ada-template-qualification"
            }
          ],
          "id": "external-template-instance-references",
          "note": "Aliases, fields, parameters, and results need the generated instance-package qualifier.",
          "state": "patched"
        },
        {
          "category": "name-lookup",
          "evidence": "bundles/cxx-ada-namespace-identity",
          "evidence_references": [
            {
              "bundle": "cxx-ada-namespace-identity",
              "cases": [],
              "path": "bundles/cxx-ada-namespace-identity"
            }
          ],
          "id": "namespace-collisions",
          "note": "Patchset 1.2.0 preserves complete named namespace paths in generated Ada identifiers.",
          "state": "patched",
          "upstream": "GCC PR 109260"
        },
        {
          "category": "template",
          "evidence": "bundles/cxx-ada-template-record-termination",
          "evidence_references": [
            {
              "bundle": "cxx-ada-template-record-termination",
              "cases": [],
              "path": "bundles/cxx-ada-template-record-termination"
            }
          ],
          "id": "trivial-template-record-syntax",
          "note": "Patchset 1.2.0 terminates the Convention aspect for trivial records emitted in concrete template packages.",
          "state": "patched"
        },
        {
          "category": "inheritance",
          "evidence": "panels/cxx-ada-spec/cases/interface-secondary-base",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/cases/interface-secondary-base"
            }
          ],
          "id": "multiple-inheritance-interface-secondary",
          "note": "The dumper maps a pure abstract, data-free secondary base to a limited interface; the runtime test verifies Ada dispatch and secondary-base pointer adjustment.",
          "state": "verified-working"
        },
        {
          "category": "inheritance",
          "evidence": "generated/catalog.py:concrete_multiple_inheritance,bundles/cxx-ada-concrete-multiple-inheritance,bundles/cxx-ada-virtual-diamond-layout,panels/cxx-ada-spec/cases/recursive-secondary-base",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [
                "concrete_multiple_inheritance"
              ],
              "path": "panels/cxx-ada-spec/generated/catalog.py"
            },
            {
              "bundle": "cxx-ada-concrete-multiple-inheritance",
              "cases": [],
              "path": "bundles/cxx-ada-concrete-multiple-inheritance"
            },
            {
              "bundle": "cxx-ada-virtual-diamond-layout",
              "cases": [],
              "path": "bundles/cxx-ada-virtual-diamond-layout"
            },
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/cases/recursive-secondary-base"
            }
          ],
          "id": "multiple-inheritance-concrete-secondary",
          "note": "The staged bundle maps the C++ primary base to Ada inheritance and each additional concrete base to exact nested as-base storage. Access-view conversions at nested component addresses support secondary virtual dispatch, including a secondary base that itself has concrete primary and secondary bases; dynamic virtual-base conversions remain an ABI boundary. Patchset 1.2.0 does not ship this; an unstaged compiler still omits every secondary base subobject.",
          "state": "staged-with-access-view"
        },
        {
          "category": "name-lookup",
          "evidence": "bundles/cxx-ada-enclosing-type-method-names",
          "evidence_references": [
            {
              "bundle": "cxx-ada-enclosing-type-method-names",
              "cases": [],
              "path": "bundles/cxx-ada-enclosing-type-method-names"
            }
          ],
          "id": "enclosing-type-method-name-collisions",
          "note": "Patchset 1.2.0 gives only a method that collides case-insensitively with its enclosing type a stable Method suffix while retaining the C++ external symbol.",
          "state": "patched"
        },
        {
          "category": "name-lookup",
          "evidence": "bundles/cxx-ada-profile-formal-type-names",
          "evidence_references": [
            {
              "bundle": "cxx-ada-profile-formal-type-names",
              "cases": [],
              "path": "bundles/cxx-ada-profile-formal-type-names"
            }
          ],
          "id": "profile-formal-type-name-collisions",
          "note": "Patchset 1.2.0 prefixes a formal when its Ada identifier would hide its own type, a later formal's type, or the result type.",
          "state": "patched"
        },
        {
          "category": "name-lookup",
          "evidence": "bundles/cxx-ada-visible-type-method-names",
          "evidence_references": [
            {
              "bundle": "cxx-ada-visible-type-method-names",
              "cases": [],
              "path": "bundles/cxx-ada-visible-type-method-names"
            }
          ],
          "id": "visible-type-method-name-collisions",
          "note": "Patchset 1.2.0 gives a method a stable Method suffix when its identifier collides with a type made visible from another generated class package.",
          "state": "patched"
        },
        {
          "category": "dispatch",
          "evidence": "bundles/cxx-ada-derived-virtual-slots",
          "evidence_references": [
            {
              "bundle": "cxx-ada-derived-virtual-slots",
              "cases": [],
              "path": "bundles/cxx-ada-derived-virtual-slots"
            }
          ],
          "id": "derived-class-new-virtual-slots",
          "note": "The staged bundle gives complete and deleting destructors hierarchy-stable Ada names so they override their inherited slots. Virtuals introduced later in a derived class then retain the C++ vtable indices, including through recursively nested concrete secondary bases. Patchset 1.2.0 does not ship this.",
          "state": "staged"
        },
        {
          "category": "template",
          "evidence": "panels/cxx-ada-spec/cases/uninstantiated-templates",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/cases/uninstantiated-templates"
            }
          ],
          "id": "uninstantiated-templates",
          "note": "The dumper emits no declaration until the C++ template is explicitly instantiated; the executable case proves that the explicit instance is then emitted and usable.",
          "state": "not-emitted"
        },
        {
          "category": "library",
          "evidence": "panels/cxx-ada-spec/cases/stdlib-value-facade",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/cases/stdlib-value-facade"
            }
          ],
          "id": "standard-library-nontrivial-values",
          "note": "A slim std::string-by-value dump references missing transitive Ada units. The executable case keeps std::string ownership in C++ and crosses a C-compatible data-and-length facade instead.",
          "state": "facade-required"
        },
        {
          "category": "runtime",
          "evidence": "generated/catalog.py:exception_throw,panels/cxx-ada-spec/cases/exception-interoperability",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [
                "exception_throw"
              ],
              "path": "panels/cxx-ada-spec/generated/catalog.py"
            },
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/cases/exception-interoperability"
            }
          ],
          "id": "exceptions",
          "note": "A C++ throw propagates into an Ada others handler at both optimization levels. A status-returning C facade is also verified for APIs that choose not to expose exceptions. GNAT's internal foreign-language identity API is version-dependent and is not part of this portable claim.",
          "state": "verified-runtime-interoperability"
        },
        {
          "category": "function",
          "evidence": "generated/catalog.py:operators,conversion_operators",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [
                "operators",
                "conversion_operators"
              ],
              "path": "panels/cxx-ada-spec/generated/catalog.py"
            }
          ],
          "id": "operators-conversions",
          "state": "verified-ada-compile"
        },
        {
          "category": "type-system",
          "evidence": "generated/catalog.py:free_rvalue_references,bundles/cxx-ada-qualified-method-names",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [
                "free_rvalue_references"
              ],
              "path": "panels/cxx-ada-spec/generated/catalog.py"
            },
            {
              "bundle": "cxx-ada-qualified-method-names",
              "cases": [],
              "path": "bundles/cxx-ada-qualified-method-names"
            }
          ],
          "id": "references-rvalue-references",
          "note": "Patchset 1.2.0 preserves lvalue- and rvalue-qualified method identity in stable Ada suffixes.",
          "state": "verified-ada-compile"
        },
        {
          "category": "type-system",
          "evidence": "bundles/cxx-ada-qualified-method-names,generated/catalog.py:noexcept_default_arguments",
          "evidence_references": [
            {
              "bundle": "cxx-ada-qualified-method-names",
              "cases": [],
              "path": "bundles/cxx-ada-qualified-method-names"
            },
            {
              "bundle": null,
              "cases": [
                "noexcept_default_arguments"
              ],
              "path": "panels/cxx-ada-spec/generated/catalog.py"
            }
          ],
          "id": "cv-qualifiers-noexcept",
          "note": "Patchset 1.2.0 preserves cv-qualified method identity in stable Ada suffixes; noexcept/default arguments compile.",
          "state": "verified-ada-compile"
        },
        {
          "category": "runtime",
          "evidence": "panels/cxx-ada-spec/cases/call-abi",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/cases/call-abi"
            }
          ],
          "id": "scalar-call-abi",
          "note": "Boolean, signed-char, unsigned-long-long, float, and double mappings execute at both optimization levels. Long double also executes and must match except on Linux AArch64 toolchains where GNAT and C++ use incompatible target calling conventions; that explicit boundary does not suppress the remaining ABI oracles.",
          "state": "verified-with-target-boundary"
        },
        {
          "category": "data-layout",
          "evidence": "cases/abi-layout,cases/call-abi,generated/catalog.py",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/cases/abi-layout"
            },
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/cases/call-abi"
            },
            {
              "bundle": null,
              "cases": [],
              "path": "panels/cxx-ada-spec/generated/catalog.py"
            }
          ],
          "id": "enums-bitfields-unions",
          "note": "Named enums, bit-fields, and unions compile; their size, alignment, and by-value runtime behavior are checked.",
          "state": "verified-runtime"
        },
        {
          "category": "name-lookup",
          "evidence": "generated/catalog.py:nested_class,anonymous_namespace,nested_namespace",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [
                "nested_class",
                "anonymous_namespace",
                "nested_namespace"
              ],
              "path": "panels/cxx-ada-spec/generated/catalog.py"
            }
          ],
          "id": "nested-classes-anonymous-scopes",
          "state": "verified-ada-compile"
        },
        {
          "category": "data-layout",
          "evidence": "bundles/cxx-ada-explicit-alignment",
          "evidence_references": [
            {
              "bundle": "cxx-ada-explicit-alignment",
              "cases": [],
              "path": "bundles/cxx-ada-explicit-alignment"
            }
          ],
          "id": "explicit-alignment",
          "note": "Patchset 1.2.0 emits the user-specified alignment independently of packed layout.",
          "state": "patched"
        },
        {
          "category": "inheritance",
          "evidence": "bundles/cxx-ada-virtual-inheritance-layout",
          "evidence_references": [
            {
              "bundle": "cxx-ada-virtual-inheritance-layout",
              "cases": [],
              "path": "bundles/cxx-ada-virtual-inheritance-layout"
            }
          ],
          "id": "virtual-inheritance-layout",
          "note": "The staged bundle preserves complete size, alignment, direct-member position, and virtual-base position while leaving the hidden ABI pointer as an opaque gap. Patchset 1.2.0 does not ship this.",
          "state": "staged"
        },
        {
          "category": "inheritance",
          "evidence": "bundles/cxx-ada-virtual-diamond-layout",
          "evidence_references": [
            {
              "bundle": "cxx-ada-virtual-diamond-layout",
              "cases": [],
              "path": "bundles/cxx-ada-virtual-diamond-layout"
            }
          ],
          "id": "virtual-diamond-as-base-layout",
          "note": "The staged bundle emits shortened storage types for non-polymorphic direct bases that omit their shared virtual base, preserving all visible diamond fields without duplicating the root. Patchset 1.2.0 does not ship this.",
          "state": "staged"
        },
        {
          "category": "name-lookup",
          "evidence": "bundles/cxx-ada-casefold-identity",
          "evidence_references": [
            {
              "bundle": "cxx-ada-casefold-identity",
              "cases": [],
              "path": "bundles/cxx-ada-casefold-identity"
            }
          ],
          "id": "ada-casefold-collisions",
          "note": "Patchset 1.2.0 assigns stable scope-local suffixes to later case variants and all of their references.",
          "state": "patched"
        },
        {
          "category": "name-lookup",
          "evidence": "bundles/cxx-ada-generated-name-identity",
          "evidence_references": [
            {
              "bundle": "cxx-ada-generated-name-identity",
              "cases": [],
              "path": "bundles/cxx-ada-generated-name-identity"
            }
          ],
          "id": "generated-name-collisions",
          "note": "The staged bundle reserves source spellings and gives only colliding synthesized declarations readable scope-local suffixes. It renames entities the staged ABI-layout bundles introduce and does not apply without them, so patchset 1.2.0 does not ship it.",
          "state": "staged"
        },
        {
          "category": "function",
          "evidence": "bundles/cxx-ada-qualified-method-names",
          "evidence_references": [
            {
              "bundle": "cxx-ada-qualified-method-names",
              "cases": [],
              "path": "bundles/cxx-ada-qualified-method-names"
            }
          ],
          "id": "method-cv-overloads",
          "state": "patched"
        },
        {
          "category": "function",
          "evidence": "bundles/cxx-ada-qualified-method-names",
          "evidence_references": [
            {
              "bundle": "cxx-ada-qualified-method-names",
              "cases": [],
              "path": "bundles/cxx-ada-qualified-method-names"
            }
          ],
          "id": "method-ref-qualifier-overloads",
          "state": "patched"
        },
        {
          "category": "function",
          "evidence": "bundles/cxx-ada-qualified-method-names",
          "evidence_references": [
            {
              "bundle": "cxx-ada-qualified-method-names",
              "cases": [],
              "path": "bundles/cxx-ada-qualified-method-names"
            }
          ],
          "id": "copy-move-special-members",
          "note": "Patchset 1.2.0 gives move assignment a distinct Ada name.",
          "state": "patched"
        },
        {
          "category": "type-system",
          "evidence": "bundles/cxx-ada-member-pointers",
          "evidence_references": [
            {
              "bundle": "cxx-ada-member-pointers",
              "cases": [],
              "path": "bundles/cxx-ada-member-pointers"
            }
          ],
          "id": "data-member-pointers",
          "note": "Patchset 1.2.0 preserves the Itanium ABI ptrdiff_t offset, including its -1 null representation; dereferencing remains a C++ operation.",
          "state": "patched"
        },
        {
          "category": "type-system",
          "evidence": "bundles/cxx-ada-member-pointers",
          "evidence_references": [
            {
              "bundle": "cxx-ada-member-pointers",
              "cases": [],
              "path": "bundles/cxx-ada-member-pointers"
            }
          ],
          "id": "member-function-pointers",
          "note": "Patchset 1.2.0 preserves the opaque two-word Itanium ABI representation, including nonvirtual, virtual, and null values; invocation remains a C++ operation.",
          "state": "patched"
        },
        {
          "category": "type-system",
          "evidence": "bundles/cxx-ada-char8-type",
          "evidence_references": [
            {
              "bundle": "cxx-ada-char8-type",
              "cases": [],
              "path": "bundles/cxx-ada-char8-type"
            }
          ],
          "id": "extended-character-types",
          "note": "Patchset 1.2.0 maps C++20 char8_t to ABI-equivalent Interfaces.C.unsigned_char; wchar_t, char16_t, and char32_t retain their existing mappings.",
          "state": "patched"
        },
        {
          "category": "type-system",
          "evidence": "bundles/cxx-ada-vector-types,generated/catalog.py:complex_and_vector",
          "evidence_references": [
            {
              "bundle": "cxx-ada-vector-types",
              "cases": [],
              "path": "bundles/cxx-ada-vector-types"
            },
            {
              "bundle": null,
              "cases": [
                "complex_and_vector"
              ],
              "path": "panels/cxx-ada-spec/generated/catalog.py"
            }
          ],
          "id": "complex-vector-types",
          "note": "Complex float types already map to Ada.Numerics complex units without a patch. The staged bundle replaces vector placeholders with aligned GNAT machine-vector arrays, and free and C-wrapper profiles use the direct vector calling convention. Patchset 1.2.0 does not ship it: the same printer fix also emits a callable Convention => CPP binding for a vector-bearing C++ method, and direct Ada dispatch through it is not portable across the tested compiler/target matrix.",
          "state": "staged"
        },
        {
          "category": "type-system",
          "evidence": "bundles/cxx-ada-anonymous-enums",
          "evidence_references": [
            {
              "bundle": "cxx-ada-anonymous-enums",
              "cases": [],
              "path": "bundles/cxx-ada-anonymous-enums"
            }
          ],
          "id": "anonymous-enum-constants",
          "note": "Patchset 1.2.0 emits sequential enumerations or integer-subtype constants and maps signature references consistently to the synthetic type.",
          "state": "patched"
        },
        {
          "category": "type-system",
          "evidence": "bundles/cxx-ada-int128-types",
          "evidence_references": [
            {
              "bundle": "cxx-ada-int128-types",
              "cases": [],
              "path": "bundles/cxx-ada-int128-types"
            }
          ],
          "id": "integer-128",
          "note": "Patchset 1.2.0 backports GCC 15's prefix recognition to GCC 13 and 14; GCC 15 and 16 are known-good controls.",
          "state": "patched"
        },
        {
          "category": "template",
          "evidence": "generated/catalog.py:partial_specialization,full_specialization",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [
                "partial_specialization",
                "full_specialization"
              ],
              "path": "panels/cxx-ada-spec/generated/catalog.py"
            }
          ],
          "id": "class-template-specializations",
          "note": "Patchset 1.2.0 terminates the generated trivial records.",
          "state": "patched"
        },
        {
          "category": "template",
          "evidence": "bundles/cxx-ada-template-nested-types",
          "evidence_references": [
            {
              "bundle": "cxx-ada-template-nested-types",
              "cases": [],
              "path": "bundles/cxx-ada-template-nested-types"
            }
          ],
          "id": "advanced-template-parameters",
          "note": "Patchset 1.2.0 declares anonymous array field types inside concrete packages with non-type or defaulted template arguments.",
          "state": "patched"
        },
        {
          "category": "template",
          "evidence": "generated/catalog.py:template_template_parameter",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [
                "template_template_parameter"
              ],
              "path": "panels/cxx-ada-spec/generated/catalog.py"
            }
          ],
          "id": "template-template-parameters",
          "note": "Patchset 1.2.0 terminates the generated trivial record.",
          "state": "patched"
        },
        {
          "category": "template",
          "evidence": "generated/catalog.py:nested_template,alias_template,constrained_template",
          "evidence_references": [
            {
              "bundle": null,
              "cases": [
                "nested_template",
                "alias_template",
                "constrained_template"
              ],
              "path": "panels/cxx-ada-spec/generated/catalog.py"
            }
          ],
          "id": "nested-alias-constrained-templates",
          "note": "Patchset 1.2.0 terminates trivial records and maps alias-template instances to the concrete type in their generated packages.",
          "state": "patched"
        }
      ],
      "gcc_versions": [
        "13.2.0",
        "14.2.0",
        "15.3.0",
        "16.2.0"
      ],
      "panel": "cxx-ada-spec",
      "schema": 2
    },
    "readme": "# C++ to Ada specification feature panel\n\nThis panel turns exploratory `g++ -fdump-ada-spec` observations into repeatable\nevidence. It separates three outcomes that need different treatment:\n\n- a supported mapping, which gets a positive end-to-end C++/Ada case;\n- a mapper defect, which gets an independent patch bundle with an executable\n  before/after regression;\n- a C++ construct Ada cannot represent directly, which is documented as a\n  facade boundary rather than disguised as a mapper bug.\n\n`matrix.toml` records feature-level conclusions. `coverage.toml` assigns every\natomic probe to a feature group, lists the runtime oracles, and states the\nremaining limits. `generated/coverage.py` fails if a catalog probe is omitted\nor assigned twice.\n\nThe panel runs in three states. `unpatched` characterizes the pinned upstream\ncompiler. `patched` is a compiler carrying exactly patchset `1.2.0`, which is\nwhat a release ships. `staged` additionally carries the staged bundles listed\nunder [staged subjects](#staged-subjects). A `patched` run makes no claim about\na staged subject: it reports those suites as skipped rather than asserting\neither the defect or the fix.\n\nThe executable panel currently has four layers:\n\n- 63 isolated atomic probes cover types and layout, pointers and functions,\n  templates, inheritance, names and linkage, and runtime/storage declarations.\n  Each probe runs in its own directory, so one malformed dump cannot mask a\n  later feature. Required declarations are checked before the generated Ada is\n  compiled. Versioned expectation files distinguish successful mappings from\n  repeatable invalid Ada and omissions.\n- 16 generated cases cover all 88 value pairs across payload kind, reference\n  carrier, C++ scope, qualifier, and full/slim dump mode. This is pairwise\n  interaction coverage, not a hand-selected sample.\n- 32 fixed-seed grammar cases combine three to seven declarations per\n  translation unit, with periodic inheritance and overload clusters. They\n  exercise higher-order interactions in the currently representable subset and\n  alternate full and slim dump modes.\n- Twenty-one shipped runtime suites, plus nine staged ones, link C++ and Ada at\n  `-O0` and `-O2`. They check scalar,\n  enum, record, union, pointer, reference, and callback calling conventions;\n  object size, alignment, and field offsets; ordinary, interface, and concrete\n  secondary-base virtual dispatch, including recursively nested concrete bases;\n  template qualification, record termination,\n  nested types, explicit\n  alignment, namespace and method identity—including enclosing-type,\n  use-visible type/method, and subprogram-profile collisions—anonymous\n  enumeration values, and\n  `char8_t`, 128-bit integers, and opaque pointer-to-member\n  values; uninstantiated-template emission, a nontrivial standard-library value\n  facade, C++ exception propagation into an Ada handler; and the exact behavior\n  of known defects.\n\nThe call-ABI suite reports the `long double` result separately. On Linux\nAArch64 with the pinned GCC 13--15 toolchains, GNAT and C++ disagree on that\ntarget calling convention even though the mapper emits the standard\n`Interfaces.C.long_double` declaration. That target/runtime boundary is\nreported explicitly instead of stopping the suite, so enum, record, union,\npointer, reference, and callback oracles still execute. A mismatch on any\nother target remains a failure.\n\nThe defect regressions reproduce malformed template records before patching,\nanonymous nested template types before patching, anonymous enum omissions\nbefore patching, pointer-to-member syntax failures, standalone empty-class\nstorage drift, inherited tail-padding drift, explicit alignment before\npatching, virtual-inheritance, virtual-diamond, and concrete\nmultiple-inheritance layout drift, unsigned 128-bit integer failures on GCC 13\nand 14 before patching, and several version- or type-specific omissions.\nIndependent problems must become independent patch bundles.\n\nThe coverage summary reports all three baselines. Patchset `1.2.0` leaves two\natomic cases classified non-passing on every supported major:\n`concrete_multiple_inheritance` and `complex_and_vector`, whose subjects are\nstaged. A staged compiler passes all 63.\n\nThat atomic case does not merely require legal Ada. Dropping both base\nsubobjects also compiles, so the case requires the primary base as Ada\ninheritance and the secondary base as its own storage view; a compiler without\nthe staged bundle reports `spec-mismatch`, not a false `pass`.\n\nIts C++ classes declare virtual destructors deliberately. Without one the\nmapper emits no base list at all, so both base subobjects vanish from the Ada\nrecord even with the staged layout bundles applied. That is a distinct gap from\nthe one this probe characterizes and is recorded under `coverage.toml` limits;\nit has no bundle yet.\n\nThe confirmed-history ledger is larger than that residual atomic count:\ntwenty-two independent C++ mapper defects have bundles introduced for 1.2.0 —\nfourteen accepted into the patchset and eight staged — and no confirmed\nfixed-layout runtime defect remains. Every linked bundle, accepted or staged,\ncontains the offending C++, the unpatched Ada output, the corrected Ada output,\nand an executable `-O0`/`-O2` before/after regression:\n\n- [`cxx-ada-template-qualification`](../../bundles/cxx-ada-template-qualification/README.md): references outside a concrete template package lose their instance qualifier;\n- [`cxx-ada-template-record-termination`](../../bundles/cxx-ada-template-record-termination/README.md): trivial concrete template records leave their Convention aspect unterminated;\n- [`cxx-ada-explicit-alignment`](../../bundles/cxx-ada-explicit-alignment/README.md): explicitly over-aligned records retain only their natural Ada alignment;\n- [`cxx-ada-namespace-identity`](../../bundles/cxx-ada-namespace-identity/README.md): distinct named C++ namespaces collapse into duplicate Ada identifiers;\n- [`cxx-ada-qualified-method-names`](../../bundles/cxx-ada-qualified-method-names/README.md): cv/ref-qualified overloads and move assignment collapse onto Ada homographs;\n- [`cxx-ada-casefold-identity`](../../bundles/cxx-ada-casefold-identity/README.md): C++ identifiers differing only by case collide in Ada;\n- [`cxx-ada-template-nested-types`](../../bundles/cxx-ada-template-nested-types/README.md): anonymous field types are emitted outside the concrete template package that needs them;\n- [`cxx-ada-anonymous-enums`](../../bundles/cxx-ada-anonymous-enums/README.md): top-level anonymous enumerators and their synthetic type are omitted;\n- [`cxx-ada-char8-type`](../../bundles/cxx-ada-char8-type/README.md): `char8_t` maps to a nonexistent Ada identifier;\n- [`cxx-ada-int128-types`](../../bundles/cxx-ada-int128-types/README.md): GCC 13 and 14 fail to recognize the unsigned internal 128-bit type name;\n- [`cxx-ada-member-pointers`](../../bundles/cxx-ada-member-pointers/README.md): data- and function-member pointer representations are emitted without Ada types;\n- [`cxx-ada-enclosing-type-method-names`](../../bundles/cxx-ada-enclosing-type-method-names/README.md): a method collides case-insensitively with its enclosing Ada type;\n- [`cxx-ada-profile-formal-type-names`](../../bundles/cxx-ada-profile-formal-type-names/README.md): a formal hides its own, a later formal's, or the result type;\n- [`cxx-ada-visible-type-method-names`](../../bundles/cxx-ada-visible-type-method-names/README.md): a method hides a type made visible from another generated class package.\n\n### Staged subjects\n\nPatchset `1.2.0` does not ship these. They carry the same evidence as an\naccepted bundle and run in the panel's `staged` state; a `patched` run skips\nthem and their nine runtime suites.\n\n- [`cxx-ada-inherited-tail-padding`](../../bundles/cxx-ada-inherited-tail-padding/README.md): Ada inheritance prevents C++ reuse of base tail padding and moves derived fields;\n- [`cxx-ada-empty-class-storage`](../../bundles/cxx-ada-empty-class-storage/README.md): empty complete objects receive zero storage while overlapping empty subobjects are represented as ordinary fields;\n- [`cxx-ada-virtual-inheritance-layout`](../../bundles/cxx-ada-virtual-inheritance-layout/README.md): virtual bases lose complete size, alignment, and field positions;\n- [`cxx-ada-virtual-diamond-layout`](../../bundles/cxx-ada-virtual-diamond-layout/README.md): direct diamond bases incorrectly include their shared virtual base as complete storage;\n- [`cxx-ada-concrete-multiple-inheritance`](../../bundles/cxx-ada-concrete-multiple-inheritance/README.md): additional concrete bases are emitted as illegal Ada progenitors instead of nested ABI storage;\n- [`cxx-ada-derived-virtual-slots`](../../bundles/cxx-ada-derived-virtual-slots/README.md): class-specific destructor names shift later derived virtuals away from their C++ vtable slots;\n- [`cxx-ada-generated-name-identity`](../../bundles/cxx-ada-generated-name-identity/README.md): readable synthesized names collide with user-written methods, aliases, formals, layout helpers, class packages, and special members;\n- [`cxx-ada-vector-types`](../../bundles/cxx-ada-vector-types/README.md): machine vectors map to placeholders that cannot appear in profiles.\n\nThe following list is only the work still open or intentionally bounded, not\nthe complete defect history.\n\nThe remaining confirmed inventory is deliberately explicit:\n\n- tested semantic boundaries rather than hidden mapper successes:\n  uninstantiated templates are not emitted, nontrivial standard-library values\n  require a facade, and dynamic virtual-base conversions remain ABI operations.\n  C++ exception propagation is tested and supported through Ada's portable\n  `others` handler. GNAT's internal API for recovering the foreign language\n  identity varies by runtime version and is not claimed as portable behavior;\n  Linux AArch64 `long double` interoperability on affected GNAT releases is a\n  compiler call-ABI boundary, not a mapper-spelling success. Direct Ada\n  dispatch to vector-bearing C++ methods likewise requires a C++ wrapper,\n  because tested GNAT versions do not classify that method ABI consistently;\n  the vector bundle is staged rather than shipped because its printer fix\n  still emits that unproven method binding as callable Ada.\n\nRun the complete current panel against a compiler root:\n\n```sh\n./panels/cxx-ada-spec/run-panel.sh TOOLCHAIN_ROOT GCC_VERSION unpatched\n```\n\nUse `patched` after applying patchset `1.2.0`, and `staged` after additionally\napplying the staged bundles with `scripts/apply-staged.sh`. An expected\npre-patch compiler rejection counts as a passing defect characterization; a\npatched or staged run must generate compilable Ada and execute its consumer for\nevery subject that state covers.\n\nThe matrix is deliberately broader than the current patchset. New confirmed\ndefects must become independent `bundles/<id>/` entries instead of being folded\ninto the template-qualification patch. The panel is operationally broad but not\nmathematically exhaustive; `coverage.toml` explicitly lists constructs still\nrequiring probes or runtime ABI oracles.\n",
    "readme_path": "panels/cxx-ada-spec/README.md",
    "summary": "This panel turns exploratory g++ -fdump-ada-spec observations into repeatable evidence. It separates three outcomes that need different treatment:",
    "title": "C++ to Ada specification feature panel"
  },
  "publication_checked": true,
  "repository_url": "https://github.com/flyology-ada/gnat-patches",
  "schema_version": 1
}
