================ @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits