diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 | 
| commit | cfca06d7963fa0909f90483b42a6d7d194d01e08 (patch) | |
| tree | 209fb2a2d68f8f277793fc8df46c753d31bc853b /clang/lib/Sema/SemaSYCL.cpp | |
| parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) | |
Notes
Diffstat (limited to 'clang/lib/Sema/SemaSYCL.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaSYCL.cpp | 49 | 
1 files changed, 49 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp new file mode 100644 index 000000000000..db7603b42f7b --- /dev/null +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -0,0 +1,49 @@ +//===- SemaSYCL.cpp - Semantic Analysis for SYCL constructs ---------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// This implements Semantic Analysis for SYCL constructs. +//===----------------------------------------------------------------------===// + +#include "clang/Sema/Sema.h" +#include "clang/Sema/SemaDiagnostic.h" + +using namespace clang; + +// ----------------------------------------------------------------------------- +// SYCL device specific diagnostics implementation +// ----------------------------------------------------------------------------- + +Sema::DeviceDiagBuilder Sema::SYCLDiagIfDeviceCode(SourceLocation Loc, +                                                   unsigned DiagID) { +  assert(getLangOpts().SYCLIsDevice && +         "Should only be called during SYCL compilation"); +  FunctionDecl *FD = dyn_cast<FunctionDecl>(getCurLexicalContext()); +  DeviceDiagBuilder::Kind DiagKind = [this, FD] { +    if (!FD) +      return DeviceDiagBuilder::K_Nop; +    if (getEmissionStatus(FD) == Sema::FunctionEmissionStatus::Emitted) +      return DeviceDiagBuilder::K_ImmediateWithCallStack; +    return DeviceDiagBuilder::K_Deferred; +  }(); +  return DeviceDiagBuilder(DiagKind, Loc, DiagID, FD, *this); +} + +bool Sema::checkSYCLDeviceFunction(SourceLocation Loc, FunctionDecl *Callee) { +  assert(getLangOpts().SYCLIsDevice && +         "Should only be called during SYCL compilation"); +  assert(Callee && "Callee may not be null."); + +  // Errors in unevaluated context don't need to be generated, +  // so we can safely skip them. +  if (isUnevaluatedContext() || isConstantEvaluated()) +    return true; + +  DeviceDiagBuilder::Kind DiagKind = DeviceDiagBuilder::K_Nop; + +  return DiagKind != DeviceDiagBuilder::K_Immediate && +         DiagKind != DeviceDiagBuilder::K_ImmediateWithCallStack; +}  | 
