diff --git a/src/AST/Function.cs b/src/AST/Function.cs index a0f45e08..c8408a8b 100644 --- a/src/AST/Function.cs +++ b/src/AST/Function.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using CppSharp.AST.Extensions; namespace CppSharp.AST { @@ -96,7 +97,7 @@ namespace CppSharp.AST public bool Equals(Parameter x, Parameter y) { - return x.QualifiedType == y.QualifiedType; + return x.QualifiedType.ResolvesTo(y.QualifiedType); } public int GetHashCode(Parameter obj) diff --git a/src/AST/FunctionExtensions.cs b/src/AST/FunctionExtensions.cs index 29bb4fbe..b474f9a5 100644 --- a/src/AST/FunctionExtensions.cs +++ b/src/AST/FunctionExtensions.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using CppSharp.AST.Extensions; namespace CppSharp.AST { @@ -76,7 +77,7 @@ namespace CppSharp.AST public static bool CanOverride(this Method @override, Method method) { return (method.OriginalName == @override.OriginalName && - method.ReturnType == @override.ReturnType && + method.ReturnType.ResolvesTo(@override.ReturnType) && method.Parameters.SequenceEqual(@override.Parameters, ParameterTypeComparer.Instance)) || (@override.IsDestructor && method.IsDestructor && method.IsVirtual); } diff --git a/src/AST/TypeExtensions.cs b/src/AST/TypeExtensions.cs index 1a4797f6..3c3b211c 100644 --- a/src/AST/TypeExtensions.cs +++ b/src/AST/TypeExtensions.cs @@ -272,5 +272,22 @@ return type; } + + public static bool ResolvesTo(this QualifiedType type, QualifiedType other) + { + if (!type.Qualifiers.Equals(other.Qualifiers)) + return false; + + var left = type.Type.Desugar(); + var right = other.Type.Desugar(); + var leftPointer = left as PointerType; + var rightPointer = right as PointerType; + if (leftPointer != null && rightPointer != null) + { + return leftPointer.Modifier == rightPointer.Modifier && + leftPointer.QualifiedPointee.ResolvesTo(rightPointer.QualifiedPointee); + } + return left.Equals(right); + } } } \ No newline at end of file diff --git a/tests/Common/Common.cpp b/tests/Common/Common.cpp index 1df2be3f..0861a2c2 100644 --- a/tests/Common/Common.cpp +++ b/tests/Common/Common.cpp @@ -309,7 +309,7 @@ int TestDelegates::CDecl(DelegateCDecl del) return del(1); } -int ImplementsAbstractFoo::pureFunction(int i) +int ImplementsAbstractFoo::pureFunction(typedefInOverride i) { return 5; } diff --git a/tests/Common/Common.h b/tests/Common/Common.h index 6c8f7968..1ff5e7c2 100644 --- a/tests/Common/Common.h +++ b/tests/Common/Common.h @@ -212,7 +212,8 @@ public: class DLL_API ImplementsAbstractFoo : public AbstractFoo { public: - virtual int pureFunction(int i = 0); + typedef int typedefInOverride; + virtual int pureFunction(typedefInOverride i = 0); virtual int pureFunction1(); virtual int pureFunction2(bool* ok = 0); };