xref: /openbsd-src/gnu/usr.bin/perl/dist/threads/t/unique.t (revision 5759b3d249badf144a6240f7eec4dcf9df003e6b)
1*5759b3d2Safresh1use strict;
2*5759b3d2Safresh1use warnings;
3*5759b3d2Safresh1
4*5759b3d2Safresh1BEGIN {
5*5759b3d2Safresh1    use Config;
6*5759b3d2Safresh1    if (! $Config{'useithreads'}) {
7*5759b3d2Safresh1        print("1..0 # SKIP Perl not compiled with 'useithreads'\n");
8*5759b3d2Safresh1        exit(0);
9*5759b3d2Safresh1    }
10*5759b3d2Safresh1    if ($] >= 5.027000) {
11*5759b3d2Safresh1        print("1..0 # SKIP 'unique' attribute no longer exists\n");
12*5759b3d2Safresh1        exit(0);
13*5759b3d2Safresh1    }
14*5759b3d2Safresh1}
15*5759b3d2Safresh1
16*5759b3d2Safresh1use ExtUtils::testlib;
17*5759b3d2Safresh1
18*5759b3d2Safresh1use threads;
19*5759b3d2Safresh1
20*5759b3d2Safresh1BEGIN {
21*5759b3d2Safresh1    if (! eval 'use threads::shared; 1') {
22*5759b3d2Safresh1        print("1..0 # SKIP threads::shared not available\n");
23*5759b3d2Safresh1        exit(0);
24*5759b3d2Safresh1    }
25*5759b3d2Safresh1
26*5759b3d2Safresh1    $| = 1;
27*5759b3d2Safresh1    print("1..6\n") ;           ### Number of tests that will be run ###
28*5759b3d2Safresh1}
29*5759b3d2Safresh1
30*5759b3d2Safresh1print("ok 1 - Loaded\n");
31*5759b3d2Safresh1
32*5759b3d2Safresh1### Start of Testing ###
33*5759b3d2Safresh1
34*5759b3d2Safresh1no warnings 'deprecated';       # Suppress warnings related to :unique
35*5759b3d2Safresh1
36*5759b3d2Safresh1my $test :shared = 2;
37*5759b3d2Safresh1
38*5759b3d2Safresh1# bugid 24383 - :unique hashes weren't being made readonly on interpreter
39*5759b3d2Safresh1# clone; check that they are.
40*5759b3d2Safresh1
41*5759b3d2Safresh1our $unique_scalar : unique;
42*5759b3d2Safresh1our @unique_array : unique;
43*5759b3d2Safresh1our %unique_hash : unique;
44*5759b3d2Safresh1threads->create(sub {
45*5759b3d2Safresh1        lock($test);
46*5759b3d2Safresh1        my $TODO = ":unique needs to be re-implemented in a non-broken way";
47*5759b3d2Safresh1        eval { $unique_scalar = 1 };
48*5759b3d2Safresh1        print $@ =~ /read-only/
49*5759b3d2Safresh1          ? '' : 'not ', "ok $test # TODO $TODO - unique_scalar\n";
50*5759b3d2Safresh1        $test++;
51*5759b3d2Safresh1        eval { $unique_array[0] = 1 };
52*5759b3d2Safresh1        print $@ =~ /read-only/
53*5759b3d2Safresh1          ? '' : 'not ', "ok $test # TODO $TODO - unique_array\n";
54*5759b3d2Safresh1        $test++;
55*5759b3d2Safresh1        if ($] >= 5.008003 && $^O ne 'MSWin32') {
56*5759b3d2Safresh1            eval { $unique_hash{abc} = 1 };
57*5759b3d2Safresh1            print $@ =~ /disallowed/
58*5759b3d2Safresh1              ? '' : 'not ', "ok $test # TODO $TODO - unique_hash\n";
59*5759b3d2Safresh1        } else {
60*5759b3d2Safresh1            print("ok $test # SKIP $TODO - unique_hash\n");
61*5759b3d2Safresh1        }
62*5759b3d2Safresh1        $test++;
63*5759b3d2Safresh1    })->join;
64*5759b3d2Safresh1
65*5759b3d2Safresh1# bugid #24940 :unique should fail on my and sub declarations
66*5759b3d2Safresh1
67*5759b3d2Safresh1for my $decl ('my $x : unique', 'sub foo : unique') {
68*5759b3d2Safresh1    {
69*5759b3d2Safresh1        lock($test);
70*5759b3d2Safresh1        if ($] >= 5.008005) {
71*5759b3d2Safresh1            eval $decl;
72*5759b3d2Safresh1            print $@ =~ /^The 'unique' attribute may only be applied to 'our' variables/
73*5759b3d2Safresh1                    ? '' : 'not ', "ok $test - $decl\n";
74*5759b3d2Safresh1        } else {
75*5759b3d2Safresh1            print("ok $test # SKIP $decl\n");
76*5759b3d2Safresh1        }
77*5759b3d2Safresh1        $test++;
78*5759b3d2Safresh1    }
79*5759b3d2Safresh1}
80*5759b3d2Safresh1
81*5759b3d2Safresh1
82