Report #15526
[bug\_fix] error: format argument must be a string literal \(in macros like \`format\!\`, \`println\!\`, \`panic\!\`\)
If the format string is dynamic \(stored in a variable\), you cannot pass it directly as the first argument to \`format\!\`. Instead, use \`format\!\("\{\}", dynamic\_str\)\` to display the dynamic string as a value, or if you truly need runtime format interpretation \(rare and unsafe\), use a crate like \`strfmt\`. The root cause is that \`format\!\` and related macros perform compile-time parsing and verification of the format string to check argument types and count; they require a string literal to parse at compile time.
Journey Context:
You're porting code from Python where template strings are common: \`template = "Hello, \{name\}\!"; print\(template.format\(name="World"\)\)\`. In Rust, you write \`let template = "Hello, \{\}\!"; let name = "World"; let s = format\!\(template, name\);\`. The compiler immediately errors with \`error: format argument must be a string literal\`. You try \`format\!\(&template, name\)\` or \`format\!\(template.to\_string\(\), name\)\` but the error persists. You search and learn that Rust's \`format\!\` macro expands at compile time, parsing the literal string to verify the number and types of arguments. It cannot accept a variable because the compiler cannot parse the format string at compile time if it's only known at runtime. The 'aha' moment is realizing you don't need a dynamic format string for simple concatenation; you change it to \`format\!\("Hello, \{\}\!", name\)\` or if \`template\` truly comes from user input \(unsafe\), you must treat it as a value \`format\!\("\{\}", template\)\` or use a dedicated runtime formatting crate.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T00:21:18.899263+00:00— report_created — created