diff --git a/MANIFEST b/MANIFEST index bcd14aa47f..0dad869726 100644 --- a/MANIFEST +++ b/MANIFEST @@ -5238,6 +5238,7 @@ t/uni/chomp.t See if Unicode chomp works t/uni/chr.t See if Unicode chr works t/uni/class.t See if Unicode classes work (\p) t/uni/fold.t See if Unicode folding works +t/uni/goto.t See if Unicode goto &sub works t/uni/greek.t See if Unicode in greek works t/uni/gv.t See if Unicode GVs work. t/uni/latin2.t See if Unicode in latin2 works diff --git a/pp_ctl.c b/pp_ctl.c index 054de67e28..03647236d7 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -2813,8 +2813,9 @@ PP(pp_goto) /* autoloaded stub? */ if (cv != GvCV(gv) && (cv = GvCV(gv))) goto retry; - autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv), - GvNAMELEN(gv), FALSE); + autogv = gv_autoload_pvn(GvSTASH(gv), GvNAME(gv), + GvNAMELEN(gv), + GvNAMEUTF8(gv) ? SVf_UTF8 : 0); if (autogv && (cv = GvCV(autogv))) goto retry; tmpstr = sv_newmortal(); diff --git a/t/uni/goto.t b/t/uni/goto.t new file mode 100644 index 0000000000..922ddc15d9 --- /dev/null +++ b/t/uni/goto.t @@ -0,0 +1,41 @@ +#!./perl -w + +BEGIN { + require './test.pl'; +} + +plan tests => 4; + +use utf8; +use open qw( :utf8 :std ); + +sub goto_baresub { + goto &問題の原因; +} + +sub goto_softref { + goto &{"問題の原因"}; +} + +sub goto_softref_octal { + goto &{"\345\225\217\351\241\214\343\201\256\345\216\237\345\233\240"}; +} + +sub 問題の原因 { + 1; +} + +ok goto_baresub(), "Magical goto works on an UTF-8 sub,"; +ok goto_softref(), "..and an UTF-8 softref sub,"; + +{ + local $@; + eval { goto_softref_octal() }; + like $@, qr/Goto undefined subroutine &main::\345\225\217\351\241\214\343\201\256\345\216\237\345\233\240/, "But does NOT find the softref sub when it's lacking the UTF-8 flag"; +} + +{ + local $@; + eval { goto &因 }; + like $@, qr/Goto undefined subroutine &main::因/, "goto undefined sub gets the right error message"; +}