;
34 if(
auto*A =
D->
getAttr<AttrT>())
35 return!A->isImplicit();
40assert(
getLangOpts().
CUDA&&
"Should only be called during CUDA compilation");
41ForceHostDeviceDepth++;
45assert(
getLangOpts().
CUDA&&
"Should only be called during CUDA compilation");
46 if(ForceHostDeviceDepth == 0)
48ForceHostDeviceDepth--;
57 return ExprError(
Diag(LLLLoc, diag::err_undeclared_var_use)
70 boolHasHostAttr =
false;
71 boolHasDeviceAttr =
false;
72 boolHasGlobalAttr =
false;
73 boolHasInvalidTargetAttr =
false;
75 switch(AL.getKind()) {
76 caseParsedAttr::AT_CUDAGlobal:
77HasGlobalAttr =
true;
79 caseParsedAttr::AT_CUDAHost:
82 caseParsedAttr::AT_CUDADevice:
83HasDeviceAttr =
true;
85 caseParsedAttr::AT_CUDAInvalidTarget:
86HasInvalidTargetAttr =
true;
93 if(HasInvalidTargetAttr)
99 if(HasHostAttr && HasDeviceAttr)
108template<
typenameA>
111return isa<A>(Attribute) &&
112!(IgnoreImplicitAttr && Attribute->isImplicit());
121 auto*VD = dyn_cast_or_null<VarDecl>(
D);
122 if(VD && VD->hasGlobalStorage() && !VD->isStaticLocal()) {
124 if((hasAttr<CUDADeviceAttr>(VD,
true) &&
125!hasAttr<CUDAHostAttr>(VD,
true)) ||
126hasAttr<CUDASharedAttr>(VD,
true) ||
127hasAttr<CUDAConstantAttr>(VD,
true))
135 boolIgnoreImplicitHDAttr) {
140 if(
D->
hasAttr<CUDAInvalidTargetAttr>())
143 if(
D->
hasAttr<CUDAGlobalAttr>())
146 if(hasAttr<CUDADeviceAttr>(
D, IgnoreImplicitHDAttr)) {
147 if(hasAttr<CUDAHostAttr>(
D, IgnoreImplicitHDAttr))
150}
else if(hasAttr<CUDAHostAttr>(
D, IgnoreImplicitHDAttr)) {
152}
else if((
D->
isImplicit() || !
D->isUserProvided()) &&
153!IgnoreImplicitHDAttr) {
164 if(Var->
hasAttr<HIPManagedAttr>())
170Var->
hasAttr<CUDAConstantAttr>() &&
171!hasExplicitAttr<CUDAConstantAttr>(Var))
173 if(Var->
hasAttr<CUDADeviceAttr>() || Var->
hasAttr<CUDAConstantAttr>() ||
174Var->
hasAttr<CUDASharedAttr>() ||
182 if(
auto*FD = dyn_cast<FunctionDecl>(Var->
getDeclContext())) {
227assert(Callee &&
"Callee must be valid.");
234(isa<CXXConstructorDecl>(Callee) || isa<CXXDestructorDecl>(Callee)))
258 if(CalleeTarget == CallerTarget ||
301llvm_unreachable(
"All cases should've been handled by now.");
307 if(
auto*A =
D->
getAttr<AttrT>())
308 returnA->isImplicit();
313 boolIsImplicitDevAttr = hasImplicitAttr<CUDADeviceAttr>(
D);
314 boolIsImplicitHostAttr = hasImplicitAttr<CUDAHostAttr>(
D);
315 returnIsImplicitDevAttr && IsImplicitHostAttr;
320 SmallVectorImpl<std::pair<DeclAccessPair, FunctionDecl *>> &Matches) {
321 if(Matches.size() <= 1)
324 usingPair = std::pair<DeclAccessPair, FunctionDecl*>;
327 autoGetCFP = [&](
constPair &Match) {
333Matches.begin(), Matches.end(),
334[&](
constPair &M1,
constPair &M2) { return GetCFP(M1) < GetCFP(M2); }));
337llvm::erase_if(Matches,
338[&](
constPair &Match) {
returnGetCFP(Match) < BestCFP; });
358*ResolvedTarget = Target2;
360*ResolvedTarget = Target1;
361}
else if(Target1 != Target2) {
364*ResolvedTarget = Target1;
379 boolHasH = MemberDecl->
hasAttr<CUDAHostAttr>();
380 boolHasD = MemberDecl->
hasAttr<CUDADeviceAttr>();
381 boolHasExplicitAttr =
382(HasD && !MemberDecl->
getAttr<CUDADeviceAttr>()->isImplicit()) ||
383(HasH && !MemberDecl->
getAttr<CUDAHostAttr>()->isImplicit());
384 if(!InClass || HasExplicitAttr)
387std::optional<CUDAFunctionTarget> InferredTarget;
397 for(
const auto&B : ClassDecl->
bases()) {
398 if(!B.isVirtual()) {
404llvm::append_range(Bases, llvm::make_pointer_range(ClassDecl->
vbases()));
407 for(
const auto*B : Bases) {
426 if(!InferredTarget) {
427InferredTarget = BaseMethodTarget;
430*InferredTarget, BaseMethodTarget, &*InferredTarget);
431 if(ResolutionError) {
434diag::note_implicit_member_target_infer_collision)
435<< (
unsigned)CSM << llvm::to_underlying(*InferredTarget)
436<< llvm::to_underlying(BaseMethodTarget);
446 for(
const auto*F : ClassDecl->
fields()) {
447 if(F->isInvalidDecl()) {
460ConstRHS && !F->isMutable(),
470 if(!InferredTarget) {
471InferredTarget = FieldMethodTarget;
474*InferredTarget, FieldMethodTarget, &*InferredTarget);
475 if(ResolutionError) {
478diag::note_implicit_member_target_infer_collision)
479<< (
unsigned)CSM << llvm::to_underlying(*InferredTarget)
480<< llvm::to_underlying(FieldMethodTarget);
492 boolNeedsH =
true, NeedsD =
true;
493 if(InferredTarget) {
538if (const CXXConstructExpr *CE =
539dyn_cast<CXXConstructExpr>(CI->getInit()))
540return isEmptyConstructor(Loc, CE->getConstructor());
582if (CXXRecordDecl *RD = BS.getType()->getAsCXXRecordDecl())
583return isEmptyDestructor(Loc, RD->getDestructor());
589 if(!llvm::all_of(ClassDecl->
fields(), [&](
const FieldDecl*Field) {
590if (CXXRecordDecl *RD = Field->getType()
591->getBaseElementTypeUnsafe()
592->getAsCXXRecordDecl())
593return isEmptyDestructor(Loc, RD->getDestructor());
602enumCUDAInitializerCheckKind {
603CICK_DeviceOrConstant,
607boolIsDependentVar(
VarDecl*VD) {
611 return Init->isValueDependent();
625CUDAInitializerCheckKind CheckKind) {
627assert(!IsDependentVar(VD) &&
"do not check dependent var");
629 autoIsEmptyInit = [&](
const Expr*
Init) {
632 if(
const auto*CE = dyn_cast<CXXConstructExpr>(
Init)) {
633 returnS.isEmptyConstructor(VD->
getLocation(), CE->getConstructor());
637 autoIsConstantInit = [&](
const Expr*
Init) {
644 autoHasEmptyDtor = [&](
VarDecl*VD) {
646 returnS.isEmptyDestructor(VD->
getLocation(), RD->getDestructor());
649 if(CheckKind == CICK_Shared)
650 returnIsEmptyInit(
Init) && HasEmptyDtor(VD);
652((IsEmptyInit(
Init) || IsConstantInit(
Init)) && HasEmptyDtor(VD));
670 boolIsSharedVar = VD->
hasAttr<CUDASharedAttr>();
671 boolIsDeviceOrConstantVar =
673(VD->
hasAttr<CUDADeviceAttr>() || VD->
hasAttr<CUDAConstantAttr>());
674 if(IsDeviceOrConstantVar || IsSharedVar) {
675 if(HasAllowedCUDADeviceStaticInitializer(
676*
this, VD, IsSharedVar ? CICK_Shared : CICK_DeviceOrConstant))
679IsSharedVar ? diag::err_shared_var_init : diag::err_dynamic_var_init)
680<<
Init->getSourceRange();
687InitFn = CE->getConstructor();
688}
else if(
const CallExpr*CE = dyn_cast<CallExpr>(
Init)) {
689InitFn = CE->getDirectCallee();
695 Diag(VD->
getLocation(), diag::err_ref_bad_target_global_initializer)
696<< llvm::to_underlying(InitFnTarget) << InitFn;
720!
getASTContext().CUDAImplicitHostDeviceFunUsedByDevice.count(Caller))))
740assert(
getLangOpts().
CUDA&&
"Should only be called during CUDA compilation");
742 if(ForceHostDeviceDepth > 0) {
743 if(!NewD->
hasAttr<CUDAHostAttr>())
745 if(!NewD->
hasAttr<CUDADeviceAttr>())
752 if(
getLangOpts().OffloadImplicitHostDeviceTemplates &&
753!NewD->
hasAttr<CUDAHostAttr>() && !NewD->
hasAttr<CUDADeviceAttr>() &&
754!NewD->
hasAttr<CUDAGlobalAttr>() &&
764NewD->
hasAttr<CUDADeviceAttr>() || NewD->
hasAttr<CUDAGlobalAttr>())
769 autoIsMatchingDeviceFn = [&](
NamedDecl*
D) {
771 D= Using->getTargetDecl();
773 returnOldD && OldD->
hasAttr<CUDADeviceAttr>() &&
774!OldD->
hasAttr<CUDAHostAttr>() &&
779 autoIt = llvm::find_if(
Previous, IsMatchingDeviceFn);
788diag::err_cuda_unattributed_constexpr_cannot_overload_device)
791diag::note_cuda_conflicting_device_function_declared_here);
807!VD->
hasAttr<CUDASharedAttr>() &&
809!IsDependentVar(VD) &&
811HasAllowedCUDADeviceStaticInitializer(*
this, VD,
812CICK_DeviceOrConstant))) {
819assert(
getLangOpts().
CUDA&&
"Should only be called during CUDA compilation");
822SemaDiagnosticBuilder::Kind DiagKind = [&] {
824 returnSemaDiagnosticBuilder::K_Nop;
828 returnSemaDiagnosticBuilder::K_Immediate;
834 returnSemaDiagnosticBuilder::K_Nop;
837 returnSemaDiagnosticBuilder::K_Immediate;
840? SemaDiagnosticBuilder::K_ImmediateWithCallStack
841: SemaDiagnosticBuilder::K_Deferred;
843 returnSemaDiagnosticBuilder::K_Nop;
851assert(
getLangOpts().
CUDA&&
"Should only be called during CUDA compilation");
854SemaDiagnosticBuilder::Kind DiagKind = [&] {
856 returnSemaDiagnosticBuilder::K_Nop;
859 returnSemaDiagnosticBuilder::K_Immediate;
865 returnSemaDiagnosticBuilder::K_Nop;
868 returnSemaDiagnosticBuilder::K_Immediate;
871? SemaDiagnosticBuilder::K_ImmediateWithCallStack
872: SemaDiagnosticBuilder::K_Deferred;
874 returnSemaDiagnosticBuilder::K_Nop;
881assert(
getLangOpts().
CUDA&&
"Should only be called during CUDA compilation");
882assert(Callee &&
"Callee may not be null.");
885 if(ExprEvalCtx.isUnevaluated() || ExprEvalCtx.isConstantEvaluated())
898SemaDiagnosticBuilder::Kind DiagKind = [
this, Caller, Callee,
899CallerKnownEmitted] {
903assert(Caller &&
"Never/wrongSide calls require a non-null caller");
907 returnCallerKnownEmitted
908? SemaDiagnosticBuilder::K_ImmediateWithCallStack
909: SemaDiagnosticBuilder::K_Deferred;
911 returnSemaDiagnosticBuilder::K_Nop;
915 if(DiagKind == SemaDiagnosticBuilder::K_Nop) {
918Callee->hasAttr<CUDAGlobalAttr>() && !Callee->isDefined() &&
933SemaDiagnosticBuilder(DiagKind,
Loc, diag::err_ref_bad_target, Caller,
937 if(!Callee->getBuiltinID())
938SemaDiagnosticBuilder(DiagKind, Callee->getLocation(),
939diag::note_previous_decl, Caller,
SemaRef)
941 returnDiagKind != SemaDiagnosticBuilder::K_Immediate &&
942DiagKind != SemaDiagnosticBuilder::K_ImmediateWithCallStack;
973 boolCalleeIsDevice = Callee->hasAttr<CUDADeviceAttr>();
975!Caller->
hasAttr<CUDAGlobalAttr>() && !Caller->
hasAttr<CUDADeviceAttr>();
976 boolShouldCheck = CalleeIsDevice && CallerIsHost;
979 autoDiagKind = SemaDiagnosticBuilder::K_Deferred;
982diag::err_capture_bad_target, Callee,
SemaRef)
990diag::warn_maybe_capture_bad_target_this_ptr, Callee,
996assert(
getLangOpts().
CUDA&&
"Should only be called during CUDA compilation");
997 if(Method->
hasAttr<CUDAHostAttr>() || Method->
hasAttr<CUDADeviceAttr>())
1005assert(
getLangOpts().
CUDA&&
"Should only be called during CUDA compilation");
1018 if(NewTarget != OldTarget &&
1022!(
getLangOpts().OffloadImplicitHostDeviceTemplates &&
1026!(
getLangOpts().OffloadImplicitHostDeviceTemplates &&
1032<< llvm::to_underlying(NewTarget) << NewFD->
getDeclName()
1033<< llvm::to_underlying(OldTarget) << OldFD;
1042 Diag(NewFD->
getLocation(), diag::warn_offload_incompatible_redeclare)
1043<< llvm::to_underlying(NewTarget) << llvm::to_underlying(OldTarget);
1050template<
typenameAttrTy>
1053 if(AttrTy *Attribute = TemplateFD.
getAttr<AttrTy>()) {
1054AttrTy *Clone = Attribute->clone(S.
Context);
1055Clone->setInherited(
true);
1063copyAttrIfPresent<CUDAGlobalAttr>(
SemaRef, FD, TemplateFD);
1064copyAttrIfPresent<CUDAHostAttr>(
SemaRef, FD, TemplateFD);
1065copyAttrIfPresent<CUDADeviceAttr>(
SemaRef, FD, TemplateFD);
1070 return "__llvmPushCallConfiguration";
1073 return getLangOpts().HIPUseNewLaunchAPI ?
"__hipPushCallConfiguration" 1074:
"hipConfigureCall";
1079 return "__cudaPushCallConfiguration";
1082 return "cudaConfigureCall";
Defines the clang::ASTContext interface.
static bool hasImplicitAttr(const ValueDecl *D)
Defines the clang::Expr interface and subclasses for C++ expressions.
llvm::MachO::Target Target
Defines the clang::Preprocessor interface.
static bool resolveCalleeCUDATargetConflict(CUDAFunctionTarget Target1, CUDAFunctionTarget Target2, CUDAFunctionTarget *ResolvedTarget)
When an implicitly-declared special member has to invoke more than one base/field special member,...
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
static void copyAttrIfPresent(Sema &S, FunctionDecl *FD, const FunctionDecl &TemplateFD)
static bool hasExplicitAttr(const VarDecl *D)
This file declares semantic analysis for CUDA constructs.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
llvm::SetVector< const ValueDecl * > CUDAExternalDeviceDeclODRUsedByHost
Keep track of CUDA/HIP external kernels or device variables ODR-used by host code.
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
llvm::DenseSet< const FunctionDecl * > CUDAImplicitHostDeviceFunUsedByDevice
Keep track of CUDA/HIP implicit host device functions used on device side in device compilation.
FunctionDecl * getcudaConfigureCallDecl()
Attr - This represents one attribute.
Represents a base class of a C++ class.
Represents a call to a C++ constructor.
Represents a C++ constructor within a class.
Represents a C++ base or member initializer.
Represents a C++ destructor within a class.
Represents a static or instance method of a struct/union/class.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Represents a C++ struct/union/class.
base_class_range vbases()
bool isAbstract() const
Determine whether this class has a pure virtual function.
bool isDynamicClass() const
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
A reference to a declared variable, function, enum, etc.
Decl - This represents one declaration (or definition), e.g.
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool isInvalidDecl() const
SourceLocation getLocation() const
DeclContext * getDeclContext()
This represents one expression.
Represents a member of a struct/union/class.
Represents a function declaration or definition.
bool hasTrivialBody() const
Returns whether the function has a trivial body that does not require any specific codegen.
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
bool isVariadic() const
Whether this function is variadic.
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Represents the results of name lookup.
This represents a decl that may have a name.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
ParsedAttr - Represents a syntactic attribute.
A (possibly-)qualified type.
bool isConstQualified() const
Determine whether this type is const-qualified.
field_range fields() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
Scope - A scope is a transient data structure that is used while parsing the program.
A generic diagnostic builder for errors which may or may not be deferred.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
ASTContext & getASTContext() const
const LangOptions & getLangOpts() const
DiagnosticsEngine & getDiagnostics() const
void PushForceHostDevice()
Increments our count of the number of times we've seen a pragma forcing functions to be host device.
void checkAllowedInitializer(VarDecl *VD)
void RecordImplicitHostDeviceFuncUsedByDevice(const FunctionDecl *FD)
Record FD if it is a CUDA/HIP implicit host device function used on device side in device compilation...
std::string getConfigureFuncName() const
Returns the name of the launch configuration function.
bool PopForceHostDevice()
Decrements our count of the number of times we've seen a pragma forcing functions to be host device.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
void maybeAddHostDeviceAttrs(FunctionDecl *FD, const LookupResult &Previous)
May add implicit CUDAHostAttr and CUDADeviceAttr attributes to FD, depending on FD and the current co...
ExprResult ActOnExecConfigExpr(Scope *S, SourceLocation LLLLoc, MultiExprArg ExecConfig, SourceLocation GGGLoc)
bool isEmptyConstructor(SourceLocation Loc, CXXConstructorDecl *CD)
bool isEmptyDestructor(SourceLocation Loc, CXXDestructorDecl *CD)
void checkTargetOverload(FunctionDecl *NewFD, const LookupResult &Previous)
Check whether NewFD is a valid overload for CUDA.
CUDAFunctionTarget CurrentTarget()
Gets the CUDA target for the current context.
SemaDiagnosticBuilder DiagIfHostCode(SourceLocation Loc, unsigned DiagID)
Creates a SemaDiagnosticBuilder that emits the diagnostic if the current context is "used as host cod...
bool inferTargetForImplicitSpecialMember(CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, CXXMethodDecl *MemberDecl, bool ConstRHS, bool Diagnose)
Given a implicit special member, infer its CUDA target from the calls it needs to make to underlying ...
struct clang::SemaCUDA::CUDATargetContext CurCUDATargetCtx
CUDATargetContextKind
Defines kinds of CUDA global host/device context where a function may be called.
@ CTCK_InitGlobalVar
Unknown context.
SemaDiagnosticBuilder DiagIfDeviceCode(SourceLocation Loc, unsigned DiagID)
Creates a SemaDiagnosticBuilder that emits the diagnostic if the current context is "used as device c...
llvm::DenseSet< FunctionDeclAndLoc > LocsWithCUDACallDiags
FunctionDecls and SourceLocations for which CheckCall has emitted a (maybe deferred) "bad call" diagn...
bool CheckCall(SourceLocation Loc, FunctionDecl *Callee)
Check whether we're allowed to call Callee from the current context.
void inheritTargetAttrs(FunctionDecl *FD, const FunctionTemplateDecl &TD)
Copies target attributes from the template TD to the function FD.
static bool isImplicitHostDeviceFunction(const FunctionDecl *D)
void CheckLambdaCapture(CXXMethodDecl *D, const sema::Capture &Capture)
void MaybeAddConstantAttr(VarDecl *VD)
May add implicit CUDAConstantAttr attribute to VD, depending on VD and current compilation settings.
void EraseUnwantedMatches(const FunctionDecl *Caller, llvm::SmallVectorImpl< std::pair< DeclAccessPair, FunctionDecl * > > &Matches)
Finds a function in Matches with highest calling priority from Caller context and erases all function...
void SetLambdaAttrs(CXXMethodDecl *Method)
Set device or host device attributes on the given lambda operator() method.
CUDAFunctionPreference IdentifyPreference(const FunctionDecl *Caller, const FunctionDecl *Callee)
Identifies relative preference of a given Caller/Callee combination, based on their host/device attri...
@ CVT_Host
Emitted on device side with a shadow variable on host side.
@ CVT_Both
Emitted on host side only.
@ CVT_Unified
Emitted on both sides with different addresses.
SpecialMemberOverloadResult - The overloading result for a special member function.
CXXMethodDecl * getMethod() const
Sema - This implements semantic analysis and AST building for C.
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
bool IsLastErrorImmediate
Is the last error level diagnostic immediate.
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
ASTContext & getASTContext() const
const LangOptions & getLangOpts() const
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl, bool Final=false)
SourceManager & getSourceManager() const
void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given function from its template.
SpecialMemberOverloadResult LookupSpecialMember(CXXRecordDecl *D, CXXSpecialMemberKind SM, bool ConstArg, bool VolatileArg, bool RValueThis, bool ConstThis, bool VolatileThis)
void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, bool MightBeOdrUse=true)
Mark a function referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
Encodes a location in the source.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isReferenceType() const
bool isCUDADeviceBuiltinSurfaceType() const
Check if the type is the CUDA device builtin surface type.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isCUDADeviceBuiltinTextureType() const
Check if the type is the CUDA device builtin texture type.
const T * getAs() const
Member-template getAs<specific type>'.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Represents a variable declaration or definition.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
bool isStaticDataMember() const
Determines whether this is a static data member.
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
bool isFileVarDecl() const
Returns true for file scoped variable declaration.
const Expr * getInit() const
ValueDecl * getVariable() const
bool isVariableCapture() const
SourceLocation getLocation() const
Retrieve the location at which this variable was captured.
bool isThisCapture() const
bool isReferenceCapture() const
Defines the clang::TargetInfo interface.
The JSON file list parser is used to communicate input to InstallAPI.
bool CudaFeatureEnabled(llvm::VersionTuple, CudaFeature)
CXXSpecialMemberKind
Kinds of C++ special members.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
CUDATargetContextKind Kind
CUDAFunctionTarget Target
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4