Skip to content

Commit d38b6c0

Browse files
authored
Merge pull request #2942 from koenmeersman/masatake-ada-generic-in-package
Ada : Improve formal parameter tags in generic function/procedure
2 parents 7ca2ad5 + 9b48727 commit d38b6c0

File tree

5 files changed

+104
-5
lines changed

5 files changed

+104
-5
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
--sort=no
2+
--kinds-Ada=+{formal}

Units/parser-ada.r/ada-generic-in-package.d/expected.tags-e

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,39 @@ package My_Package isMy_Package/s2,48
66
type Num is digits <>;Num5,81
77
type Missing_Tag is recordMissing_Tag/t10,208
88
Num : Integer;Num11,237
9+
10+
input_1.adb,1666
11+
procedure Input_1 isInput_1/p1,0
12+
procedure Generic_Reverse_Array (X : in out Array_T);Generic_Reverse_Array/p9,200
13+
type T is private;T4,32
14+
type Index is range <>;Index5,55
15+
type Array_T is array (Index range <>) of T;Array_T6,83
16+
with function Img (A, B: T) return boolean;Img8,152
17+
procedure Generic_Reverse_Array (X : in out Array_T) isGeneric_Reverse_Array/p11,257
18+
Tmp : T;Tmp15,389
19+
X_Left : T renames X (I);X_Left16,403
20+
X_Right : T renames X (X'Last + X'First - I);X_Right17,431
21+
type Color is (None, Black, Red, Green, Blue, White);Color/t26,603
22+
type Color is (None, Black, Red, Green, Blue, White);None26,603
23+
type Color is (None, Black, Red, Green, Blue, White);Black26,603
24+
type Color is (None, Black, Red, Green, Blue, White);Red26,603
25+
type Color is (None, Black, Red, Green, Blue, White);Green26,603
26+
type Color is (None, Black, Red, Green, Blue, White);Blue26,603
27+
type Color is (None, Black, Red, Green, Blue, White);White26,603
28+
type Color_Array is array (Integer range <>) of Color;Color_Array/t27,659
29+
procedure Reverse_Color_Array is new Generic_Reverse_ArrayReverse_Color_Array/p28,716
30+
type Shape is (None, Circle, Triangle, Square);Shape/t31,859
31+
type Shape is (None, Circle, Triangle, Square);None31,859
32+
type Shape is (None, Circle, Triangle, Square);Circle31,859
33+
type Shape is (None, Circle, Triangle, Square);Triangle31,859
34+
type Shape is (None, Circle, Triangle, Square);Square31,859
35+
type Shape_Array is array (Integer range <>) of Shape;Shape_Array/t32,909
36+
procedure Reverse_Shape_Array is new Generic_Reverse_ArrayReverse_Shape_Array/p33,966
37+
38+
input_2.ads,301
39+
package input_2 isinput_2/s1,0
40+
type Generator is null record;Generator/t3,20
41+
type Unsigned is mod <>;Unsigned5,63
42+
type Real is digits <>;Real6,92
43+
with function Random (G: Generator) return Unsigned is <>;Random7,120
44+
function Random (G: Generator) return Real;Random/f8,183
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
procedure Input_1 is
2+
3+
generic
4+
type T is private;
5+
type Index is range <>;
6+
type Array_T is array (Index range <>) of T;
7+
Null_Value : T;
8+
with function Img (A, B: T) return boolean;
9+
procedure Generic_Reverse_Array (X : in out Array_T);
10+
11+
procedure Generic_Reverse_Array (X : in out Array_T) is
12+
begin
13+
for I in X'First .. (X'Last + X'First) / 2 loop
14+
declare
15+
Tmp : T;
16+
X_Left : T renames X (I);
17+
X_Right : T renames X (X'Last + X'First - I);
18+
begin
19+
Tmp := X_Left;
20+
X_Left := X_Right;
21+
X_Right := Tmp;
22+
end;
23+
end loop;
24+
end Generic_Reverse_Array;
25+
26+
type Color is (None, Black, Red, Green, Blue, White);
27+
type Color_Array is array (Integer range <>) of Color;
28+
procedure Reverse_Color_Array is new Generic_Reverse_Array
29+
(T => Color, Index => Integer, Array_T => Color_Array, Null_Value => None);
30+
31+
type Shape is (None, Circle, Triangle, Square);
32+
type Shape_Array is array (Integer range <>) of Shape;
33+
procedure Reverse_Shape_Array is new Generic_Reverse_Array
34+
(T => Shape, Index => Integer, Array_T => Shape_Array, Null_Value => None);
35+
36+
begin
37+
null;
38+
end Input_1;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package input_2 is
2+
3+
type Generator is null record;
4+
generic
5+
type Unsigned is mod <>;
6+
type Real is digits <>;
7+
with function Random (G: Generator) return Unsigned is <>;
8+
function Random (G: Generator) return Real;
9+
10+
end input_2;

