Browse Source

Fixed the pass for ambiguity to correctly mark ambiguous functions.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/444/head
Dimitar Dobrev 10 years ago
parent
commit
1cb4b22788
  1. 8
      src/Generator.Tests/AST/TestAST.cs
  2. 20
      src/Generator/Passes/CheckAmbiguousFunctions.cs
  3. 7
      tests/Native/AST.h

8
src/Generator.Tests/AST/TestAST.cs

@ -256,5 +256,13 @@ namespace CppSharp.Generator.Tests.AST
//Assert.AreEqual("const int& testConstRefSignature()", AstContext.FindClass("HasConstFunction").Single().FindMethod("testConstRefSignature").Signature); //Assert.AreEqual("const int& testConstRefSignature()", AstContext.FindClass("HasConstFunction").Single().FindMethod("testConstRefSignature").Signature);
//Assert.AreEqual("const int& testStaticConstRefSignature()", AstContext.FindClass("HasConstFunction").Single().FindMethod("testStaticConstRefSignature").Signature); //Assert.AreEqual("const int& testStaticConstRefSignature()", AstContext.FindClass("HasConstFunction").Single().FindMethod("testStaticConstRefSignature").Signature);
} }
[Test]
public void TestAmbiguity()
{
new CheckAmbiguousFunctions { Driver = new Driver(new DriverOptions(), new TextDiagnosticPrinter()) }
.VisitLibrary(AstContext);
Assert.IsTrue(AstContext.FindClass("HasAmbiguousFunctions").Single().FindMethod("ambiguous").IsAmbiguous);
}
} }
} }

20
src/Generator/Passes/CheckAmbiguousFunctions.cs

@ -45,15 +45,13 @@ namespace CppSharp.Passes
if (!overload.IsGenerated) continue; if (!overload.IsGenerated) continue;
if (!CheckConstness(function, overload)) if (CheckConstnessForAmbiguity(function, overload) ||
continue; CheckDefaultParametersForAmbiguity(function, overload))
{
if (!CheckDefaultParameters(function, overload))
continue;
function.IsAmbiguous = true; function.IsAmbiguous = true;
overload.IsAmbiguous = true; overload.IsAmbiguous = true;
} }
}
if (function.IsAmbiguous) if (function.IsAmbiguous)
Driver.Diagnostics.Debug("Found ambiguous overload: {0}", Driver.Diagnostics.Debug("Found ambiguous overload: {0}",
@ -62,7 +60,7 @@ namespace CppSharp.Passes
return true; return true;
} }
static bool CheckDefaultParameters(Function function, Function overload) private static bool CheckDefaultParametersForAmbiguity(Function function, Function overload)
{ {
var commonParameters = Math.Min(function.Parameters.Count, overload.Parameters.Count); var commonParameters = Math.Min(function.Parameters.Count, overload.Parameters.Count);
@ -98,7 +96,7 @@ namespace CppSharp.Passes
return true; return true;
} }
static bool CheckConstness(Function function, Function overload) private static bool CheckConstnessForAmbiguity(Function function, Function overload)
{ {
if (function is Method && overload is Method) if (function is Method && overload is Method)
{ {
@ -110,17 +108,17 @@ namespace CppSharp.Passes
if (method1.IsConst && !method2.IsConst && sameParams) if (method1.IsConst && !method2.IsConst && sameParams)
{ {
method1.ExplicitlyIgnore(); method1.ExplicitlyIgnore();
return false; return true;
} }
if (method2.IsConst && !method1.IsConst && sameParams) if (method2.IsConst && !method1.IsConst && sameParams)
{ {
method2.ExplicitlyIgnore(); method2.ExplicitlyIgnore();
return false; return true;
} }
} }
return true; return false;
} }
} }
} }

7
tests/Native/AST.h

@ -84,3 +84,10 @@ inline const TestTemplateClass2 operator+(const TestTemplateClass2& f1, const Te
{ {
return TestTemplateClass2(); return TestTemplateClass2();
} }
class HasAmbiguousFunctions
{
public:
void ambiguous();
void ambiguous() const;
};

Loading…
Cancel
Save