Skip to content

Commit 380d064

Browse files
committed
Generate valid C# for overloads with types nested in templates
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent eb6a90d commit 380d064

File tree

3 files changed

+37
-7
lines changed

3 files changed

+37
-7
lines changed

src/Generator/Passes/CheckDuplicatedNamesPass.cs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ public bool Equals(Parameter x, Parameter y)
113113
if (left.Equals(right))
114114
return true;
115115

116+
if (CheckForSpecializations(left, right))
117+
return true;
118+
116119
// TODO: some target languages might make a difference between values and pointers
117120
Type leftPointee = left.GetPointee();
118121
Type rightPointee = right.GetPointee();
@@ -131,14 +134,23 @@ public bool Equals(Parameter x, Parameter y)
131134

132135
private static bool CheckForSpecializations(Type leftPointee, Type rightPointee)
133136
{
134-
ClassTemplateSpecialization leftSpecialization;
135-
ClassTemplateSpecialization rightSpecialization;
136-
return leftPointee.TryGetDeclaration(out leftSpecialization) &&
137-
rightPointee.TryGetDeclaration(out rightSpecialization) &&
137+
Class leftClass;
138+
Class rightClass;
139+
if (!leftPointee.TryGetDeclaration(out leftClass) ||
140+
!rightPointee.TryGetDeclaration(out rightClass))
141+
return false;
142+
143+
var leftSpecialization = leftClass as ClassTemplateSpecialization ??
144+
leftClass.Namespace as ClassTemplateSpecialization;
145+
var rightSpecialization = rightClass as ClassTemplateSpecialization ??
146+
rightClass.Namespace as ClassTemplateSpecialization;
147+
148+
return leftSpecialization != null && rightSpecialization != null &&
138149
leftSpecialization.TemplatedDecl.TemplatedDecl.Equals(
139150
rightSpecialization.TemplatedDecl.TemplatedDecl) &&
140151
leftSpecialization.Arguments.SequenceEqual(
141-
rightSpecialization.Arguments, TemplateArgumentComparer.Instance);
152+
rightSpecialization.Arguments, TemplateArgumentComparer.Instance) &&
153+
leftClass.OriginalName == rightClass.OriginalName;
142154
}
143155

144156
public int GetHashCode(Parameter obj)

tests/CSharp/CSharpTemplates.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,9 @@ void TemplateSpecializer::completeSpecializationInParameter(TwoTemplateArgs<int
122122
TwoTemplateArgs<int *, int> p2,
123123
TwoTemplateArgs<int *, float> p3,
124124
TwoTemplateArgs<const char *, int> p4,
125-
TwoTemplateArgs<QString, int> p5)
125+
TwoTemplateArgs<QString, int> p5,
126+
TwoTemplateArgs<const char *, int>::iterator p6,
127+
TwoTemplateArgs<QString, int>::iterator p7)
126128
{
127129
}
128130

tests/CSharp/CSharpTemplates.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,12 +273,24 @@ template <typename K, typename V>
273273
class TwoTemplateArgs
274274
{
275275
public:
276+
class iterator
277+
{
278+
public:
279+
iterator() {}
280+
~iterator() {}
281+
};
282+
void takeDependentPtrToFirstTemplateArg(iterator i, const K& k);
276283
void takeDependentPtrToSecondTemplateArg(const V& v);
277284
private:
278285
K key;
279286
V value;
280287
};
281288

289+
template <typename K, typename V>
290+
void TwoTemplateArgs<K, V>::takeDependentPtrToFirstTemplateArg(iterator i, const K& k)
291+
{
292+
}
293+
282294
template <typename K, typename V>
283295
void TwoTemplateArgs<K, V>::takeDependentPtrToSecondTemplateArg(const V& v)
284296
{
@@ -547,7 +559,9 @@ class DLL_API TemplateSpecializer
547559
TwoTemplateArgs<int*, int> p2,
548560
TwoTemplateArgs<int*, float> p3,
549561
TwoTemplateArgs<const char*, int> p4,
550-
TwoTemplateArgs<QString, int> p5);
562+
TwoTemplateArgs<QString, int> p5,
563+
TwoTemplateArgs<const char*, int>::iterator p6,
564+
TwoTemplateArgs<QString, int>::iterator p7);
551565
VirtualTemplate<void> returnSpecializedWithVoid();
552566
private:
553567
IndependentFields<int> independentFields;
@@ -754,6 +768,8 @@ template class DLL_API TemplateWithIndexer<float>;
754768
template class DLL_API TemplateWithIndexer<const char*>;
755769
template class DLL_API TemplateDerivedFromRegularDynamic<RegularDynamic>;
756770
template class DLL_API HasCtorWithMappedToEnum<TestFlag>;
771+
template class DLL_API TwoTemplateArgs<const char*, int>;
772+
template class DLL_API TwoTemplateArgs<QString, int>;
757773

758774
class TestForwardedClassInAnotherUnit;
759775

0 commit comments

Comments
 (0)