require './test.pl';
}
-plan (109);
+plan (114);
+# Please do not eliminate the plan. We have tests in DESTROY blocks.
sub expected {
my($object, $package, $type) = @_;
# class is a ref
$a1 = bless {}, "A4";
$b1 = eval { bless {}, $a1 };
-isnt ($@, '', "class is a ref");
+like ($@, qr/^Attempt to bless into a reference at /, "class is a ref");
# class is an overloaded ref
{
bless [], "main::";
ok(1, 'blessing into main:: does not crash'); # [perl #87388]
+
+sub _117941 { package _117941; bless [] }
+delete $::{"_117941::"};
+eval { _117941() };
+like $@, qr/^Attempt to bless into a freed package at /,
+ 'bless with one arg when current stash is freed';
+
+for(__PACKAGE__) {
+ eval { bless \$_ };
+ like $@, qr/^Modification of a read-only value attempted/,
+ 'read-only COWs cannot be blessed';
+}
+
+sub TIESCALAR { bless \(my $thing = pop), shift }
+sub FETCH { ${$_[0]} }
+tie $tied, main => $untied = [];
+eval { bless $tied };
+is ref $untied, "main", 'blessing through tied refs' or diag $@;
+
+bless \$victim, "Food";
+eval 'bless \$Food::bard, "Bard"';
+sub Bard::DESTROY {
+ isnt ref(\$victim), '__ANON__',
+ 'reblessing does not leave an object in limbo temporarily';
+ bless \$victim
+}
+undef *Food::;
+{
+ my $w;
+ # This should catch ‘Attempt to free unreferenced scalar’.
+ local $SIG{__WARN__} = sub { $w .= shift };
+ bless \$victim;
+ is $w, undef,
+ 'no warnings when reblessing inside DESTROY triggered by reblessing'
+}