Currently the following case fails:
template<typename Ty>
Ty foo(Ty *addr, Ty val) {
Ty v;
#pragma omp atomic compare capture
{
v = *addr;
if (*addr > val)
*addr = val;
}
return v;
}The compiler complains addr is not a lvalue. That's because when an expression
is instantiation dependent, we cannot tell if it is lvalue or not.