diff options
Diffstat (limited to 'lib/Sema/SemaCUDA.cpp')
| -rw-r--r-- | lib/Sema/SemaCUDA.cpp | 21 | 
1 files changed, 19 insertions, 2 deletions
| diff --git a/lib/Sema/SemaCUDA.cpp b/lib/Sema/SemaCUDA.cpp index 64222fbf8ac8..5973500826e3 100644 --- a/lib/Sema/SemaCUDA.cpp +++ b/lib/Sema/SemaCUDA.cpp @@ -62,6 +62,11 @@ Sema::CUDAFunctionTarget Sema::IdentifyCUDATarget(const FunctionDecl *D) {  bool Sema::CheckCUDATarget(const FunctionDecl *Caller,                             const FunctionDecl *Callee) { +  // The CUDADisableTargetCallChecks short-circuits this check: we assume all +  // cross-target calls are valid. +  if (getLangOpts().CUDADisableTargetCallChecks) +    return false; +    CUDAFunctionTarget CallerTarget = IdentifyCUDATarget(Caller),                       CalleeTarget = IdentifyCUDATarget(Callee); @@ -92,9 +97,21 @@ bool Sema::CheckCUDATarget(const FunctionDecl *Caller,      if (Caller->isImplicit()) return false;      bool InDeviceMode = getLangOpts().CUDAIsDevice; -    if ((InDeviceMode && CalleeTarget != CFT_Device) || -        (!InDeviceMode && CalleeTarget != CFT_Host)) +    if (!InDeviceMode && CalleeTarget != CFT_Host) +        return true; +    if (InDeviceMode && CalleeTarget != CFT_Device) { +      // Allow host device functions to call host functions if explicitly +      // requested. +      if (CalleeTarget == CFT_Host && +          getLangOpts().CUDAAllowHostCallsFromHostDevice) { +        Diag(Caller->getLocation(), +             diag::warn_host_calls_from_host_device) +            << Callee->getNameAsString() << Caller->getNameAsString(); +        return false; +      } +        return true; +    }    }    return false; | 
