Clang/C2 是否使用与 Clang/LLVM 相同的语义分析和 AST?
Does Clang/C2 use the same semantic analysis & AST as Clang/LLVM?
我认为 Clang/C2 使用包含语义分析和 AST 的 Clang 前端,并用 C2 替换了 LLVM 代码生成器。
但奇怪的是 Clang/C2 和 Clang/LLVM 之间有些不一致。
例如,给定以下程序:
#include <iostream>
void f(int)
{
std::cout << "int!\n";
}
template<class T>
void fun(T i)
{
f(i);
}
void f(float)
{
std::cout << "float!\n";
}
int main()
{
fun(5.f);
return 0;
}
标准行为是 select int
重载。 G++ & Clang/LLVM 给我正确的结果。
OTOH,众所周知,MSVC 缺少 2 短语查找,因此它 select 是 float
过载。奇怪的是,Clang/C2,它应该使用 Clang 前端,因此具有 2-phrase 查找,也给我与 MSVC 相同的结果。
是Clang/C2中没有使用正常的语义分析和AST,还是故意模仿MSVC?
melak47 是正确的。我们一直在努力修复 Clang/C2 的默认设置。我们的目的是关闭所有 MSVC 兼容性选项,但我们正在逐步进行。 Clang/C2 编译器使用与 Clang/LLVM 相同的 Clang 前端,并且应该(最终)表现得像 Clang/LLVM 一样。
所以直接回答你的问题,是的 Clang/C2 使用与 Clang/LLVM 相同的语义分析和 AST。除了让它连接到 C2 之外,我们没有修改 Clang。 (小谎言:我们也让它生成调试信息,但它被推回到 Clang 主干。)
至于其他评论,Microsoft 没有必要创建 "bends to match what the MS compiler does" 的 Clang。 Clang-cl 项目就是这样做的。例如,请参阅此处的最后一张幻灯片:http://llvm.org/devmtg/2014-04/PDFs/Talks/clang-cl.pdf
我认为 Clang/C2 使用包含语义分析和 AST 的 Clang 前端,并用 C2 替换了 LLVM 代码生成器。 但奇怪的是 Clang/C2 和 Clang/LLVM 之间有些不一致。
例如,给定以下程序:
#include <iostream>
void f(int)
{
std::cout << "int!\n";
}
template<class T>
void fun(T i)
{
f(i);
}
void f(float)
{
std::cout << "float!\n";
}
int main()
{
fun(5.f);
return 0;
}
标准行为是 select int
重载。 G++ & Clang/LLVM 给我正确的结果。
OTOH,众所周知,MSVC 缺少 2 短语查找,因此它 select 是 float
过载。奇怪的是,Clang/C2,它应该使用 Clang 前端,因此具有 2-phrase 查找,也给我与 MSVC 相同的结果。
是Clang/C2中没有使用正常的语义分析和AST,还是故意模仿MSVC?
melak47 是正确的。我们一直在努力修复 Clang/C2 的默认设置。我们的目的是关闭所有 MSVC 兼容性选项,但我们正在逐步进行。 Clang/C2 编译器使用与 Clang/LLVM 相同的 Clang 前端,并且应该(最终)表现得像 Clang/LLVM 一样。
所以直接回答你的问题,是的 Clang/C2 使用与 Clang/LLVM 相同的语义分析和 AST。除了让它连接到 C2 之外,我们没有修改 Clang。 (小谎言:我们也让它生成调试信息,但它被推回到 Clang 主干。)
至于其他评论,Microsoft 没有必要创建 "bends to match what the MS compiler does" 的 Clang。 Clang-cl 项目就是这样做的。例如,请参阅此处的最后一张幻灯片:http://llvm.org/devmtg/2014-04/PDFs/Talks/clang-cl.pdf