Browse Source

Generate valid C# for default params in specialisations

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1632/head
Dimitar Dobrev 4 years ago
parent
commit
4d4505e334
  1. 2
      src/Generator/Passes/HandleDefaultParamValuesPass.cs
  2. 8
      src/Generator/Passes/SpecializationMethodsWithDependentPointersPass.cs
  3. 10
      tests/CSharp/CSharpTemplates.h

2
src/Generator/Passes/HandleDefaultParamValuesPass.cs

@ -12,7 +12,7 @@ namespace CppSharp.Passes
new Dictionary<DeclarationContext, List<Function>>(); new Dictionary<DeclarationContext, List<Function>>();
public HandleDefaultParamValuesPass() public HandleDefaultParamValuesPass()
=> VisitOptions.ResetFlags(VisitFlags.ClassMethods); => VisitOptions.ResetFlags(VisitFlags.ClassMethods | VisitFlags.ClassTemplateSpecializations);
public override bool VisitTranslationUnit(TranslationUnit unit) public override bool VisitTranslationUnit(TranslationUnit unit)
{ {

8
src/Generator/Passes/SpecializationMethodsWithDependentPointersPass.cs

@ -88,14 +88,6 @@ namespace CppSharp.Passes
foreach (var parameter in extensionMethod.Parameters) foreach (var parameter in extensionMethod.Parameters)
{ {
var qualType = parameter.QualifiedType; var qualType = parameter.QualifiedType;
if (parameter.DefaultArgument != null)
{
Type type = qualType.Type.Desugar(resolveTemplateSubstitution: false);
type = (type.GetFinalPointee() ?? type).Desugar(
resolveTemplateSubstitution: false);
if (type is TemplateParameterSubstitutionType)
parameter.DefaultArgument = null;
}
RemoveTemplateSubstitution(ref qualType); RemoveTemplateSubstitution(ref qualType);
parameter.QualifiedType = qualType; parameter.QualifiedType = qualType;
} }

10
tests/CSharp/CSharpTemplates.h

@ -119,6 +119,12 @@ T IndependentFields<T>::staticDependent(const T& t)
return t; return t;
} }
template <typename T>
template <typename AdditionalDependentType>
void IndependentFields<T>::usesAdditionalDependentType(AdditionalDependentType additionalDependentType)
{
}
template <typename T> template <typename T>
float IndependentFields<T>::getIndependent() float IndependentFields<T>::getIndependent()
{ {
@ -176,7 +182,7 @@ private:
}; };
template <typename T> template <typename T>
DependentValueFields<T>::DependentValueFields() DependentValueFields<T>::DependentValueFields() : unionField(0), dependentFunctionPointerField(0)
{ {
} }
@ -186,7 +192,7 @@ DependentValueFields<T>::~DependentValueFields()
} }
template <typename T> template <typename T>
DependentValueFields<T>::DependentValueFields(IndependentFields<T> i) DependentValueFields<T>::DependentValueFields(IndependentFields<T> i) : DependentValueFields()
{ {
} }

Loading…
Cancel
Save