[clang] [HLSL] Add implicit resource element type concepts to AST (PR #112600)
Chris B via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 17 16:43:03 PDT 2024
================
@@ -323,30 +324,101 @@ struct TemplateParameterListBuilder {
S.Context, Builder.Record->getDeclContext(), SourceLocation(),
SourceLocation(), /* TemplateDepth */ 0, Position,
&S.Context.Idents.get(Name, tok::TokenKind::identifier),
- /* Typename */ false,
- /* ParameterPack */ false);
+ /* Typename */ true,
+ /* ParameterPack */ false,
+ /* HasTypeConstraint*/ false);
if (!DefaultValue.isNull())
Decl->setDefaultArgument(
S.Context, S.getTrivialTemplateArgumentLoc(DefaultValue, QualType(),
SourceLocation()));
-
+ Decl->setReferenced();
Params.emplace_back(Decl);
return *this;
}
- BuiltinTypeDeclBuilder &finalizeTemplateArgs() {
+ ConceptSpecializationExpr *getConceptSpecializationExpr(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
+ TemplateTypeParmDecl *ConceptTTPD = dyn_cast<TemplateTypeParmDecl>(
+ CD->getTemplateParameters()->getParam(0));
+
+ clang::TemplateTypeParmDecl *T = clang::TemplateTypeParmDecl::Create(
+ context, // AST context
+ context.getTranslationUnitDecl(), // DeclContext
+ SourceLocation(), SourceLocation(),
+ /*depth=*/0, // Depth in the template parameter list
+ /*position=*/0, // Position in the template parameter list
+ /*id=*/nullptr, // Identifier for 'T'
+ /*Typename=*/true, // Indicates this is a 'typename' or 'class'
+ /*ParameterPack=*/false, // Not a parameter pack
+ /*HasTypeConstraint=*/false // Not a parameter pack
+ );
+
+ T->setDeclContext(DC);
+ T->setReferenced();
+
+ clang::QualType ConceptTType = context.getTypeDeclType(ConceptTTPD);
+
+ TemplateArgument ConceptTA = TemplateArgument(ConceptTType);
+
+ std::vector<TemplateArgument> ConceptConvertedArgsVec = {ConceptTA};
+ ArrayRef<TemplateArgument> ConceptConvertedArgs = ConceptConvertedArgsVec;
+
+ clang::QualType CSETType = context.getTypeDeclType(T);
+
+ TemplateArgument CSETA = TemplateArgument(CSETType);
+
+ std::vector<TemplateArgument> CSEConvertedArgsVec = {CSETA};
+ ArrayRef<TemplateArgument> CSEConvertedArgs = CSEConvertedArgsVec;
+
+ ImplicitConceptSpecializationDecl *ImplicitCSEDecl =
+ ImplicitConceptSpecializationDecl::Create(
+ context, Builder.Record->getDeclContext(), loc, CSEConvertedArgs);
+
+ const ConstraintSatisfaction CS(CD, ConceptConvertedArgs);
----------------
llvm-beanz wrote:
```suggestion
clang::QualType CSETType = context.getTypeDeclType(T);
TemplateArgument CSETA = TemplateArgument(CSETType);
ImplicitConceptSpecializationDecl *ImplicitCSEDecl =
ImplicitConceptSpecializationDecl::Create(
context, Builder.Record->getDeclContext(), loc, {CSETA});
const ConstraintSatisfaction CS(CD, {ConceptTA});
```
https://github.com/llvm/llvm-project/pull/112600
More information about the cfe-commits
mailing list