From cc2a283c7f55fa3eb0df9d15dae99e77ff7933df Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Thu, 14 Jul 2016 23:06:10 +0300 Subject: [PATCH] Fixed the completion of templates. Signed-off-by: Dimitar Dobrev --- src/CppParser/Parser.cpp | 6 ++++-- src/Generator.Tests/AST/TestAST.cs | 8 ++++++++ tests/Native/AST.h | 6 ++++++ tests/Native/ASTExtensions.h | 7 ++++++- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 60a11d92..090f1f57 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -1148,7 +1148,8 @@ ClassTemplate* Parser::WalkClassTemplate(const clang::ClassTemplateDecl* TD) return CT; CT = new ClassTemplate(); - if (TD != TD->getCanonicalDecl()) + if (!TD->isThisDeclarationADefinition() && + TD->getCanonicalDecl()->isThisDeclarationADefinition()) { CT->IsIncomplete = true; CT->CompleteDeclaration = WalkClassTemplate(TD->getCanonicalDecl()); @@ -1373,7 +1374,8 @@ FunctionTemplate* Parser::WalkFunctionTemplate(const clang::FunctionTemplateDecl /*AddToNamespace=*/false); FT = new FunctionTemplate(); - if (TD != TD->getCanonicalDecl()) + if (!TD->isThisDeclarationADefinition() && + TD->getCanonicalDecl()->isThisDeclarationADefinition()) { FT->IsIncomplete = true; FT->CompleteDeclaration = WalkFunctionTemplate(TD->getCanonicalDecl()); diff --git a/src/Generator.Tests/AST/TestAST.cs b/src/Generator.Tests/AST/TestAST.cs index 5a6e9ca3..620409c2 100644 --- a/src/Generator.Tests/AST/TestAST.cs +++ b/src/Generator.Tests/AST/TestAST.cs @@ -367,5 +367,13 @@ namespace CppSharp.Generator.Tests.AST /// no string for this control key. /// ".Replace("\r", string.Empty), commentMethod.Replace("\r", string.Empty)); } + + [Test] + public void TestCompletionOfClassTemplates() + { + var templates = AstContext.FindDecl("ForwardedTemplate").ToList(); + Assert.IsFalse(templates.Single( + t => t.DebugText == "template \r\nclass ForwardedTemplate\r\n{\r\n}").IsIncomplete); + } } } diff --git a/tests/Native/AST.h b/tests/Native/AST.h index e7b872b4..8ede7e8c 100644 --- a/tests/Native/AST.h +++ b/tests/Native/AST.h @@ -148,3 +148,9 @@ public: //---------------------------------------------------------------------- const char * GetIOHandlerControlSequence(char ch); }; + +template +class ForwardedTemplate; + +typedef ForwardedTemplate i; +typedef ForwardedTemplate l; diff --git a/tests/Native/ASTExtensions.h b/tests/Native/ASTExtensions.h index 3182addd..f616d3ff 100644 --- a/tests/Native/ASTExtensions.h +++ b/tests/Native/ASTExtensions.h @@ -6,4 +6,9 @@ template class TestTemplateClass; // Implicit instantiations typedef TestTemplateClass TestTemplateClassComplex; -typedef TestTemplateClass> TestTemplateClassMoreComplex; \ No newline at end of file +typedef TestTemplateClass> TestTemplateClassMoreComplex; + +template +class ForwardedTemplate +{ +};