diff --git a/src/Core/Parser/ASTConverter.cs b/src/Core/Parser/ASTConverter.cs index 4d242d7a..8717d00f 100644 --- a/src/Core/Parser/ASTConverter.cs +++ b/src/Core/Parser/ASTConverter.cs @@ -835,7 +835,8 @@ namespace CppSharp { var decl = ctx.getClasses(i); var _decl = Visit(decl) as AST.Class; - _ctx.Classes.Add(_decl); + if (!_decl.IsIncomplete) + _ctx.Classes.Add(_decl); } for (uint i = 0; i < ctx.TemplatesCount; ++i) diff --git a/src/CppParser/AST.cpp b/src/CppParser/AST.cpp index a3b65366..809d339d 100644 --- a/src/CppParser/AST.cpp +++ b/src/CppParser/AST.cpp @@ -258,7 +258,7 @@ Namespace* DeclarationContext::FindCreateNamespace(const std::string& Name) return _namespace; } -Class* DeclarationContext::FindClass(const std::string& Name) +Class* DeclarationContext::FindClass(const std::string& Name, bool IsComplete) { if (Name.empty()) return nullptr; @@ -267,7 +267,8 @@ Class* DeclarationContext::FindClass(const std::string& Name) if (entries.size() == 1) { auto _class = std::find_if(Classes.begin(), Classes.end(), - [&](Class* klass) { return klass->Name == Name; }); + [&](Class* klass) { return klass->Name == Name && + (!klass->IsIncomplete || !IsComplete); }); return _class != Classes.end() ? *_class : nullptr; } @@ -281,7 +282,7 @@ Class* DeclarationContext::FindClass(const std::string& Name) if (!_namespace) return nullptr; - return _namespace->FindClass(className); + return _namespace->FindClass(className, IsComplete); } Class* DeclarationContext::CreateClass(std::string Name, bool IsComplete) @@ -297,7 +298,7 @@ Class* DeclarationContext::CreateClass(std::string Name, bool IsComplete) Class* DeclarationContext::FindClass(const std::string& Name, bool IsComplete, bool Create) { - auto _class = FindClass(Name); + auto _class = FindClass(Name, IsComplete); if (!_class) { @@ -310,31 +311,7 @@ Class* DeclarationContext::FindClass(const std::string& Name, bool IsComplete, return _class; } - if (!_class->IsIncomplete || !IsComplete) - return _class; - - if (!Create) - return nullptr; - - auto newClass = CreateClass(Name, IsComplete); - - // Replace the incomplete declaration with the complete one. - if (_class->IsIncomplete) - { - bool Found = false; - std::replace_if(Classes.begin(), Classes.end(), - [&](Class* klass) - { - Found |= (klass == _class); - return klass == _class; - }, newClass); - if (Found) - delete _class; - else - _class->CompleteDeclaration = newClass; - } - - return newClass; + return _class; } Enumeration* DeclarationContext::FindEnum(void* OriginalPtr) diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index 918f2de9..933fc986 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -433,9 +433,9 @@ public: CS_IGNORE CppSharp::CppParser::AST::Namespace* FindCreateNamespace(const std::string& Name); CS_IGNORE Class* CreateClass(std::string Name, bool IsComplete); - CS_IGNORE Class* FindClass(const std::string& Name); + CS_IGNORE Class* FindClass(const std::string& Name, bool IsComplete); CS_IGNORE Class* FindClass(const std::string& Name, bool IsComplete, - bool Create = false); + bool Create); CS_IGNORE ClassTemplate* FindClassTemplate(const std::string& USR); CS_IGNORE FunctionTemplate* FindFunctionTemplate(const std::string& USR); diff --git a/tests/Common/Common.h b/tests/Common/Common.h index 11e736d0..3fb02fd6 100644 --- a/tests/Common/Common.h +++ b/tests/Common/Common.h @@ -1002,3 +1002,18 @@ void NonTrivialDtor::setDtorCalled(bool value) { dtorCalled = true; } + +template class ForwardedTemplate; + +ForwardedTemplate returnsForwardedTemplate(); + +template class ForwardedTemplate +{ + ForwardedTemplate functionInForwardedTemplate() const; +}; + +template +ForwardedTemplate ForwardedTemplate::functionInForwardedTemplate() const +{ + return ForwardedTemplate(); +}