@@ -156,6 +156,9 @@ struct BuiltinTypeMethodBuilder {
156156 BuiltinTypeDeclBuilder &finalize ();
157157 Expr *getResourceHandleExpr ();
158158
159+ BuiltinTypeMethodBuilder &getResourceHandle (PlaceHolder ResourceRecord);
160+ BuiltinTypeMethodBuilder &returnThis ();
161+
159162private:
160163 void createDecl ();
161164
@@ -332,7 +335,7 @@ Expr *BuiltinTypeMethodBuilder::convertPlaceholder(PlaceHolder PH) {
332335 return DeclRefExpr::Create (
333336 AST, NestedNameSpecifierLoc (), SourceLocation (), ParamDecl, false ,
334337 DeclarationNameInfo (ParamDecl->getDeclName (), SourceLocation ()),
335- ParamDecl->getType (), VK_PRValue);
338+ ParamDecl->getType (). getNonReferenceType () , VK_PRValue);
336339}
337340
338341BuiltinTypeMethodBuilder::BuiltinTypeMethodBuilder (BuiltinTypeDeclBuilder &DB,
@@ -431,6 +434,29 @@ Expr *BuiltinTypeMethodBuilder::getResourceHandleExpr() {
431434 OK_Ordinary);
432435}
433436
437+ BuiltinTypeMethodBuilder &
438+ BuiltinTypeMethodBuilder::getResourceHandle (PlaceHolder ResourceRecord) {
439+ ensureCompleteDecl ();
440+
441+ Expr *ResourceExpr = convertPlaceholder (ResourceRecord);
442+
443+ ASTContext &AST = DeclBuilder.SemaRef .getASTContext ();
444+ FieldDecl *HandleField = DeclBuilder.getResourceHandleField ();
445+ MemberExpr *HandleExpr = MemberExpr::CreateImplicit (
446+ AST, ResourceExpr, false , HandleField, HandleField->getType (), VK_LValue,
447+ OK_Ordinary);
448+ StmtsList.push_back (HandleExpr);
449+ return *this ;
450+ }
451+
452+ BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::returnThis () {
453+ ASTContext &AST = DeclBuilder.SemaRef .getASTContext ();
454+ CXXThisExpr *ThisExpr = CXXThisExpr::Create (
455+ AST, SourceLocation (), Method->getFunctionObjectParameterType (), true );
456+ StmtsList.push_back (ThisExpr);
457+ return *this ;
458+ }
459+
434460template <typename ... Ts>
435461BuiltinTypeMethodBuilder &
436462BuiltinTypeMethodBuilder::callBuiltin (StringRef BuiltinName,
@@ -687,23 +713,11 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addCopyConstructor() {
687713
688714 using PH = BuiltinTypeMethodBuilder::PlaceHolder;
689715
690- BuiltinTypeMethodBuilder Builder (*this , " " , AST.VoidTy , false , true );
691- Builder.addParam (" other" , ConstRecordRefType);
692- Builder.ensureCompleteDecl ();
693-
694- ParmVarDecl *OtherParam = Builder.Method ->getParamDecl (0 );
695-
696- Expr *OtherDeclRef = DeclRefExpr::Create (
697- AST, NestedNameSpecifierLoc (), SourceLocation (), OtherParam, false ,
698- DeclarationNameInfo (OtherParam->getDeclName (), SourceLocation ()),
699- ConstRecordType, VK_LValue);
700-
701- FieldDecl *HandleField = getResourceHandleField ();
702- Expr *OtherHandleMemberExpr = MemberExpr::CreateImplicit (
703- AST, OtherDeclRef, false , HandleField, HandleField->getType (), VK_LValue,
704- OK_Ordinary);
705-
706- return Builder.assign (PH::Handle, OtherHandleMemberExpr).finalize ();
716+ return BuiltinTypeMethodBuilder (*this , " " , AST.VoidTy , false , true )
717+ .addParam (" other" , ConstRecordRefType)
718+ .getResourceHandle (PH::_0)
719+ .assign (PH::Handle, PH::LastStmt)
720+ .finalize ();
707721}
708722
709723BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addCopyAssignmentOperator () {
@@ -717,32 +731,13 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addCopyAssignmentOperator() {
717731 QualType RecordRefType = AST.getLValueReferenceType (RecordType);
718732
719733 using PH = BuiltinTypeMethodBuilder::PlaceHolder;
720-
721734 DeclarationName Name = AST.DeclarationNames .getCXXOperatorName (OO_Equal);
722- BuiltinTypeMethodBuilder Builder (*this , Name, RecordRefType, false , false );
723- Builder.addParam (" other" , ConstRecordRefType);
724- Builder.ensureCompleteDecl ();
725-
726- ParmVarDecl *OtherParam = Builder.Method ->getParamDecl (0 );
727- Expr *OtherDeclRef = DeclRefExpr::Create (
728- AST, NestedNameSpecifierLoc (), SourceLocation (), OtherParam, false ,
729- DeclarationNameInfo (OtherParam->getDeclName (), SourceLocation ()),
730- ConstRecordType, VK_LValue);
731-
732- FieldDecl *HandleField = getResourceHandleField ();
733- Expr *OtherHandleMemberExpr = MemberExpr::CreateImplicit (
734- AST, OtherDeclRef, false , HandleField, HandleField->getType (), VK_LValue,
735- OK_Ordinary);
736-
737- Builder.assign (PH::Handle, OtherHandleMemberExpr);
738-
739- // return *this;
740- CXXThisExpr *This = CXXThisExpr::Create (
741- AST, SourceLocation (), Builder.Method ->getFunctionObjectParameterType (),
742- true );
743- Builder.StmtsList .push_back (This);
744-
745- return Builder.finalize ();
735+ return BuiltinTypeMethodBuilder (*this , Name, RecordRefType, false , false )
736+ .addParam (" other" , ConstRecordRefType)
737+ .getResourceHandle (PH::_0)
738+ .assign (PH::Handle, PH::LastStmt)
739+ .returnThis ()
740+ .finalize ();
746741}
747742
748743BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addArraySubscriptOperators () {
0 commit comments