================
@@ -8056,6 +8056,30 @@ void Sema::ProcessDeclAttributeList(
}
}
+ // CUDA/HIP: restrict explicit CUDA target attributes on deduction guides.
+ //
+ // Deduction guides are not callable functions and never participate in
+ // codegen; they are always treated as host+device for CUDA/HIP semantic
+ // checks. We therefore allow either no CUDA target attributes or an
explicit
+ // '__host__ __device__' annotation, but reject guides that are host-only,
+ // device-only, or marked '__global__'. The use of explicit CUDA/HIP target
+ // attributes on deduction guides is deprecated and will be rejected in a
+ // future Clang version.
+ if (getLangOpts().CUDA)
+ if (auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) {
+ bool HasHost = Guide->hasAttr<CUDAHostAttr>();
+ bool HasDevice = Guide->hasAttr<CUDADeviceAttr>();
+ bool HasGlobal = Guide->hasAttr<CUDAGlobalAttr>();
+
+ if (HasGlobal || HasHost != HasDevice) {
+ Diag(Guide->getLocation(), diag::err_deduction_guide_target_attr);
+ Guide->setInvalidDecl();
+ } else if (HasHost && HasDevice) {
+ Diag(Guide->getLocation(),
+ diag::warn_deduction_guide_target_attr_deprecated);
----------------
Artem-B wrote:
Do we want to stick with "no target attributes on guides" policy? Or do we
treat it as "guides are always HD, implicitly or explicitly". Considering that
target overloads do play the role in the guide selection, I would be biased
towards the latter, as it would be a case of business as usual, but with some
restrictions. One could reason about overload resolution behavior of the guide
using the same rules as we do for other functions.
If we stick with "no target attributes", we'd still need to mention implicit HD
treatment, which makes it equivalent to the case above, but with the oddity
that the function behaves as HD, but we are not allowed to state it explicitly,
though we are generally allowed to make implicitly-HD functions of other kinds
explicitly HD. I do not think this extra quirk is buying us anything useful,
other than making it harder to start using target args on the guides. However,
with non-HD variants being diagnosed as errors, we already have enough
guardrails to protect us from unsupported (for now, at least) use of target
attributes.
I'd drop the deprecation for explicit HD.
https://github.com/llvm/llvm-project/pull/170481
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits