Похоже на баг. Суть в том, что компилятор почему-то разрешает объявлять метки с одинаковыми именами (хотя в тех же C и C++ такое запрещено), но учитывает только метку, объявленную самой последней.
Ещё интересно то, что метки видны не только внутри одного блока, но и в пределах всей функции, т.е. если объявить метку внутри блока if/switch/for/while/do/{}, она будет доступна и за пределами этого блока.
Следовательно, баг не специфичен конкретно для switch и пример из 1-го поста можно значительно упростить:
PHP код:
#include <a_samp>
main()
{
goto test_label;
test_label:
print("test_label 1");
return;
test_label:
print("test_label 2");
}
Обойти проблему можно довольно очевидным способом: просто не использовать метки с одинаковыми названиями.
P.S.: Баг всё ещё присутствует в последней версии Pawn (4.0), поэтому я
оставил багрепорт в репозитории Pawn на GitHub.