rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
97.83k stars 12.66k forks source link

Hard-to-read ICEs when fluent translation uses non-existing variable #128340

Open RalfJung opened 2 months ago

RalfJung commented 2 months ago

When I screw up the variable names in a messages.flt file, I am getting the following error:

thread 'rustc' panicked at compiler/rustc_errors/src/json.rs:412:56:
called `Result::unwrap()` on an `Err` value: Two { primary: One { id: "const_eval_pointer_out_of_bounds", args: FluentArgs([("alloc_size", Number(FluentNumber { value: 4.0, options: FluentNumberOptions { style: Decimal, currency: None, currency_display: Symbol, use_grouping: true, minimum_integer_digits: None, minimum_fraction_digits: None, maximum_fraction_digits: None, minimum_significant_digits: None, maximum_significant_digits: None } })), ("alloc_size_minus_ptr_offset", Number(FluentNumber { value: 4.0, options: FluentNumberOptions { style: Decimal, currency: None, currency_display: Symbol, use_grouping: true, minimum_integer_digits: None, minimum_fraction_digits: None, maximum_fraction_digits: None, minimum_significant_digits: None, maximum_significant_digits: None } })), ("bad_pointer_message", String("out-of-bounds `offset_from`")), ("error_kind", String("const")), ("inbounds_size_abs", Number(FluentNumber { value: 10.0, options: FluentNumberOptions { style: Decimal, currency: None, currency_display: Symbol, use_grouping: true, minimum_integer_digits: None, minimum_fraction_digits: None, maximum_fraction_digits: None, minimum_significant_digits: None, maximum_significant_digits: None } })), ("inbounds_size_is_neg", String("false")), ("instance", String("")), ("pointer", String("alloc30")), ("ptr_offset_is_neg", String("false"))]), kind: PrimaryBundleMissing }, fallback: One { id: "const_eval_pointer_out_of_bounds", args: FluentArgs([("alloc_size", Number(FluentNumber { value: 4.0, options: FluentNumberOptions { style: Decimal, currency: None, currency_display: Symbol, use_grouping: true, minimum_integer_digits: None, minimum_fraction_digits: None, maximum_fraction_digits: None, minimum_significant_digits: None, maximum_significant_digits: None } })), ("alloc_size_minus_ptr_offset", Number(FluentNumber { value: 4.0, options: FluentNumberOptions { style: Decimal, currency: None, currency_display: Symbol, use_grouping: true, minimum_integer_digits: None, minimum_fraction_digits: None, maximum_fraction_digits: None, minimum_significant_digits: None, maximum_significant_digits: None } })), ("bad_pointer_message", String("out-of-bounds `offset_from`")), ("error_kind", String("const")), ("inbounds_size_abs", Number(FluentNumber { value: 10.0, options: FluentNumberOptions { style: Decimal, currency: None, currency_display: Symbol, use_grouping: true, minimum_integer_digits: None, minimum_fraction_digits: None, maximum_fraction_digits: None, minimum_significant_digits: None, maximum_significant_digits: None } })), ("inbounds_size_is_neg", String("false")), ("instance", String("")), ("pointer", String("alloc30")), ("ptr_offset_is_neg", String("false"))]), kind: Fluent { errs: [ResolverError(Reference(Variable { id: "pointer_xx" }))] } } }

Needless to say, this is not exactly a pleasant debugging experience. Would be nice to get a clear message saying what went wrong. :)

In this case, the string const_eval_pointer_out_of_bounds referenced $pointer_xx which does not exist.

veera-sivarajan commented 2 months ago

@rustbot label -needs-triage +C-enhancement +T-compiler +A-translation +D-diagnostic-infra

workingjubilee commented 2 months ago

...Honestly I feel like this should not even ICE.

chenyukang commented 2 months ago

cc #101109 I think #101109 was partially solved.

chenyukang commented 2 months ago

...Honestly I feel like this should not even ICE.

as we discussed, seems we need static analysis in tidy. https://github.com/rust-lang/rust/issues/101109#issuecomment-1243761137

RalfJung commented 2 months ago

Also note that the code that caused the ICE for me doesn't even use diagnostic types, it passes arguments to fluent manually. Even the suggested static analysis would not catch that.