parsers/ada.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1589,11 +1589,14 @@ static adaTokenInfo *adaParse(adaParseMode mode, adaTokenInfo *parent)
15891589
continue;
15901590
}
15911591
else if(adaKeywordCmp(ADA_KEYWORD_PRAGMA) ||
1592-
adaKeywordCmp(ADA_KEYWORD_WITH) ||
1592+
((mode != ADA_GENERIC) && adaKeywordCmp(ADA_KEYWORD_WITH)) ||
15931593
adaKeywordCmp(ADA_KEYWORD_USE))
15941594
{
15951595
/* set the token to NULL so we accidentally don't pick up something
1596-
* from earlier */
1596+
* from earlier
1597+
* Do not skip lines having 'with' when 'mode == ADA_GENERIC'
1598+
* this to intercept 'formal subprograms' of a generic declaration.
1599+
* see: ARM 12.1(22) */
15971600
skipPast(";");
15981601
continue;
15991602
}
@@ -1693,11 +1696,23 @@ static adaTokenInfo *adaParse(adaParseMode mode, adaTokenInfo *parent)
16931696
if(adaKeywordCmp(ADA_KEYWORD_PACKAGE))
16941697
{
16951698
token = adaParseBlock(parent, ADA_KIND_PACKAGE);
1699+
1700+
/* The above 'adaParseBlock' has read the end of a 'generic package declaration',
1701+
* reset the mode back to the original mode.
1702+
* see: ARM 12.1(24) */
1703+
Assert (parent);
1704+
mode = (parent->parent)? ADA_DECLARATIONS: ADA_ROOT;
16961705
}
16971706
else if(adaKeywordCmp(ADA_KEYWORD_PROCEDURE) ||
16981707
adaKeywordCmp(ADA_KEYWORD_FUNCTION))
16991708
{
17001709
token = adaParseSubprogram(parent, ADA_KIND_SUBPROGRAM);
1710+
1711+
/* The above 'adaParseBlock' as read the end of a 'generic function/procedure declaration',
1712+
* reset the mode back to the original mode.
1713+
* see: ARM 12.1(21/22) */
1714+
Assert (parent);
1715+
mode = (parent->parent)? ADA_DECLARATIONS: ADA_ROOT;
17011716
}
17021717
else if(adaKeywordCmp(ADA_KEYWORD_TASK))
17031718
{
@@ -1770,10 +1785,8 @@ static adaTokenInfo *adaParse(adaParseMode mode, adaTokenInfo *parent)
17701785
if(token != NULL)
17711786
{
17721787
/* if any generic params have been gathered, attach them to
1773-
* token, and set the mode back to ADA_ROOT or ADA_DECLARATIONS */
1788+
* token. */
17741789
appendAdaTokenList(token, &genericParamsRoot.children);
1775-
Assert (parent);
1776-
mode = (parent->parent)? ADA_DECLARATIONS: ADA_ROOT;
17771790
} /* if(token != NULL) */
17781791

17791792
break;

0 commit comments

Comments
 (0)