)]}'
{
  "log": [
    {
      "commit": "6203366023ffdbb0d9d92f6e1ee44516fb848de8",
      "tree": "bb1f3a03c203dec787671811e2c795bf14a98d98",
      "parents": [
        "addae216a5dd37c81eacabf7c40ef94e7b98a00d"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 15 13:44:24 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 15 17:17:38 2026 +0100"
      },
      "message": "R: Filter \"using C/C++ compiler:\" banner from R CMD SHLIB output\n\nR 4.3.0 and later print a \"using C compiler: ...\" / \"using C++ compiler: ...\"\nbanner via message() (stderr) on every R CMD SHLIB compile. The R example and\ntest-suite rules already redirect SHLIB stdout to /dev/null to hide the old\ncompiler echo, but the new banner goes to stderr, so it leaked into the logs -\nhundreds of lines per test-suite run.\n\nFilter just those banner lines out of stderr in the r and r_cpp rules while\nkeeping genuine compiler errors and warnings, and preserve the SHLIB exit\nstatus so a failed compile still fails the rule.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "addae216a5dd37c81eacabf7c40ef94e7b98a00d",
      "tree": "dfef1232f1987314fbc5d90c6cc3b7f6bcf24956",
      "parents": [
        "9b641e0b40f8a0da8ab552a7116a6060f56ef4fd"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 15 09:51:49 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 15 09:51:49 2026 +0100"
      },
      "message": "swig-conventions: document CHANGES.current entry conventions\n"
    },
    {
      "commit": "9b641e0b40f8a0da8ab552a7116a6060f56ef4fd",
      "tree": "0817aa7303c76be21ca7d75674a971fb49d744eb",
      "parents": [
        "f646ab96d96a168bfd0e570eb777cf1ee9a04602"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 15 07:52:46 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 15 08:52:25 2026 +0100"
      },
      "message": "R: Honour %rename of an enum for the generated R enum name\n\nR::enumDeclaration built the enum name passed to defineEnumeration from\nthe enum\u0027s C++ name, so %rename was ignored for the R enum name: a\nrenamed enum was registered under its original name while its enum item\nnames used the renamed name. Use sym:name for the final name component,\nkeeping any C++ scope.\n\nThe enum class name emitted for the $R_class typemap special variable\n(used by enumFromInteger / enumToInteger in the generated accessors) was\nsimilarly built from the C++ name. Substitute the renamed name there too\nvia replaceRClass, using Language::enumLookup to find the enum, so the\naccessor coercions and defineEnumeration agree on the enum name.\n\nUpdate the cpp11_strongly_typed_enumerations R runme to expect the\nrenamed enum name _Enum18 and remove the known-limitation TODO.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "f646ab96d96a168bfd0e570eb777cf1ee9a04602",
      "tree": "68b1c956d45338aa1a72b6a9e0b8047c15777b25",
      "parents": [
        "32a3e5b4642ef03ae64c2bb4aeffb647b01f1943"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 15 00:02:12 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 15 08:51:28 2026 +0100"
      },
      "message": "Go: Honour %rename of an enum for the generated Go type name\n\ngoEnumName built the Go enum type name from the enum\u0027s C++ name, so\n%rename was ignored for the Go type. Use sym:name for the final name\ncomponent, keeping any C++ scope.\n\nA side effect is that a typedef named enum, \"typedef enum class Foo {...}\nBar;\", now uses the typedef name Bar for the Go type as well as for its\nenum item constants, matching the other target languages.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "32a3e5b4642ef03ae64c2bb4aeffb647b01f1943",
      "tree": "d04a5091df0f0f6a77504f5af2835a2d95861813",
      "parents": [
        "b161e2dcc6a92d46ce0ec09c899a80d6dc1a03cb"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 15 00:01:55 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 15 00:24:05 2026 +0100"
      },
      "message": "R: Honour %rename of enum items in the generated R code\n\nR::enumvalueDeclaration built the enum item label passed to\ndefineEnumeration from the C++ name rather than sym:name, so %rename of an\nenum item was not honoured in the generated R code. Use sym:name for the\nlabel.\n\nAdd test coverage for %rename of an enum class and an enum item to the\ncpp11_strongly_typed_enumerations runme of every target language that has\none, locking in the behaviour for the languages that were already correct.\nThe enum_thorough R runme now checks the renamed enum item too.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "b161e2dcc6a92d46ce0ec09c899a80d6dc1a03cb",
      "tree": "2b48b751b3c8a73b76dc714d9d771a30cbd7f20d",
      "parents": [
        "6c8cb38efec16a01110629eb8c0580b0d97cc068"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Tue Jul 14 22:20:15 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 15 00:24:05 2026 +0100"
      },
      "message": "[R] Review follow up for scoped enum fix\n\nSimplify the enum name prefixing in R::enumValue() - the Copy() calls were\nnot needed as Setattr() adds a reference and setting sym:name to the value it\nalready holds is a no-op, so both copies leaked.\n\nAdd a CHANGES.current entry and note in the test that %rename is not honoured\nin the generated R code, which the test currently expects.\n\nAssisted-by: Claude Opus 4.8\n"
    },
    {
      "commit": "6c8cb38efec16a01110629eb8c0580b0d97cc068",
      "tree": "846c2f6363ea0666c0d2b6c19d5e18aae7f25572",
      "parents": [
        "5124908ed52d466627f7c0969b6bb14a09c43490"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Wed May 20 11:52:27 2026 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 15 00:24:05 2026 +0100"
      },
      "message": "R: Fix non-class scoped enums\n\nIn R::enumValue() (Source/Modules/r.cxx:2749), for non-class scoped enums\n(enum class at file scope), the enum value name was being prefixed twice:\n\n1. R::enumValue() manually prefixes sym:name with the parent enum name via\n   Swig_name_member(0, parent_sym:name, symname) giving VarType_Discretized\n2. Then Language::variableWrapper() prefixes again via EnumClassPrefix (set\n   by Language::enumDeclaration for scoped enums) giving\n   VarType_VarType_Discretized\n\nThis caused the C wrapper function to be named\nR_swig_VarType_VarType_Discretized_get while the R .Call referenced\nR_swig_VarType_Discretized_get, a mismatch that crashed at runtime.\n\nIn R::enumValue(), for scoped enums, skip the manual prefixing and let\nLanguage::variableWrapper() handle it through the EnumClassPrefix mechanism\n(which already exists for this purpose).\n\nCloses #2984\n"
    },
    {
      "commit": "5124908ed52d466627f7c0969b6bb14a09c43490",
      "tree": "d85706b384aef8adfda252bbeb3a10ec4cbc366f",
      "parents": [
        "7201136121a92ec67dac9168e2c38f145c65720c"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sun Jul 12 15:53:03 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Tue Jul 14 20:16:23 2026 +0100"
      },
      "message": "[Lua] Remove unused director helper functions\n\nSWIG_Lua_director_has_method() and SWIG_Lua_director_call_method() in\ndirector.swg are not referenced by the generated code or anywhere else. The\ngenerated director methods look up the method override themselves, via\nSWIG_Lua_get_director_override(), and make the lua_pcall() inline.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "7201136121a92ec67dac9168e2c38f145c65720c",
      "tree": "c502e39157731b600f7e16e4c2ac8893980f6f09",
      "parents": [
        "294c944c104edf4ceea01c207e16cb12ddefeaf2"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sun Jul 12 09:42:53 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Tue Jul 14 20:16:20 2026 +0100"
      },
      "message": "[Lua] Add director support for Lua 5.1 and LuaJIT\n\nDirectors store the table of Lua method overrides for an object in the\nuserdata\u0027s uservalue. Uservalues were added in Lua 5.2, so directors did not\ncompile at all for Lua 5.1 or LuaJIT, failing with:\n\n  error: \u0027lua_getuservalue\u0027 was not declared in this scope\n  error: \u0027lua_setuservalue\u0027 was not declared in this scope\n\nUservalues replaced the userdata environments of Lua 5.1, so use the\nenvironment functions, lua_getfenv and lua_setfenv, when wrapping for Lua 5.1.\n\nThe two are not quite interchangeable and simply defining lua_getuservalue to\nlua_getfenv is subtly wrong. A new userdata has no uservalue (nil) in Lua 5.2\nand later, but in Lua 5.1 it inherits the environment of the C function\ncreating it, which turns out to be Lua\u0027s package table, shared by every\nuserdata the module creates. The \"is there a table of overrides yet?\" test\nwould then always succeed and every object\u0027s overrides would be written into\nthat one shared table - overrides set on one object would be seen by all other\nobjects and the package table would be corrupted. So the tables created for\noverrides are marked with a key that is not a valid C++ method name, and an\nunmarked environment is reported as nil to match Lua 5.2.\n\nThe override lookup was inlined into every generated director method, so it is\nnow generated as a call to a new SWIG_Lua_get_director_override() in\ndirector.swg instead. This puts the uservalue handling in one place and makes\nthe generated code smaller.\n\nThe Lua examples and the whole Lua test-suite, including all the director\ntests, now pass with Lua 5.1, and continue to pass with Lua 5.3. A director\nwrapper also compiles against LuaJIT\u0027s headers.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "294c944c104edf4ceea01c207e16cb12ddefeaf2",
      "tree": "f26d30283f26ebb42295aec5972c8aca5ebcc0e6",
      "parents": [
        "3c29f45e9e69b32fd07a6862ce5cb616e9af942e"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 13 21:48:46 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Tue Jul 14 20:15:39 2026 +0100"
      },
      "message": "[Lua] Restore Lua 5.1 and LuaJIT compatibility for non-director wrapping\n\nthe new Lua directors feature uses lua_setuservalue, added in Lua 5.2.\nRemoving the LUA_VERSION_NUM-guarded compatibility defines for lua_rawlen,\nlua_pushglobaltable and lua_rawsetp/lua_rawgetp from Lib/lua/luarun.swg.\n\nLuaJIT implements the Lua 5.1 API and, per its own documentation, is\n\"API+ABI-compatible with Lua 5.1, which prevents implementing features\nthat would otherwise break the Lua/C API and ABI\" (https://luajit.org/extensions.html,\n\"Extensions from Lua 5.2\" section) - so it never defines these Lua 5.2 additions.\nNoticed when rebuilding obs-studio\u0027s LuaJIT-based Lua bindings against SWIG master.\n\nRestore those compatibility defines, scoped to 5.1 and later only (the old\nLua 5.0-only shims are not restored).\n\nAlso revert an incidental ok!\u003dLUA_OK comparison introduced by #3394\nback to ok!\u003d0, since LUA_OK isn\u0027t defined pre-5.2 either and luaL_dostring()\nalready returns 0 on success on every Lua version.\n\nFix the examples and test-suite where they themselves used Lua 5.2 only\nfeatures: LUA_OK in Examples/lua/embed/embed.c, _ENV in helpers.lua, and\nstring.format(\"%c\", ...) in li_cdata_bytes, which yields an empty string for a\nNUL byte in Lua 5.1 as strlen() is applied to the formatted result, so\nstring.char() is used instead.\n\nDirectors continue to require Lua 5.2 or later and are unaffected by this\nchange; the Lua 5.1 director test failures are addressed separately.\n\nAssisted-by: Claude Code (Sonnet 5)\n"
    },
    {
      "commit": "3c29f45e9e69b32fd07a6862ce5cb616e9af942e",
      "tree": "cb60995a8cf1d57f1c4b942648c9d57903e8d960",
      "parents": [
        "71b007e200925b45dae62b5f2ca898c5b896ea66"
      ],
      "author": {
        "name": "Erez Geva",
        "email": "ErezGeva2@gmail.com",
        "time": "Tue Jul 14 20:51:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 19:51:18 2026 +0100"
      },
      "message": "Fix li_stdint test (#3494)\n\nConverting signed to unsigned may change the value\n\nConverting signed to unsigned may change the value.\n\nThe test need to pass values unchanged.\nAs long as the values are in the type range!\nConverting signed to unsigned we may convert the value to a different one if the value is outside the range.\nThough the test fails. For example on i386\n\nuint16_td(0xffff) \u003d\u003e 0x7fff + 1\n\n\nSigned-off-by: Erez Geva \u003cErezGeva2@gmail.com\u003e"
    },
    {
      "commit": "71b007e200925b45dae62b5f2ca898c5b896ea66",
      "tree": "ee61923ae55cb4ff39018611018b81a064b536ec",
      "parents": [
        "c3abc3e5e12f412ec14bb89ef4bb829c53ba2cdf"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 21:54:32 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 23:05:36 2026 +0100"
      },
      "message": "Python testing tweaks\n\nSwitch the variety of odd python-3.13 tests to python-3.14.\nAdd python-3.15 - can fail (continue-on-error) until it is out of beta.\n"
    },
    {
      "commit": "c3abc3e5e12f412ec14bb89ef4bb829c53ba2cdf",
      "tree": "9bfbaa499e0159a29c8d8b35c3bc4289576212c1",
      "parents": [
        "6fdc361f8fbf7dbe6d28a4a9696f9ae8960a5826"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 20:09:47 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 23:05:36 2026 +0100"
      },
      "message": "add lua 5.5 on ubuntu testing\n"
    },
    {
      "commit": "6fdc361f8fbf7dbe6d28a4a9696f9ae8960a5826",
      "tree": "ec30a68c9d8b5e0e759cc000fbfc1916e6df020e",
      "parents": [
        "f156c9990752e16045616854fd3b5923cd5edc50"
      ],
      "author": {
        "name": "Erez Geva",
        "email": "ErezGeva2@gmail.com",
        "time": "Sat Jul 11 12:07:49 2026 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 23:04:57 2026 +0100"
      },
      "message": "Add MacOS GHA lua test (#3491)\n"
    },
    {
      "commit": "f156c9990752e16045616854fd3b5923cd5edc50",
      "tree": "deb2537fa7b5e074f54b91abc2c42d85cecc682b",
      "parents": [
        "6cd8779506b39f898e80042f615082cde2c17518"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 13:08:31 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 21:02:49 2026 +0100"
      },
      "message": "Fix protected/private nested class referenced in generated upcast helper\n\nReported on the swig-devel mailing list during early testing of swig-4.5,\nwhere CrossWire SWORD\u0027s Perl bindings (GBFHTMLHREF::MyUserData deriving\nfrom BasicFilterUserData) failed to build: a protected or private nested\nclass deriving from a class used elsewhere in the wrapped API could produce\na runtime upcast helper function referencing the nested class by its\ninaccessible qualified name, a C++ compile error. No target language ever\nwraps a non-public nested class, so typepass.cxx now simply skips\nregistering it for the cast table. Fixes it for Lua too, which hits the\nsame bug as Perl/Python/Ruby/Tcl despite having full nested class support,\nsince Java/C# are structurally immune (they don\u0027t use SWIG\u0027s generic\nruntime type table at all). Added regression tests to nested_scope.i and\ndirector_protected.i (covering directors/dirprot), with a runtime check in\nevery director_protected runme confirming polymorphic dispatch through the\nwrapped base still works correctly.\n\nAssisted-by: Claude Code (Sonnet 5)\n"
    },
    {
      "commit": "6cd8779506b39f898e80042f615082cde2c17518",
      "tree": "b94b047058f2da48a1bae6bce9f850f2a01020e7",
      "parents": [
        "d0abb87916dd3d2255e1b5268a0c8b9266bd6c3e"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 09:31:44 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 09:31:44 2026 +0100"
      },
      "message": "Fix -Wunused-variable\n"
    },
    {
      "commit": "d0abb87916dd3d2255e1b5268a0c8b9266bd6c3e",
      "tree": "8747d7ea6b237825270b5242aca74d5584d6c5eb",
      "parents": [
        "54ac29eb019c9c5a24332037cbfc9de1195b2ead"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 01:21:46 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 01:45:15 2026 +0100"
      },
      "message": "Fix Wunused-but-set-variable in test-suite\n"
    },
    {
      "commit": "54ac29eb019c9c5a24332037cbfc9de1195b2ead",
      "tree": "f3f5ab591469c71d54edb28b3055f8d6ff980ac2",
      "parents": [
        "659802a885bcaeb078a68bfce7803a3b51f16f94"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 01:16:45 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 01:45:15 2026 +0100"
      },
      "message": "Update php tests for additionally generated classes/functions\n"
    },
    {
      "commit": "659802a885bcaeb078a68bfce7803a3b51f16f94",
      "tree": "d0ce6d241e3b2bc8f0a92fe78bbb2c43f2e7e3e9",
      "parents": [
        "223728eef8931f3c70e9368954a54aa2ad96337d"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 01:12:10 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 01:45:15 2026 +0100"
      },
      "message": "Remove debug from operator_overload_break testcase seen in Lua\n"
    },
    {
      "commit": "223728eef8931f3c70e9368954a54aa2ad96337d",
      "tree": "5827f72022afb099bfebe2909662446b90426c55",
      "parents": [
        "ee983ff306ec2121b29c51aa31a6afaad454a6e2"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 00:57:36 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 01:44:50 2026 +0100"
      },
      "message": "Install correct version of pcre - required for swig-4.1.0 and later for ubuntu-26.04\n"
    },
    {
      "commit": "ee983ff306ec2121b29c51aa31a6afaad454a6e2",
      "tree": "84219479bfb8cdd8b773aaca93cd7c6a2db91fc8",
      "parents": [
        "f5ba8c1fdcfce2284ddffd45785391d6e440efa1"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 00:17:14 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 01:44:50 2026 +0100"
      },
      "message": "Test tcl-9.0 on ubuntu 26.04\n"
    },
    {
      "commit": "f5ba8c1fdcfce2284ddffd45785391d6e440efa1",
      "tree": "f86453eacd08b05ce5713a116de8ee57863c4426",
      "parents": [
        "e4f58c1ee55103e712c40c71dd59b50664b7e5a9"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Fri Jul 10 23:44:11 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 01:44:50 2026 +0100"
      },
      "message": "Tcl: fix build failure on Tcl 9 using Tcl_NewSizeIntObj\n\nTcl_NewSizeIntObj is not a real Tcl API in any version. The official\n\"Migrating C extensions to Tcl 9\" guide states there is no complementary\ncreation function for Tcl_GetSizeIntFromObj and that Tcl_NewWideIntObj\nshould be used to wrap Tcl_Size values. See\nhttps://core.tcl-lang.org/tcl/wiki?name\u003dMigrating+C+extensions+to+Tcl+9.\nThe Tcl_NewWideIntObj API is available from tcl-8.4 (2002).\n"
    },
    {
      "commit": "e4f58c1ee55103e712c40c71dd59b50664b7e5a9",
      "tree": "7ae3663262d1847b97dce6075ba4587fc8dfd71d",
      "parents": [
        "7938b51aea860bb98486ad31342b0050354c1c86"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Fri Jul 10 23:33:09 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 11 01:44:37 2026 +0100"
      },
      "message": "Fix tclsh interpreter name in configure\n\nFix for when multiple interpreters are installed, such as 8.6 and 9.0 on Ubuntu\n"
    },
    {
      "commit": "7938b51aea860bb98486ad31342b0050354c1c86",
      "tree": "d732f7d6b6f32d3ca70910b604242e9ee314e4fc",
      "parents": [
        "3dda830ac9da5a492b1849c5b003904898b4fd53"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jul 09 21:53:57 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jul 09 21:55:58 2026 +0100"
      },
      "message": "swig-conventions: document CHANGES.current target language bracket tag\n\nNote that a CHANGES.current entry affecting only certain target languages is\ntagged with the affected language(s) in square brackets at the start of the\nentry, kept on one line, and that the tag is omitted for changes affecting all\nor most languages, the parser or the core.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "3dda830ac9da5a492b1849c5b003904898b4fd53",
      "tree": "91ec4b148b48dd5cb042737cb757d0049e5744ea",
      "parents": [
        "39984b23685ce280896735ac76a193bf037ac598"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jul 09 20:43:12 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jul 09 21:55:58 2026 +0100"
      },
      "message": "Add char *\u0026 string typemaps to all languages and char_strings runme parity\n\nA \u0027char *\u0026\u0027 (a reference to a char pointer) was only marshalled as a string by\nC#, D, Go, Java and PHP; every other language treated it as an opaque char **\npointer.  Add char *\u0026 string typemaps to the languages that were missing them,\nso a char *\u0026 function argument, return value or variable is marshalled as a\nstring in every target language.  SWIG\u0027s const reference stripping means this\nalso covers char *const\u0026.\n\n- Lib/typemaps/strings.swg: add Char *\u0026 to the %typemaps_string in, freearg,\n  out, typecheck and director typemaps.  This gives char *\u0026 to the languages\n  that use the Unified Typemap Library (Python, Ruby, Perl, Tcl, Octave, Scilab,\n  R and JavaScript).  The shared in typemap now casts \u0026buf to $1_ltype so that a\n  const char * reference hidden behind a typedef also compiles.\n- Lib/lua/luatypemaps.swg, Lib/guile/typemaps.i, Lib/ocaml/ocaml.swg: these\n  define their own char * string typemaps; give each char *\u0026 and const char *\u0026\n  in/out/freearg typemaps too.\n- Lib/r/rtype.swg: the C wrapper returned the char *\u0026 string correctly but the R\n  proxy wrapped it as an undefined _p_p_char S4 class; add char *\u0026 to the\n  scoerceout char list so it is returned as a plain character value.\n\nchar_strings.i is now exercised by a runme in every target language, all testing\nthe same set of functions (get/set/pingpong/global variables and all four char *\u0026\nfunctions), giving complete char *\u0026 typemap coverage and testing.\n\nWhere a language genuinely cannot support part of the char array portion of the\ntest (a char[] global has no varin typemap in most scripting languages, a char[16]\nparameter is bounds checked, and Guile/OCaml reject char[] parameters), that one\nassertion is adapted or skipped with an inline comment; the char *\u0026 coverage is\ncomplete everywhere.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "39984b23685ce280896735ac76a193bf037ac598",
      "tree": "bff87bffd679918fc331e5441b22b97245450f58",
      "parents": [
        "ae17418e4807f7859fc178c2d99f499a0a9ce42c"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jul 09 12:27:11 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jul 09 21:55:58 2026 +0100"
      },
      "message": "Go and Guile: fix further const char * / char *\u0026 wrapper bugs\n\nTwo further char string wrapper fixes found while working on the Go #3290\ntypedef fix, both exercised by the common char_strings.i test:\n\nGo: a function or variable returning \u0027char *\u0026\u0027 (a reference to a char\npointer) generated a wrapper that returned a corrupted string, because the\n\u0027out\u0027 typemap passed the char ** (the address of the reference) to\nSwig_AllocateString and ran strlen on it without dereferencing. Give\nchar *\u0026 its own \u0027out\u0027 typemap that dereferences ($1 is a char **). A Go\nchar_strings runme is added so the char *\u0026 return values are now verified\nat runtime for Go.\n\nGuile: the \u0027freearg\u0027 typemap for char * frees the malloc\u0027ed copy made by\nSWIG_scm2str with SWIG_free($1). When the matched type is const char *,\nhidden behind a typedef such as \u0027typedef const char *MyString\u0027, $1 is\nconst char * and passing it to SWIG_free (which takes void *) is an\n\u0027invalid conversion from const void* to void*\u0027 C++ error. Cast to char *.\nThis is the same class of bug as the Go #3290 fix.\n\nAlso make the Go char *\u0026 \u0027freearg\u0027 free the malloc\u0027ed buffer through $1\n(as *$1, since $1 is a char **) with a cast, consistent with the char *\n\u0027freearg\u0027, rather than naming the in-typemap temporary.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "ae17418e4807f7859fc178c2d99f499a0a9ce42c",
      "tree": "9b1ebaccd2f9335616fadab7fdf0b7aa0389eb50",
      "parents": [
        "d43ee445e05551f76ecbad7cc40212b3426e4148"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jul 09 00:33:03 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jul 09 21:55:58 2026 +0100"
      },
      "message": "Go: fix invalid conversion for const char * hidden behind a typedef\n\nThe Go \u0027in\u0027 typemap for char * wrote the null terminator through $1, which\nfails to compile as C++ when the matched type is const char *, as happens\nwith a typedef such as \u0027typedef const char *MyString\u0027. Allocate and write\nthe terminator through a char * temp, assign to $1 via $1_ltype, and cast\nin the freearg so a const char * buffer can still be freed. Freeing $1\n(rather than the temp) keeps the freearg working when char * is remapped\nwith %apply SWIGTYPE[], which overrides the in typemap but not the freearg.\n\nAdd coverage to the common char_strings.i test, which is compiled for\nevery language, rather than a Go only test: a typedef\u0027d const char * setter\nplus a runtime assertion in each language that has a char_strings runme\n(c, csharp, d, java, javascript, lua, perl5, php).\n\nSee #3290.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "d43ee445e05551f76ecbad7cc40212b3426e4148",
      "tree": "7fb96567e3eabe9aa86a9420a12f8af8c8fb77a1",
      "parents": [
        "213d73aa13540d347d5714a8d7e0e148f70d8dcd"
      ],
      "author": {
        "name": "Erez Geva",
        "email": "ErezGeva2@gmail.com",
        "time": "Thu Jul 09 19:27:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 18:27:35 2026 +0100"
      },
      "message": "Rename the near function to cmp_flt function that compare float numbers (#3490)\n\nAnd move it to helpers.\nAlthough Lua uses C floating math.\nThe actual used C floating functions in Lua\n might be different from the actual floating functions\n used in the original C code, which may lead to a slightly\n different floating number.\nSo for calculated floating numbers we should use the cmp_flt function in the assert.\n\nSigned-off-by: Erez Geva \u003cErezGeva2@gmail.com\u003e"
    },
    {
      "commit": "213d73aa13540d347d5714a8d7e0e148f70d8dcd",
      "tree": "f193785089bf7173c6859f1b3ba4664523817b19",
      "parents": [
        "38e2824d487ec65afd497910da9995faefda20cc"
      ],
      "author": {
        "name": "Derek Huang",
        "email": "37860662+phetdam@users.noreply.github.com",
        "time": "Wed Jul 08 18:34:48 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 23:34:48 2026 +0100"
      },
      "message": "r.cxx: ensure Rpackage and DllName are DOH strings (#3471)"
    },
    {
      "commit": "38e2824d487ec65afd497910da9995faefda20cc",
      "tree": "326af38c13d875f70fe3e272215a0b2f2d106cd9",
      "parents": [
        "9632e5b8c64c345ae09f7bf46656e2dec7487f3d"
      ],
      "author": {
        "name": "Vadim Zeitlin",
        "email": "vz-swig@zeitlins.org",
        "time": "Wed Jul 08 23:14:41 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 08 23:26:47 2026 +0100"
      },
      "message": "Fix deleting invalid string when parsing Doxygen grouping comments\n\nFixes a fatal regression (\"Attempt to delete a non-DOH object\") in the\n-doxygen scanner: when a structural Doxygen block (e.g. @name/@{) was\nfollowed by a blank line without any accumulated comment content, the\nscanner called Delete() on an unset yylval.str. Guard the deletion with\na check that a comment was actually accumulated, only handle the\nstructural-block logic when scanning Doxygen comments, and add a\nregression test.\n\nCloses #3403\n"
    },
    {
      "commit": "9632e5b8c64c345ae09f7bf46656e2dec7487f3d",
      "tree": "6db4cfa240f264536d4e11be58e6cb6c477b20d4",
      "parents": [
        "4ac5b4d5077e8f806251544f263c4e39606b66c7"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 08 23:20:43 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jul 08 23:20:43 2026 +0100"
      },
      "message": "swig-conventions: require short form issue/PR references in commit messages\n\nReference issues and pull requests as #NNNN rather than a full GitHub URL.\nThe short form is more readable in the commit log and GitHub still renders\nit as a link.\n"
    },
    {
      "commit": "4ac5b4d5077e8f806251544f263c4e39606b66c7",
      "tree": "a831063932c1340b0aa4d1f04bd8aabab111cce1",
      "parents": [
        "79f7a2b7cb7ddc256eba09c8770133148025171d"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Tue Jul 07 09:30:50 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Tue Jul 07 09:30:50 2026 +0100"
      },
      "message": "Ruby: fix flaky director_binary_string_rev_len test\n\nThe runme passed the director callback as a temporary argument to Caller.new\nwithout keeping any Ruby reference to it. After the constructor returned, the\nonly thing referencing the director was the raw, non-owning Callback pointer\nstored inside the C++ Caller, which Ruby\u0027s garbage collector cannot see. If a\nGC ran between constructing the Caller and calling caller.call(), the director\nproxy was collected and its C++ director deleted, leaving Caller::_callback\ndangling. The subsequent _callback-\u003erun() then dispatched through freed memory:\nswig_get_self() read the recycled swig_self slot, intermittently observed on CI\nas Qfalse, giving \"undefined method \u0027run\u0027 for false\", and reproducible locally\nas a segfault under GC.stress.\n\nHold the callback in a local variable for the duration of the call, matching the\nsibling director_binary_string test and the Python, Java, PHP and Perl runmes\nfor this same interface. Verified with GC.stress \u003d true: the old code crashed\n5/5 runs, the fixed code passed 20/20.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "79f7a2b7cb7ddc256eba09c8770133148025171d",
      "tree": "d9c91ae9d6f99e186c1b331649cbf1b6374a744f",
      "parents": [
        "012345bbc93444e03cc8101a34b4ff5ea8cf1a1d"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 22:49:48 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:31 2026 +0100"
      },
      "message": "Python: Remove Python 2 compatibility macros\n\nRemove the Python 2 C API compatibility macros from pyhead.swg (PyClass_Check,\nPyInt_*, PyString_*, Py_TPFLAGS_HAVE_CLASS, _PyLong_FromSsize_t) and the SWIG\nstring helper macros SWIG_Python_str_FromFormat and SWIG_Python_str_FromChar.\nThese mapped Python 2 names onto the Python 3 C API and were kept only for user\ntypemaps, which should now call the Python 3 C API directly.\nSWIG_Python_str_FromChar was still used internally, so its call sites now use\nPyUnicode_FromString directly.\n\nAlso remove the dead SWIG_PYTHON_SLOW_GETSET_THIS \"fast getset\" code in\npyrun.swg. That macro was unconditionally defined for Python 3, so the guarded\nPython 2 paths (using PyInstance_Check) were never compiled; only the slow\ngetset path is kept.\n\nUpdate the python_annotations_typing test typemap, which used PyString_Check\nand PyString_AsString, to use PyBytes_Check and PyBytes_AsString.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "012345bbc93444e03cc8101a34b4ff5ea8cf1a1d",
      "tree": "e0bdd9d352333c079d06fc5f4e8951f8443e24f4",
      "parents": [
        "2598574915a647259478ad6a74d613e2da40dd3d"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sun Jul 05 12:44:12 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:31 2026 +0100"
      },
      "message": "Require a CHANGES.current entry for user visible changes\n\nUpdate the AGENTS.md changelog guidance to require a CHANGES.current\nentry for any user visible change, written clearly and succinctly.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "2598574915a647259478ad6a74d613e2da40dd3d",
      "tree": "bf3d35af5f7239af399716c1cc3f9fbae9e3ac88",
      "parents": [
        "d96ca6632c3ec6992434e0040dcfe6b66d673501"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sun Jul 05 22:48:07 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:31 2026 +0100"
      },
      "message": "Complete the Python 2 removal and fix issues found reviewing it\n\nFollow-up work on top of the initial Python 2.x removal: it finishes the\nremoval and fixes several issues found while reviewing the change.\n\nCorrectness fixes:\n- pyrun.swg: SwigPyPacked_str passed the type name straight to\n  PyUnicode_FromFormat as its format string, so a type name containing a\n  \u0027%\u0027 would be misinterpreted. Use PyUnicode_FromString instead.\n- Doc/Manual/Varargs.html: the (...) varargs freearg typemap example lost\n  its free() loop when the surrounding Python 2 guard was removed, leaking\n  the memory the in typemap allocates. Restore the loop, now unconditional.\n- Doc/Manual/Typemaps.html: the PyInt_Check to PyLong_Check substitution\n  left two typecheck excerpts reading PyLong_Check || PyLong_Check; collapse\n  each back to a single check.\n\nCode generator (Source/Modules/python.cxx):\n- Emit the native class X(..., metaclass\u003d_SwigNonDynamicMeta) form for\n  nondynamic classes in all three base-list branches (object, Exception and\n  explicit bases), and drop the Python 2 _swig_add_metaclass helper.\n- Emit a plain import builtins as __builtin__ instead of the Python 2\n  try/except import fallback.\n- Update a stale Python 2.x comment.\n\nRemove the deprecated embed.i library (it only ever worked with Python 2):\n- Delete Lib/python/embed.i and the Lib/python/Makefile.in reference to it.\n- Remove the python_static and python_static_cpp targets from\n  Examples/Makefile.in and the now-orphaned static: targets that used them\n  from the Examples/python example Makefiles.\n- Remove the embed.i section from the manual.\n\nPython test suite (Examples/test-suite/python):\n- profiletest_runme.py: convert the Python 2 print statements to print().\n- doxygen_constructors_runme.py: drop the dead sys.version_info \u003c (3, 0)\n  branch, keeping the Python 3 super().__init__() form.\n- li_cdata_bytes_runme.py and li_cdata_bytes_cpp_runme.py: drop the dead\n  exit-on-Python-2 version guard.\n- file_test_runme.py and python_abstractbase_runme.py: drop the now-unused\n  import sys left behind by guard removal.\n\nDocumentation (Doc/Manual/Python.html):\n- Drop the embed.i and SWIG_PYTHON_STRICT_UNICODE_WCHAR sections; the latter\n  macro was Python 2 only and no longer exists, wide strings are unicode-only\n  by default.\n- De-duplicate the %pythonabc example and drop a stale collections.abc\n  compatibility note.\n- Update the version support statement and other stale Python 2 mentions.\n\nOther cleanups:\n- Tools/mkdist.py: raise the minimum Python version check to Python 3.\n- Reword stale Python 2 comments in pyrun.swg, pyiterators.swg and\n  pycontainer.swg, and fix a PyString_FromFormat left in a pyclasses.swg\n  doc comment.\n- CHANGES.current: record that Python 2 support has been dropped.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "d96ca6632c3ec6992434e0040dcfe6b66d673501",
      "tree": "552e205ac4ab7a5af51d7a7c98257cf2cc25f585",
      "parents": [
        "7177a9cf8eb898e4ae8229d6ab7798169211c0af"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Tue May 26 10:35:57 2026 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:31 2026 +0100"
      },
      "message": "Drop SWIGPY_UNICODE_ARG  macro\n"
    },
    {
      "commit": "7177a9cf8eb898e4ae8229d6ab7798169211c0af",
      "tree": "6f9e8020233511b4eaa5b78492d040b9f5fbde0a",
      "parents": [
        "50ffa773c05e9678e514b27c39687ab2e5f4878a"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Tue Apr 21 08:12:27 2026 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:31 2026 +0100"
      },
      "message": "Drop python2.x in autotools\n"
    },
    {
      "commit": "50ffa773c05e9678e514b27c39687ab2e5f4878a",
      "tree": "b24305c452fdd365bbb2ddf491b56477d27888cc",
      "parents": [
        "8f0cbe1195b18cf1938d0498d4a4d82f1693d136"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Sun Apr 19 14:58:01 2026 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:31 2026 +0100"
      },
      "message": "Doc: Drop remainning python2 use\n"
    },
    {
      "commit": "8f0cbe1195b18cf1938d0498d4a4d82f1693d136",
      "tree": "9d6ece226bfbca0f025a7d8a61eecbbe468bd2ed",
      "parents": [
        "eb812508394b06eb4be9ccb00550fc3aa1ecf305"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Sun Apr 19 14:52:19 2026 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:31 2026 +0100"
      },
      "message": "Drop SWIG_PYTHON_2_UNICODE\n"
    },
    {
      "commit": "eb812508394b06eb4be9ccb00550fc3aa1ecf305",
      "tree": "c28bbfad354e2cb93da24a8742c71a18e54d0109",
      "parents": [
        "27addd9371fdd2f0d25e467a538bf8cedc599db8"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Mon Sep 15 09:19:31 2025 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:31 2026 +0100"
      },
      "message": "Python: Update keywords\n\nCloses #2424\n"
    },
    {
      "commit": "27addd9371fdd2f0d25e467a538bf8cedc599db8",
      "tree": "89a8cd04404351c9ad628316b6a233e8de2a4abb",
      "parents": [
        "a1c738f02f257aa18ebcfa1d7306cf43a4df0bed"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Mon Sep 15 09:03:19 2025 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:31 2026 +0100"
      },
      "message": "Python: Update doc\n"
    },
    {
      "commit": "a1c738f02f257aa18ebcfa1d7306cf43a4df0bed",
      "tree": "5b9f2e843b46109081c56d9bbec469296bb288ae",
      "parents": [
        "cb6e7c542a1a642a3c7860fd670c4c700955068b"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Mon Sep 15 08:56:56 2025 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:30 2026 +0100"
      },
      "message": "Python: Drop python2 build\n"
    },
    {
      "commit": "cb6e7c542a1a642a3c7860fd670c4c700955068b",
      "tree": "b715665ec120cf0d35464828f9afdc665ee4502d",
      "parents": [
        "da2f0f9c03e1b48e1c8f5399ea1524128dc29dd4"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Mon Sep 15 08:47:58 2025 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:30 2026 +0100"
      },
      "message": "Python: Drop sys.version_info\u003c3 examples code\n"
    },
    {
      "commit": "da2f0f9c03e1b48e1c8f5399ea1524128dc29dd4",
      "tree": "3d91491cad22ce817b306e05e64a8ce5b07f5e9a",
      "parents": [
        "fb18e24fa505da176c5a11a4bc20ab6d9ad95a86"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Mon Sep 15 08:44:25 2025 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:30 2026 +0100"
      },
      "message": "Python: Drop operators compatibility\n"
    },
    {
      "commit": "fb18e24fa505da176c5a11a4bc20ab6d9ad95a86",
      "tree": "49fdecad4b1729bd40bdadc2e580ae7ae515adfb",
      "parents": [
        "b89050101d7b8ad6a0658579ca90b8e3b3d6a7e9"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Mon Sep 15 08:41:17 2025 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:30 2026 +0100"
      },
      "message": "Python: Drop collections.abc compatibility\n"
    },
    {
      "commit": "b89050101d7b8ad6a0658579ca90b8e3b3d6a7e9",
      "tree": "5437aeb867aaf4b62c331044d457d0e2091dc90e",
      "parents": [
        "f505f2566fb89f633b8251f1644fc5375be404bd"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Mon Sep 15 08:37:30 2025 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:30 2026 +0100"
      },
      "message": "Python: Avoid compatibility macros\n"
    },
    {
      "commit": "f505f2566fb89f633b8251f1644fc5375be404bd",
      "tree": "63e2d0beb0bbb1f8b5034e2dacccfa34675685de",
      "parents": [
        "3e62339f7318658c0255f3196479f9f5b128dad8"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Mon Sep 15 08:33:11 2025 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jul 06 23:50:30 2026 +0100"
      },
      "message": "Python: Drop PY_VERSION_HEX\u003c3.5 code\n\nCloses #3201\n"
    },
    {
      "commit": "3e62339f7318658c0255f3196479f9f5b128dad8",
      "tree": "3a3bc453c43b6f34e21e66d9fe9a8f49f3d03656",
      "parents": [
        "58fc6b4c3fa23f41d91a76f88e34a717ff4ddfea"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sun Jul 05 21:40:16 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sun Jul 05 21:49:43 2026 +0100"
      },
      "message": "Fix configure warning when Java is disabled\n\nFixes:\n\n  -gt: unary operator expected\n\nwhen running \u0027./configure --without-alllang\u0027 (or any configuration where javac\nis not found).\n"
    },
    {
      "commit": "58fc6b4c3fa23f41d91a76f88e34a717ff4ddfea",
      "tree": "18cc48b3f6bae07c44c9c47ec309b6834ca0518b",
      "parents": [
        "9c569da6ad18d682eeefd63bc6a49b4058048726"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sun Jul 05 11:38:38 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sun Jul 05 12:14:45 2026 +0100"
      },
      "message": "Update macOS Go CI versions to 1.24, 1.25, 1.26\n\nThe macOS runner images (macos-26 Tahoe) dropped Go 1.23 from the\nhosted tool cache as it is now out of Go\u0027s support policy, which broke\nthe go 1.23 build. Replace 1.23 with 1.26, the newest release, keeping\nthe two latest supported versions plus the newest.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "9c569da6ad18d682eeefd63bc6a49b4058048726",
      "tree": "aed76f1a077bdd154e783168f9eff50d4eac8ecd",
      "parents": [
        "12473abeb52c326657be461898619df6796e5c3b"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sun Jul 05 00:15:57 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sun Jul 05 09:13:55 2026 +0100"
      },
      "message": "Make AI commit-message rules prominent in AGENTS.md and swig-conventions\n\nAn AI agent recently committed with a Co-Authored-By trailer for the AI\ntool and backticks in the body, because the commit conventions were only\nreachable by opening the swig-conventions skill and said nothing about\nthe auto-injected footers many AI tools add by default.\n\nHoist the mandatory commit-message rules inline into AGENTS.md (which is\nloaded into agent context) and add a dedicated subsection to the\nswig-conventions skill, stating explicitly that these rules override any\nCo-Authored-By footer a tool or harness injects automatically, that the\nAssisted-by trailer is the correct disclosure, and that backticks must\nnot be used.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "12473abeb52c326657be461898619df6796e5c3b",
      "tree": "14d34c2278fbc41cb8f19dde3f2cd8dc8a78af5b",
      "parents": [
        "f9e9f88d0d0aa5eb189c298d34f94cdf1cc8ecfa"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sun Jul 05 00:07:14 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sun Jul 05 09:13:55 2026 +0100"
      },
      "message": "Fix Octave detection in configure with newer Octave\n\nTwo independent issues prevented ./configure from detecting an installed\nand working Octave:\n\n1. Newer Octave changed the first line of \u0027octave --version\u0027 from\n   \"GNU Octave, version X\" to \"GNU Octave (arch) version X\".  The check\n   for whether octave works matched the literal \"Octave, version\" and so\n   failed, clearing OCTAVE and dropping Octave from the build.  Relax the\n   pattern to \"Octave.*version\" so both layouts match.\n\n2. The mkoctfile check baked PATH and LD_LIBRARY_PATH into a command\n   string unquoted and relied on word splitting to pass them to env.\n   When PATH contained a directory with a space (for example a Windows\n   path under WSL) this broke env, so the mkoctfile check failed and\n   Octave was disabled.  Invoke mkoctfile via a small shell function that\n   quotes both variables, still clearing the rest of the environment so\n   inherited variables such as CXXFLAGS do not override mkoctfile\u0027s own\n   defaults.\n\nVerified on Ubuntu 26.04 with Octave 11.1.0: configure now lists octave,\nand the octave test suite compiles and runs a module using the detected\nflags.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "f9e9f88d0d0aa5eb189c298d34f94cdf1cc8ecfa",
      "tree": "28cdab2fed512e0eff798a1c5e5fc496e6457110",
      "parents": [
        "9140467c2d3851aba1216b9a24b9b4ce113bda6d"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 04 23:37:02 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jul 04 23:37:02 2026 +0100"
      },
      "message": "Warning fix -Wdiscarded-qualifiers\n"
    },
    {
      "commit": "9140467c2d3851aba1216b9a24b9b4ce113bda6d",
      "tree": "03edf6495bcbfb9a5aaf2029790fdf608dfbfe0f",
      "parents": [
        "9aa54c517f1893ed9391588377fc805574681dea"
      ],
      "author": {
        "name": "Olly Betts",
        "email": "olly@survex.com",
        "time": "Mon Jun 29 14:36:06 2026 +1200"
      },
      "committer": {
        "name": "Olly Betts",
        "email": "olly@survex.com",
        "time": "Mon Jun 29 14:36:06 2026 +1200"
      },
      "message": "Improve handling of NULL vs nullptr vs 0 vs 0L\n\nFor some target languages (Octave, Python and Ruby), SWIG has previously\ntreated nullptr or NULL as an integer 0 if used in a situation where\nthe type wasn\u0027t known to be a pointer.\n\nFor nullptr this is never helpful, because it has type nullptr_t which\ndoes not implicitly convert to 0, so we no longer do this.\n\nFor NULL it\u0027s rather dubious - C and C++ allow NULL to be defined as\ninteger 0, so `int i \u003d NULL` may work and is occassionally seen in real\ncode, but it is semantically wrong.  Also GCC and clang define NULL to a\nmagic value and by default will warn about such misuse, so it\u0027s likely\nto be less common than before they did this.  So now SWIG only converts\nNULL to 0 if used in a context where we know the underlying type is an\narithmetic type.\n\nUsing an integer zero (or equivalent value such as 0L) for a NULL\npointer is valid, and SWIG will still treat it as a NULL pointer if used\nin a context where know the type is a pointer.  This is now done based\non the value of the integer constant so also applies to 0L (previously\nit was only done if the value was written in the code as literally `0`).\n\nFixes: #3472\n"
    },
    {
      "commit": "9aa54c517f1893ed9391588377fc805574681dea",
      "tree": "64bc8a358790a363816cc1ff15bf6ce33f41a55c",
      "parents": [
        "5f7ee3121d0fe09918de5fcce9d024383763122a"
      ],
      "author": {
        "name": "Erez Geva",
        "email": "ErezGeva2@gmail.com",
        "time": "Tue Jun 23 16:29:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 23 15:29:25 2026 +0100"
      },
      "message": "Improve YML (#3482)\n\n- Align steps in clang-format job to match build job\n- Add persist-credentials: false, to improve checkout security\n- Improve the use of MSYS packages variables.\n- Remove MSYS boost package when using error test suite\n- Update hendrikmuhs/ccache-action as it use deprecated Node.js\n- Homebrew tap trust\n\nSigned-off-by: Erez Geva \u003cErezGeva2@gmail.com\u003e"
    },
    {
      "commit": "5f7ee3121d0fe09918de5fcce9d024383763122a",
      "tree": "5b367d6e7ca27e4040d252626050ab6901332e4e",
      "parents": [
        "c0754fbde28eab4e314c0cabf5940a3dc3125064"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jun 20 07:29:52 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jun 20 07:29:52 2026 +0100"
      },
      "message": "Correction in custom typemap in python_annotations_typing test\n\nFix visual c++ warning C4244: \u0027\u003d\u0027: conversion from \u0027Py_ssize_t\u0027 to \u0027int\u0027, possible loss of data\n"
    },
    {
      "commit": "c0754fbde28eab4e314c0cabf5940a3dc3125064",
      "tree": "a6a26ee985883d37b8cbf57b35f82f4bfc63a9c9",
      "parents": [
        "7f7f758e7c9acf5843c686a7496621e490f2936f"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Fri Jun 19 08:45:53 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jun 20 07:20:37 2026 +0100"
      },
      "message": "Add test coverage and docs for alias templates as a base class and using-declaration qualifier\n\nThe test suite previously only exercised C++11 alias templates as function return\ntypes (cpp11_alias_templates).  These add coverage for an alias template instantiation\nused in inheritance positions:\n\n  - cpp11_alias_template_inheritance: an identity alias template as a base with a member\n    using-declaration, an identity alias whose inherited enum is imported through the alias\n    qualifier (with the alias also naming a function parameter type), a non-identity alias\n    as the base of a class template where the using-declaration imports an overload that\n    merges with a local overload, and an inheriting constructor whose scope qualifier is an\n    alias template\n  - cpp17_using_pack_alias_template: a C++17 using-declaration pack over an alias template\n    base pack, both for inherited member functions (\u0027using Identity\u003cTs\u003e::g...;\u0027) and for\n    inherited constructors (\u0027using Identity\u003cTs\u003e::Identity...;\u0027) - the alias template\n    analogue of cpp17_inheriting_constructors_pack, which inherits through direct bases\n\nEach follows the documented pattern: the underlying template is instantiated with a\nnamed %template and the alias instantiation is registered with an empty %template(),\nafter which the alias resolves in these positions just like the underlying type.\n\nA new using_member_typedef_overload test covers the related typedef-qualifier cases: an\noverload imported through a typedef-to-template-instantiation qualifier that merges with a\nlocal overload, and an inherited enum imported through a typedef qualifier.\n\nInvestigated as issue #3478: an alias template used as a base or using-declaration\nqualifier appears to be unresolved (Warning 401 / Warning 315), but this is the\ndocumented requirement that the alias instantiation be registered with %template();\nit is not a SWIG defect.\n\nIn cpp17_using_pack_alias_template the Over method-pack overloads are ignored for D only\n(\u0027#if defined(SWIGD) %ignore Over\u003cA, B\u003e::g;\u0027): D wraps multiple inheritance as single\ninheritance plus mix-in methods and marks the g(int) overload inherited from the second\nbase \u0027override\u0027, which ldmd2 rejects.  The class is still wrapped for D and every other\nlanguage exercises the overloads.  For Visual C++ the alias-template-as-base-pack classes\nare guarded with \u0027#ifndef _MSC_VER\u0027, falling back to the equivalent direct \u0027Ts...\u0027 base\n(MSVC rejects an alias template base in a pack expansion with C3770); SWIG still parses and\nwraps the alias form so coverage is unchanged, mirroring cpp17_using_typename_pack.\n\nThe C++11 chapter\u0027s \u0027Type alias and alias templates\u0027 section is split into separate\n\u0027Type aliases\u0027 and \u0027Alias templates\u0027 sections, and the alias template section is\nrewritten to explain the two-%template requirement and the base class / using-declaration\nusage that was previously only shown for return types.\n\nThe swig-doc and swig-test skills gain a note that code examples and .i test cases must\nnot place a class or struct definition on a single line.  The swig-test skill also gains\nguidance on handling a failure in a single target language (fix or work around it in that\nlanguage rather than excluding the test, except for experimental backends) and on\nreporting which languages and tests were run.\n\nAssisted-by: Claude Opus 4.8\n"
    },
    {
      "commit": "7f7f758e7c9acf5843c686a7496621e490f2936f",
      "tree": "f7d74fb3f85113bec78c51262017d3984df1f5d8",
      "parents": [
        "70971d804a43b50dd5d560ad339a1cb68024fb8c"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Fri Jun 19 22:31:54 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Fri Jun 19 22:34:54 2026 +0100"
      },
      "message": "Add test-configured-languages.sh helper to the swig-test skill\n\nAfter adding or changing a test case the new test should be run for every\ntarget language the build was configured for with ./configure, and it should\nbe warning clean everywhere. This adds a helper script to the swig-test skill\nthat does both.\n\nThe script discovers the configured language subset from the generated\ntop-level Makefile (a language is enabled when its skip-\u003clang\u003e marker is empty)\nso it never runs a language that configure disabled. Each language is built\nwith the same warning flags CI uses: it runs Tools/testflags.py per language\nand passes the resulting CFLAGS/CXXFLAGS, including -Werror, to make, exactly\nas .github/workflows/linux.yml does, so any compiler warning on the generated\nwrapper fails the build. The C++ standard is auto detected from a cppNN_ test\nname prefix and the C standard derived from it as CI does, both overridable.\n\nFor the javascript run the engine is resolved automatically: it follows the\njavascript test Makefile precedence (node, then jsc, then v8) but only uses\nnode when node, node-gyp and npm are all present, otherwise it reads the\nconfigured jsc/v8 fallback from the generated Makefile and passes it as ENGINE.\nThis removes the need to pass ENGINE\u003djsc to make by hand. A --engine option\noverrides this, and an explicit ENGINE\u003d passed as an extra make arg is left\nuntouched.\n\nResults are reported per language as PASS or FAIL with a final summary; the\nexit status is the number of languages that failed. Supports language filters,\nparallel runs, verbose output and plain make via --no-flags.\n\nSKILL.md documents the all language run as the final confidence step for any\nnew test and the no warnings requirement.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "70971d804a43b50dd5d560ad339a1cb68024fb8c",
      "tree": "5bbe6268c77aeee8d31b5a8a19de5c137d88b3fd",
      "parents": [
        "e1a7e0b1c570d68ceecd5577c843b7e91ecf45ad"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 18 22:16:52 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 18 22:16:52 2026 +0100"
      },
      "message": "Don\u0027t run failing experimental C tests\n"
    },
    {
      "commit": "e1a7e0b1c570d68ceecd5577c843b7e91ecf45ad",
      "tree": "89bc46c397ab0346ad17e336d84d19262cb221a4",
      "parents": [
        "c0d4f290d6f62fa58e0d243673d46655179a95f1"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 18 22:04:46 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 18 22:06:37 2026 +0100"
      },
      "message": "Fix MSVC C4244 narrowing warning in cpp11_template_pack_specialization test\n\nThe recursive sum helpers in the StdFunction partial specialization mix\nargument types deliberately, so for StdFunction\u003cint(int, double, int)\u003e the\nunary helper is instantiated with A\u003ddouble and RET\u003dint and \u0027return a\u0027\nnarrowed a double to an int. Make the intended conversion explicit with\nstatic_cast\u003cRET\u003e in both the unary and the many-args helpers.\n\nAssisted-by: Claude Opus 4.8 (1M context)\n"
    },
    {
      "commit": "c0d4f290d6f62fa58e0d243673d46655179a95f1",
      "tree": "47f4393a53e991d2839684664208c3ca75cc7a72",
      "parents": [
        "21f00a94ccb11b801ce33f13eb550c16ae80b9cc"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 18 08:32:38 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 18 22:01:51 2026 +0100"
      },
      "message": "Fix C++17 inheriting constructor pack dropping the last base constructor\n\nThe inheriting constructor pack \u0027using T::T ...;\u0027 over a variadic base pack\nwrapped the constructors of every base except the last, and emitted a spurious\nWarning 526 naming the using declaration after the derived class instead of the\nbase.\n\nDuring template instantiation the pack using declaration is expanded into one\nusing declaration per base: the first element is patched in place and the rest\nare appended as siblings.  The appended siblings were only revisited by the\nclass child walk when the using declaration was not the last child, because that\nwalk captures the next sibling before recursing so that an empty pack can detach\nitself.  As the pack using declaration is normally the last member, the appended\nsiblings kept the unexpanded template name and were never registered as\ninheriting constructors of the instantiated class.\n\nExpand and splice each appended sibling in place immediately after the first\nelement, so every base constructor is wrapped regardless of the using\ndeclaration\u0027s position and the empty pack detach path is left untouched.\n\nCloses #3481\n\nAssisted-by: Claude Opus 4.8\n"
    },
    {
      "commit": "21f00a94ccb11b801ce33f13eb550c16ae80b9cc",
      "tree": "1a23890187002f4dba8d18cda26689aa5fea10e5",
      "parents": [
        "6723e094807f3413dc0ab2f6b59b1a849e8257e8"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 18 21:39:18 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 18 21:54:46 2026 +0100"
      },
      "message": "AGENTS.md: keep test case comments brief\n\nNote that test cases should not carry long or obvious comments - prefer a single concise\nline over a multi-line explanation.\n"
    },
    {
      "commit": "6723e094807f3413dc0ab2f6b59b1a849e8257e8",
      "tree": "741ed535995a8c6d2201ab9b8043df4af8c6cfc3",
      "parents": [
        "85ed426a497134a04d95f44de2dac8f750d2b9a0"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 18 09:12:57 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 18 21:42:06 2026 +0100"
      },
      "message": "Fix syntax error for inherited conversion operator in a using declaration (#3480)\n\nA using declaration naming an inherited conversion function, such as\n\u0027using Base::operator int;\u0027, was rejected with a syntax error. Other\nusing-declaration declarator-ids parsed fine, but a conversion-operator-id was\nhandled only by the standalone conversion operator rule, which requires a full\nfunction definition; no using-declaration production accepted it.\n\nAdd a dedicated using-declaration production for a scope qualified conversion\noperator. This is kept separate from the shared idcolon rule: idcolon would\ngreedily consume the trailing scope qualifier and never reach the\nCONVERSIONOPERATOR token, and extending idcolon itself would change how out of\nclass conversion operator definitions are parsed. The conversion operator is now\nbrought into the derived class like any other inherited member.\n\nNew test typedef_inherit_using imports a privately inherited conversion operator\nwith a using declaration, exercised by mirrored Python and Java runme scripts.\n\nFixes #3480\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "85ed426a497134a04d95f44de2dac8f750d2b9a0",
      "tree": "f53a534d861c634eac13eff5b49e27085734c443",
      "parents": [
        "c5bfe9766f3ad17caf5b378f78a8bdf517e3db94"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 18 09:12:27 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 18 21:42:06 2026 +0100"
      },
      "message": "Fix syntax error for typename member type pack in a using declaration (#3479)\n\nA using declaration that combines the \u0027typename\u0027 disambiguator with a C++17\npack expansion to import a member type from each base in a base pack, such as\n\u0027using typename Bases::value_type ...;\u0027, was rejected with a syntax error.\nThe typename form and the pack form each parsed on their own, but there was no\ngrammar production for the combination.\n\nAdd the missing USING TYPENAME idcolon ELLIPSIS SEMI production to cpp_using_decl,\nmirroring the existing pack expansion rule and setting the pack flag.\n\nNew test cpp17_using_typename_pack exercises the construct with mirrored Python\nand Java runme scripts.\n\nFixes #3479\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "c5bfe9766f3ad17caf5b378f78a8bdf517e3db94",
      "tree": "cfd310f7ea87afff96f58963a934470b2dee5fe1",
      "parents": [
        "65fbe448ac5fe20713b05b0b7a0cb0a01eb66224"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 00:23:45 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 22:28:32 2026 +0100"
      },
      "message": "Fix template parameter expansion for members inherited via a typedef qualifier\n\nA using declaration that brings an inherited member into a derived class\nthrough a typedef or C++11 alias of a template instantiation base lost the\ntemplate arguments of the qualifier, so template parameters in the member\u0027s\ntype were left unexpanded and the generated wrapper failed to compile.\n\nFor example, given:\n\n  template \u003ctypename LinksT\u003e class NodeI {\n  public:\n    using links_type \u003d LinksT;\n    Owners\u003clinks_type\u003e owners;\n  };\n  template \u003ctypename LinksT\u003e class Cluster : public NodeI\u003cLinksT\u003e {\n  public:\n    using NodeIT \u003d NodeI\u003cLinksT\u003e;\n    using NodeIT::owners;\n  };\n\nthe wrapped owners member was emitted as Owners\u003clinks_type\u003e rather than\nOwners\u003cNodeI\u003cint\u003e::links_type\u003e for Cluster\u003cint\u003e.\n\nSwig_symbol_type_qualify resolved the typedef qualifier but rebuilt the\nscope from the found member\u0027s symbol table, which is the bare template name\nand drops the template arguments. The qualifier is now rewritten to the\ntemplate-id, with the template arguments typedef reduced, so the existing\ntemplate handling preserves them. Inheriting constructor using declarations\nand global scope or operator qualifiers are left untouched.\n\nThis is the same root cause as a member function whose parameter or return\ntype is written in terms of the base template parameter, for example a method\ntaking Owners\u003clinks_type\u003e\u0026 inherited through the typedef qualifier (#1153).\nBoth forms are now expanded correctly.\n\nFixes #1042\nFixes #1153\n\nAssisted-by: Claude Opus 4.8 (1M context)\n"
    },
    {
      "commit": "65fbe448ac5fe20713b05b0b7a0cb0a01eb66224",
      "tree": "5df21a2a0924cc89e8623f3259d18d40fe113c22",
      "parents": [
        "e2fca65752ad78f484e807d1938ec806c2ae5824"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 15 12:38:44 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 01:53:49 2026 +0100"
      },
      "message": "Move the #2933 duplicate using declaration regression test to its own test case\n\nThe regression test was added to li_std_vector.i, but it has nothing to do\nwith std::vector - move to its own duplicate using declarations test.\n"
    },
    {
      "commit": "e2fca65752ad78f484e807d1938ec806c2ae5824",
      "tree": "b5971b9112342b945eacf198b75e04d58fa862bd",
      "parents": [
        "7541a2af276a6c21e2f53c4a2f54c98abd3ea286"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Wed May 20 19:06:40 2026 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 01:51:58 2026 +0100"
      },
      "message": "Fix duplicate using declaration\n\nSource/Swig/symbol.c:Swig_symbol_cadd() chains duplicate using declarations (e.g., two using aa::UsedFromNS;) via csym:nextSibling.\nWhen Swig_symbol_clookup() later resolves the unqualified name UsedFromNS, it sees csym:nextSibling set and treats it as \"overloaded using declarations\",\nbreaking out of the resolution loop and returning the using node itself instead of following uname to the underlying aa::UsedFromNS class node.\nThe type qualification then fails, generating std::vector\u003c UsedFromNS \u003e instead of std::vector\u003c aa::UsedFromNS \u003e in wrapper code.\n\nIn Source/Swig/symbol.c:615, added a new else if clause in Swig_symbol_cadd() that detects\nwhen both the existing entry (cn) and the new node (n) are using declarations with identical uname attributes,\nand returns early without chaining. This prevents the spurious csym:nextSibling that confuses Swig_symbol_clookup.\n\nCloses #2933\n\nAssisted-by: Claude Code (deepseek-v4-flash)\n"
    },
    {
      "commit": "7541a2af276a6c21e2f53c4a2f54c98abd3ea286",
      "tree": "78e80025575b86e4c3790b87806c649e55348196",
      "parents": [
        "3006c3cc02f605af372704f223c29a9fd4c3a9c8"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Tue Jun 16 20:53:48 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 01:47:06 2026 +0100"
      },
      "message": "Fix infinite loop inheriting through a self-referential typedef (#1827)\n\nA class inheriting from a base named through a redundant self-referential typedef,\nfor example\n\n  typedef struct foo foo;\n  struct foo { };\n  class bar : public foo { };\n\nsent SWIG into an infinite loop. cplus_inherit_types_impl chases typedef\ndeclarations to find the base class, but looking up \u0027foo\u0027 returns the typedef node\nwhose underlying type is again \u0027foo\u0027, which resolves by name back to the same\ntypedef node, so the loop never terminates.\n\nDetect this self-reference (the underlying type resolves to the same node) and\nresolve to the aliased class of the same name instead, which is a sibling of the\ntypedef in the symbol table found by walking the csym:nextSibling chain. The base\nclass is then resolved correctly so bar derives from foo.\n\nAdd the same self-reference guard to Swig_symbol_clookup_resolve_typedef, which is\nused for base class lookup in a later pass and had the same latent loop.\n\nExtend the typedef_inherit test with a regression case.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "3006c3cc02f605af372704f223c29a9fd4c3a9c8",
      "tree": "bedab6bfe6a510c354f45ab849c9ae90752a647e",
      "parents": [
        "85e41bd3e45a477edd8bc4670cf44c8e8b3cbd94"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Tue Jun 16 09:08:56 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 01:47:06 2026 +0100"
      },
      "message": "Do not apply the symbol checkfunc to scope qualifiers in symbol_lookup_qualified\n\nWhen resolving a qualified name Prefix::name through inherited scopes, the scope\nqualifier Prefix was looked up using the caller\u0027s checkfunc. The inherit list\nholds base classes and the namespaces brought into scope by using directives, so\nPrefix here names a scope, not the target symbol. The checkfunc filters the\ntarget, so a filter such as symbol_is_template (which only accepts a template\nnode) wrongly rejects the scope and the whole lookup fails.\n\nFor example, with\n\n  namespace Outer { namespace Middle { template\u003cclass T\u003e class Thing {}; } }\n  using namespace Outer;          // Middle is added to the inherit list\n  void use(Middle::Thing\u003cint\u003e t);\n\nresolving Middle::Thing with a template only checkfunc rejected the namespace\nMiddle and the lookup failed. The scope qualifier is now resolved without the\ncheckfunc, which is only applied to the final target symbol Thing. The same\napplies when the qualifier is a base class, or a nested class of a base class,\nreached through the inherit list.\n\nThis is a defensive correctness fix. No change in generated output across the\nwhole test suite: the affected lookups are all masked downstream (template\ndefault arguments are expanded earlier at Swig_symbol_cadd time, and the other\nconsumer feeds an idempotent re-qualification), so no regression test can\ndemonstrate it.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "85e41bd3e45a477edd8bc4670cf44c8e8b3cbd94",
      "tree": "0de0fdc53bfa2848fabeb0853f119f739c576121",
      "parents": [
        "77c6e7afa89d6ebf31b180c242ce6b619877fdae"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Tue Jun 16 08:10:25 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 01:47:06 2026 +0100"
      },
      "message": "Reduce Swig_symbol_clookup and the local variant to thin wrappers\n\nSwig_symbol_clookup is identical to Swig_symbol_clookup_check called with a\nnull checkfunc, and Swig_symbol_clookup_local is likewise identical to\nSwig_symbol_clookup_local_check. Replace the two duplicated bodies with thin\nwrappers that forward to the check variants, and move the descriptive comments\nonto the check variants which now hold the implementation.\n\nNo functional change.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "77c6e7afa89d6ebf31b180c242ce6b619877fdae",
      "tree": "c4a54930b558d145c9203948e373fba42ec13b86",
      "parents": [
        "638742fbccb54fac9eddc4e109578b70de3a8752"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Tue Jun 16 01:25:16 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 01:47:06 2026 +0100"
      },
      "message": "Add Swig_symbol_clookup_resolve_typedef and use it for base class lookup\n\nSwig_symbol_clookup follows using declarations but returns a typedef node as\nis.  The code that resolves a base class name through a chain of typedefs to the\nunderlying class or template node was open coded and duplicated in\nSwig_make_inherit_list and in the parser.  Add a public symbol table function\nthat does a Swig_symbol_clookup and then follows any chain of typedef\ndeclarations to the node the name ultimately refers to, and use it in both\nplaces.\n\nAssisted-by: Claude Opus 4.8\n"
    },
    {
      "commit": "638742fbccb54fac9eddc4e109578b70de3a8752",
      "tree": "f1a676bbf11348162a61a2e96d74d2c001ce552d",
      "parents": [
        "b78dba177a660f36a1111b2ff786bdb99782e1be"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 15 21:27:07 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 01:47:06 2026 +0100"
      },
      "message": "Detect inheriting constructors by base class match in the parser\n\nThe parser flagged an inheriting constructor (using Base::Base) only when the\nterminal name of the nested-name-specifier equalled the unqualified-id, which\nmissed the form \u0027using Alias::Base\u0027 where Alias is a typedef for the direct base\nBase.  The parser now also flags a candidate when the unqualified-id matches a\nbase class of the enclosing class, resolved through typedefs.  The type pass\nverifies the candidate and clears it when the nested-name-specifier does not\nresolve to an immediate base whose own name the unqualified-id is, so an ordinary\nmember using declaration is imported instead.\n\nExtend cpp11_template_using_base and cpp11_inheriting_constructors_typedef with\nthe typedef-qualifier forms, including the base\u0027s own member typedef as the\nqualifier, the base named by its own name through a typedef, and a member typedef\nand protected method import.\n\nAssisted-by: Claude Opus 4.8\n"
    },
    {
      "commit": "b78dba177a660f36a1111b2ff786bdb99782e1be",
      "tree": "642a03d8f955ab31f12c24b30a59e7301b769cea",
      "parents": [
        "50cd4f2afcc84282ae8af32a5e6f5d67e4c1a756"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 15 07:53:07 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 01:47:06 2026 +0100"
      },
      "message": "Inherit constructors named through a typedef base\n\nC++11 inheriting constructors (using Base::Base;) now work when the immediate\nbase class is named through a typedef, a chain of typedefs, a typedef whose\ntemplate argument is itself a typedef, a scope-qualified or namespaced name, or\na type-template parameter used directly as the base class (the mixin idiom).\n\nThe inheriting constructor\u0027s using-declaration qualifier is normalized in the\ntypepass stage; the inheriting base is then found by identity in the resolved base\nclass list and the base class\u0027 constructors are used to implement the inherited\nconstructors.\n\nAn inheriting-constructor using declaration whose qualifier is not an immediate\nbase class is reported with Warning 329 (uses base \u0027...\u0027 which is not an\nimmediate base of \u0027...\u0027) rather than the generic Warning 315.\n\nCloses #2951)\n\nAssisted-by: Claude Opus 4.8\n"
    },
    {
      "commit": "50cd4f2afcc84282ae8af32a5e6f5d67e4c1a756",
      "tree": "c386b46755f54ff133a7b3fe7dff81c5bae1578f",
      "parents": [
        "055fe0e793947732eb9b4ee5acc65f90e9748234"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jun 13 01:39:12 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 01:47:06 2026 +0100"
      },
      "message": "Keep a scope qualified type name fully qualified when canonicalizing\n\nThis fixes a minor regression introduced by the previous commit, which added\nthe scope canonicalization to SwigType_typedef_qualified() and could shorten a\nfully qualified type name.\n\nSwigType_typedef_qualified() resolves a scope qualified name that itself names\na scope to that scope\u0027s canonical name, so a base named through a derived class\n(Derived::Base) resolves to the same type as the base named directly. But the\nscope\u0027s canonical name can be less qualified than the name being resolved: a\nclass declared with a qualified name reached through a using namespace, such as\n\n  namespace Outer { namespace Space { namespace Middle { class Thing; } } }\n  using namespace Outer::Space;\n  class Middle::Thing {};\n  void useit(Outer::Space::Middle::Thing t);\n\nregisters a scope whose canonical name is the shorter Middle::Thing, so the\nfully qualified Outer::Space::Middle::Thing was being shortened to Middle::Thing.\n\nAdopt the canonical name only when it names a genuinely different scope, not\nwhen it is merely a trailing part of the name already given. The base named\nthrough a derived class still canonicalizes (Space::Base is not a suffix of\nDerived::Base), while a name already qualified in full through namespaces is\nkept as is.\n\nAssisted-by: Claude Opus 4.8 (1M context)\n"
    },
    {
      "commit": "055fe0e793947732eb9b4ee5acc65f90e9748234",
      "tree": "919ce2fc12d0d0cf21fc73dae4c896df3138ae90",
      "parents": [
        "978f675ad7be42cc1ade0d7ffaef770671e0af5b"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Fri Jun 12 19:06:18 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 01:47:06 2026 +0100"
      },
      "message": "Inject a base class name into the derived class so it can be named there\n\nIn C++ a base class\u0027 name is a member of the base (its injected class name) and so\nis visible from within a derived class, named either unqualified (\u0027Base\u0027) or scope\nqualified through the derived class (\u0027Derived::Base\u0027).  SWIG did not model this, so\na base in a namespace named without its namespace qualifier was not resolved: a\nusing declaration through such a typedef gave a spurious Warning 315 and dropped the\nmember, and the base named as a type was either unresolved or treated as a distinct\ntype from the base named directly.\n\n  namespace Space { struct Base { ... }; }\n  struct Derived : Space::Base {\n    typedef Base base_type;        // Base, not Space::Base\n    using base_type::method;       // no longer Warning 315\n    Base m(Base b);                // \u0027Base\u0027 resolves to Space::Base\n  };\n  Derived::Base f(Derived::Base);  // \u0027Derived::Base\u0027 resolves to Space::Base\n\nThis is handled in three places, mirroring the same C++ rule:\n\n - Swig_symbol_inherit() adds the base class\u0027 name to the derived class\u0027 C symbol\n   table, so the symbol table resolves the base named from within the derived class.\n   The node added is the base\u0027s own entry in its enclosing scope, where every class\n   is registered; it does not clash, as the derived class\u0027 constructors carry the\n   derived name.\n\n - The type system (typepass) aliases the base class\u0027 name to the base\u0027s own scope\n   within the derived class, so a base named unqualified as a type resolves to the\n   base\u0027s own type.\n\n - SwigType_typedef_qualified() resolves a scope qualified name that itself names a\n   scope (such as Derived::Base) to that scope\u0027s canonical name, so the base named\n   through the derived class resolves to the same type as the base named directly.\n\nCloses #2659\n\nAssisted-by: Claude Opus 4.8 (1M context)\n"
    },
    {
      "commit": "978f675ad7be42cc1ade0d7ffaef770671e0af5b",
      "tree": "02053249a2fbd3bf41115a0eac9667d8f14b26c4",
      "parents": [
        "bdde889c2c2e55adefc2b3aaea7ae96e683907d0"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 11 22:18:01 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 01:47:06 2026 +0100"
      },
      "message": "Fix spurious Warning 315 for a member using-declaration through a typedef base with a constructor\n\nWhen a base class declares a constructor of its own, the constructor shares the\nbase class name.  Resolving a typedef that names the base to its scope looked the\nbase class name up through the derived class\u0027 inherited scope and found the base\nconstructor ahead of the class itself, so no typedef scope alias was created and a\nlater \u0027using base_type::member;\u0027 was reported as Warning 315 and the member\nsilently dropped.\n\nSkip constructor nodes (including the using-declaration nodes that inherit base\nconstructors, which also carry the class name) when resolving a typedef to its\nscope, so the class node is found instead.\n\nResolving the typedef now goes through Swig_symbol_clookup_check, whose\nusing-declaration chase loop was missing the self-reference guard that\nSwig_symbol_clookup already has.  Add it to avoid infinite recursion (a stack\noverflow and crash) on a self-referential using declaration; the existing test\nExamples/test-suite/using2.i, with a top-level \u0027using ::baz;\u0027, exercises this.\n\nAssisted-by: Claude Opus 4.8 (1M context)\n"
    },
    {
      "commit": "bdde889c2c2e55adefc2b3aaea7ae96e683907d0",
      "tree": "5654f2b27031b58643600951d6c3ae063bbfcdfd",
      "parents": [
        "0e95ec95741f6a938b88c9d851680443d0e7528e"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 01:25:50 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 17 01:46:42 2026 +0100"
      },
      "message": "[D] Fix deprecation warnings in nspacemove runme tests\n\nThe D compiler deprecated reaching a module by its fully qualified name\nwhen only a sibling module in the same package has been imported. The\nnspacemove_nested and nspacemove_stl runme tests accessed InnerClass and\nSTL container modules this way without importing them, producing\n-Wdeprecated warnings.\n\nAdd a static import for each module that is referenced by fully qualified\nname, matching the existing nspacemove runme test.\n\nAssisted-by: Claude Opus 4.8 (1M context)\n"
    },
    {
      "commit": "0e95ec95741f6a938b88c9d851680443d0e7528e",
      "tree": "b83b6b71fcfb68f00cfcd10aa140fb572351d098",
      "parents": [
        "5fd1a0b1c53102298c859146b705d31c7fe553c8"
      ],
      "author": {
        "name": "Lars Kanis",
        "email": "lars@greiz-reinsdorf.de",
        "time": "Wed Jun 17 01:10:29 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 00:10:29 2026 +0100"
      },
      "message": "Update Ruby Data API deprecation details (#3466)\n\nThe old API was removed in https://github.com/ruby/ruby/pull/15447 and the change will be released in ruby-4.1.\r\nRuby-4.0 still supports the old untyped API."
    },
    {
      "commit": "5fd1a0b1c53102298c859146b705d31c7fe553c8",
      "tree": "90b8efdc89eebfc0113a743cb9aca7a4c04dbf5e",
      "parents": [
        "9aa5e9e3fa7a9b479ce410f2b537a043b5724f8c"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Tue Jun 16 23:27:55 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Tue Jun 16 23:32:25 2026 +0100"
      },
      "message": "Ruby: embed the TypedData wrapper for per-class descriptors too\n\nEmbedded data (RUBY_TYPED_EMBEDDABLE) was only enabled on the anonymous\nswig_type_data_type descriptor. Wrapped class objects use the per-class\nSwigClass*.cext_type descriptor, whose flags were left zero, so they were never\nembedded: the swig_ruby_wrapped_object was allocated separately and, since the\nfree callback no longer calls ruby_xfree once embedding is compiled in, leaked\non every object.\n\nSet cext_type.flags from a shared SWIG_RUBY_TYPED_DATA_FLAGS macro, used by both\nthe static swig_type_data_type and the generated per-class descriptors so they\ncan not drift apart. The flags member, and the macro, only exist from Ruby 2.1\n(guarded by RUBY_TYPED_FREE_IMMEDIATELY), so the build still works on Ruby 2.0.\n\nAdd test ruby_typeddata_embedded which checks that a wrapped object is embedded\non Ruby 3.3 and later via RTYPEDDATA_EMBEDDED_P.\n\nAssisted-by: Claude Opus 4.8\n"
    },
    {
      "commit": "9aa5e9e3fa7a9b479ce410f2b537a043b5724f8c",
      "tree": "85e589883d148ba350809dac1d1a71a90cef859c",
      "parents": [
        "058340dd8265fc61fbf6d529ef0c5168b027cb94"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Fri Jun 12 23:36:33 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Tue Jun 16 23:32:25 2026 +0100"
      },
      "message": "Ruby: avoid undefining-allocator warning for swig_runtime_data\n\nSWIG_Ruby_SetModule wrapped an instance of the swig_runtime_data class with\nTypedData_Wrap_Struct and only then called rb_undef_alloc_func on the class.\nWrapping first marks the class as a T_DATA class, so undefining its allocator\nafterwards makes Ruby 3.x print, on every module load:\n\n  warning: undefining the allocator of T_DATA class swig_runtime_data\n\nUndefine the allocator before the class has any instances to avoid the warning.\nThe class still can not be instantiated from Ruby.\n\nThis warning has been emitted for every Ruby module since commit\n4748a6c31a63c1c6c321deb85c59ce6905967452 (Ruby: use TypedData API instead of\ndeprecated untyped Data API) switched from the untyped Data API to TypedData.\n\nAssisted-by: Claude Opus 4.8\n"
    },
    {
      "commit": "058340dd8265fc61fbf6d529ef0c5168b027cb94",
      "tree": "4658581e933855a73f0d5c9121d902515f7db5d6",
      "parents": [
        "f8038e7cfc3f84f848c05181187a7f45ef0156e7"
      ],
      "author": {
        "name": "Lars Kanis",
        "email": "lars@greiz-reinsdorf.de",
        "time": "Wed Jun 10 11:39:54 2026 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Tue Jun 16 23:32:25 2026 +0100"
      },
      "message": "Ruby: Fix objects embedded data usage\n\nTwo things disabled objects embedded data usage:\n\n1. RUBY_TYPED_EMBEDDABLE is no `define`, but only an `enum` in ruby-3.3 to 4.0.\n   It will be a define in ruby-4.1, but to enable the feature we better check for TYPED_DATA_EMBEDDED which is defined in all rubies 3.3 and following.\n   The ruby docs are a bit misleading about this: https://github.com/ruby/ruby/blob/master/doc/extension.rdoc#c-struct-to-ruby-object\n\n2. RUBY_TYPED_EMBEDDABLE should be OR\u0027ed bitwise to have an effect.\n"
    },
    {
      "commit": "f8038e7cfc3f84f848c05181187a7f45ef0156e7",
      "tree": "9cef8dc8fbecc4bf3450808be44e22357d3e54de",
      "parents": [
        "a9072b72c7a7d375329abafe099cead12686db8c"
      ],
      "author": {
        "name": "Vadim Zeitlin",
        "email": "vz-swig@zeitlins.org",
        "time": "Sat Jun 13 17:35:40 2026 +0200"
      },
      "committer": {
        "name": "Vadim Zeitlin",
        "email": "vz-swig@zeitlins.org",
        "time": "Sat Jun 13 17:35:40 2026 +0200"
      },
      "message": "Fix Windows workflow file syntax broken by the previous commit\n\na9072b72c (Drop ruby urcrt64 GHA build for now, 2026-06-13) commented\nout one line too many, resulting in syntax errors for the workflow file.\n"
    },
    {
      "commit": "a9072b72c7a7d375329abafe099cead12686db8c",
      "tree": "46e18a75fdebe5e8ed0ebda4e2cbdb4fd5977a68",
      "parents": [
        "7bc2d93e2e6a130be72ba59b937e7e11fe391e9f"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jun 13 11:35:32 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Sat Jun 13 11:35:32 2026 +0100"
      },
      "message": "Drop ruby urcrt64 GHA build for now\n\nMSYS2 windows-2025-vs2026 image updated mingw-w64-crt from r59 to r92, which\ndropped the legacy SEH symbols _gnu_exception_handler and\n__mingw_oldexcpt_handler that the bundled compiler\u0027s crt2.o still\nreferences, so linking eswig.exe failed with undefined references.\n"
    },
    {
      "commit": "7bc2d93e2e6a130be72ba59b937e7e11fe391e9f",
      "tree": "c23e3e7429ad732f54ae2a5fa9fcc03c0a378f54",
      "parents": [
        "6fe73bf1448934bb25099c6e4e9e7155ff644d5e"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 10 22:03:22 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 10 22:03:53 2026 +0100"
      },
      "message": "Fix malformed comment in typepass.cxx\n"
    },
    {
      "commit": "6fe73bf1448934bb25099c6e4e9e7155ff644d5e",
      "tree": "10e3a4b5b60bc1ecf07550f902750095d40860b9",
      "parents": [
        "3999e67464d8a52f6910b43dcbbd086e474c0b5a"
      ],
      "author": {
        "name": "Lars Kanis",
        "email": "lars@greiz-reinsdorf.de",
        "time": "Wed Jun 10 08:58:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 07:58:01 2026 +0100"
      },
      "message": "Ruby: Allocate the TypedData wrapper with TypedData_Make_Struct and use embedded data (#3465)\n\nRuby-3.3+ allows to embed the wrapper data into the objects memory slot.\nThis is particular useful for SWIG since the `struct swig_ruby_wrapped_object` is a small and fixed size piece of memory.\nAlso the rest of the restrictions apply: https://github.com/ruby/ruby/blob/master/doc/extension.rdoc#c-struct-to-ruby-object\n\nThis commit reverts several changes of commit 98ea4cdf2db28dded4b365c4d984ab79453c2106 :\n\n1. Revert allocation of `struct swig_ruby_wrapped_object` per malloc:\n\nWhen using `TypedData_Make_Struct` the corresponding deacclocation should call `ruby_xfree` instead of `free`.\nThat\u0027s the better fix than changing to `malloc` allocation.\n\n2. RTYPEDDATA_DATA is reverted back to RTYPEDDATA_GET_DATA\n\nBecause RTYPEDDATA_GET_DATA was in preparation of using RUBY_TYPED_EMBEDDABLE.\n\n3. Revert back to use plain pointer for `$swig_runtime_data_type_pointer`\n\nBecause there\u0027s no need an no advantage in using `struct swig_ruby_wrapped_object` for this object.\nIt\u0027s makes things only more complicated and needs more memory.\n\n4. The simple type check of $swig_runtime_data_type_pointer was removed\n\nIt should be re-added as it protects for accident changes or GC issues."
    },
    {
      "commit": "3999e67464d8a52f6910b43dcbbd086e474c0b5a",
      "tree": "54e24e51eaa9717580a493fdb1a3e4a67bf5f4b0",
      "parents": [
        "d224682bfd3e83cbb806538c0a661fd530130cc2"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 22:44:12 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 22:46:38 2026 +0100"
      },
      "message": "Ruby: remove the obsolete std::set\u003cGC_VALUE\u003e GC workaround (#2115)\n\nReverts f029beffe8e86b1b6e8f27b8dcc0514b99fa8bac - a GC collecting the \"hello\"\nstring in the testcase resulting in occasional segfault.\n\nNo longer happens with the recently applied fix for #3385 which reworked\nSwigGCReferences to retain every tracked object in an st_table and pin them\nwith rb_gc_mark.\n\nCloses #2115\n"
    },
    {
      "commit": "d224682bfd3e83cbb806538c0a661fd530130cc2",
      "tree": "022776d194d17ddc02979fbe4a0bc67aa1ca6fdf",
      "parents": [
        "dbe3f5ec793e328f741745606f84045cbc886693"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 18:42:58 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 22:16:29 2026 +0100"
      },
      "message": "Convert Doxygen comment markers to plain C comments in SWIG source\n\nSWIG source is not run through Doxygen, so the Doxygen comment markers /**,\n/*!, /// and //! are just noise; SWIG uses plain /* ... */ block comments.\n\nDocument this in the swig-conventions skill and convert the existing Doxygen\nmarkers in SWIG\u0027s own C/C++ source (the Source/ tree and the Ruby runtime in\nLib/ruby) to plain /* comments.\n\nTarget language documentation comments that the library templates emit into generated code\n- for example the C# /// comments in Lib/csharp and the JavaScript and Java /** comments -\nare left unchanged, since they are part of the generated output rather than SWIG\u0027s own source.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "dbe3f5ec793e328f741745606f84045cbc886693",
      "tree": "28d112191b9f7232483a7b48404954343ba17b7e",
      "parents": [
        "35cba12b13d27a34f51cae2386ced43322ce4cea"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 18:54:20 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 22:16:29 2026 +0100"
      },
      "message": "Ruby: update the manual typemap examples off the deprecated Data API\n\nThe STL-vector-to-array typemap examples in the manual wrapped and unwrapped\nC++ pointers with the deprecated untyped Data_Wrap_Struct / Data_Get_Struct and\nthe raw swig_class.klass. Now that generated objects use the TypedData API, a\nraw Data_Wrap_Struct object is not compatible with SWIG_ConvertPtr, so use\nSWIG_NewPointerObj and SWIG_ConvertPtr with the $descriptor(classname *) type\ndescriptor instead. These work with both old and new SWIG.\n\nIssue #3170\n"
    },
    {
      "commit": "35cba12b13d27a34f51cae2386ced43322ce4cea",
      "tree": "385ba87e07dad0b578597965311a3d21c0d53db0",
      "parents": [
        "fd008b1406b1418dc35c2bf484928b9bb36d3373"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 18:33:04 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 22:16:29 2026 +0100"
      },
      "message": "Ruby: address review feedback - rename the TypedData wrapper struct\n\nRename the per-object wrapper struct from ruby_wrapped_object to\nswig_ruby_wrapped_object: a ruby_ prefix in the global namespace is reserved\nfor the Ruby project itself (swig/swig#3326 review). Also reword the\nhandleClassName comment.\n\nThe other review points are already satisfied by the implementation: the\nTypedData descriptors use positional rather than C99 designated initializers\n(C90), the generic callbacks take a plainly named parameter, and object\nwrapping uses the documented TypedData_Wrap_Struct rather than the internal\nData API.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "fd008b1406b1418dc35c2bf484928b9bb36d3373",
      "tree": "164d2b0ab93f5316f5446e7c98ec8517a862f835",
      "parents": [
        "98ea4cdf2db28dded4b365c4d984ab79453c2106"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 07:28:34 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 22:16:26 2026 +0100"
      },
      "message": "Ruby: complete the TypedData migration - GC marker, docs and test enforcement\n\nConvert the hidden SwigGCReferences marker object - added with the deprecated\nData_Wrap_Struct by the #3385 GC compaction fix - to TypedData_Wrap_Struct,\nremoving the last use of the untyped Data API from the Ruby runtime. The\nst_table registry and the pinning mark are unchanged; the marker still wraps a\nnon-NULL pointer so its mark function is not skipped by the garbage collector.\n\nDrop -Wno-deprecated-declarations from the Ruby test flags so that any\nreintroduced Data_Wrap_Struct, Data_Make_Struct or Data_Get_Struct fails to\ncompile under -Werror: Ruby 3.4 warns about the untyped Data API by default and\nRuby 4.0 removes it entirely, so no extra define is needed. The flag dated to an\nunrelated macOS isfinite/finite workaround, which is still applied on macOS\nthrough the common flags.\n\nAlso add the CHANGES entry and the Ruby manual note describing the migration and\nthe DATA_PTR / Data_Get_Struct replacement that hand written code must use.\n\nIssue #3170\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "98ea4cdf2db28dded4b365c4d984ab79453c2106",
      "tree": "9eadefe01160baf9700e2318eaa1657651eb245d",
      "parents": [
        "4748a6c31a63c1c6c321deb85c59ce6905967452"
      ],
      "author": {
        "name": "Julien Schueller",
        "email": "schueller@phimeca.com",
        "time": "Mon Jun 08 06:39:50 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 22:15:19 2026 +0100"
      },
      "message": "Ruby: allocate the TypedData wrapper with malloc and free it reliably\n\nThe previous commit allocated each object\u0027s ruby_wrapped_object with\nTypedData_Make_Struct and freed it from the descriptor\u0027s free callback. That\nonly installed the free callback for classes with a destructor or %freefunc, so\nthe wrapper leaked for destructor-less classes and for the anonymous SWIG::TYPE*\npointer objects, and it freed a Ruby-allocated block with plain free().\n\nAllocate the wrapper with malloc and bind it with TypedData_Wrap_Struct, and\nalways install the generic mark and free trampolines on every descriptor, the\napproach taken in #3456.\n\nThe free trampoline runs the per-object free function, if any, and then frees the\nwrapper, so malloc and free are paired and nothing leaks regardless of whether the\nclass owns a destructor. Because TypedData_Wrap_Struct never embeds the data,\nRTYPEDDATA_DATA is the correct accessor and the RTYPEDDATA_GET_DATA shim is no longer needed.\n\nSee issue #3170.\n\nAssisted-by: Claude Code (deepseek-v4-flash)\n"
    },
    {
      "commit": "4748a6c31a63c1c6c321deb85c59ce6905967452",
      "tree": "4bce0bb314333056c4bd76c6bddb9db7180229c9",
      "parents": [
        "ef8c5af40ae15ad00d0e5916446c9252bb1c3d97"
      ],
      "author": {
        "name": "Lars Kanis",
        "email": "lars.kanis@sincnovation.com",
        "time": "Mon Jun 08 07:28:11 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 22:15:19 2026 +0100"
      },
      "message": "Ruby: use TypedData API instead of deprecated untyped Data API\n\nThe untyped Data API (Data_Wrap_Struct, Data_Get_Struct, DATA_PTR and direct\naccess to RDATA()-\u003edfree) is deprecated. Ruby 3.4 warns about it by default,\nwhich becomes an error when building generated wrappers with -Werror, and Ruby\n4.0 removes the API altogether.\n\nThe generated runtime now wraps every object with the TypedData API. Because a\nTypedData rb_data_type_t is static per class, it can not carry the per-object\nmark and free functions that SWIG needs (ownership is transferred at runtime),\nso each object holds a small ruby_wrapped_object that keeps the wrapped pointer\ntogether with its mark and free functions. Generic mark and free callbacks in\nthe per-class descriptor dispatch to these per-object functions. Each class\ngets its own descriptor whose struct name is the C++ class name, which shows up\nin Ruby heap dumps and ObjectSpace statistics.\n\nThis is not fully backwards compatible: hand written code that reached the\nwrapped pointer through DATA_PTR or Data_Get_Struct must instead use the SWIG\nconversion functions, which work with old and new SWIG. The ruby_manual_proxy\ntest is updated to demonstrate the migration.\n\nSee issue #3170.\n\nThe source of this code is extracted from #3326. Also see followup commit.\n"
    },
    {
      "commit": "ef8c5af40ae15ad00d0e5916446c9252bb1c3d97",
      "tree": "736da0afa25f3a60ca35218c68b1cec70a2a39fa",
      "parents": [
        "6ec4b440d6abcfb3176f25f67c049b33b456ced5"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 18:33:34 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 18:34:56 2026 +0100"
      },
      "message": "Add a 3-level deep nested test\n"
    },
    {
      "commit": "6ec4b440d6abcfb3176f25f67c049b33b456ced5",
      "tree": "fd022daa7c4626b0c8bd6f91ab16dd3f161fdea9",
      "parents": [
        "5a46d9ec3b7c4402d8ee96c982839cfcaf484c9a"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 04 08:41:41 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Mon Jun 08 07:57:22 2026 +0100"
      },
      "message": "Keep unsupported nested classes as ignored classes, not forward declarations\n\nFor a target language that does not implement nested class support, a C++\nclass nested inside another class was discarded after parsing and replaced\nby a synthesized forward class declaration in the enclosing scope. That\nforward declaration carries no symbol table or members, so names that\nresolve through the nested class could not be resolved. In particular a\nusing declaration whose scope qualifier reaches the nested class through a\ntypedef, such as \u0027using Outer::Nested::Me::method;\u0027 where \u0027Me\u0027 is a typedef\nnaming the nested class, gave a spurious \u0027Nothing known about ...\u0027 warning\n(Warning 315) and the member was silently dropped.\n\nThe nested class is now kept as the real parsed class node and marked with\nfeature:ignore, instead of being replaced by a forward declaration. It is\nstill not wrapped (and still reported with Warning 325), but its scope,\nmembers and typedefs remain available for name resolution. This also\nresolves an out of line nested class definition written inside the\nenclosing class, such as \u0027struct Outer::Nested { ... };\u0027, which previously\nreported \u0027Outer is not defined as a valid scope\u0027.\n\nNested template classes are kept the same way. A %template instantiation of\nsuch a class still cannot be wrapped as a proxy class and continues to be\nreported with Warning 331.\n\nAdd the using_nested_member_typedef test and the cpp_nested_out_of_line_scope\nerror test. The nested_scope test was previously run only for Java and C#\nto avoid the out of line scope error above; it now runs for all languages.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "5a46d9ec3b7c4402d8ee96c982839cfcaf484c9a",
      "tree": "73ec4354cf092927640aa524b0cdaeea4be4ac3d",
      "parents": [
        "5b251e54cb1389667f57411e7b0ee1de66cb2661"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 04 22:17:38 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Fri Jun 05 08:06:19 2026 +0100"
      },
      "message": "Add -Wdelete-non-virtual-dtor to the test-suite C++ warning flags\n\nThis warning is used by some Javscript compilers, so let\u0027s enforce for\nall languages.\n"
    },
    {
      "commit": "5b251e54cb1389667f57411e7b0ee1de66cb2661",
      "tree": "12b48fa9efc2d7f40f0c5c9e8cfc60f748695a11",
      "parents": [
        "42149f507649be6791b412121e6b519cc198294c"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Fri Jun 05 00:30:02 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Fri Jun 05 00:30:02 2026 +0100"
      },
      "message": "clang-format violation fix in python.cxx\n"
    },
    {
      "commit": "42149f507649be6791b412121e6b519cc198294c",
      "tree": "19ee2b8fb76d5bc20647a7b16ee1fb7dc6c423a7",
      "parents": [
        "ddb72429fbeb437d1311ac3a692377e06f1e2938"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 04 20:33:46 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 04 23:49:27 2026 +0100"
      },
      "message": "lookupPytyping memory ownership fix\n\nFollowing on from supporting multi-argument pytyping typemaps,\nlookupPytyping could return either an owned string or a borrowed\nreference. Fix the memory handling.\n\nAdd a changes file entry for the multi-argument pytyping fix.\n"
    },
    {
      "commit": "ddb72429fbeb437d1311ac3a692377e06f1e2938",
      "tree": "38a4f0cb62e4a036240b304ec105509da6104b34",
      "parents": [
        "15cab256699ac5f677971ba5eeff56cab7f1104d"
      ],
      "author": {
        "name": "Nerixyz",
        "email": "nerixdev@outlook.de",
        "time": "Wed May 06 22:28:03 2026 +0200"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 04 23:48:53 2026 +0100"
      },
      "message": "Python: Support multi-argument typemaps for pytyping\n"
    },
    {
      "commit": "15cab256699ac5f677971ba5eeff56cab7f1104d",
      "tree": "8eba8e40900e33ae9ceda31748f22811b1202065",
      "parents": [
        "bdbf3586a84b492cb6dd7ec228c94f46b24e8da5"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 03 23:23:15 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 04 22:45:38 2026 +0100"
      },
      "message": "Qualify typedef-to-template scope qualifier before lookup\n\nWhen a using declaration\u0027s scope qualifier is a typedef to a template\ninstantiation, symbol_scope_lookup reduced the typedef target but did not\nscope qualify it before looking up the instantiated template scope. The\nreduce step qualifies template arguments but not the template name itself,\nso a template name introduced by a using declaration (rather than being\ndirectly visible or brought in by a using directive) was left unqualified\nand the instantiated scope was not found, giving a spurious \u0027Nothing known\nabout ...\u0027 warning (Warning 315), eg:\n\n  namespace Other { template \u003ctypename T\u003e struct OtherBase { typedef int Integer; typedef OtherBase\u003cT\u003e Me; }; }\n  using Other::OtherBase;\n  struct Derived : OtherBase\u003cint\u003e {\n    typedef OtherBase\u003cint\u003e Base;\n    using Base::Me::Integer;\n  };\n\nsymbol_scope_lookup now qualifies the reduced type with\nSwig_symbol_type_qualify before the lookup, following the reduce/qualify\nidiom used elsewhere (eg Swig_symbol_template_reduce). This resolves the\ntemplate name through the using declaration.\n\nExpand the using_member_typedef_template testcase for testing.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "bdbf3586a84b492cb6dd7ec228c94f46b24e8da5",
      "tree": "ab755ffd2fd8493e604f935c72fa6cce94cd097d",
      "parents": [
        "71856ff1a583975ebb96f81c9f2884c1f40e69ec"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 03 07:38:05 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 04 22:45:38 2026 +0100"
      },
      "message": "Resolve using declarations qualified by a typedef to a template instantiation\n\nExtends the #2694 fix. When a using declaration\u0027s scope qualifier is a\ntypedef to a template instantiation whose template arguments are\nthemselves typedefs, eg:\n\n  typedef int IntAlias;\n  typedef UsingBase\u003cIntAlias\u003e UsingBaseClass;\n  using UsingBaseClass::Me::Integer;\n\nthe template arguments were not reduced, so \u0027UsingBase\u003cIntAlias\u003e\u0027 did not\nmatch the instantiated \u0027UsingBase\u003cint\u003e\u0027 scope and SWIG issued a \u0027Nothing\nknown about ...\u0027 warning (Warning 315).\n\nsymbol_scope_lookup now reduces the template arguments of a template\ninstantiation typedef target via Swig_symbol_typedef_reduce before\nlooking up its scope, so the instantiated scope is found. The reduction\nfollows a typedef chain in the template argument too.\n\nAdd the using_member_typedef_template test, a template-based variant of\nusing_member_typedef, and the using_method_typedefs test (a protected\nbase method brought into the derived public interface via a using\ndeclaration through various typedef forms, covering issue #2951 for\nmembers - the symbol lookup fix above resolves it without a separate\nallocate change).\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    },
    {
      "commit": "71856ff1a583975ebb96f81c9f2884c1f40e69ec",
      "tree": "8e8354533fff48aab5666fd001cd38add72503fb",
      "parents": [
        "f5c98866f77abce0a0d73c38b2bde21d26244f23"
      ],
      "author": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Wed Jun 03 08:16:38 2026 +0100"
      },
      "committer": {
        "name": "William S Fulton",
        "email": "wsf@fultondesigns.co.uk",
        "time": "Thu Jun 04 22:45:38 2026 +0100"
      },
      "message": "Fix resolution of names with a typedef scope qualifier (#2694)\n\nA using declaration that introduces a base class member via a typedef\nused as a scope qualifier, such as \u0027using BaseAlias::Me::Integer;\u0027 where\nBaseAlias and Me are typedefs naming a class, was not resolved and SWIG\nissued a spurious \u0027Nothing known about ...\u0027 warning (Warning 315).\n\nWhen the parser qualifies the using declaration target name, the\nqualified name lookup only matched scope qualifiers against registered\nscope names and did not resolve typedefs that appear as a scope\nqualifier. The stored uname was therefore left unqualified and later\nsymbol and typedef resolution failed. Swig_symbol_clookup and\nSwig_symbol_clookup_check now fall back to resolving a typedef scope\nqualifier through to its real scope before looking up the member. Only a\nqualifier reached through a typedef is resolved here; one that resolves\ndirectly to a class or namespace scope (for example a namespace made\nvisible by a using namespace directive) is left to the normal lookup. A\ntemplate instantiation used as a scope qualifier (eg \u0027Base\u003cT\u003e::member\u0027)\nis left to the template machinery, as resolving it here can pick up an\nunsubstituted template parameter.\n\nExtend the using_member_typedef test with single, double and namespace\nqualified typedef scope qualifiers and add Java and Python runtime tests\nthat check every member and global function round trips an int.\n\nAssisted-by: Claude Code (Opus 4.8)\n"
    }
  ],
  "next": "f5c98866f77abce0a0d73c38b2bde21d26244f23"
}
