================
@@ -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

Reply via email to