Skip to content

QA: Aqua undefined_exports flags du_cache/u_cache/user_cache on Julia 1.12 (DiffEqBase @reexport binding-partition) #157

Description

@ChrisRackauckas-Claude

Summary

On Julia 1.12 (the QA julia 1 lane), Aqua.test_undefined_exports(HighDimPDE) fails:

Undefined exports detected:
3-element Vector{Symbol}:
 Symbol("HighDimPDE.du_cache")
 Symbol("HighDimPDE.u_cache")
 Symbol("HighDimPDE.user_cache")

This reproduces on unmodified main (scheduled run 28211297790, job 83573031987, where the old hand-rolled qa.jl already called Aqua.test_undefined_exports). It is not introduced by the run_qa v1.6 conversion (#156).

Root cause

src/HighDimPDE.jl does @reexport using DiffEqBase. @reexport re-exports every name in names(DiffEqBase), which includes du_cache/u_cache/user_cache. These three are owned by SciMLBase (parentmodule(DiffEqBase.du_cache) == SciMLBase) and only re-exported by DiffEqBase — so HighDimPDE re-exports them through a double-reexport chain SciMLBase -> DiffEqBase -> HighDimPDE.

On Julia 1.10 / 1.11 the binding resolves and isdefined(HighDimPDE, :du_cache) == true, so Aqua passes (verified locally on 1.10: Undefined exports from HighDimPDE: Symbol[]). On Julia 1.12 the binding-partition / export-visibility change makes isdefined(HighDimPDE, :du_cache) == false even though the export still exists, so Aqua reports it as an undefined export. Verified locally on 1.12.6: all three defined=false.

This is a Julia-1.12-only artifact of the SciMLBase/DiffEqBase @reexport chain, not a real over-export in HighDimPDE's own source (the names appear nowhere in src/). The proper fix is upstream (SciMLBase/DiffEqBase export hygiene under 1.12, or Reexport/Julia binding handling), not in this repo.

Interim handling

Marked aqua_broken = (:undefined_exports,) in test/qa/qa.jl with a comment pointing here. run_qa disables the sub-check in Aqua.test_all and emits a tracked @test_broken, so the lane goes green and auto-flags (Unexpected Pass) once the upstream chain is fixed and the name resolves on 1.12.

Reproduction

# Julia 1.12, QA env
using HighDimPDE
[n for n in names(HighDimPDE) if !isdefined(HighDimPDE, n)]
# => [:du_cache, :u_cache, :user_cache]  (empty on 1.10/1.11)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions