clang 23.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::defineHLSLMatrixAlias() {
125 ASTContext &AST = SemaPtr->getASTContext();
126 llvm::SmallVector<NamedDecl *> TemplateParams;
127
128 auto *TypeParam = TemplateTypeParmDecl::Create(
129 AST, HLSLNamespace, SourceLocation(), SourceLocation(), 0, 0,
130 &AST.Idents.get("element", tok::TokenKind::identifier), false, false);
131 TypeParam->setDefaultArgument(
132 AST, SemaPtr->getTrivialTemplateArgumentLoc(
134
135 TemplateParams.emplace_back(TypeParam);
136
137 // these should be 64 bit to be consistent with other clang matrices.
138 auto *RowsParam = NonTypeTemplateParmDecl::Create(
139 AST, HLSLNamespace, SourceLocation(), SourceLocation(), 0, 1,
140 &AST.Idents.get("rows_count", tok::TokenKind::identifier), AST.IntTy,
141 false, AST.getTrivialTypeSourceInfo(AST.IntTy));
142 llvm::APInt RVal(AST.getIntWidth(AST.IntTy), 4);
143 TemplateArgument RDefault(AST, llvm::APSInt(std::move(RVal)), AST.IntTy,
144 /*IsDefaulted=*/true);
145 RowsParam->setDefaultArgument(
146 AST, SemaPtr->getTrivialTemplateArgumentLoc(RDefault, AST.IntTy,
147 SourceLocation(), RowsParam));
148 TemplateParams.emplace_back(RowsParam);
149
150 auto *ColsParam = NonTypeTemplateParmDecl::Create(
151 AST, HLSLNamespace, SourceLocation(), SourceLocation(), 0, 2,
152 &AST.Idents.get("cols_count", tok::TokenKind::identifier), AST.IntTy,
153 false, AST.getTrivialTypeSourceInfo(AST.IntTy));
154 llvm::APInt CVal(AST.getIntWidth(AST.IntTy), 4);
155 TemplateArgument CDefault(AST, llvm::APSInt(std::move(CVal)), AST.IntTy,
156 /*IsDefaulted=*/true);
157 ColsParam->setDefaultArgument(
158 AST, SemaPtr->getTrivialTemplateArgumentLoc(CDefault, AST.IntTy,
159 SourceLocation(), ColsParam));
160 TemplateParams.emplace_back(ColsParam);
161
162 const unsigned MaxMatDim = SemaPtr->getLangOpts().MaxMatrixDimension;
163
164 auto *MaxRow = IntegerLiteral::Create(
165 AST, llvm::APInt(AST.getIntWidth(AST.IntTy), MaxMatDim), AST.IntTy,
167 auto *MaxCol = IntegerLiteral::Create(
168 AST, llvm::APInt(AST.getIntWidth(AST.IntTy), MaxMatDim), AST.IntTy,
170
171 auto *RowsRef = DeclRefExpr::Create(
172 AST, NestedNameSpecifierLoc(), SourceLocation(), RowsParam,
173 /*RefersToEnclosingVariableOrCapture*/ false,
174 DeclarationNameInfo(RowsParam->getDeclName(), SourceLocation()),
175 AST.IntTy, VK_LValue);
176 auto *ColsRef = DeclRefExpr::Create(
177 AST, NestedNameSpecifierLoc(), SourceLocation(), ColsParam,
178 /*RefersToEnclosingVariableOrCapture*/ false,
179 DeclarationNameInfo(ColsParam->getDeclName(), SourceLocation()),
180 AST.IntTy, VK_LValue);
181
182 auto *RowsLE = BinaryOperator::Create(AST, RowsRef, MaxRow, BO_LE, AST.BoolTy,
185 auto *ColsLE = BinaryOperator::Create(AST, ColsRef, MaxCol, BO_LE, AST.BoolTy,
188
190 AST, RowsLE, ColsLE, BO_LAnd, AST.BoolTy, VK_PRValue, OK_Ordinary,
192
193 auto *ParamList = TemplateParameterList::Create(
194 AST, SourceLocation(), SourceLocation(), TemplateParams, SourceLocation(),
196
197 IdentifierInfo &II = AST.Idents.get("matrix", tok::TokenKind::identifier);
198
200 AST.getTemplateTypeParmType(0, 0, false, TypeParam),
202 AST, NestedNameSpecifierLoc(), SourceLocation(), RowsParam, false,
203 DeclarationNameInfo(RowsParam->getDeclName(), SourceLocation()),
204 AST.IntTy, VK_LValue),
206 AST, NestedNameSpecifierLoc(), SourceLocation(), ColsParam, false,
207 DeclarationNameInfo(ColsParam->getDeclName(), SourceLocation()),
208 AST.IntTy, VK_LValue),
210
211 auto *Record = TypeAliasDecl::Create(AST, HLSLNamespace, SourceLocation(),
212 SourceLocation(), &II,
213 AST.getTrivialTypeSourceInfo(AliasType));
214 Record->setImplicit(true);
215
216 auto *Template =
217 TypeAliasTemplateDecl::Create(AST, HLSLNamespace, SourceLocation(),
218 Record->getIdentifier(), ParamList, Record);
219
220 Record->setDescribedAliasTemplate(Template);
221 Template->setImplicit(true);
222 Template->setLexicalDeclContext(Record->getDeclContext());
223 HLSLNamespace->addDecl(Template);
224}
225
226void HLSLExternalSemaSource::defineTrivialHLSLTypes() {
227 defineHLSLVectorAlias();
228 defineHLSLMatrixAlias();
229}
230
231/// Set up common members and attributes for buffer types
233 ResourceClass RC, bool IsROV,
234 bool RawBuffer, bool HasCounter) {
236 .addBufferHandles(RC, IsROV, RawBuffer, HasCounter)
241}
242
243/// Set up common members and attributes for sampler types
252
253/// Set up common members and attributes for texture types
265
266// This function is responsible for constructing the constraint expression for
267// this concept:
268// template<typename T> concept is_typed_resource_element_compatible =
269// __is_typed_resource_element_compatible<T>;
272 ASTContext &Context = S.getASTContext();
273
274 // Obtain the QualType for 'bool'
275 QualType BoolTy = Context.BoolTy;
276
277 // Create a QualType that points to this TemplateTypeParmDecl
278 QualType TType = Context.getTypeDeclType(T);
279
280 // Create a TypeSourceInfo for the template type parameter 'T'
281 TypeSourceInfo *TTypeSourceInfo =
282 Context.getTrivialTypeSourceInfo(TType, NameLoc);
283
284 TypeTraitExpr *TypedResExpr = TypeTraitExpr::Create(
285 Context, BoolTy, NameLoc, UTT_IsTypedResourceElementCompatible,
286 {TTypeSourceInfo}, NameLoc, true);
287
288 return TypedResExpr;
289}
290
291// This function is responsible for constructing the constraint expression for
292// this concept:
293// template<typename T> concept is_structured_resource_element_compatible =
294// !__is_intangible<T> && sizeof(T) >= 1;
296 SourceLocation NameLoc,
298 ASTContext &Context = S.getASTContext();
299
300 // Obtain the QualType for 'bool'
301 QualType BoolTy = Context.BoolTy;
302
303 // Create a QualType that points to this TemplateTypeParmDecl
304 QualType TType = Context.getTypeDeclType(T);
305
306 // Create a TypeSourceInfo for the template type parameter 'T'
307 TypeSourceInfo *TTypeSourceInfo =
308 Context.getTrivialTypeSourceInfo(TType, NameLoc);
309
310 TypeTraitExpr *IsIntangibleExpr =
311 TypeTraitExpr::Create(Context, BoolTy, NameLoc, UTT_IsIntangibleType,
312 {TTypeSourceInfo}, NameLoc, true);
313
314 // negate IsIntangibleExpr
315 UnaryOperator *NotIntangibleExpr = UnaryOperator::Create(
316 Context, IsIntangibleExpr, UO_LNot, BoolTy, VK_LValue, OK_Ordinary,
317 NameLoc, false, FPOptionsOverride());
318
319 // element types also may not be of 0 size
320 UnaryExprOrTypeTraitExpr *SizeOfExpr = new (Context) UnaryExprOrTypeTraitExpr(
321 UETT_SizeOf, TTypeSourceInfo, BoolTy, NameLoc, NameLoc);
322
323 // Create a BinaryOperator that checks if the size of the type is not equal to
324 // 1 Empty structs have a size of 1 in HLSL, so we need to check for that
326 Context, llvm::APInt(Context.getTypeSize(Context.getSizeType()), 1, true),
327 Context.getSizeType(), NameLoc);
328
329 BinaryOperator *SizeGEQOneExpr =
330 BinaryOperator::Create(Context, SizeOfExpr, rhs, BO_GE, BoolTy, VK_LValue,
331 OK_Ordinary, NameLoc, FPOptionsOverride());
332
333 // Combine the two constraints
335 Context, NotIntangibleExpr, SizeGEQOneExpr, BO_LAnd, BoolTy, VK_LValue,
336 OK_Ordinary, NameLoc, FPOptionsOverride());
337
338 return CombinedExpr;
339}
340
342 bool isTypedBuffer) {
343 ASTContext &Context = S.getASTContext();
344 DeclContext *DC = NSD->getDeclContext();
345 SourceLocation DeclLoc = SourceLocation();
346
347 IdentifierInfo &ElementTypeII = Context.Idents.get("element_type");
349 Context, NSD->getDeclContext(), DeclLoc, DeclLoc,
350 /*D=*/0,
351 /*P=*/0,
352 /*Id=*/&ElementTypeII,
353 /*Typename=*/true,
354 /*ParameterPack=*/false);
355
356 T->setDeclContext(DC);
357 T->setReferenced();
358
359 // Create and Attach Template Parameter List to ConceptDecl
361 Context, DeclLoc, DeclLoc, {T}, DeclLoc, nullptr);
362
363 DeclarationName DeclName;
364 Expr *ConstraintExpr = nullptr;
365
366 if (isTypedBuffer) {
367 DeclName = DeclarationName(
368 &Context.Idents.get("__is_typed_resource_element_compatible"));
369 ConstraintExpr = constructTypedBufferConstraintExpr(S, DeclLoc, T);
370 } else {
371 DeclName = DeclarationName(
372 &Context.Idents.get("__is_structured_resource_element_compatible"));
373 ConstraintExpr = constructStructuredBufferConstraintExpr(S, DeclLoc, T);
374 }
375
376 // Create a ConceptDecl
377 ConceptDecl *CD =
378 ConceptDecl::Create(Context, NSD->getDeclContext(), DeclLoc, DeclName,
379 ConceptParams, ConstraintExpr);
380
381 // Attach the template parameter list to the ConceptDecl
382 CD->setTemplateParameters(ConceptParams);
383
384 // Add the concept declaration to the Translation Unit Decl
385 NSD->getDeclContext()->addDecl(CD);
386
387 return CD;
388}
389
390void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
391 CXXRecordDecl *Decl;
392 ConceptDecl *TypedBufferConcept = constructBufferConceptDecl(
393 *SemaPtr, HLSLNamespace, /*isTypedBuffer*/ true);
394 ConceptDecl *StructuredBufferConcept = constructBufferConceptDecl(
395 *SemaPtr, HLSLNamespace, /*isTypedBuffer*/ false);
396
397 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "Buffer")
398 .addSimpleTemplateParams({"element_type"}, TypedBufferConcept)
399 .finalizeForwardDeclaration();
400
401 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
402 setupBufferType(Decl, *SemaPtr, ResourceClass::SRV, /*IsROV=*/false,
403 /*RawBuffer=*/false, /*HasCounter=*/false)
408 });
409
410 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWBuffer")
411 .addSimpleTemplateParams({"element_type"}, TypedBufferConcept)
412 .finalizeForwardDeclaration();
413
414 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
415 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/false,
416 /*RawBuffer=*/false, /*HasCounter=*/false)
421 });
422
423 Decl =
424 BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RasterizerOrderedBuffer")
425 .addSimpleTemplateParams({"element_type"}, StructuredBufferConcept)
426 .finalizeForwardDeclaration();
427 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
428 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/true,
429 /*RawBuffer=*/false, /*HasCounter=*/false)
434 });
435
436 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "StructuredBuffer")
437 .addSimpleTemplateParams({"element_type"}, StructuredBufferConcept)
438 .finalizeForwardDeclaration();
439 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
440 setupBufferType(Decl, *SemaPtr, ResourceClass::SRV, /*IsROV=*/false,
441 /*RawBuffer=*/true, /*HasCounter=*/false)
446 });
447
448 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWStructuredBuffer")
449 .addSimpleTemplateParams({"element_type"}, StructuredBufferConcept)
450 .finalizeForwardDeclaration();
451 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
452 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/false,
453 /*RawBuffer=*/true, /*HasCounter=*/true)
460 });
461
462 Decl =
463 BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "AppendStructuredBuffer")
464 .addSimpleTemplateParams({"element_type"}, StructuredBufferConcept)
465 .finalizeForwardDeclaration();
466 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
467 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/false,
468 /*RawBuffer=*/true, /*HasCounter=*/true)
472 });
473
474 Decl =
475 BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "ConsumeStructuredBuffer")
476 .addSimpleTemplateParams({"element_type"}, StructuredBufferConcept)
477 .finalizeForwardDeclaration();
478 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
479 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/false,
480 /*RawBuffer=*/true, /*HasCounter=*/true)
484 });
485
486 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
487 "RasterizerOrderedStructuredBuffer")
488 .addSimpleTemplateParams({"element_type"}, StructuredBufferConcept)
489 .finalizeForwardDeclaration();
490 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
491 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/true,
492 /*RawBuffer=*/true, /*HasCounter=*/true)
499 });
500
501 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "ByteAddressBuffer")
502 .finalizeForwardDeclaration();
503 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
504 setupBufferType(Decl, *SemaPtr, ResourceClass::SRV, /*IsROV=*/false,
505 /*RawBuffer=*/true, /*HasCounter=*/false)
508 });
509 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWByteAddressBuffer")
510 .finalizeForwardDeclaration();
511 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
512 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/false,
513 /*RawBuffer=*/true, /*HasCounter=*/false)
516 });
517 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
518 "RasterizerOrderedByteAddressBuffer")
519 .finalizeForwardDeclaration();
520 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
521 setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, /*IsROV=*/true,
522 /*RawBuffer=*/true, /*HasCounter=*/false)
525 });
526
527 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "SamplerState")
528 .finalizeForwardDeclaration();
529 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
530 setupSamplerType(Decl, *SemaPtr).completeDefinition();
531 });
532
533 Decl =
534 BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "SamplerComparisonState")
535 .finalizeForwardDeclaration();
536 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
537 setupSamplerType(Decl, *SemaPtr).completeDefinition();
538 });
539
540 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "Texture2D")
541 .addSimpleTemplateParams({"element_type"}, TypedBufferConcept)
542 .finalizeForwardDeclaration();
543 onCompletion(Decl, [this](CXXRecordDecl *Decl) {
544 setupTextureType(Decl, *SemaPtr, ResourceClass::SRV, /*IsROV=*/false,
545 ResourceDimension::Dim2D)
547 });
548}
549
550void HLSLExternalSemaSource::onCompletion(CXXRecordDecl *Record,
551 CompletionFunction Fn) {
552 if (!Record->isCompleteDefinition())
553 Completions.insert(std::make_pair(Record->getCanonicalDecl(), Fn));
554}
555
557 if (!isa<CXXRecordDecl>(Tag))
558 return;
559 auto Record = cast<CXXRecordDecl>(Tag);
560
561 // If this is a specialization, we need to get the underlying templated
562 // declaration and complete that.
563 if (auto TDecl = dyn_cast<ClassTemplateSpecializationDecl>(Record))
564 Record = TDecl->getSpecializedTemplate()->getTemplatedDecl();
565 Record = Record->getCanonicalDecl();
566 auto It = Completions.find(Record);
567 if (It == Completions.end())
568 return;
569 It->second(Record);
570}
Defines the clang::ASTContext interface.
llvm::dxil::ResourceClass ResourceClass
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
static BuiltinTypeDeclBuilder setupBufferType(CXXRecordDecl *Decl, Sema &S, ResourceClass RC, bool IsROV, bool RawBuffer, bool HasCounter)
Set up common members and attributes for buffer types.
static BuiltinTypeDeclBuilder setupSamplerType(CXXRecordDecl *Decl, Sema &S)
Set up common members and attributes for sampler types.
static ConceptDecl * constructBufferConceptDecl(Sema &S, NamespaceDecl *NSD, bool isTypedBuffer)
static Expr * constructTypedBufferConstraintExpr(Sema &S, SourceLocation NameLoc, TemplateTypeParmDecl *T)
static BuiltinTypeDeclBuilder setupTextureType(CXXRecordDecl *Decl, Sema &S, ResourceClass RC, bool IsROV, ResourceDimension Dim)
Set up common members and attributes for texture 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:220
TranslationUnitDecl * getTranslationUnitDecl() const
QualType getDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, SourceLocation AttrLoc) const
Return the unique reference to the matrix type of the specified element type and size.
unsigned getIntWidth(QualType T) const
CanQualType FloatTy
IdentifierTable & Idents
Definition ASTContext.h:790
CanQualType BoolTy
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:4038
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:4982
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:487
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:974
Represents the results of name lookup.
Definition Lookup.h:147
Represent a C++ namespace.
Definition Decl.h:592
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
Definition DeclCXX.cpp:3314
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
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:856
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:9380
ASTContext & getASTContext() const
Definition Sema.h:927
const LangOptions & getLangOpts() const
Definition Sema.h:920
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:3717
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:5807
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:8273
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
Definition ExprCXX.h:2896
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:2625
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2244
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:5039
Represents a C++ using-declaration.
Definition DeclCXX.h:3587
static UsingDirectiveDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation NamespaceLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Nominated, DeclContext *CommonAncestor)
Definition DeclCXX.cpp:3270
BuiltinTypeDeclBuilder & addGetDimensionsMethodForBuffer()
BuiltinTypeDeclBuilder & addBufferHandles(ResourceClass RC, bool IsROV, bool RawBuffer, bool HasCounter, AccessSpecifier Access=AccessSpecifier::AS_private)
BuiltinTypeDeclBuilder & addTextureHandle(ResourceClass RC, bool IsROV, ResourceDimension RD, AccessSpecifier Access=AccessSpecifier::AS_private)
BuiltinTypeDeclBuilder & addSampleMethods(ResourceDimension Dim)
BuiltinTypeDeclBuilder & addStaticInitializationFunctions(bool HasCounter)
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_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:135
@ 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...