clang 10 & OpenMP on range-based for error(文档说应该没问题)

clang 10 & OpenMP on range-based for error (docs say should be ok)

我正在 c++17 和 OpenMP 项目上测试 clang 10.0,当 #pragma omp parallel for 用于基于范围的 for 时出现错误。

clang 10 的发行说明,在 OpenMP Support in Clang 部分,说得很清楚:

当我使用 clang++-10 -fopenmp -std=c++17 编译 MWE 时(参见 https://godbolt.org/z/fdTeMo 在线编译器):

#include<vector>
#include<iostream>
int main(int argc, char** argv){
    std::vector<int> ii{0,11,22,33,44,55,66};
    #pragma omp parallel for
    for(int& i: ii){
        std::cerr<<i<<std::endl;
    }
}

我得到:

<source>:6:5: error: statement after '#pragma omp parallel for' must be a for loop

    for(int& i: ii){

    ^

1 error generated.

Compiler returned: 1

怎么了?

OpenMP 5.0 中添加了对 range-based for 循环的支持,并且,正如您 link 的 Clang 10 Release Notes 中所述,您需要明确使用 -fopenmp-version=50 激活支持的选项:

OpenMP Support in Clang

Use -fopenmp-version=50 option to activate support for OpenMP 5.0.

因此,如果我们将您的编译命令扩展为 clang++-10 -fopenmp -fopenmp-version=50 -std=c++17,OMP pragma 接受其后的基于范围的 for 循环。

DEMO.