================
@@ -676,6 +676,75 @@
BuiltinTypeDeclBuilder::addHandleConstructorFromImplicitBinding() {
.finalize();
}
+BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addCopyConstructor() {
+ if (Record->isCompleteDefinition())
+ return *this;
+
+ ASTContext &AST = SemaRef.getASTContext();
+ QualType RecordType = AST.getCanonicalTagType(Record);
+ QualType ConstRecordType = RecordType.withConst();
+ QualType ConstRecordRefType = AST.getLValueReferenceType(ConstRecordType);
+
+ using PH = BuiltinTypeMethodBuilder::PlaceHolder;
+
+ BuiltinTypeMethodBuilder Builder(*this, "", AST.VoidTy, false, true);
+ Builder.addParam("other", ConstRecordRefType);
+ Builder.ensureCompleteDecl();
+
+ ParmVarDecl *OtherParam = Builder.Method->getParamDecl(0);
+
+ Expr *OtherDeclRef = DeclRefExpr::Create(
+ AST, NestedNameSpecifierLoc(), SourceLocation(), OtherParam, false,
+ DeclarationNameInfo(OtherParam->getDeclName(), SourceLocation()),
+ ConstRecordType, VK_LValue);
+
+ FieldDecl *HandleField = getResourceHandleField();
+ Expr *OtherHandleMemberExpr = MemberExpr::CreateImplicit(
+ AST, OtherDeclRef, false, HandleField, HandleField->getType(), VK_LValue,
+ OK_Ordinary);
+
+ return Builder.assign(PH::Handle, OtherHandleMemberExpr).finalize();
----------------
hekota wrote:
The methods on BuiltininTypeMethodBuilder could be something like this:
```
template <typename T>
BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::getResourceHandle(T
ResourceRecord) {
ensureCompleteDecl();
Expr *ResourceExpr = convertPlaceholder(ResourceRecord);
ASTContext &AST = DeclBuilder.SemaRef.getASTContext();
FieldDecl *HandleField = DeclBuilder.getResourceHandleField();
MemberExpr *HandleExpr = MemberExpr::CreateImplicit(
AST, ResourceExpr, false, HandleField, HandleField->getType(), VK_LValue,
OK_Ordinary);
StmtsList.push_back(HandleExpr);
return *this;
}
BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::returnThis() {
ensureCompleteDecl();
ASTContext &AST = DeclBuilder.SemaRef.getASTContext();
CXXThisExpr *ThisExpr = CXXThisExpr::Create(
AST, SourceLocation(), Method->getFunctionObjectParameterType(),
true);
StmtsList.push_back(ReturnStmt::Create(AST, SourceLocation(), ThisExpr,
nullptr));
return *this;
}
```
https://github.com/llvm/llvm-project/pull/156075
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits