@@ -30,16 +30,27 @@ impl<'a> AnalyzeContext<'a> {
3030 Ok ( ( ) )
3131 }
3232
33- fn analyze_concurrent_statement (
33+ pub fn define_labels_for_concurrent_part (
3434 & self ,
3535 scope : & Scope < ' a > ,
36- statement : & mut LabeledConcurrentStatement ,
36+ statements : & mut [ LabeledConcurrentStatement ] ,
3737 diagnostics : & mut dyn DiagnosticHandler ,
3838 ) -> FatalResult {
39- if let Some ( ref mut label) = statement. label {
40- scope. add ( label. define ( self . arena , AnyEntKind :: Label ) , diagnostics) ;
39+ for statement in statements. iter_mut ( ) {
40+ if let Some ( ref mut label) = statement. label {
41+ scope. add ( label. define ( self . arena , AnyEntKind :: Label ) , diagnostics) ;
42+ }
4143 }
4244
45+ Ok ( ( ) )
46+ }
47+
48+ fn analyze_concurrent_statement (
49+ & self ,
50+ scope : & Scope < ' a > ,
51+ statement : & mut LabeledConcurrentStatement ,
52+ diagnostics : & mut dyn DiagnosticHandler ,
53+ ) -> FatalResult {
4354 match statement. statement {
4455 ConcurrentStatement :: Block ( ref mut block) => {
4556 if let Some ( ref mut guard_condition) = block. guard_condition {
@@ -58,6 +69,8 @@ impl<'a> AnalyzeContext<'a> {
5869 if let Some ( ref mut list) = block. header . port_map {
5970 self . analyze_assoc_elems ( scope, list, diagnostics) ?;
6071 }
72+
73+ self . define_labels_for_concurrent_part ( scope, & mut block. statements , diagnostics) ?;
6174 self . analyze_declarative_part ( & nested, & mut block. decl , diagnostics) ?;
6275 self . analyze_concurrent_part ( & nested, & mut block. statements , diagnostics) ?;
6376 }
@@ -77,6 +90,7 @@ impl<'a> AnalyzeContext<'a> {
7790 }
7891 }
7992 let nested = scope. nested ( ) ;
93+ self . define_labels_for_sequential_part ( scope, statements, diagnostics) ?;
8094 self . analyze_declarative_part ( & nested, decl, diagnostics) ?;
8195 self . analyze_sequential_part (
8296 & nested,
@@ -175,6 +189,10 @@ impl<'a> AnalyzeContext<'a> {
175189 if let Some ( label) = alternative_label {
176190 scope. add ( label. define ( self . arena , AnyEntKind :: Label ) , diagnostics) ;
177191 }
192+
193+ // Pre-declare labels
194+ self . define_labels_for_concurrent_part ( scope, statements, diagnostics) ?;
195+
178196 if let Some ( ref mut decl) = decl {
179197 self . analyze_declarative_part ( scope, decl, diagnostics) ?;
180198 }
0 commit comments