<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">