Skip to content

Commit ae9eede

Browse files
committed
Fixed a crash when a constructor takes a template or specialisation.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 6dec97f commit ae9eede

File tree

4 files changed

+36
-17
lines changed

4 files changed

+36
-17
lines changed

src/AST/ClassExtensions.cs

+22
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,28 @@ private static IEnumerable<Class> GetSpecializedClassesOf(this Class dependentCl
178178
c => c.Name == dependentClass.Name)).ToList();
179179
}
180180

181+
public static Class GetInterface(this Class @class)
182+
{
183+
var specialization = @class as ClassTemplateSpecialization;
184+
Class @interface = null;
185+
if (specialization == null)
186+
{
187+
@interface = @class.Namespace.Classes.Find(
188+
c => c.OriginalClass == @class && c.IsInterface);
189+
}
190+
else
191+
{
192+
Class template = specialization.TemplatedDecl.TemplatedClass;
193+
Class templatedInterface = @class.Namespace.Classes.Find(
194+
c => c.OriginalClass == template && c.IsInterface);
195+
if (templatedInterface != null)
196+
@interface = templatedInterface.Specializations.FirstOrDefault(
197+
s => s.OriginalClass == specialization && s.IsInterface);
198+
}
199+
200+
return @interface;
201+
}
202+
181203
public static bool HasDependentValueFieldInLayout(this Class @class)
182204
{
183205
if (@class.Fields.Any(f => IsValueDependent(f.Type)))

src/Generator/Generators/CSharp/CSharpSources.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2595,7 +2595,7 @@ private void GenerateOperator(Method method, QualifiedType returnType)
25952595
Class paramClass;
25962596
Class @interface = null;
25972597
if (paramType.TryGetClass(out paramClass))
2598-
@interface = paramClass.Namespace.Classes.Find(c => c.OriginalClass == paramClass);
2598+
@interface = paramClass.GetInterface();
25992599

26002600
var paramName = string.Format("{0}{1}",
26012601
method.Parameters[0].Type.IsPrimitiveTypeConvertibleToRef() ?

src/Generator/Passes/ParamTypeToInterfacePass.cs

+1-16
Original file line numberDiff line numberDiff line change
@@ -59,22 +59,7 @@ private static void ChangeToInterfaceType(ref QualifiedType type)
5959
if (!finalType.TryGetClass(out @class))
6060
return;
6161

62-
var specialization = @class as ClassTemplateSpecialization;
63-
Class @interface = null;
64-
if (specialization == null)
65-
{
66-
@interface = @class.Namespace.Classes.Find(
67-
c => c.OriginalClass == @class && c.IsInterface);
68-
}
69-
else
70-
{
71-
Class template = specialization.TemplatedDecl.TemplatedClass;
72-
Class templatedInterface = @class.Namespace.Classes.Find(
73-
c => c.OriginalClass == template && c.IsInterface);
74-
if (templatedInterface != null)
75-
@interface = templatedInterface.Specializations.FirstOrDefault(
76-
s => s.OriginalClass == specialization);
77-
}
62+
Class @interface = @class.GetInterface();
7863
if (@interface == null)
7964
return;
8065

tests/CSharp/CSharpTemplates.h

+12
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ class DLL_API DependentValueFields : public Base<T>
137137
T field;
138138
};
139139
DependentValueFields();
140+
DependentValueFields(IndependentFields<T> i);
140141
~DependentValueFields();
141142
DependentValueFields& returnInjectedClass();
142143
DependentValueFields returnValue();
@@ -163,6 +164,11 @@ DependentValueFields<T>::~DependentValueFields()
163164
{
164165
}
165166

167+
template <typename T>
168+
DependentValueFields<T>::DependentValueFields(IndependentFields<T> i)
169+
{
170+
}
171+
166172
template <typename T>
167173
T DependentValueFields<T>::getDependentValue()
168174
{
@@ -404,6 +410,7 @@ class VirtualTemplate
404410
{
405411
public:
406412
VirtualTemplate();
413+
VirtualTemplate(IndependentFields<int> i);
407414
VirtualTemplate(OptionalTemplateArgs<T> optionalTemplateArgs);
408415
virtual ~VirtualTemplate();
409416
virtual int function();
@@ -415,6 +422,11 @@ VirtualTemplate<T>::VirtualTemplate()
415422
{
416423
}
417424

425+
template <typename T>
426+
VirtualTemplate<T>::VirtualTemplate(IndependentFields<int> i)
427+
{
428+
}
429+
418430
template <typename T>
419431
VirtualTemplate<T>::VirtualTemplate(OptionalTemplateArgs<T> optionalTemplateArgs)
420432
{

0 commit comments

Comments
 (0)