From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#! /usr/bin/env perl
# empty cvs, exists and defined &cv
use strict;
BEGIN {
unshift @INC, 't';
require TestBC;
}
use Test::More tests => 7;
use Config;
my $name = 'ccode251i';
use B::C ();
my $todo = ($B::C::VERSION ge '1.43_06') ? "" : "TODO ";
ctestok(1,'C,-O3',$name,<<'EOF', $todo.'#251 simple predeclaration');
sub f;$e=exists &f;$d=defined &f;print "ok" if "-$e-$d-" eq "-1--";
EOF
ctestok(2,'C,-O3',$name,<<'EOF', ($] >= 5.018 ? "TODO 5.18 " : "").$todo.'#251 lvalue predeclaration');
sub f :lvalue;$e=exists &f;$d=defined &f;print "ok" if "-$e-$d-" eq "-1--";
EOF
ctestok(3,'C,-O3',$name,<<'EOF', $todo.'#251 empty proto predeclaration');
sub f ();$e=exists &f;$d=defined &f;print "ok" if "-$e-$d-" eq "-1--";
EOF
ctestok(4,'C,-O3',$name,<<'EOF', $todo.'#251 proto predeclaration');
sub f ($);$e=exists &f;$d=defined &f;print "ok" if "-$e-$d-" eq "-1--";
EOF
ctestok(5,'C,-O3',$name,<<'EOF', '#251 regular cv definition');
sub f{1};$e=exists &f;$d=defined &f;print "ok" if "-$e-$d-" eq "-1-1-";
EOF
# similar but not same as test 1
# passes now threaded >= 5.8.9
my $todo6 = ($] < 5.008009 or !$Config{useithreads}) ? "TODO " : "";
ctestok(6,'C,-O3','ccode290i',<<'EOF', $todo6.'#290 empty sub exists && not defined');
sub f; print "ok" if exists &f && not defined &f;
EOF
# and this works ok
ctestok(7,'C,-O3','ccode290i',<<'EOF', '#290 empty sub not defined && exists');
sub f; print "ok" if not defined &f && exists &f;
EOF