如何忽略作为clang C ++模块一部分的标题中的警告?

时间:2016-08-11 07:30:07

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

我们正在使用与-fmodule-fcxx-module的clang来启用模块支持,如http://clang.llvm.org/docs/Modules.html所述。通过为我们的核心库定义模块映射,我们已经看到了构建时间的显着改进。

但是,我们有一些库标题使用pragma来禁用某些行的警告,例如:

template <typename TFloat>
static bool exactlyEqual(TFloat lhs, TFloat rhs)
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wfloat-equal"
    return lhs == rhs;
#pragma clang diagnostic pop
}

当此标头作为预编译模块被拉入时,似乎clang的内部表示不保留编译指示信息,并且仍然会发出警告。由于我们将警告视为错误,因此导致编译失败。有些人可能会争辩完全禁用float-equal,但我们还有一些其他具有不同警告的情况,我们不希望全局禁用。

我们已经在使用-Wno-system-headers-isystem,因此图书馆的客户端通常不会看到这样的警告(即使没有编译指示),但这似乎不起作用标头作为模块导入。此外,我们仍然会对库内部的代码发出这些警告,其中包含标头作为非系统标头(即不使用-isystem /使用双引号),因为模块预编译和导入也发生在这里。

我尝试使用_Pragma(...)代替#pragma而没有任何效果。

是否有其他方法有条件地忽略来自预编译clang模块的标头中的警告?

更新:我已在https://github.com/MikeWeller/ClangModuleWarnings上放置示例项目,以重现问题

更新:似乎[system]模块属性将取消所有警告。然而,这甚至会抑制我们在构建库本身时想要看到的警告,并且我们不希望制作所有模块系统模块。如果我们在构建库本身时找到了不使用库模块映射的方法,这可能是可以接受的,但我们仍然希望对非系统模块进行某些警告。

0 个答案:

没有答案