Skip to content

Julia 1.12.0-rc1: --trim breaks selective imports causing UndefVarError #59207

@ChrisRackauckas-Claude

Description

@ChrisRackauckas-Claude

Description

The experimental --trim flag in Julia 1.12.0-rc1 has a bug where selective imports (e.g., using Module: func1, func2) don't work properly. Variables/functions that are not explicitly imported become undefined, even though they should be accessible within the module's scope.

This issue was discovered while testing the --trim feature with code patterns from NonlinearSolve.jl PR #665.

Minimal Reproducer

module TestTrimBug
    using LinearAlgebra: norm  # Selective import - NOT importing I
    
    function test_identity()
        return 2I  # Will fail with --trim
    end
end

TestTrimBug.test_identity()

Save as test_trim.jl and run with:

julia --experimental --trim test_trim.jl

Expected Behavior

When using using LinearAlgebra: norm, the module should still have access to all exported symbols from LinearAlgebra (like I), as per normal Julia semantics.

Actual Behavior

With --trim, only explicitly imported symbols are available. Attempting to use other symbols results in:

ERROR: LoadError: UndefVarError(:I, 0x000000000000966a, Main.TestTrimBug)

The hexadecimal reference (e.g., 0x000000000000966a) indicates a compilation issue.

Environment

  • Julia Version: 1.12.0-rc1
  • Platform: Linux x86_64
  • Command: julia --experimental --trim

Full Test Script

Click to expand full test script
#\!/usr/bin/env julia
module TestTrimImportBug
    using LinearAlgebra: norm, dot
    # NOT importing: I (identity matrix)
    
    function test_norm()
        x = [1.0, 2.0, 3.0]
        return norm(x)  # This works
    end
    
    function test_dot()
        x = [1.0, 2.0]
        y = [3.0, 4.0]
        return dot(x, y)  # This works
    end
    
    function test_identity()
        return 2I  # UndefVarError with --trim
    end
end

println("Julia \$(VERSION) --trim import bug reproducer")
println("=" ^ 50)

println("\nTesting selective imports with --trim...")

try
    result = TestTrimImportBug.test_norm()
    println("✓ norm() works: \$result")
catch e
    println("✗ norm() failed: \$e")
end

try
    result = TestTrimImportBug.test_dot()
    println("✓ dot() works: \$result")
catch e
    println("✗ dot() failed: \$e")
end

try
    result = TestTrimImportBug.test_identity()
    println("✓ I (identity) works: \$result")
catch e
    println("✗ I (identity) failed: \$e")
    if isa(e, UndefVarError)
        println("  This is the --trim bug\!")
    end
end

Output:

Julia 1.12.0-rc1 --trim import bug reproducer
==================================================

Testing selective imports with --trim...
✓ norm() works: 3.7416573867739413
✓ dot() works: 11.0
✗ I (identity) failed: UndefVarError(:I, 0x000000000000966a, Main.TestTrimImportBug)
  This is the --trim bug\!

Impact

This bug affects packages that use selective imports and const global caches, which is a common pattern in optimization and scientific computing packages. The NonlinearSolve.jl trimming tests would fail due to this issue.

Workarounds

  1. Use using Module instead of selective imports
  2. Explicitly import all needed symbols
  3. Use fully qualified names (e.g., LinearAlgebra.I)

Related

cc: @ChrisRackauckas (for NonlinearSolve.jl context)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions