[Ada] Crash on compiling project with multiple subunits per file
2020-06-19 Justin Squirek <squirek@adacore.com> gcc/ada/ * lib.adb (Check_Same_Extended_Unit): Add check to determine if the body for the subunits exist in the same file as their specifications.
This commit is contained in:
parent
d0e9248d9b
commit
82bcb33bcf
@ -362,6 +362,12 @@ package body Lib is
|
||||
-- Step 2: Check subunits. If a subunit is instantiated, follow the
|
||||
-- instantiation chain rather than the stub chain.
|
||||
|
||||
-- Note that we must handle the case where the subunit exists in the
|
||||
-- same body as the main unit (which may happen when Naming gets
|
||||
-- manually specified within a project file or through tools like
|
||||
-- gprname). Otherwise, we will have an infinite loop jumping around
|
||||
-- the same file.
|
||||
|
||||
Unit1 := Unit (Cunit (Unum1));
|
||||
Unit2 := Unit (Cunit (Unum2));
|
||||
Inst1 := Instantiation (Sind1);
|
||||
@ -384,21 +390,35 @@ package body Lib is
|
||||
Length_Of_Name (Unit_Name (Unum2))
|
||||
then
|
||||
Sloc2 := Sloc (Corresponding_Stub (Unit2));
|
||||
Unum2 := Get_Source_Unit (Sloc2);
|
||||
goto Continue;
|
||||
|
||||
if Unum2 /= Get_Source_Unit (Sloc2) then
|
||||
Unum2 := Get_Source_Unit (Sloc2);
|
||||
goto Continue;
|
||||
else
|
||||
null; -- Unum2 already designates the correct unit
|
||||
end if;
|
||||
else
|
||||
Sloc1 := Sloc (Corresponding_Stub (Unit1));
|
||||
Unum1 := Get_Source_Unit (Sloc1);
|
||||
goto Continue;
|
||||
|
||||
if Unum1 /= Get_Source_Unit (Sloc1) then
|
||||
Unum1 := Get_Source_Unit (Sloc1);
|
||||
goto Continue;
|
||||
else
|
||||
null; -- Unum1 already designates the correct unit
|
||||
end if;
|
||||
end if;
|
||||
|
||||
-- Sloc1 in subunit, Sloc2 not
|
||||
|
||||
else
|
||||
Sloc1 := Sloc (Corresponding_Stub (Unit1));
|
||||
Unum1 := Get_Source_Unit (Sloc1);
|
||||
goto Continue;
|
||||
|
||||
if Unum1 /= Get_Source_Unit (Sloc1) then
|
||||
Unum1 := Get_Source_Unit (Sloc1);
|
||||
goto Continue;
|
||||
else
|
||||
null; -- Unum1 already designates the correct unit
|
||||
end if;
|
||||
end if;
|
||||
|
||||
-- Sloc2 in subunit, Sloc1 not
|
||||
@ -408,8 +428,13 @@ package body Lib is
|
||||
and then Inst2 = No_Location
|
||||
then
|
||||
Sloc2 := Sloc (Corresponding_Stub (Unit2));
|
||||
Unum2 := Get_Source_Unit (Sloc2);
|
||||
goto Continue;
|
||||
|
||||
if Unum2 /= Get_Source_Unit (Sloc2) then
|
||||
Unum2 := Get_Source_Unit (Sloc2);
|
||||
goto Continue;
|
||||
else
|
||||
null; -- Unum2 already designates the correct unit
|
||||
end if;
|
||||
end if;
|
||||
|
||||
-- Step 3: Check instances. The two locations may yield a common
|
||||
|
Loading…
Reference in New Issue
Block a user