Skip to content

Commit 831cea9

Browse files
committed
Fix the generated C# when a dependent param has a default value
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 9cad946 commit 831cea9

File tree

3 files changed

+23
-0
lines changed

3 files changed

+23
-0
lines changed

src/Generator/Passes/HandleDefaultParamValuesPass.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@ public override bool VisitFunctionDecl(Function function)
4343
var overloadIndices = new List<int>(function.Parameters.Count);
4444
foreach (var parameter in function.Parameters.Where(p => p.DefaultArgument != null))
4545
{
46+
Type type = parameter.Type.Desugar(resolveTemplateSubstitution: false);
47+
type = (type.GetFinalPointee() ?? type).Desugar(
48+
resolveTemplateSubstitution: false);
49+
if (type is TemplateParameterSubstitutionType)
50+
{
51+
parameter.DefaultArgument = null;
52+
continue;
53+
}
54+
4655
var result = parameter.DefaultArgument.String;
4756
if (PrintExpression(function, parameter.Type,
4857
parameter.OriginalDefaultArgument, ref result) == null)

src/Generator/Passes/SpecializationMethodsWithDependentPointersPass.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,14 @@ private static Method GetExtensionMethodForDependentPointer(Method specializedMe
100100
foreach (var parameter in extensionMethod.Parameters)
101101
{
102102
var qualType = parameter.QualifiedType;
103+
if (parameter.DefaultArgument != null)
104+
{
105+
Type type = qualType.Type.Desugar(resolveTemplateSubstitution: false);
106+
type = (type.GetFinalPointee() ?? type).Desugar(
107+
resolveTemplateSubstitution: false);
108+
if (type is TemplateParameterSubstitutionType)
109+
parameter.DefaultArgument = null;
110+
}
103111
RemoveTemplateSubstitution(ref qualType);
104112
parameter.QualifiedType = qualType;
105113
}

tests/CSharp/CSharpTemplates.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class DLL_API IndependentFields : public T1
4242
T getDependent(const T& t);
4343
const T* propertyReturnDependentPointer();
4444
static T staticDependent(const T& t);
45+
void hasDefaultDependentParam(T* ptr, const T& refT = T());
4546
template <typename AdditionalDependentType>
4647
void usesAdditionalDependentType(AdditionalDependentType additionalDependentType);
4748
static const int independentConst;
@@ -118,6 +119,11 @@ T IndependentFields<T>::staticDependent(const T& t)
118119
return t;
119120
}
120121

122+
template <typename T>
123+
void IndependentFields<T>::hasDefaultDependentParam(T* ptr, const T& refT)
124+
{
125+
}
126+
121127
template <typename T>
122128
int IndependentFields<T>::getIndependent()
123129
{

0 commit comments

Comments
 (0)