[Openmp-dev] exception throwing from a copy constructor for a firstprivate

Joachim Protze via Openmp-dev openmp-dev at lists.llvm.org
Wed Dec 15 00:21:26 PST 2021


Hi Natalia,

I redirected this question to the OpenMP language committee. I think 
this case might be an oversight. The spec does not define, when the copy 
constructor is used to initialize the variable.

Best
Joachim

Am 14.12.21 um 20:18 schrieb Natalia Glagoleva via Openmp-dev:
> In Standard 5.2 I see these two phrases:
> 
> (p 48, 16-19) A throw executed inside a region that arises from a 
> thread-limiting directive must cause 17 execution to resume within the 
> same region, and the same thread that threw the exception must 18 catch 
> it. If the directive is also exception-aborting then whether the 
> exception is caught or the 19 throw results in runtime error termination 
> is implementation defined.
> 
> (p 617, 3-4) Whether a throw executed inside a region that arises from 
> an exception-aborting directive 4 results in runtime error termination 
> is implementation defined (see Section 3.1).
> 
> I am trying the attached test,
> 
> clang -O0 task_ftp_EH3_noeh.cpp  -DNOISY -DCOUNT=2 -fopenmp
> 
> The essential part:
> 
> void main_test(MyObject* pTree, int i) {
> 
>      if (!pTree) return;
> 
> #pragma omp parallel default(none) shared(i, pTree) 
> num_threads(NUM_THREADS)
> 
> #pragma omp single
> 
>      {
> 
>          while (pTree) {
> 
>              try {
> 
>                  MyObject tree(*pTree);
> 
> #pragma omp task firstprivate(i, tree)
> 
>                  {
> 
>                      …
> 
>                      main_test(tree.right, i + 4);
> 
>                  }
> 
>                    …
> 
>              }
> 
>              catch (std::exception) {
> 
>                  …
> 
>              }
> 
>              …
> 
>          }
> 
>      }
> 
> }
> 
> Where copy constructor for ‘tree’ throws when it’s called for 
> firstprivate clause (called second time).
> 
> My assumption was that the clause is computed in the ‘single’ region, 
> not ‘task’ region, and catch is there too, so I thought that technically 
> it should be legal and catch should work.
> 
> This is hanging in the runtime, verified with llvm 13 release.
> 
> Is it a bug?
> 
> Thank you,
> 
> Natalia Glagoleva
> 
> 
> _______________________________________________
> Openmp-dev mailing list
> Openmp-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/openmp-dev
> 



More information about the Openmp-dev mailing list