aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2020-09-12 07:39:13 +0200
committerTristan Gingold <tgingold@free.fr>2020-09-12 07:39:13 +0200
commit69b0dbb24c1ae374bd2f9c4291e93326471bd71b (patch)
tree2cf5afd312607ad4d4e7cca6a0f9c455a3f54eac /src/vhdl
parent776b85c64c2809735d3df2b2fbf4a970854ecce0 (diff)
downloadghdl-69b0dbb24c1ae374bd2f9c4291e93326471bd71b.tar.gz
ghdl-69b0dbb24c1ae374bd2f9c4291e93326471bd71b.tar.bz2
ghdl-69b0dbb24c1ae374bd2f9c4291e93326471bd71b.zip
vhdl: allow conflict design unit name with -frelaxed
Fix #1461 Allow a design unit (package or entity) to have the same name as a library.
Diffstat (limited to 'src/vhdl')
-rw-r--r--src/vhdl/vhdl-sem.adb12
-rw-r--r--src/vhdl/vhdl-sem_scopes.adb48
2 files changed, 43 insertions, 17 deletions
diff --git a/src/vhdl/vhdl-sem.adb b/src/vhdl/vhdl-sem.adb
index 03351c914..ff963ec38 100644
--- a/src/vhdl/vhdl-sem.adb
+++ b/src/vhdl/vhdl-sem.adb
@@ -184,8 +184,16 @@ package body Vhdl.Sem is
-- Makes the entity name visible.
-- FIXME: quote LRM.
- Sem_Scopes.Add_Name
- (Entity_Library, Get_Identifier (Entity_Library), False);
+ declare
+ Prev_Hide : constant Boolean := Is_Warning_Enabled (Warnid_Hide);
+ begin
+ -- Avoid spurious warning from entity name (if it has the same
+ -- identifier as a library clause).
+ Enable_Warning (Warnid_Hide, False);
+ Sem_Scopes.Add_Name
+ (Entity_Library, Get_Identifier (Entity_Library), False);
+ Enable_Warning (Warnid_Hide, Prev_Hide);
+ end;
-- LRM 10.1 Declarative Region
-- 1. An entity declaration, together with a corresponding architecture
diff --git a/src/vhdl/vhdl-sem_scopes.adb b/src/vhdl/vhdl-sem_scopes.adb
index 687c92aba..e4288341b 100644
--- a/src/vhdl/vhdl-sem_scopes.adb
+++ b/src/vhdl/vhdl-sem_scopes.adb
@@ -477,6 +477,8 @@ package body Vhdl.Sem_Scopes is
end if;
if Is_Conflict_Declaration (Raw_Inter) then
+ -- The current declaration for RAW_INTER is a conflict: there are
+ -- multiple *potentially* visible declarations for the identifier.
if Potentially then
-- Yet another conflicting interpretation.
return;
@@ -920,21 +922,30 @@ package body Vhdl.Sem_Scopes is
if Is_In_Current_Declarative_Region (Current_Inter) then
-- They are perhaps visible in the same declarative region.
- -- LRM93 11.2
- -- If two or more logical names having the same
- -- identifier appear in library clauses in the same
- -- context, the second and subsequent occurences of the
- -- logical name have no effect. The same is true of
- -- logical names appearing both in the context clause
- -- of a primary unit and in the context clause of a
- -- corresponding secondary unit.
- -- GHDL: we apply this rule with VHDL-87, because of implicits
- -- library clauses STD and WORK.
- if Get_Kind (Decl) = Iir_Kind_Library_Declaration
- and then
- Get_Kind (Current_Decl) = Iir_Kind_Library_Declaration
- then
- return;
+ if Get_Kind (Current_Decl) = Iir_Kind_Library_Declaration then
+ -- LRM93 11.2
+ -- If two or more logical names having the same
+ -- identifier appear in library clauses in the same
+ -- context, the second and subsequent occurences of the
+ -- logical name have no effect. The same is true of
+ -- logical names appearing both in the context clause
+ -- of a primary unit and in the context clause of a
+ -- corresponding secondary unit.
+ -- GHDL: we apply this rule with VHDL-87, because of
+ -- implicit library clauses STD and WORK.
+ if Get_Kind (Decl) = Iir_Kind_Library_Declaration then
+ return;
+ end if;
+
+ if Flag_Relaxed_Rules
+ and then Get_Kind (Decl) in Iir_Kinds_Library_Unit
+ then
+ Warning_Msg_Sem
+ (Warnid_Hide, +Decl,
+ "unit %i hides library %i", (+Decl, +Decl));
+ Interpretations.Table (Current_Inter).Decl := Decl;
+ return;
+ end if;
end if;
-- None of the two declarations are potentially visible, ie
@@ -1263,11 +1274,18 @@ package body Vhdl.Sem_Scopes is
-- This is needed when an architecture is analysed.
procedure Add_Entity_Declarations (Entity : Iir_Entity_Declaration)
is
+ Prev_Hide : constant Boolean := Is_Warning_Enabled (Warnid_Hide);
begin
+ -- Temporarly disable hide warning to avoid spurious messages.
+ Enable_Warning (Warnid_Hide, False);
+
Add_Declarations_From_Interface_Chain (Get_Generic_Chain (Entity));
Add_Declarations_From_Interface_Chain (Get_Port_Chain (Entity));
Add_Declarations (Get_Declaration_Chain (Entity), False);
Add_Declarations_Of_Concurrent_Statement (Entity);
+
+ -- Restore
+ Enable_Warning (Warnid_Hide, Prev_Hide);
end Add_Entity_Declarations;
-- Add declarations from a package into the current declarative region.