{"record":{"id":"bf6b3dc2557ec229","repo":"stride3d/stride","slug":"parameter-index-arg-name-in-method-name-doesn-t-have-a","errorCode":null,"errorMessage":"Parameter {index} ({arg.Name}) in method {Name} doesn't have a default but a previous argument had a default value","messagePattern":"Parameter (.+?) \\((.+?)\\) in method (.+?) doesn't have a default but a previous argument had a default value","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/shaders/Stride.Shaders.Parsers/Parsing/SDSL/AST/ShaderElements.MethodOrMember.cs","lineNumber":435,"sourceCode":"        {\n            p.TypeName.ProcessSymbol(table);\n            var argSym = p.TypeName.Type!;\n            table.DeclaredTypes.TryAdd(argSym.ToString(), argSym);\n            p.Type = argSym;\n            var parameterType = GenerateParameterType(p);\n            ftype.ParameterTypes.Add(new(parameterType, p.Modifiers));\n            var parameterSymbol = new Symbol(new(p.Name, SymbolKind.Variable), parameterType, 0, OwnerType: table.CurrentShader);\n            table.CurrentFrame.Add(p.Name, parameterSymbol);\n            ParameterSymbols.Add(parameterSymbol);\n        }\n\n        Span<int> defaultParameters = stackalloc int[Parameters.Count];\n        var firstDefaultParameter = -1;\n        for (var index = 0; index < Parameters.Count; index++)\n        {\n            var arg = Parameters[index];\n            if (firstDefaultParameter != -1 && arg.DefaultValue == null)\n                throw new InvalidOperationException($\"Parameter {index} ({arg.Name}) in method {Name} doesn't have a default but a previous argument had a default value\");\n            if (arg.DefaultValue != null)\n            {\n                if (firstDefaultParameter == -1)\n                    firstDefaultParameter = index;\n                defaultParameters[index] = arg.DefaultValue.CompileConstantValue(table, context, arg.Type).Id;\n            }\n\n            if (arg.Semantic != null)\n            {\n                // We use OpMemberDecorateString on the function ID\n                // but this is not valid so we'll need to make sure to remove that after the ShaderMixer\n                context.Add(new OpMemberDecorateString(function.Id, index, Specification.Decoration.UserSemantic, arg.Semantic));\n            }\n        }\n\n        var symbol = new Symbol(new(Name, SymbolKind.Method, IsStage: IsStaged), ftype, function.Id, MemberAccessWithImplicitThis: ftype, OwnerType: table.CurrentShader);\n\n        if (firstDefaultParameter != -1)","sourceCodeStart":417,"sourceCodeEnd":453,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/shaders/Stride.Shaders.Parsers/Parsing/SDSL/AST/ShaderElements.MethodOrMember.cs#L417-L453","documentation":"Method parameters with default values must form a contiguous trailing block, as in C#. Once a parameter has a DefaultValue, every following parameter must also have one; otherwise the compiler cannot build valid default-argument elision and throws this InvalidOperationException.","triggerScenarios":"Declaring a shader method like `void Foo(float a = 1, float b)` where a parameter after a defaulted one lacks a default.","commonSituations":"Reordering parameters during refactoring so a defaulted argument precedes a non-defaulted one, or appending a new non-defaulted parameter to a method that already had defaults.","solutions":["Give the offending parameter a default value.","Reorder parameters so all defaulted ones come last.","Remove the default from the earlier parameter."],"exampleFix":"// before\nvoid Foo(float a = 1.0, float b);\n// after\nvoid Foo(float a = 1.0, float b = 2.0);","handlingStrategy":"validation","validationCode":"bool seenDefault = false;\nforeach (var p in method.Parameters)\n{\n    if (seenDefault && p.DefaultValue == null) throw new InvalidOperationException(\"Default parameters must be trailing\");\n    seenDefault |= p.DefaultValue != null;\n}","typeGuard":null,"tryCatchPattern":"try { method.ProcessSymbol(table, context); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"doesn't have a default\"))\n{\n    // supply the missing default or reorder parameters\n}","preventionTips":["Keep all defaulted parameters at the end of the signature.","Run signature checks after refactoring parameter order."],"tags":["shader","sdsl","default-parameters","signature"],"backgroundTag":"missing-required-argument","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}