summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sem_names.adb63
-rw-r--r--testsuite/gna/bug7186/bug.vhdl24
-rwxr-xr-xtestsuite/gna/bug7186/testsuite.sh9
3 files changed, 67 insertions, 29 deletions
diff --git a/sem_names.adb b/sem_names.adb
index 89e8dfd..0e46db9 100644
--- a/sem_names.adb
+++ b/sem_names.adb
@@ -1877,6 +1877,38 @@ package body Sem_Names is
return R;
end Sem_As_Indexed_Or_Slice_Name;
+ -- Sem parenthesis name when the prefix is a function declaration.
+ -- Can be either a function call (and the expression is the actual) or
+ -- a slice/index of the result of a call without actual.
+ procedure Sem_Parenthesis_Function (Sub_Name : Iir) is
+ Used : Boolean;
+ R : Iir;
+ Match : Boolean;
+ begin
+ Used := False;
+ if Get_Kind (Sub_Name) in Iir_Kinds_Function_Declaration then
+ Sem_Association_Chain
+ (Get_Interface_Declaration_Chain (Sub_Name),
+ Assoc_Chain, False, Missing_Parameter, Name, Match);
+ if Match then
+ Add_Result
+ (Res,
+ Sem_As_Function_Call (Prefix_Name, Sub_Name, Assoc_Chain));
+ Used := True;
+ end if;
+ end if;
+ if Get_Kind (Sub_Name) not in Iir_Kinds_Procedure_Declaration then
+ R := Sem_As_Indexed_Or_Slice_Name (Sub_Name, False);
+ if R /= Null_Iir then
+ Add_Result (Res, R);
+ Used := True;
+ end if;
+ end if;
+ if not Used then
+ Sem_Name_Free_Result (Sub_Name, Null_Iir);
+ end if;
+ end Sem_Parenthesis_Function;
+
Actual : Iir;
Actual_Expr : Iir;
begin
@@ -1945,38 +1977,13 @@ package body Sem_Names is
when Iir_Kind_Overload_List =>
declare
El : Iir;
- Used : Boolean;
- R : Iir;
- Match : Boolean;
Prefix_List : Iir_List;
begin
Prefix_List := Get_Overload_List (Prefix);
for I in Natural loop
El := Get_Nth_Element (Prefix_List, I);
exit when El = Null_Iir;
- Used := False;
- if Get_Kind (El) in Iir_Kinds_Function_Declaration then
- Sem_Association_Chain
- (Get_Interface_Declaration_Chain (El),
- Assoc_Chain, False, Missing_Parameter, Name, Match);
- if Match then
- Add_Result
- (Res, Sem_As_Function_Call (Prefix_Name, El,
- Assoc_Chain));
- Used := True;
- end if;
- end if;
- if Get_Kind (El) not in Iir_Kinds_Procedure_Declaration
- then
- R := Sem_As_Indexed_Or_Slice_Name (El, False);
- if R /= Null_Iir then
- Add_Result (Res, R);
- Used := True;
- end if;
- end if;
- if not Used then
- Sem_Name_Free_Result (El, Null_Iir);
- end if;
+ Sem_Parenthesis_Function (El);
end loop;
end;
if Res = Null_Iir then
@@ -1985,9 +1992,7 @@ package body Sem_Names is
& Disp_Node (Prefix_Name), Name);
end if;
when Iir_Kinds_Function_Declaration =>
- Add_Result (Res, Sem_As_Function_Call (Prefix_Name,
- Prefix, Assoc_Chain));
- Add_Result (Res, Sem_As_Indexed_Or_Slice_Name (Prefix, False));
+ Sem_Parenthesis_Function (Prefix);
if Res = Null_Iir then
Error_Msg_Sem
("prefix is neither a function name "
diff --git a/testsuite/gna/bug7186/bug.vhdl b/testsuite/gna/bug7186/bug.vhdl
new file mode 100644
index 0000000..9587521
--- /dev/null
+++ b/testsuite/gna/bug7186/bug.vhdl
@@ -0,0 +1,24 @@
+library IEEE;
+use ieee.numeric_std.all;
+use ieee.std_logic_1164.all;
+
+-- A testbench has no ports.
+entity system is
+end system;
+
+architecture behav of system is
+ subtype entry is unsigned(7 downto 0);
+ type invect is array (natural range <>) of entry;
+ signal minimum : entry;
+ signal vec : invect(0 to 20);
+ function min(iv : invect) return entry is
+ begin
+ return iv(0);
+ end;
+begin
+ process
+ begin
+ minimum <= min(invect); -- should be vec not invect
+ wait;
+ end process;
+end behav;
diff --git a/testsuite/gna/bug7186/testsuite.sh b/testsuite/gna/bug7186/testsuite.sh
new file mode 100755
index 0000000..fada702
--- /dev/null
+++ b/testsuite/gna/bug7186/testsuite.sh
@@ -0,0 +1,9 @@
+#! /bin/sh
+
+. ../../testenv.sh
+
+analyze_failure bug.vhdl
+
+clean
+
+echo "Test successful"