|  | 
| 611 | 611 | # Test that the hash function works without world age issues | 
| 612 | 612 | @test hash(bar59429, UInt(0)) isa UInt | 
| 613 | 613 | end | 
|  | 614 | + | 
|  | 615 | +# Backdating tests | 
|  | 616 | +module BackdateConstTest | 
|  | 617 | +    using Test | 
|  | 618 | +    const world_before = Base.get_world_counter() | 
|  | 619 | +    f() = BACKDATED_CONST  # defined in old world | 
|  | 620 | +    const world_after_f = Base.get_world_counter() | 
|  | 621 | +    const BACKDATED_CONST = 42  # defined in new world | 
|  | 622 | +    @test BACKDATED_CONST == 42 | 
|  | 623 | +    if Base.JLOptions().depwarn <= 1 | 
|  | 624 | +        # depwarn=no or yes: backdating works, emits warning | 
|  | 625 | +        # Call f from the old world (before BACKDATED_CONST was defined) | 
|  | 626 | +        @test_warn "Detected access to binding `BackdateConstTest.BACKDATED_CONST`" Base.invoke_in_world(world_after_f, f) | 
|  | 627 | +        @test Base.invoke_in_world(world_before, isdefinedglobal, @__MODULE__, :BACKDATED_CONST) | 
|  | 628 | +    else | 
|  | 629 | +        # depwarn=error: backdating disabled | 
|  | 630 | +        @test !Base.invoke_in_world(world_before, isdefinedglobal, @__MODULE__, :BACKDATED_CONST) | 
|  | 631 | +        @test_throws UndefVarError Base.invoke_in_world(world_after_f, f) | 
|  | 632 | +    end | 
|  | 633 | +end | 
|  | 634 | + | 
|  | 635 | +module BackdateImportTest | 
|  | 636 | +    using Test | 
|  | 637 | +    module Source | 
|  | 638 | +        exported_value = 42  # Use a value, not a function | 
|  | 639 | +    end | 
|  | 640 | +    const world_before = Base.get_world_counter() | 
|  | 641 | +    g() = exported_value  # defined in old world | 
|  | 642 | +    const world_after_g = Base.get_world_counter() | 
|  | 643 | +    import .Source: exported_value  # import in new world | 
|  | 644 | +    @test exported_value == 42 | 
|  | 645 | +    if Base.JLOptions().depwarn <= 1 | 
|  | 646 | +        @test_warn "Detected access to binding `BackdateImportTest.exported_value`" Base.invoke_in_world(world_after_g, g) | 
|  | 647 | +        @test Base.invoke_in_world(world_before, isdefinedglobal, @__MODULE__, :exported_value) | 
|  | 648 | +    else | 
|  | 649 | +        @test !Base.invoke_in_world(world_before, isdefinedglobal, @__MODULE__, :exported_value) | 
|  | 650 | +        @test_throws UndefVarError Base.invoke_in_world(world_after_g, g) | 
|  | 651 | +    end | 
|  | 652 | +end | 
|  | 653 | + | 
|  | 654 | +module BackdateGlobalTest | 
|  | 655 | +    using Test | 
|  | 656 | +    const world_before = Base.get_world_counter() | 
|  | 657 | +    h() = backdated_global  # defined in old world | 
|  | 658 | +    const world_after_h = Base.get_world_counter() | 
|  | 659 | +    global backdated_global::Int = 123  # defined in new world | 
|  | 660 | +    @test backdated_global == 123 | 
|  | 661 | +    if Base.JLOptions().depwarn <= 1 | 
|  | 662 | +        @test_warn "Detected access to binding `BackdateGlobalTest.backdated_global`" Base.invoke_in_world(world_after_h, h) | 
|  | 663 | +        @test Base.invoke_in_world(world_before, isdefinedglobal, @__MODULE__, :backdated_global) | 
|  | 664 | +    else | 
|  | 665 | +        @test !Base.invoke_in_world(world_before, isdefinedglobal, @__MODULE__, :backdated_global) | 
|  | 666 | +        @test_throws UndefVarError Base.invoke_in_world(world_after_h, h) | 
|  | 667 | +    end | 
|  | 668 | +end | 
|  | 669 | + | 
|  | 670 | +# Test case from issue #58511 | 
|  | 671 | +module BackdateIssue58511 | 
|  | 672 | +    using Test | 
|  | 673 | +    function foo() | 
|  | 674 | +        eval(:(a = 42)) | 
|  | 675 | +        return a | 
|  | 676 | +    end | 
|  | 677 | +    if Base.JLOptions().depwarn <= 1 | 
|  | 678 | +        @test_warn "Detected access to binding `BackdateIssue58511.a`" foo() | 
|  | 679 | +    else | 
|  | 680 | +        @test_throws UndefVarError foo() | 
|  | 681 | +    end | 
|  | 682 | +end | 
|  | 683 | + | 
|  | 684 | +# Test that implicit imports are NOT backdated | 
|  | 685 | +module BackdateNoImplicitTest | 
|  | 686 | +    using Test | 
|  | 687 | +    module Source1 | 
|  | 688 | +        export shared_name | 
|  | 689 | +        shared_name() = 1 | 
|  | 690 | +    end | 
|  | 691 | +    module Source2 | 
|  | 692 | +        export shared_name | 
|  | 693 | +        shared_name() = 2 | 
|  | 694 | +    end | 
|  | 695 | +    const world_before = Base.get_world_counter() | 
|  | 696 | +    using .Source1, .Source2 | 
|  | 697 | +    @test_throws UndefVarError shared_name() | 
|  | 698 | +    @test !Base.invoke_in_world(world_before, isdefinedglobal, @__MODULE__, :shared_name) | 
|  | 699 | +end | 
0 commit comments