[PATCH] D79526: [CUDA][HIP] Workaround for resolving host device function against wrong-sided function
Artem Belevich via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri May 8 14:31:38 PDT 2020
tra added a comment.
This one is just a FYI. I've managed to reduce the failure in the first version of this patch and it looks rather odd because the reduced test case has nothing to do with CUDA. Instead it appears to introduce a difference in compilation of regular host-only C++ code with `-x cuda` vs -x `c++`. I'm not sure how/why first version caused this and why the latest one fixes it. It may be worth double checking that we're not missing something here.
template <class a> a b;
auto c(...);
template <class d> constexpr auto c(d) -> decltype(0);
struct e {
template <class ad, class... f> static auto g(ad, f...) {
h<e, decltype(b<f>)...>;
}
struct i {
template <class, class... f> static constexpr auto j(f... k) { c(k...); }
};
template <class, class... f> static auto h() { i::j<int, f...>; }
};
class l {
l() {
e::g([] {}, this);
}
};
The latest version of this patch works, but previous one failed with an error, when the example was compiled as CUDA, but not, when it was compiled as C++:
$ bin/clang++ -x cuda argmax.cc -ferror-limit=1 -fsyntax-only --cuda-host-only -nocudalib -nocudainc -fsized-deallocation -std=c++17
argmax.cc:9:68: error: function 'c' with deduced return type cannot be used before it is defined
template <class, class... f> static constexpr auto j(f... k) { c(k...); }
^
argmax.cc:11:53: note: in instantiation of function template specialization 'e::i::j<int, l *>' requested here
template <class, class... f> static auto h() { i::j<int, f...>; }
^
argmax.cc:6:5: note: in instantiation of function template specialization 'e::h<e, l *>' requested here
h<e, decltype(b<f>)...>;
^
argmax.cc:15:8: note: in instantiation of function template specialization 'e::g<(lambda at argmax.cc:15:10), l *>' requested here
e::g([] {}, this);
^
argmax.cc:2:6: note: 'c' declared here
auto c(...);
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
2 errors generated when compiling for host.
$ bin/clang++ -x c++ argmax.cc -ferror-limit=1 -fsyntax-only --cuda-host-only -nocudalib -nocudainc -fsized-deallocation -std=c++17
clang-11: warning: argument unused during compilation: '-nocudainc' [-Wunused-command-line-argument]
argmax.cc:11:50: warning: expression result unused [-Wunused-value]
template <class, class... f> static auto h() { i::j<int, f...>; }
^~~~~~~~~~~~~~~
argmax.cc:6:5: note: in instantiation of function template specialization 'e::h<e, l *>' requested here
h<e, decltype(b<f>)...>;
^
argmax.cc:15:8: note: in instantiation of function template specialization 'e::g<(lambda at argmax.cc:15:10), l *>' requested here
e::g([] {}, this);
^
argmax.cc:6:5: warning: expression result unused [-Wunused-value]
h<e, decltype(b<f>)...>;
^~~~~~~~~~~~~~~~~~~~~~~
argmax.cc:15:8: note: in instantiation of function template specialization 'e::g<(lambda at argmax.cc:15:10), l *>' requested here
e::g([] {}, this);
^
argmax.cc:3:35: warning: inline function 'c<l *>' is not defined [-Wundefined-inline]
template <class d> constexpr auto c(d) -> decltype(0);
^
argmax.cc:9:68: note: used here
template <class, class... f> static constexpr auto j(f... k) { c(k...); }
^
3 warnings generated.
================
Comment at: clang/include/clang/Sema/Sema.h:11663
+ bool IgnoreImplicitHDAttr = false,
+ bool *IsImplicitHDAttr = nullptr);
CUDAFunctionTarget IdentifyCUDATarget(const ParsedAttributesView &Attrs);
----------------
Plumbing an optional output argument it through multiple levels of callers as an output argument is rather hard to follow, especially considering that it's not set in all code paths. Perhaps we can turn IsImplicitHDAttr into a separate function and call it from isBetterOverloadCandidate().
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D79526/new/
https://reviews.llvm.org/D79526
More information about the cfe-commits
mailing list