diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 06355d6b..908e72bc 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -1776,8 +1776,13 @@ static CXXOperatorKind GetOperatorKindFromDecl(clang::DeclarationName Name) Method* Parser::WalkMethodCXX(const clang::CXXMethodDecl* MD) { + const clang::CXXConstructorDecl* Ctor; if (opts->skipPrivateDeclarations && MD->getAccess() == clang::AccessSpecifier::AS_private && + !MD->isCopyAssignmentOperator() && + !MD->isMoveAssignmentOperator() && + (!(Ctor = llvm::dyn_cast(MD)) || + !Ctor->isCopyOrMoveConstructor()) && !MD->isVirtual()) return nullptr; diff --git a/src/Generator.Tests/AST/TestAST.cs b/src/Generator.Tests/AST/TestAST.cs index a45fbeab..3ef58111 100644 --- a/src/Generator.Tests/AST/TestAST.cs +++ b/src/Generator.Tests/AST/TestAST.cs @@ -602,5 +602,13 @@ namespace CppSharp.Generator.Tests.AST var @classC = AstContext.FindClass("ClassC").First(); Assert.That(@classC.Redeclarations.Count, Is.EqualTo(2)); } + + [Test] + public void TestPrivateCCtorCopyAssignment() + { + Class @class = AstContext.FindCompleteClass("HasPrivateCCtorCopyAssignment"); + Assert.That(@class.Constructors.Any(c => c.IsCopyConstructor), Is.True); + Assert.That(@class.Methods.Any(o => o.OperatorKind == CXXOperatorKind.Equal), Is.True); + } } } diff --git a/tests/Native/AST.h b/tests/Native/AST.h index 57a19339..e9cdd8fd 100644 --- a/tests/Native/AST.h +++ b/tests/Native/AST.h @@ -237,3 +237,10 @@ class ClassB; class ClassC {}; class ClassC; class ClassC; + +class HasPrivateCCtorCopyAssignment +{ +private: + HasPrivateCCtorCopyAssignment(const HasPrivateCCtorCopyAssignment&) = delete; + HasPrivateCCtorCopyAssignment& operator=(const HasPrivateCCtorCopyAssignment&) = delete; +};