jdoerfert added inline comments.
================ Comment at: lib/Headers/__clang_cuda_cmath.h:55-56 +#if defined(_OPENMP) && defined(__cplusplus) +__DEVICE__ const float abs(const float __x) { return ::fabsf((float)__x); } +__DEVICE__ const double abs(const double __x) { return ::fabs((double)__x); } +#endif ---------------- efriedma wrote: > gtbercea wrote: > > tra wrote: > > > Where do these functions come from? > > > https://en.cppreference.com/w/cpp/numeric/math/fabs does not seem to show > > > any `abs` functions with const args. > > What's happening is that when including the random header file, this header > > file uses abs with const arguments: > > > > > > ``` > > const double __n = _M_nd(__urng); > > const double __y = -std::abs(__n) * __param._M_sm - 1; > > ``` > > > > And without there functions here the error I get is: > > > > > > ``` > > In file included from test.c:8: > > In file included from > > /usr/lib/gcc/ppc64le-redhat-linux/4.8.5/../../../../include/c++/4.8.5/random:52: > > /usr/lib/gcc/ppc64le-redhat-linux/4.8.5/../../../../include/c++/4.8.5/bits/random.tcc:1476:27: > > error: call to 'abs' is ambiguous > > const double __y = -std::abs(__n) * __param._M_sm - 1; > > ^~~~~~~~ > > /usr/include/stdlib.h:770:12: note: candidate function > > extern int abs (int __x) __THROW __attribute__ ((__const__)) __wur; > > ^ > > /usr/lib/gcc/ppc64le-redhat-linux/4.8.5/../../../../include/c++/4.8.5/cstdlib:166:3: > > note: candidate function > > abs(long __i) { return __builtin_labs(__i); } > > ^ > > /usr/lib/gcc/ppc64le-redhat-linux/4.8.5/../../../../include/c++/4.8.5/cstdlib:174:3: > > note: candidate function > > abs(long long __x) { return __builtin_llabs (__x); } > > ^ > > /usr/lib/gcc/ppc64le-redhat-linux/4.8.5/../../../../include/c++/4.8.5/cstdlib:179:3: > > note: candidate function > > abs(__int128 __x) { return __x >= 0 ? __x : -__x; } > > ^ > > ``` > Overloading ignores the "const"; `float abs(float)` is the same thing. So > probably clearer to declare it without the extra "const" modifiers, and then > clean up the redundant definitions. > > That said, I'm not sure how you managed to pick up the declarations from > cstdlib, but not cmath. What files are getting included when this fails? > > (Actually, in C++17, both cmath and cstdlib are supposed to declare all the > float and integer overloads of abs, but that's only implemented in newer > versions of libstdc++.) > That said, I'm not sure how you managed to pick up the declarations from > cstdlib, but not cmath. What files are getting included when this fails? Until we get support for OpenMP `omp declare variant begin/end` support in clang (X), we will only provide the CUDA declarations & definitions for math functions, not the host ones. It is one of these problems that arises when the single source language needs both, device and host definitions. (In CUDA the `__device__` overload is the way out, in OpenMP it will be `variant` with an appropriate device context.) (X) I'm right now working on integrating this into OpenMP 5.1 but we can implement it as soon as the design is decided on. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D62046/new/ https://reviews.llvm.org/D62046 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits