clang 22.0.0git
HLSLExternalSemaSource.cpp
Go to the documentation of this file.
1//===--- HLSLExternalSemaSource.cpp - HLSL Sema Source --------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9//
10//===----------------------------------------------------------------------===//
11
15#include "clang/AST/Attr.h"
16#include "clang/AST/Decl.h"
17#include "clang/AST/DeclCXX.h"
18#include "clang/AST/Expr.h"
19#include "clang/AST/Type.h"
21#include "clang/Sema/Lookup.h"
22#include "clang/Sema/Sema.h"
23#include "clang/Sema/SemaHLSL.h"
24#include "llvm/ADT/SmallVector.h"
25
26using namespace clang;
27using namespace llvm::hlsl;
28
30
32 SemaPtr = &S;
33 ASTContext &AST = SemaPtr->getASTContext();
34 // If the translation unit has external storage force external decls to load.
37
38 IdentifierInfo &HLSL = AST.Idents.get("hlsl", tok::TokenKind::identifier);
40 NamespaceDecl *PrevDecl = nullptr;
42 PrevDecl = Result.getAsSingle<NamespaceDecl>();
43 HLSLNamespace = NamespaceDecl::Create(
44 AST, AST.getTranslationUnitDecl(), /*Inline=*/false, SourceLocation(),
45 SourceLocation(), &HLSL, PrevDecl, /*Nested=*/false);
46 HLSLNamespace->setImplicit(true);
47 HLSLNamespace->setHasExternalLexicalStorage();
48 AST.getTranslationUnitDecl()->addDecl(HLSLNamespace);
49
50 // Force external decls in the HLSL namespace to load from the PCH.
51 (void)HLSLNamespace->getCanonicalDecl()->decls_begin();
52 defineTrivialHLSLTypes();
53 defineHLSLTypesWithForwardDeclarations();
54
55 // This adds a `using namespace hlsl` directive. In DXC, we don't put HLSL's
56 // built in types inside a namespace, but we are planning to change that in
57 // the near future. In order to be source compatible older versions of HLSL
58 // will need to implicitly use the hlsl namespace. For now in clang everything
59 // will get added to the namespace, and we can remove the using directive for
60 // future language versions to match HLSL's evolution.
63 NestedNameSpecifierLoc(), SourceLocation(), HLSLNamespace,
65
67}
68
69void HLSLExternalSemaSource::defineHLSLVectorAlias() {
70 ASTContext &AST = SemaPtr->getASTContext();
71
72 llvm::SmallVector<NamedDecl *> TemplateParams;
73
74 auto *TypeParam = TemplateTypeParmDecl::Create(
75 AST, HLSLNamespace, SourceLocation(), SourceLocation(), 0, 0,
76 &AST.Idents.get("element", tok::TokenKind::identifier), false, false);
77 TypeParam->setDefaultArgument(
80
81 TemplateParams.emplace_back(TypeParam);
82
83 auto *SizeParam = NonTypeTemplateParmDecl::Create(
84 AST, HLSLNamespace, SourceLocation(), SourceLocation(), 0, 1,
85 &AST.Idents.get("element_count", tok::TokenKind::identifier), AST.IntTy,
86 false, AST.getTrivialTypeSourceInfo(AST.IntTy));
87 llvm::APInt Val(AST.getIntWidth(AST.IntTy), 4);
88 TemplateArgument Default(AST, llvm::APSInt(std::move(Val)), AST.IntTy,
89 /*IsDefaulted=*/true);
90 SizeParam->setDefaultArgument(
92 SourceLocation(), SizeParam));
93 TemplateParams.emplace_back(SizeParam);
94
95 auto *ParamList =
97 TemplateParams, SourceLocation(), nullptr);
98
99 IdentifierInfo &II = AST.Idents.get("vector", tok::TokenKind::identifier);
100
102 AST.getTemplateTypeParmType(0, 0, false, TypeParam),
104 AST, NestedNameSpecifierLoc(), SourceLocation(), SizeParam, false,
105 DeclarationNameInfo(SizeParam->getDeclName(), SourceLocation()),
106 AST.IntTy, VK_LValue),
108
109 auto *Record = TypeAliasDecl::Create(AST, HLSLNamespace, SourceLocation(),
110 SourceLocation(), &II,
111 AST.getTrivialTypeSourceInfo(AliasType));
112 Record->setImplicit(true);
113
114 auto *Template =
115 TypeAliasTemplateDecl::Create(AST, HLSLNamespace, SourceLocation(),
116 Record->getIdentifier(), ParamList, Record);
117
118 Record->setDescribedAliasTemplate(Template);
119 Template->setImplicit(true);
120 Template->setLexicalDeclContext(Record->getDeclContext());
121 HLSLNamespace->addDecl(Template);
122}
123
124void HLSLExternalSemaSource::defineTrivialHLSLTypes() {
125 defineHLSLVectorAlias();
126}
127
128/// Set up common members and attributes for buffer types
142
143// This function is responsible for constructing the constraint expression for
144// this concept:
145// template<typename T> concept is_typed_resource_element_compatible =
146// __is_typed_resource_element_compatible<T>;
149 ASTContext &Context = S.getASTContext();
150
151 // Obtain the QualType for 'bool'
152 QualType BoolTy = Context.BoolTy;
153
154 // Create a QualType that points to this TemplateTypeParmDecl
155 QualType TType = Context.getTypeDeclType(T);
156
157 // Create a TypeSourceInfo for the template type parameter 'T'
158 TypeSourceInfo *TTypeSourceInfo =
159 Context.getTrivialTypeSourceInfo(TType, NameLoc);
160
161 TypeTraitExpr *TypedResExpr = TypeTraitExpr::Create(
162 Context, BoolTy, NameLoc, UTT_IsTypedResourceElementCompatible,
163 {TTypeSourceInfo}, NameLoc, true);
164
165 return TypedResExpr;
166}
167
168// This function is responsible for constructing the constraint expression for
169// this concept:
170// template<typename T> concept is_structured_resource_element_compatible =
171// !__is_intangible<T> && sizeof(T) >= 1;
173 SourceLocation NameLoc,
175 ASTContext &Context = S.getASTContext();
176
177 // Obtain the QualType for 'bool'
178 QualType BoolTy = Context.BoolTy;
179
180 // Create a QualType that points to this TemplateTypeParmDecl
181 QualType TType = Context.getTypeDeclType(T);
182
183 // Create a TypeSourceInfo for the template type parameter 'T'
184 TypeSourceInfo *TTypeSourceInfo =
185 Context.getTrivialTypeSourceInfo(TType, NameLoc);
186
187 TypeTraitExpr *IsIntangibleExpr =
188 TypeTraitExpr::Create(Context, BoolTy, NameLoc, UTT_IsIntangibleType,
189 {TTypeSourceInfo}, NameLoc, true);
190
191 // negate IsIntangibleExpr
192 UnaryOperator *NotIntangibleExpr = UnaryOperator::Create(
193 Context, IsIntangibleExpr, UO_LNot, BoolTy, VK_LValue, OK_Ordinary,
194 NameLoc, false, FPOptionsOverride());
195
196 // element types also may not be of 0 size
197 UnaryExprOrTypeTraitExpr *SizeOfExpr = new (Context) UnaryExprOrTypeTraitExpr(
198 UETT_SizeOf, TTypeSourceInfo, BoolTy, NameLoc, NameLoc);
199
200 // Create a BinaryOperator that checks if the size of the type is not equal to
201 // 1 Empty structs have a size of 1 in HLSL, so we need to check for that
203 Context, llvm::APInt(Context.getTypeSize(Context.getSizeType()), 1, true),
204 Context.getSizeType(), NameLoc);
205
206 BinaryOperator *SizeGEQOneExpr =
207 BinaryOperator::Create(Context, SizeOfExpr, rhs, BO_GE, BoolTy, VK_LValue,
208 OK_Ordinary, NameLoc, FPOptionsOverride());
209
210 // Combine the two constraints
212 Context, NotIntangibleExpr, SizeGEQOneExpr, BO_LAnd, BoolTy, VK_LValue,
213 OK_Ordinary, NameLoc, FPOptionsOverride());
214
215 return CombinedExpr;
216}
217
219 bool isTypedBuffer) {
220 ASTContext &Context = S.getASTContext();
221 DeclContext *DC = NSD->getDeclContext();
222 SourceLocation DeclLoc = SourceLocation();
223
224 IdentifierInfo &ElementTypeII = Context.Idents.get("element_type");
226 Context, NSD->getDeclContext(), DeclLoc, DeclLoc,
227 /*D=*/0,
228 /*P=*/0,
229 /*Id=*/&ElementTypeII,
230 /*Typename=*/true,
231 /*ParameterPack=*/false);
232
233 T->setDeclContext(DC);
234 T->setReferenced();
235
236 // Create and Attach Template Parameter List to ConceptDecl
238 Context, DeclLoc, DeclLoc, {T}, DeclLoc, nullptr);
239
240 DeclarationName DeclName;
241 Expr *ConstraintExpr = nullptr;
242
243 if (isTypedBuffer) {
244 DeclName = DeclarationName(
245 &Context.Idents.get("__is_typed_resource_element_compatible"));
246 ConstraintExpr = constructTypedBufferConstraintExpr(S, DeclLoc, T);
247 } else {
248 DeclName = DeclarationName(
249 &Context.Idents.get("__is_structured_resource_element_compatible"));
250 ConstraintExpr = constructStructuredBufferConstraintExpr(S, DeclLoc, T);
251 }
252
253 // Create a ConceptDecl
254 ConceptDecl *CD =
255 ConceptDecl::Create(Context, NSD->getDeclContext(), DeclLoc, DeclName,
256 ConceptParams, ConstraintExpr);
257
258 // Attach the template parameter list to the ConceptDecl
259 CD->setTemplateParameters(ConceptParams);
260
261 // Add the concept declaration to the Translation Unit Decl
262 NSD->getDeclContext()->addDecl(CD);
263
264 return CD;
265}
266
267void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
268 CXXRecordDecl *Decl;
269 ConceptDecl *TypedBufferConcept = constructBufferConceptDecl(
270 *SemaPtr, HLSLNamespace, /*isTypedBuffer*/ true);
271 ConceptDecl *StructuredBufferConcept = constructBufferConceptDecl(
272 *SemaPtr, HLSLNamespace, /*isTypedBuffer*/ false);
273
274 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "Buffer")
275 .addSimpleTemplateParams({"element_type"}, TypedBufferConcept)
276 .finalizeForwardDeclaration();
277
278 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
279 setupBufferType(Decl, *SemaPtr, ResourceClass::SRV, /*IsROV=*/false,
280 /*RawBuffer=*/false)
284 });
285
286 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWBuffer")
287 .addSimpleTemplateParams({"element_type"}, TypedBufferConcept)
288 .finalizeForwardDeclaration();
289
290 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
291 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/false,
292 /*RawBuffer=*/false)
296 });
297
298 Decl =
299 BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RasterizerOrderedBuffer")
300 .addSimpleTemplateParams({"element_type"}, StructuredBufferConcept)
301 .finalizeForwardDeclaration();
302 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
303 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/true,
304 /*RawBuffer=*/false)
308 });
309
310 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "StructuredBuffer")
311 .addSimpleTemplateParams({"element_type"}, StructuredBufferConcept)
312 .finalizeForwardDeclaration();
313 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
314 setupBufferType(Decl, *SemaPtr, ResourceClass::SRV, /*IsROV=*/false,
315 /*RawBuffer=*/true)
319 });
320
321 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWStructuredBuffer")
322 .addSimpleTemplateParams({"element_type"}, StructuredBufferConcept)
323 .finalizeForwardDeclaration();
324 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
325 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/false,
326 /*RawBuffer=*/true)
332 });
333
334 Decl =
335 BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "AppendStructuredBuffer")
336 .addSimpleTemplateParams({"element_type"}, StructuredBufferConcept)
337 .finalizeForwardDeclaration();
338 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
339 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/false,
340 /*RawBuffer=*/true)
343 });
344
345 Decl =
346 BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "ConsumeStructuredBuffer")
347 .addSimpleTemplateParams({"element_type"}, StructuredBufferConcept)
348 .finalizeForwardDeclaration();
349 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
350 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/false,
351 /*RawBuffer=*/true)
354 });
355
356 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
357 "RasterizerOrderedStructuredBuffer")
358 .addSimpleTemplateParams({"element_type"}, StructuredBufferConcept)
359 .finalizeForwardDeclaration();
360 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
361 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/true,
362 /*RawBuffer=*/true)
368 });
369
370 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "ByteAddressBuffer")
371 .finalizeForwardDeclaration();
372 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
373 setupBufferType(Decl, *SemaPtr, ResourceClass::SRV, /*IsROV=*/false,
374 /*RawBuffer=*/true)
376 });
377 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWByteAddressBuffer")
378 .finalizeForwardDeclaration();
379 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
380 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/false,
381 /*RawBuffer=*/true)
383 });
384 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
385 "RasterizerOrderedByteAddressBuffer")
386 .finalizeForwardDeclaration();
387 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
388 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/true,
389 /*RawBuffer=*/true)
391 });
392}
393
394void HLSLExternalSemaSource::onCompletion(CXXRecordDecl *Record,
395 CompletionFunction Fn) {
396 if (!Record->isCompleteDefinition())
397 Completions.insert(std::make_pair(Record->getCanonicalDecl(), Fn));
398}
399
401 if (!isa<CXXRecordDecl>(Tag))
402 return;
403 auto Record = cast<CXXRecordDecl>(Tag);
404
405 // If this is a specialization, we need to get the underlying templated
406 // declaration and complete that.
407 if (auto TDecl = dyn_cast<ClassTemplateSpecializationDecl>(Record))
408 Record = TDecl->getSpecializedTemplate()->getTemplatedDecl();
409 Record = Record->getCanonicalDecl();
410 auto It = Completions.find(Record);
411 if (It == Completions.end())
412 return;
413 It->second(Record);
414}
Defines the clang::ASTContext interface.
llvm::dxil::ResourceClass ResourceClass
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
static ConceptDecl * constructBufferConceptDecl(Sema &S, NamespaceDecl *NSD, bool isTypedBuffer)
static Expr * constructTypedBufferConstraintExpr(Sema &S, SourceLocation NameLoc, TemplateTypeParmDecl *T)
static BuiltinTypeDeclBuilder setupBufferType(CXXRecordDecl *Decl, Sema &S, ResourceClass RC, bool IsROV, bool RawBuffer)
Set up common members and attributes for buffer types.
static Expr * constructStructuredBufferConstraintExpr(Sema &S, SourceLocation NameLoc, TemplateTypeParmDecl *T)
llvm::MachO::Record Record
Definition MachO.h:31
This file declares semantic analysis for HLSL constructs.
Defines the clang::SourceLocation class and associated facilities.
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:188
TranslationUnitDecl * getTranslationUnitDecl() const
unsigned getIntWidth(QualType T) const
CanQualType FloatTy
IdentifierTable & Idents
Definition ASTContext.h:737
QualType getTemplateTypeParmType(unsigned Depth, unsigned Index, bool ParameterPack, TemplateTypeParmDecl *ParmDecl=nullptr) const
Retrieve the template type parameter type for a template parameter or parameter pack with the given d...
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
CanQualType IntTy
QualType getDependentSizedExtVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc) const
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:3974
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
Definition Expr.cpp:4938
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
Declaration of a C++20 concept.
static ConceptDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, Expr *ConstraintExpr=nullptr)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1449
void addDecl(Decl *D)
Add the declaration D into this context.
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
Definition DeclBase.h:2688
decl_iterator decls_begin() const
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
Definition Expr.cpp:484
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
DeclContext * getDeclContext()
Definition DeclBase.h:448
The name of a declaration.
This represents one expression.
Definition Expr.h:112
Represents difference between two FPOptions values.
void CompleteType(TagDecl *Tag) override
Complete an incomplete HLSL builtin type.
void InitializeSema(Sema &S) override
Initialize the semantic source with the Sema instance being used to perform semantic analysis on the ...
One of these records is kept for each identifier that is lexed.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Definition Expr.cpp:971
Represents the results of name lookup.
Definition Lookup.h:147
Represent a C++ namespace.
Definition Decl.h:591
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
Definition DeclCXX.cpp:3245
A C++ nested-name-specifier augmented with source location information.
static NonTypeTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D, unsigned P, const IdentifierInfo *Id, QualType T, bool ParameterPack, TypeSourceInfo *TInfo)
A (possibly-)qualified type.
Definition TypeBase.h:937
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:854
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
Definition Sema.h:9311
ASTContext & getASTContext() const
Definition Sema.h:925
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
Encodes a location in the source.
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3714
Represents a template argument.
void setTemplateParameters(TemplateParameterList *TParams)
Stores a list of template parameters for a TemplateDecl and its derived classes.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
Declaration of a template type parameter.
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, unsigned D, unsigned P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, UnsignedOrNone NumExpanded=std::nullopt)
static TypeAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Definition Decl.cpp:5680
static TypeAliasTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
A container of type source information.
Definition TypeBase.h:8256
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
Definition ExprCXX.h:2890
static TypeTraitExpr * Create(const ASTContext &C, QualType T, SourceLocation Loc, TypeTrait Kind, ArrayRef< TypeSourceInfo * > Args, SourceLocation RParenLoc, bool Value)
Create a new type trait expression.
Definition ExprCXX.cpp:1914
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
Definition Expr.h:2627
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2246
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
Definition Expr.cpp:4995
Represents a C++ using-declaration.
Definition DeclCXX.h:3585
static UsingDirectiveDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation NamespaceLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Nominated, DeclContext *CommonAncestor)
Definition DeclCXX.cpp:3201
BuiltinTypeDeclBuilder & addHandleConstructorFromImplicitBinding()
BuiltinTypeDeclBuilder & addHandleConstructorFromBinding()
BuiltinTypeDeclBuilder & addHandleMember(ResourceClass RC, bool IsROV, bool RawBuffer, AccessSpecifier Access=AccessSpecifier::AS_private)
BuiltinTypeDeclBuilder & addCreateFromImplicitBinding()
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
Definition Address.h:330
@ OK_Ordinary
An ordinary object is located at an address in memory.
Definition Specifiers.h:151
@ Result
The result type of a method or function.
Definition TypeBase.h:905
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
Definition Parser.h:81
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition Specifiers.h:139
U cast(CodeGen::Address addr)
Definition Address.h:327
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...