{"record":{"id":"c6e93893806e5c5d","repo":"rust-lang/rust","slug":"unexpected-token-after-identifier","errorCode":null,"errorMessage":"unexpected token after identifier","messagePattern":"unexpected token after identifier","errorType":"validation","errorClass":"syn::Error","httpStatus":null,"severity":"error","filePath":"library/compiler-builtins/crates/libm-macros/src/enums.rs","lineNumber":29,"sourceCode":"pub fn function_enum(\n    mut item: ItemEnum,\n    attributes: pm2::TokenStream,\n) -> syn::Result<pm2::TokenStream> {\n    expect_empty_enum(&item)?;\n    let attr_span = attributes.span();\n    let mut attr = attributes.into_iter();\n\n    // Attribute should be the identifier of the `BaseName` enum.\n    let Some(tt) = attr.next() else {\n        return Err(syn::Error::new(attr_span, \"expected one attribute\"));\n    };\n\n    let pm2::TokenTree::Ident(base_enum) = tt else {\n        return Err(syn::Error::new(tt.span(), \"expected an identifier\"));\n    };\n\n    if let Some(tt) = attr.next() {\n        return Err(syn::Error::new(\n            tt.span(),\n            \"unexpected token after identifier\",\n        ));\n    }\n\n    let enum_name = &item.ident;\n    let mut as_str_arms = Vec::new();\n    let mut from_str_arms = Vec::new();\n    let mut base_arms = Vec::new();\n\n    for func in ALL_OPERATIONS.iter() {\n        let fn_name = func.name;\n        let ident = Ident::new(&fn_name.to_upper_camel_case(), Span::call_site());\n        let bname_ident = Ident::new(&base_name(fn_name).to_upper_camel_case(), Span::call_site());\n\n        // Match arm for `fn as_str(self)` matcher\n        as_str_arms.push(quote! { Self::#ident => #fn_name });\n        from_str_arms.push(quote! { #fn_name => Self::#ident });","sourceCodeStart":11,"sourceCodeEnd":47,"githubUrl":"https://github.com/rust-lang/rust/blob/7088e4b63a9516ebfbfe2ab2d999cf01a528ac14/library/compiler-builtins/crates/libm-macros/src/enums.rs#L11-L47","documentation":"Thrown by `#[function_enum]` (enums.rs:29) when more than one token follows the base-name identifier. The macro accepts exactly one attribute token; any extra tokens (commas, extra idents, generics) are rejected.","triggerScenarios":"Writing `#[function_enum(BaseName, Extra)]`, `#[function_enum(BaseName<>)]`, or any form with tokens after the identifier.","commonSituations":"Assuming the macro accepts a list; copy-pasting leftover tokens from another attribute.","solutions":["Provide only the single base-name identifier.","Remove any trailing punctuation or extra arguments."],"exampleFix":"// before\n#[function_enum(BaseName, Extra)]\nenum Func {}\n\n// after\n#[function_enum(BaseName)]\nenum Func {}","handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["function_enum takes exactly one identifier attribute — no lists, no generics.","Keep the attribute minimal."],"tags":["proc-macro","libm","function-enum","validation"],"backgroundTag":null,"analyzedSha":"7088e4b63a9516ebfbfe2ab2d999cf01a528ac14","analyzedAt":"2026-08-10T14:17:03.603Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}