[clang] [llvm] [HLSL] Add implicit resource element type concepts to AST (PR #116413)
Justin Bogner via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 22 15:46:47 PST 2024
================
@@ -323,19 +325,117 @@ struct TemplateParameterListBuilder {
return *this;
}
- BuiltinTypeDeclBuilder &finalizeTemplateArgs() {
+ // The concept specialization expression (CSE) constructed in
+ // constructConceptSpecializationExpr is constructed so that it
+ // matches the CSE that is constructed when parsing the below C++ code:
+ //
+ // template<typename T>
+ // concept is_typed_resource_element_compatible =
+ // __builtin_hlsl_typed_resource_element_compatible<T>
+ //
+ // template<typename element_type> requires
+ // is_typed_resource_element_compatible<element_type>
+ // struct RWBuffer {
+ // element_type Val;
+ // };
+ //
+ // int fn() {
+ // RWBuffer<int> Buf;
+ // }
+ //
+ // When dumping the AST and filtering for "RWBuffer", the resulting AST
+ // structure is what we're trying to construct below, specifically the
+ // CSE portion.
+ ConceptSpecializationExpr *
+ constructConceptSpecializationExpr(Sema &S, ConceptDecl *CD) {
+ ASTContext &Context = S.getASTContext();
+ SourceLocation Loc = Builder.Record->getBeginLoc();
+ DeclarationNameInfo DNI(CD->getDeclName(), Loc);
+ NestedNameSpecifierLoc NNSLoc;
+ DeclContext *DC = Builder.Record->getDeclContext();
+ TemplateArgumentListInfo TALI(Loc, Loc);
+
+ // Assume that the concept decl has just one template parameter
+ // This parameter should have been added when CD was constructed
+ // in getTypedBufferConceptDecl
+ assert(CD->getTemplateParameters()->size() == 1 &&
+ "unexpected concept decl parameter count");
+ TemplateTypeParmDecl *ConceptTTPD = dyn_cast<TemplateTypeParmDecl>(
+ CD->getTemplateParameters()->getParam(0));
+
+ // this TemplateTypeParmDecl is the template for the resource, and is
+ // used to construct a template argumentthat will be used
+ // to construct the ImplicitConceptSpecializationDecl
+ TemplateTypeParmDecl *T = TemplateTypeParmDecl::Create(
+ Context, // AST context
+ Builder.Record->getDeclContext(), // DeclContext
+ SourceLocation(), SourceLocation(),
+ /*depth=*/0, // Depth in the template parameter list
+ /*position=*/0, // Position in the template parameter list
+ /*id=*/nullptr, // Identifier for 'T'
----------------
bogner wrote:
I get that the parameter names in `TemplateTypeParmDecl::Create` aren't all great, but these comments really should match those names exactly.
https://github.com/llvm/llvm-project/pull/116413
More information about the cfe-commits
mailing list