| //===- 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::SemaDiagnosticBuilder Sema::SYCLDiagIfDeviceCode(SourceLocation Loc, | 
 |                                                        unsigned DiagID) { | 
 |   assert(getLangOpts().SYCLIsDevice && | 
 |          "Should only be called during SYCL compilation"); | 
 |   FunctionDecl *FD = dyn_cast<FunctionDecl>(getCurLexicalContext()); | 
 |   SemaDiagnosticBuilder::Kind DiagKind = [this, FD] { | 
 |     if (!FD) | 
 |       return SemaDiagnosticBuilder::K_Nop; | 
 |     if (getEmissionStatus(FD) == Sema::FunctionEmissionStatus::Emitted) | 
 |       return SemaDiagnosticBuilder::K_ImmediateWithCallStack; | 
 |     return SemaDiagnosticBuilder::K_Deferred; | 
 |   }(); | 
 |   return SemaDiagnosticBuilder(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; | 
 |  | 
 |   SemaDiagnosticBuilder::Kind DiagKind = SemaDiagnosticBuilder::K_Nop; | 
 |  | 
 |   return DiagKind != SemaDiagnosticBuilder::K_Immediate && | 
 |          DiagKind != SemaDiagnosticBuilder::K_ImmediateWithCallStack; | 
 | } |