Browse Source

Fixed the potential incorrect translation unit of templated classes.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>

Conflicts:
	tests/NamespacesDerived/NamespacesDerived.h
pull/520/head
Dimitar Dobrev 10 years ago
parent
commit
f754263ab5
  1. 46
      src/Generator/Passes/ResolveIncompleteDeclsPass.cs
  2. 5
      tests/NamespacesBase/NamespacesBase.h
  3. 4
      tests/NamespacesDerived/NamespacesDerived.h

46
src/Generator/Passes/ResolveIncompleteDeclsPass.cs

@ -14,25 +14,24 @@ namespace CppSharp.Passes @@ -14,25 +14,24 @@ namespace CppSharp.Passes
public override bool VisitClassDecl(Class @class)
{
if (!@class.IsIncomplete)
goto Out;
if (!base.VisitClassDecl(@class))
return false;
if (@class.CompleteDeclaration != null)
goto Out;
EnsureCompleteDeclaration(@class);
@class.CompleteDeclaration =
AstContext.FindCompleteClass(@class.QualifiedName);
return true;
}
if (@class.CompleteDeclaration == null)
{
@class.GenerationKind = GenerationKind.Internal;
Driver.Diagnostics.Debug("Unresolved declaration: {0}",
@class.Name);
}
public override bool VisitClassTemplateDecl(ClassTemplate template)
{
if (!base.VisitClassTemplateDecl(template))
return false;
Out:
EnsureCompleteDeclaration(template.TemplatedDecl);
return base.VisitClassDecl(@class);
template.TemplatedDecl = template.TemplatedDecl.CompleteDeclaration ?? template.TemplatedDecl;
return true;
}
public override bool VisitEnumDecl(Enumeration @enum)
@ -59,5 +58,24 @@ namespace CppSharp.Passes @@ -59,5 +58,24 @@ namespace CppSharp.Passes
return base.VisitEnumDecl(@enum);
}
private void EnsureCompleteDeclaration(Declaration declaration)
{
if (!declaration.IsIncomplete)
return;
if (declaration.CompleteDeclaration != null)
return;
declaration.CompleteDeclaration =
AstContext.FindCompleteClass(declaration.QualifiedName);
if (declaration.CompleteDeclaration == null)
{
declaration.GenerationKind = GenerationKind.Internal;
Driver.Diagnostics.Debug("Unresolved declaration: {0}",
declaration.Name);
}
}
}
}

5
tests/NamespacesBase/NamespacesBase.h

@ -47,3 +47,8 @@ class DLL_API Abstract @@ -47,3 +47,8 @@ class DLL_API Abstract
public:
virtual void abstractFunction() = 0;
};
template <typename T>
class TemplateClass
{
};

4
tests/NamespacesDerived/NamespacesDerived.h

@ -43,6 +43,8 @@ class Base3 @@ -43,6 +43,8 @@ class Base3
{
};
template <typename T> class TemplateClass;
class Derived2 : public Base3
{
public:
@ -56,4 +58,6 @@ public: @@ -56,4 +58,6 @@ public:
void defaultEnumValueFromDependency(OverlappingNamespace::ColorsEnum c = OverlappingNamespace::ColorsEnum::black);
Abstract* getAbstract();
private:
TemplateClass<int> t;
};

Loading…
Cancel
Save