<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/61926>61926</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang++ unable to compile a constexpr function within openmp statement
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
suganyat14
</td>
</tr>
</table>
<pre>
While compiling a c++ program, clang++ emits a compilation error "error: statement not allowed in constexpr function" for the following program:
cat newvec.h
#include <vector>
namespace elfplace { namespace opt {
struct VectorExprBase {};
template <typename T, typename TIndex>
class Vector : public std::vector<T>, public VectorExprBase
{
public:
using ValueType = T;
using IndexType = TIndex;
constexpr TIndex begIdx() const { return 0; }
constexpr T& eval(TIndex i) { return (*this)[i]; }
}; // End of class Vector
template <typename T> struct ConstRef;
template <typename T, typename TIndex> struct ConstRef<Vector<T, TIndex>> { using type = const Vector<T, TIndex>&; };
template <typename Expr, typename Func>
struct Reduce : public VectorExprBase
{
using ValueType = typename Expr::ValueType;
using IndexType = typename Expr::IndexType;
constexpr ValueType eval() const
{
IndexType begIdx = expr.begIdx();
ValueType res;
#pragma omp parallel for schedule(static)
for (IndexType partIdx = 0; partIdx < 100; ++partIdx)
{
IndexType partBegIdx = begIdx + partIdx ;
auto& pr = expr.eval(partBegIdx);
}
return res;
}
typename ConstRef<Expr>::type expr;
};
}} // End of namespace elfplace::opt
#include "newvec.h"
int main()
{
}
~/open-llvm/llvm-project-llvmorg-16.0.0-rc3/install_rel/bin/clang++ -fopenmp new2.cc
In file included from new2.cc:1:
./newvec.h:31:5: error: statement not allowed in constexpr function
#pragma omp parallel for schedule(static)
^
1 error generated.
GNU g++(Version 11.3.0) can compile this program. Which is the correct behavior? I understand that constexpr is determined at compilation time. Can't we use it with openmp?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVsuS6yYQ_Rq86RqVBJYtL7wYv1KzyeLWZO4yhVHbIoVABWgem3x7CvSeO6ncJF7M2NB9uvv0aYA7J-8acU_yA8lPK976yti9a-9cf3CfrVdXU37sv1dSIQhTN1JJfQcOgtADoQdorLlbXhN6BKG4vvfLWEvvgll04V4aDWitsUAojV8IewTnuccatQdtPHClzBuWIDUIo53H98bCrdUieBNK4WYs-ArhZoJlyGOIzh5JeiJp_1dwDxrfXlEkVb9OmdRCtSUCYcdXFD4kcJ47aV6ja7hAQHVrVPhCtgeYlk3jw8rcx3nbCg8vEe_83tgDd9GNbE-ELUw91o3iPsb3Hw0GXHgOtE2_nnSJ72NaQnHnemwIbDXtVUkBzpehXvY4lHF8Dj70OBgs0-mTGBKH3mqkDFoXmHzhqsXnjyYkeILnMXsA6C1idpNFn-yiyGA8ta4zAbji_al8J7QgdNdtQ_cJ_Fr0rdWQEnaAwNpXOIRuAF-5IrToMWWA-gEkhnj0lXSE7kh-kCQ_LXAHLrpVeiH0AmddgrnBnO2f6Bs7Q9_8Y8jzG95GKv5Np38EOb5MXaXHmSbYOZba9cIPbejo_DsfuhnK_wkxBsEssry0Woxq7BP9hmUbJmOS4z-o7St1LUNGLY8GM-F9JbsvXEeDmesknilyr6BRhIPtlOwUqpNsjBhQkrmEF6MxwVt0ix1CWWP5veZg6gYabrlSqOIZ5kSFZauQ0CKcgFIE1NHxFg_JYkqm4dYP2cQ5mRaOkKXd6MRjt99YwM16ET5L2MNU51AyneMvXHnrTRjFxk7E9KROWJ8JWsx0P6cLqmYGY3Nn49D1-dy1Osoe48phPsufp3t7-jTdPx7uHaBp_MJ3dk1QOl4hlM6NpPZQc6l7NSwF_-mo-ZPQi2lQPyj1WhN6Cf8eGmv-QOHjmrH3h2yTpEn6YAUj9CK181yp3y0qQi_XEOYyv1gfbgGvbsIFRxMh5tGeNNzCPd3XUMLNmno0ZI_ZeOgnhF7G8tgjCzt5GOr_dDX_f82TvD9msv6VcEeNlnssk3mBv_z6G_REEFq8oHXhXZFlCUvSONdc9y8OhHANDO-DBL5XUlQgXXw_CGMtCg9XrPirDPVe4AlaXaJ1nusSfMX9rFDpoESPtpYaS4hb06vGyxoTOHJN6NbDG0LrEKSHN-kr6HpF2KXLf1XuWbljO77CfbYp0ny3TdfZqtpvWCYYXsu0wLUoeJnteJFyxgrKdgWjbCX3NKUsXafrtGDpOkvyK8-L3Zblt23ORV6QdYo1lyoJqkqMva-kcy3uN9mOblaKX1G5-MiLuoa4GYSdn1Z2H2V5be-OrFMlnXcTipde4f44U2Cr-TXwa0aq-ReiiPVL3TMwyWnVWrWvvG9cEGMc0rv0VXtNhBkm5NOghKkI6TpCL7GcvwIAAP__RixJ-w">