【问题标题】:Clang emits an "unused type alias" warning for a type alias that is usedClang 为使用的类型别名发出“未使用的类型别名”警告
【发布时间】:2018-05-06 22:55:44
【问题描述】:

我有一些 Clang 正在生成警告的代码。这是从实际代码中简化的,但精神是一样的。本地类中的this_t 用于实例化其他模板类。

template<class T>
struct value_holder
{
    T  value;
};

template<class T>
int get_value()
{
    struct value_t
    {
        using this_t = value_t;
        //    ^ here
        static value_holder<this_t> val()
        {
            return value_holder<this_t>();
        }

        operator int()
        { return 0; }
    };
    return value_t::val().value;
}

int main(int argc, char** argv) {
    return get_value<void>();
}

当使用-std=c++1z -Wall 编译时,Clang 会警告unused type alias

main.cpp:14:15: warning: unused type alias 'this_t' [-Wunused-local-typedef]
        using this_t = value_t;
              ^
1 warning generated.

您可以在 godbolt (6.0, trunk) 上看到错误,而我在本地使用的 Clang 7 报告了同样的情况。

仅当本地类嵌套在模板类的模板函数或方法中时,才会出现此警告。当类嵌套在具体类或函数中时,不会发出警告。

Clang 在此处发出此警告是否正确? this_t 类型用于value_t::val() 的返回类型。

【问题讨论】:

  • @VTT 它用于val() 的定义中,因此它看起来绝对不是“未使用”的类型别名。如果您取出using,代码将无法编译。
  • 我的猜测是,在解析了模板类型之后,当它编译具体代码时,它有一些value_holder_value_t 类并且“忘记了”它使用this_t 来解析模板类型。
  • 在godbolt输出中,注意签名int get_value&lt;void&gt;()::value_t::val()中的返回类型。不知何故,它认识到value_holder&lt;value_t&gt; 类型永远不会在get_value() 之外出现,并且正在“优化”函数签名。
  • 我设置-Wno-unused-local-typedef 多年前从未回头
  • 请记住,POSIX 保留所有以_t 结尾的名称供实现使用,因此对于您自己的类型/函数/别名来说,这样的名称通常不是一个好的选择。

标签: c++ clang clang++ llvm-clang type-alias


【解决方案1】:

这似乎是 Clang 中的一个错误(2488333298),于 2015 年针对 Clang 3.7 首次报告。我在 Godbolt 中尝试过,它似乎早在 3.6 就出现了。

【讨论】:

    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多