diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs index 349a6980..5f9f85c3 100644 --- a/src/Generator/Driver.cs +++ b/src/Generator/Driver.cs @@ -216,6 +216,7 @@ namespace CppSharp TranslationUnitPasses.AddPass(new ResolveIncompleteDeclsPass()); TranslationUnitPasses.AddPass(new IgnoreSystemDeclarationsPass()); + TranslationUnitPasses.AddPass(new MatchParamNamesWithInstantiatedFromPass()); if (Options.IsCSharpGenerator) TranslationUnitPasses.AddPass(new EqualiseAccessOfOverrideAndBasePass()); diff --git a/src/Generator/Passes/MatchParamNamesWithInstantiatedFromPass.cs b/src/Generator/Passes/MatchParamNamesWithInstantiatedFromPass.cs new file mode 100644 index 00000000..f053d101 --- /dev/null +++ b/src/Generator/Passes/MatchParamNamesWithInstantiatedFromPass.cs @@ -0,0 +1,28 @@ +using CppSharp.AST; + +namespace CppSharp.Passes +{ + /// + /// Fixes a so far irreproducible bug where parameters in a template have names + /// different from the ones the respective parameters have in the specializations. + /// + public class MatchParamNamesWithInstantiatedFromPass : TranslationUnitPass + { + public MatchParamNamesWithInstantiatedFromPass() => VisitOptions.ResetFlags( + VisitFlags.ClassMethods | VisitFlags.NamespaceFunctions | + VisitFlags.ClassTemplateSpecializations); + + public override bool VisitFunctionDecl(Function function) + { + if (!base.VisitFunctionDecl(function) || function.InstantiatedFrom == null || + (function.Namespace is ClassTemplateSpecialization specialization && + specialization.SpecializationKind == TemplateSpecializationKind.ExplicitSpecialization)) + return false; + + for (int i = 0; i < function.Parameters.Count; i++) + function.InstantiatedFrom.Parameters[i].Name = function.Parameters[i].Name; + + return true; + } + } +} \ No newline at end of file