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