[Ada] Illegal deferred constant causes stack overflow
authorHristian Kirtchev <kirtchev@adacore.com>
Mon, 16 Jul 2018 14:09:44 +0000 (14:09 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 16 Jul 2018 14:09:44 +0000 (14:09 +0000)
commit705bcbfeeccd0217f1764e9669ae727960563d24
tree996e7ec40828441a661586fffa285a6d2f75d9c0
parente05a1ce7113ba87b45bb6c950a8ae0bf56c536e3
[Ada] Illegal deferred constant causes stack overflow

This patch prevents the compiler from entering infinite recursion when
processing an illegal deferred constant.

------------
-- Source --
------------

--  types.ads

package Types is
   type Enum is (One, Two);
end Types;

--  types2.ads

with Types;

package Types2 is
   type Enum is private;
   One : constant Enum;
   Two : constant Enum;

private
   type Enum is new Types.Enum;
   One : constant Enum := One;
   Two : constant Enum := Two;

end Types2;

----------------------------
-- Compilation and output --
----------------------------

$ gcc -c types2.ads
types2.ads:10:04: full constant declaration appears too late
types2.ads:11:04: full constant declaration appears too late

2018-07-16  Hristian Kirtchev  <kirtchev@adacore.com>

gcc/ada/

* sem_eval.adb (Compile_Time_Known_Value): Add a guard which prevents
the compiler from entering infinite recursion when trying to determine
whether a deferred constant has a compile time known value, and the
initialization expression of the constant is a reference to the
constant itself.

From-SVN: r262698
gcc/ada/ChangeLog
gcc/ada/sem_eval.adb