<div dir="ltr"><div class="gmail_quote"><div dir="ltr">Hi all,<div><br></div><div>I came across an issue that happens to trigger an assertion in clang if an operation with type type is implemented in a scope that happens to install a terminate scope in the exceptions stack. I see the issue while using complex arithmetic in OpenMP regions, but I believe that could also be a problem for non-openMP codes. </div><div><br></div><div>The problem happens in `ComplexExprEmitter::EmitComplexBinOpLibCall` and is caused by an assertion in:</div><div><br></div><div>```</div><div><div>  RValue Res = CGF.EmitCall(FuncInfo, Func, ReturnValueSlot(), Args,</div><div>                            nullptr, &Call);</div><div>  cast<llvm::CallInst>(Call)->setCallingConv(CGF.CGM.getBuiltinCC());</div><div>  cast<llvm::CallInst>(Call)->setDoesNotThrow();</div></div><div>```</div><div><br></div><div>`EHStack.requiresLandingPad()` is used by `EmitCall` and is true if we have a scope installed in the exceptions stack. This causes `EmitCall` to produce an invoke instruction instead of a call instruction. </div><div><br></div><div>One of the ways to tackle the issue is use the proper attributes for the library function (e.g. no unwind). Is this the right thing to do? Or can these library calls throw in some cases?</div><div><br></div><div>Any thoughts?</div><div><br></div><div>Here is a simple code that replicates the problem:</div><div>```</div><div><div>int main (int argc, char *argv[]){</div><div>  double _Complex dc = (double)argc + 3*I;</div><div><br></div><div>  dc *= dc;</div><div>  #pragma omp parallel</div><div>  {</div><div>    dc *= dc;</div><div>  }</div></div><div>  printf("%lf %lf\n",creal(dc),cimag(dc));</div><div>  return 0;</div><div>}</div><div>``` </div><div><br></div><div>Thanks!</div><span class="HOEnZb"><font color="#888888"><div>Samuel</div></font></span></div>
</div><br></div>