From 333388fd3c9fa03362a3c2a2675ab521c4ddb1ff Mon Sep 17 00:00:00 2001 From: Matthew Jasper Date: Fri, 8 Sep 2023 10:14:36 +0000 Subject: Move let expression checking to parsing There was an incomplete version of the check in parsing and a second version in AST validation. This meant that some, but not all, invalid uses were allowed inside macros/disabled cfgs. It also means that later passes have a hard time knowing when the let expression is in a valid location, sometimes causing ICEs. - Add a field to ExprKind::Let in AST/HIR to mark whether it's in a valid location. - Suppress later errors and MIR construction for invalid let expressions. --- compiler/rustc_parse/src/errors.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'compiler/rustc_parse/src/errors.rs') diff --git a/compiler/rustc_parse/src/errors.rs b/compiler/rustc_parse/src/errors.rs index e0b1e3678e4..10b659d811a 100644 --- a/compiler/rustc_parse/src/errors.rs +++ b/compiler/rustc_parse/src/errors.rs @@ -10,7 +10,7 @@ use rustc_span::symbol::Ident; use rustc_span::{Span, Symbol}; use crate::fluent_generated as fluent; -use crate::parser::TokenDescription; +use crate::parser::{ForbiddenLetReason, TokenDescription}; #[derive(Diagnostic)] #[diag(parse_maybe_report_ambiguous_plus)] @@ -395,6 +395,8 @@ pub(crate) struct IfExpressionMissingCondition { pub(crate) struct ExpectedExpressionFoundLet { #[primary_span] pub span: Span, + #[subdiagnostic] + pub reason: ForbiddenLetReason, } #[derive(Diagnostic)] -- cgit 1.4.1-3-g733a5