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
public override bool VisitClassDecl(Class @class) public override bool VisitClassDecl(Class @class)
{ {
if (!@class.IsIncomplete) if (!base.VisitClassDecl(@class))
goto Out; return false;
if (@class.CompleteDeclaration != null) EnsureCompleteDeclaration(@class);
goto Out;
@class.CompleteDeclaration = return true;
AstContext.FindCompleteClass(@class.QualifiedName); }
if (@class.CompleteDeclaration == null) public override bool VisitClassTemplateDecl(ClassTemplate template)
{ {
@class.GenerationKind = GenerationKind.Internal; if (!base.VisitClassTemplateDecl(template))
Driver.Diagnostics.Debug("Unresolved declaration: {0}", return false;
@class.Name);
}
Out: EnsureCompleteDeclaration(template.TemplatedDecl);
return base.VisitClassDecl(@class); template.TemplatedDecl = template.TemplatedDecl.CompleteDeclaration ?? template.TemplatedDecl;
return true;
} }
public override bool VisitEnumDecl(Enumeration @enum) public override bool VisitEnumDecl(Enumeration @enum)
@ -59,5 +58,24 @@ namespace CppSharp.Passes
return base.VisitEnumDecl(@enum); 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
public: public:
virtual void abstractFunction() = 0; virtual void abstractFunction() = 0;
}; };
template <typename T>
class TemplateClass
{
};

4
tests/NamespacesDerived/NamespacesDerived.h

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

Loading…
Cancel
Save