[clang] [CUDA/HIP] Fix errors for device function used in host global initializers (PR #222338)
Mariya Podchishchaeva via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 10 07:48:09 PDT 2026
================
@@ -776,39 +776,51 @@ void SemaCUDA::checkAllowedInitializer(VarDecl *VD) {
} else {
// This is a host-side global variable. Check that the initializer is
// callable from the host side.
- const FunctionDecl *InitFn = nullptr;
- if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(Init)) {
- InitFn = CE->getConstructor();
- } else if (const CallExpr *CE = dyn_cast<CallExpr>(Init)) {
- InitFn = CE->getDirectCallee();
- }
- if (InitFn) {
- CUDAFunctionTarget InitFnTarget = IdentifyTarget(InitFn);
- if (InitFnTarget != CUDAFunctionTarget::Host &&
- InitFnTarget != CUDAFunctionTarget::HostDevice) {
- Diag(VD->getLocation(), diag::err_ref_bad_target_global_initializer)
- << InitFnTarget << InitFn;
- Diag(InitFn->getLocation(), diag::note_previous_decl) << InitFn;
- VD->setInvalidDecl();
- }
- }
+
struct GlobVarInitChecker : ConstEvaluatedExprVisitor<GlobVarInitChecker> {
+ private:
using Base = ConstEvaluatedExprVisitor<GlobVarInitChecker>;
SemaCUDA &SCRef;
- SourceLocation InitLoc;
+ VarDecl *VD;
+ void CheckForWrongSidedCall(const FunctionDecl *FD) {
+ CUDAFunctionTarget InitFnTarget = SCRef.IdentifyTarget(FD);
+ if (InitFnTarget != CUDAFunctionTarget::Host &&
+ InitFnTarget != CUDAFunctionTarget::HostDevice) {
+ SCRef.Diag(VD->getLocation(),
+ diag::err_ref_bad_target_global_initializer)
+ << InitFnTarget << FD;
+ SCRef.Diag(FD->getLocation(), diag::note_previous_decl) << FD;
+ VD->setInvalidDecl();
----------------
Fznamznon wrote:
Ok, done in https://github.com/llvm/llvm-project/pull/222338/commits/1f7378fb2b23b84a5c6e88ad780d2ef2f973a3db , thanks
https://github.com/llvm/llvm-project/pull/222338
More information about the cfe-commits
mailing list