Browse Source

Fixed a problem when walking the managed AST because friend templated

classes were seen as declared multiple times and resulted into a crash. Solves #975.
pull/974/merge
Marco Zille 8 years ago committed by João Matos
parent
commit
5eb077b5d4
  1. 17
      src/CppParser/Parser.cpp
  2. 20
      tests/CSharp/CSharpTemplates.h

17
src/CppParser/Parser.cpp

@ -887,6 +887,23 @@ void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC) @@ -887,6 +887,23 @@ void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC)
continue;
WalkDeclaration(D);
break;
case Decl::Friend:
{
FriendDecl* FD = cast<FriendDecl>(D);
auto decl = FD->getFriendDecl();
// Skip every friend declaration that isn't a function declaration
if (decl && !isa<FunctionDecl>(decl))
continue;
WalkDeclaration(D);
break;
}
case Decl::FriendTemplate:
{
// In this case always skip the declaration since, unlike Decl::Friend handled above,
// it never is a declaration of a friend function or method
break;
}
default:
{
WalkDeclaration(D);

20
tests/CSharp/CSharpTemplates.h

@ -474,3 +474,23 @@ template class DLL_API TemplateWithIndexer<T1>; @@ -474,3 +474,23 @@ template class DLL_API TemplateWithIndexer<T1>;
template class DLL_API TemplateWithIndexer<T2*>;
class TestForwardedClassInAnotherUnit;
// Forward declaration of class as friend
template<class T> class ForwardTemplateFriendClassContainer;
template<class T> class ForwardTemplateFriendClass;
template<class T>
class ForwardTemplateFriendClassContainer
{
template<class K> friend class ForwardTemplateFriendClass;
};
template<class T>
class ForwardTemplateFriendClass
{
protected:
ForwardTemplateFriendClass() { }
};
class ForwardTemplateFriendClassUser : public ForwardTemplateFriendClass<ForwardTemplateFriendClassUser>
{ };
Loading…
Cancel
Save