Обходной путь для ошибки символа отладки с функцией авто-члена?

121
10

Кажется, что проблема связана с символами отладки и авто.


У меня есть функция auto в классе:


#include <cstddef>

template <typename T>
struct binary_expr {
auto operator()(std::size_t i){
return 1;
}
};

int main(){
binary_expr<double> b;
return 0;
}


Когда я компилирую с g++ (4.8.2) и -g, у меня есть эта ошибка:


g++ -g -std=c++1y auto.cpp
auto.cpp: In instantiation of ‘struct binary_expr<double>’:
auto.cpp:11:25: required from here
auto.cpp:4:8: internal compiler error: in gen_type_die_with_usage, at dwarf2out.c:19484
struct binary_expr {
^
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://bugs.gentoo.org/> for instructions.

С clang++ (3.4) и -g у меня есть это:


clang++ -g -std=c++1y auto.cpp
error: debug information for auto is not yet supported
1 error generated.

Если я удаляю -g или задаю тип явно, он отлично работает.


Является ли clang++, предположительно, частью С++ 14?


Есть ли обходной путь для этих ограничений или я ввернута?

спросил(а) 2014-07-07T21:48:00+04:00 6 лет, 3 месяца назад
1
Решение
113

Даже через некоторое время единственным обходным решением, которое я нашел, является создание шаблона функции, довольно глупое обходное решение... Очевидно, что clang не имеет проблем с автоматическими функциями, которые являются шаблонами. Я не знаю, работает ли это во всех случаях, но до сих пор это работало для меня.

#include <cstddef>

template <typename T>
struct binary_expr {
template<typename E = void>
auto operator()(std::size_t i){
return 1;
}
};

int main(){
binary_expr<double> b;
return 0;
}

ответил(а) 2015-08-12T09:18:00+03:00 5 лет, 2 месяца назад
71

Теперь это работает на Clang 3.5 SVN. Пример Live. Похоже, что виновником было совершение с мая 2013 года, см. Это сообщение в списке рассылки Clang.


PR16091: Ошибка при попытке испускать информацию об отладке для undeduced auto типы возврата

Возможно, нам следует просто подавить это, а не ошибки, но поскольку у нас есть инфраструктура для этого, я решил, что буду использовать его - если это что это неправильная вещь, мы, вероятно, должны удалить эту инфраструктуры полностью. Я предполагаю, что он лежал с ранних дней поддержки поддержки отладки.


// RUN: %clang_cc1 -emit-llvm-only -std=c++1y -g %s 2>&1 | FileCheck %s
2
3 struct foo {
4 auto func(); // CHECK: error: debug information for auto is not yet supported
5 };
6
7 foo f;

Однако я не могу найти коммит, который удалил эту информацию, возможно, произошло улучшение, которое теперь предотвращает запуск этого поведения.

ответил(а) 2014-07-22T15:50:00+04:00 6 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема