11using System ;
2+ using System . Collections . Generic ;
23using System . Linq ;
34using CppSharp . AST ;
45using CppSharp . AST . Extensions ;
56using CppSharp . Types ;
7+ using CppSharp . Generators ;
68
79namespace CppSharp . Passes
810{
@@ -68,13 +70,16 @@ public override bool VisitFunctionDecl(AST.Function function)
6870
6971 private bool CheckDefaultParametersForAmbiguity ( Function function , Function overload )
7072 {
71- var commonParameters = Math . Min ( function . Parameters . Count , overload . Parameters . Count ) ;
73+ List < Parameter > functionParams = RemoveOperatorParams ( function ) ;
74+ List < Parameter > overloadParams = RemoveOperatorParams ( overload ) ;
75+
76+ var commonParameters = Math . Min ( functionParams . Count , overloadParams . Count ) ;
7277
7378 var i = 0 ;
7479 for ( ; i < commonParameters ; ++ i )
7580 {
76- AST . Type funcType = GetFinalType ( function . Parameters [ i ] ) ;
77- AST . Type overloadType = GetFinalType ( overload . Parameters [ i ] ) ;
81+ AST . Type funcType = GetFinalType ( functionParams [ i ] ) ;
82+ AST . Type overloadType = GetFinalType ( overloadParams [ i ] ) ;
7883
7984 AST . Type funcPointee = funcType . GetFinalPointee ( ) ?? funcType ;
8085 AST . Type overloadPointee = overloadType . GetFinalPointee ( ) ?? overloadType ;
@@ -85,28 +90,53 @@ private bool CheckDefaultParametersForAmbiguity(Function function, Function over
8590 return false ;
8691 }
8792
88- for ( ; i < function . Parameters . Count ; ++ i )
93+ for ( ; i < functionParams . Count ; ++ i )
8994 {
90- var funcParam = function . Parameters [ i ] ;
95+ var funcParam = functionParams [ i ] ;
9196 if ( ! funcParam . HasDefaultValue )
9297 return false ;
9398 }
9499
95- for ( ; i < overload . Parameters . Count ; ++ i )
100+ for ( ; i < overloadParams . Count ; ++ i )
96101 {
97- var overloadParam = overload . Parameters [ i ] ;
102+ var overloadParam = overloadParams [ i ] ;
98103 if ( ! overloadParam . HasDefaultValue )
99104 return false ;
100105 }
101106
102- if ( function . Parameters . Count > overload . Parameters . Count )
107+ if ( functionParams . Count > overloadParams . Count )
103108 overload . ExplicitlyIgnore ( ) ;
104109 else
105110 function . ExplicitlyIgnore ( ) ;
106111
107112 return true ;
108113 }
109114
115+ private List < Parameter > RemoveOperatorParams ( Function function )
116+ {
117+ var functionParams = new List < Parameter > ( function . Parameters ) ;
118+
119+ if ( ! function . IsOperator ||
120+ ( Context . Options . GeneratorKind != GeneratorKind . CLI &&
121+ Context . Options . GeneratorKind != GeneratorKind . CSharp ) )
122+ return functionParams ;
123+
124+ // C++ operators in a class have no class param unlike C#
125+ // but we need to be able to compare them to free operators.
126+ Parameter param = functionParams . Find ( p => p . Kind == ParameterKind . Regular ) ;
127+ if ( param != null )
128+ {
129+ AST . Type type = param . Type . Desugar ( ) ;
130+ type = ( type . GetFinalPointee ( ) ?? type ) . Desugar ( ) ;
131+ Class @class ;
132+ if ( type . TryGetClass ( out @class ) &&
133+ function . Namespace == @class )
134+ functionParams . Remove ( param ) ;
135+ }
136+
137+ return functionParams ;
138+ }
139+
110140 private AST . Type GetFinalType ( Parameter parameter )
111141 {
112142 TypeMap typeMap ;
0 commit comments