使用自动成员函数解决调试符号错误的方法?

时间:2014-07-07 18:48:04

标签: c++ gcc c++11 clang c++14

调试符号和自动似乎存在问题。

我在课堂上有一个自动功能:

#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 ++应该是C ++ 14功能完整吗?

是否存在针对这些限制的解决方法或者我搞砸了?

2 个答案:

答案 0 :(得分:2)

这现在似乎适用于Clang 3.5 SVN。 Live Example。似乎罪魁祸首是2013年5月的提交,请参阅Clang邮件列表中的message

  

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;

但是,我找不到删除此信息的提交,也许有一项改进现在可以防止触发此行为。

答案 1 :(得分:0)

即使过了一段时间,我发现的唯一解决方法是制作功能模板,非常愚蠢的解决方法......显然,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;
}