@@ -126,6 +126,7 @@ fn parse_if_statement_known_keyword(
126126 } ,
127127 End => {
128128 stream. expect_kind( If ) ?;
129+ stream. pop_if_kind( Identifier ) ?;
129130 conditionals. push( conditional) ;
130131 break ;
131132 }
@@ -1238,6 +1239,33 @@ end if;
12381239 )
12391240 ) ;
12401241 }
1242+ #[ test]
1243+ fn parse_labeled_if_statement ( ) {
1244+ let ( code, statement) = parse (
1245+ "\
1246+ mylabel: if cond = true then
1247+ foo(1,2);
1248+ x := 1;
1249+ end if mylabel;
1250+ " ,
1251+ ) ;
1252+ assert_eq ! (
1253+ statement,
1254+ with_label(
1255+ Some ( code. s1( "mylabel" ) . ident( ) ) ,
1256+ SequentialStatement :: If ( IfStatement {
1257+ conditionals: vec![ Conditional {
1258+ condition: code. s1( "cond = true" ) . expr( ) ,
1259+ item: vec![
1260+ code. s1( "foo(1,2);" ) . sequential_statement( ) ,
1261+ code. s1( "x := 1;" ) . sequential_statement( )
1262+ ]
1263+ } ] ,
1264+ else_item: None
1265+ } )
1266+ )
1267+ ) ;
1268+ }
12411269
12421270 #[ test]
12431271 fn parse_if_else_statement ( ) {
@@ -1265,6 +1293,31 @@ end if;
12651293 ) ;
12661294 }
12671295
1296+ #[ test]
1297+ fn parse_labeled_if_else_statement ( ) {
1298+ let ( code, statement) = parse (
1299+ "\
1300+ mylabel: if cond = true then
1301+ foo(1,2);
1302+ else
1303+ x := 1;
1304+ end if mylabel;
1305+ " ,
1306+ ) ;
1307+ assert_eq ! (
1308+ statement,
1309+ with_label(
1310+ Some ( code. s1( "mylabel" ) . ident( ) ) ,
1311+ SequentialStatement :: If ( IfStatement {
1312+ conditionals: vec![ Conditional {
1313+ condition: code. s1( "cond = true" ) . expr( ) ,
1314+ item: vec![ code. s1( "foo(1,2);" ) . sequential_statement( ) ]
1315+ } ] ,
1316+ else_item: Some ( vec![ code. s1( "x := 1;" ) . sequential_statement( ) ] )
1317+ } )
1318+ )
1319+ ) ;
1320+ }
12681321 #[ test]
12691322 fn parse_if_elsif_else_statement ( ) {
12701323 let ( code, statement) = parse (
@@ -1298,7 +1351,39 @@ end if;
12981351 )
12991352 ) ;
13001353 }
1301-
1354+ #[ test]
1355+ fn parse_labeled_if_elsif_else_statement ( ) {
1356+ let ( code, statement) = parse (
1357+ "\
1358+ mylabel: if cond = true then
1359+ foo(1,2);
1360+ elsif cond2 = false then
1361+ y := 2;
1362+ else
1363+ x := 1;
1364+ end if mylabel;
1365+ " ,
1366+ ) ;
1367+ assert_eq ! (
1368+ statement,
1369+ with_label(
1370+ Some ( code. s1( "mylabel" ) . ident( ) ) ,
1371+ SequentialStatement :: If ( IfStatement {
1372+ conditionals: vec![
1373+ Conditional {
1374+ condition: code. s1( "cond = true" ) . expr( ) ,
1375+ item: vec![ code. s1( "foo(1,2);" ) . sequential_statement( ) ]
1376+ } ,
1377+ Conditional {
1378+ condition: code. s1( "cond2 = false" ) . expr( ) ,
1379+ item: vec![ code. s1( "y := 2;" ) . sequential_statement( ) ]
1380+ }
1381+ ] ,
1382+ else_item: Some ( vec![ code. s1( "x := 1;" ) . sequential_statement( ) ] )
1383+ } )
1384+ )
1385+ ) ;
1386+ }
13021387 #[ test]
13031388 fn parse_case_statement ( ) {
13041389 let ( code, statement) = parse (
0 commit comments