diff --git a/src/Generator/Passes/CheckDuplicatedNamesPass.cs b/src/Generator/Passes/CheckDuplicatedNamesPass.cs index 474415a0..1241a988 100644 --- a/src/Generator/Passes/CheckDuplicatedNamesPass.cs +++ b/src/Generator/Passes/CheckDuplicatedNamesPass.cs @@ -8,12 +8,14 @@ namespace CppSharp.Passes { class DeclarationName { + public Driver Driver { get; set; } private readonly string Name; private readonly Dictionary methodSignatures; private int Count; - public DeclarationName(string name) + public DeclarationName(string name, Driver driver) { + Driver = driver; Name = name; methodSignatures = new Dictionary(); } @@ -58,8 +60,11 @@ namespace CppSharp.Passes Count = methodCount+1; if (method.IsOperator) + { // TODO: turn into a method; append the original type (say, "signed long") of the last parameter to the type so that the user knows which overload is called + Driver.Diagnostics.EmitWarning("Duplicate operator {0} ignored", method.Name); method.ExplicityIgnored = true; + } else method.Name += methodCount.ToString(CultureInfo.InvariantCulture); return true; @@ -136,7 +141,7 @@ namespace CppSharp.Passes // If the name is not yet on the map, then add it. if (!names.ContainsKey(fullName)) - names.Add(fullName, new DeclarationName(decl.Name)); + names.Add(fullName, new DeclarationName(decl.Name, Driver)); if (names[fullName].UpdateName(decl)) Driver.Diagnostics.EmitWarning("Duplicate name {0}, renamed to {1}", fullName, decl.Name); diff --git a/tests/Basic/Basic.cpp b/tests/Basic/Basic.cpp index fe630c2a..74fcfd40 100644 --- a/tests/Basic/Basic.cpp +++ b/tests/Basic/Basic.cpp @@ -4,14 +4,14 @@ Foo::Foo() { } -Foo2& Foo2::operator <<(signed int i) +Foo2 Foo2::operator<<(signed int i) { Foo2 foo; foo.C = C << i; return foo; } -Foo2& Foo2::operator <<(signed long l) +Foo2 Foo2::operator<<(signed long l) { Foo2 foo; foo.C = C << l; diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index df964508..109ab84a 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -23,8 +23,8 @@ public: int C; - Foo2& operator<<(signed int i); - Foo2& operator<<(signed long l); + Foo2 operator<<(signed int i); + Foo2 operator<<(signed long l); }; struct DLL_API Bar