Действительно, это ошибка в GCC, о которой говорилось в комментариях, но я подумал, что хотел бы дать дополнительное представление о природе этой ошибки.В файле GCC NEWS есть эта строка:
__FUNCTION__
и __PRETTY_FUNCTION__
теперь обрабатываются парсером как переменные;ранее они рассматривались как строковые константы.Поэтому код типа printf (__FUNCTION__ ": foo")
должен быть переписан на printf ("%s: foo", __FUNCTION__)
.Это необходимо для шаблонов.
Но __PRETTY_FUNCTION__
на самом деле не переменная, это особый случай, который обрабатывается в синтаксическом анализаторе, как мы видим в constexpr.c
:
case DECL_EXPR:
{
tree decl = DECL_EXPR_DECL (body);
if (TREE_CODE (decl) == USING_DECL
/* Accept __func__, __FUNCTION__, and __PRETTY_FUNCTION__. */
|| DECL_ARTIFICIAL (decl))
return NULL_TREE;
return error_mark_node;
}
Если бы это действительно была переменная, мы ожидали бы, что она пройдет те же тесты, что и эти:
constexpr const char* s2 = "TEST";
constexpr const char* s3 = s2;
test_template<ce_strlen("TEST")> c;
test_template<ce_strlen(s2)> d;
test_template<ce_strlen(s3)> e;