{"record":{"id":"d2b32b1907983d76","repo":"bevyengine/bevy","slug":"invalid-key-override-must-be-either-default-or","errorCode":null,"errorMessage":"Invalid key override. Must be either `default` or a valid Rust expression of the correct key type","messagePattern":"Invalid key override\\. Must be either `default` or a valid Rust expression of the correct key type","errorType":"validation","errorClass":"syn::Error","httpStatus":null,"severity":"error","filePath":"crates/bevy_render/macros/src/specializer.rs","lineNumber":80,"sourceCode":"}\n\nconst KEY_ERROR_MSG: &str = \"Invalid key override. Must be either `default` or a valid Rust expression of the correct key type\";\n\nimpl Parse for Key {\n    fn parse(input: ParseStream) -> syn::Result<Self> {\n        if let Ok(ident) = input.parse::<Ident>() {\n            if ident == KEY_DEFAULT_IDENT {\n                Ok(Key::Default)\n            } else {\n                Err(syn::Error::new_spanned(ident, KEY_ERROR_MSG))\n            }\n        } else {\n            input\n                .parse::<Expr>()\n                .map(Box::new)\n                .map(Key::Custom)\n                .map_err(|mut err| {\n                    err.extend(syn::Error::new(err.span(), KEY_ERROR_MSG));\n                    err\n                })\n        }\n    }\n}\n\n#[derive(Clone)]\nstruct FieldInfo {\n    ty: Type,\n    member: Member,\n    key: Key,\n}\n\nimpl FieldInfo {\n    fn key_ty(&self, specialize_path: &Path, target_path: &Path) -> Option<Type> {\n        let ty = &self.ty;\n        matches!(self.key, Key::Whole | Key::Index(_))\n            .then_some(parse_quote!(<#ty as #specialize_path::Specializer<#target_path>>::Key))","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/bevyengine/bevy/blob/396ca727080776bd313bb892423b7d94e03b81b4/crates/bevy_render/macros/src/specializer.rs#L62-L98","documentation":"Bevy's `Specializer` derive lets fields override how they contribute to a specialization key with `#[key(...)]`. The payload must be either the single lowercase identifier `default` or a syntactically valid Rust expression of the field's key type. When the payload parses as an identifier that is not `default`, or fails to parse as an expression, the derive emits this KEY_ERROR_MSG.","triggerScenarios":"`#[key(Default)]` (capital D parses as an identifier that is not `default`), `#[key()]` or any leftover fragment where the expression parser also fails.","commonSituations":"Typing `Default` out of habit instead of `default`; leaving a half-edited expression like `#[key(Mode::A +)]` after refactoring a key enum.","solutions":["Use the exact lowercase identifier: `#[key(default)]`","Otherwise supply one complete, valid expression of the field's key type, e.g. `#[key(Mode::Alpha as u8)]`","Check for stray characters, unmatched parens or duplicated tokens inside the attribute"],"exampleFix":"// before\n#[key(Default)]\nmode: Mode,\n\n// after\n#[key(default)]\nmode: Mode,","handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use the exact identifier `default` (lowercase) in #[key(...)]","Keep key expressions complete and compilable on one line","Run cargo check after every key-attribute edit; these are compile-time errors"],"tags":["bevy","specializer","proc-macro","compile-time"],"backgroundTag":"invalid-macro-attribute-value","analyzedSha":"396ca727080776bd313bb892423b7d94e03b81b4","analyzedAt":"2026-08-20T16:12:39.808Z","contentChangedAt":"2026-08-20T16:12:39.808Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}