aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl/sem_stmts.adb
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2016-03-26 16:31:11 +0100
committerTristan Gingold <tgingold@free.fr>2016-03-26 16:31:11 +0100
commitc42bb2eac575196a2a19334e585d72d8c7c01f63 (patch)
treefd62d5eb38f18320a133a0cff4df14c2058ae901 /src/vhdl/sem_stmts.adb
parentd82753539cb4307b57710ab499aae0ffce872ca0 (diff)
downloadghdl-c42bb2eac575196a2a19334e585d72d8c7c01f63.tar.gz
ghdl-c42bb2eac575196a2a19334e585d72d8c7c01f63.tar.bz2
ghdl-c42bb2eac575196a2a19334e585d72d8c7c01f63.zip
Avoid a crash on error.
Fix bug041.
Diffstat (limited to 'src/vhdl/sem_stmts.adb')
-rw-r--r--src/vhdl/sem_stmts.adb67
1 files changed, 33 insertions, 34 deletions
diff --git a/src/vhdl/sem_stmts.adb b/src/vhdl/sem_stmts.adb
index 13fcc08d8..c6bbcb332 100644
--- a/src/vhdl/sem_stmts.adb
+++ b/src/vhdl/sem_stmts.adb
@@ -109,7 +109,7 @@ package body Sem_Stmts is
end Sem_Sequential_Labels;
procedure Fill_Array_From_Aggregate_Associated
- (Chain : Iir; Nbr : in out Natural; Arr : Iir_Array_Acc)
+ (Chain : Iir; Nbr : in out Natural; Arr : in out Iir_Array)
is
El : Iir;
Ass : Iir;
@@ -121,9 +121,7 @@ package body Sem_Stmts is
Fill_Array_From_Aggregate_Associated
(Get_Association_Choices_Chain (Ass), Nbr, Arr);
else
- if Arr /= null then
- Arr (Nbr) := Ass;
- end if;
+ Arr (Nbr) := Ass;
Nbr := Nbr + 1;
end if;
El := Get_Chain (El);
@@ -177,42 +175,43 @@ package body Sem_Stmts is
procedure Check_Uniq_Aggregate_Associated
(Aggr : Iir_Aggregate; Nbr : Natural)
is
+ Chain : constant Iir := Get_Association_Choices_Chain (Aggr);
+ subtype El_Array_Type is Iir_Array (0 .. Nbr - 1);
+ Name_Arr, Obj_Arr : El_Array_Type;
Index : Natural;
- Arr : Iir_Array_Acc;
- Chain : Iir;
- V_I, V_J : Iir;
+ El : Iir;
begin
- Chain := Get_Association_Choices_Chain (Aggr);
- -- Count number of associated values, and create the array.
- -- Already done: use nbr.
- -- Fill_Array_From_Aggregate_Associated (List, Nbr, null);
- Arr := new Iir_Array (0 .. Nbr - 1);
-- Fill the array.
Index := 0;
- Fill_Array_From_Aggregate_Associated (Chain, Index, Arr);
- if Index /= Nbr then
- -- Should be the same.
- raise Internal_Error;
- end if;
- -- Check each element is uniq.
- for I in Arr.all'Range loop
- V_I := Name_To_Object (Arr (I));
- if Get_Name_Staticness (V_I) = Locally then
- for J in 0 .. I - 1 loop
- V_J := Name_To_Object (Arr (J));
- if Get_Name_Staticness (V_J) = Locally
- and then not Is_Disjoint (V_I, V_J)
- then
- Error_Msg_Sem ("target is assigned more than once", Arr (I));
- Error_Msg_Sem (" (previous assignment is here)", Arr (J));
- Free (Arr);
- return;
- end if;
- end loop;
+ Fill_Array_From_Aggregate_Associated (Chain, Index, Name_Arr);
+ -- Should be the same.
+ pragma Assert (Index = Nbr);
+
+ -- Replace name with object. Return now in case of error (not an
+ -- object or not a static name).
+ for I in Name_Arr'Range loop
+ El := Name_To_Object (Name_Arr (I));
+ if El = Null_Iir
+ or else Get_Name_Staticness (El) /= Locally
+ then
+ -- Error...
+ return;
end if;
+ Obj_Arr (I) := El;
+ end loop;
+
+ -- Check each element is uniq.
+ for I in Name_Arr'Range loop
+ for J in 0 .. I - 1 loop
+ if not Is_Disjoint (Obj_Arr (I), Obj_Arr (J)) then
+ Error_Msg_Sem
+ ("target is assigned more than once", Name_Arr (I));
+ Error_Msg_Sem
+ (" (previous assignment is here)", Name_Arr (J));
+ return;
+ end if;
+ end loop;
end loop;
- Free (Arr);
- return;
end Check_Uniq_Aggregate_Associated;
-- Do checks for the target of an assignment.