Сравнение тегов Ada приводит к сбою компилятора - PullRequest
0 голосов
/ 07 ноября 2018

Я не уверен, является ли это ошибкой в ​​моей версии gcc (4.8.5) или gprbuild (2.2.0), но когда я пытаюсь скомпилировать проект, появляется определенная функция, тело которой вызывает сбой компилятора с STORAGE_ERROR. Когда я строю с -cargs -v, я вижу, что gnatl -quiet ... - это команда, которая выводится последней перед сбоем.

Рассматриваемая функция создает информативную строку из тега, принадлежащего определенной иерархии типов. Это выглядит примерно так:

function Tag_To_String (From : Ada.Tags.Tag) return String is (
    if From = A'Tag then "This is tag A"
    elsif From = B'Tag then "This is tag B"
    --  ...
    elsif From = Z'Tag then "This is tag Z"
    else "");

Тогда как я могу заставить его успешно скомпилироваться, если я изменю это тело на:

function Tag_To_String (From : Ada.Tags.Tag) return String is ("");

Я получаю именно такую ​​ошибку:

gcc -c -gnat12 sourcefile.adb

raised STORAGE_ERROR : stack overflow or erroneous memory access
gprbuild: *** compilation phase failed

Есть идеи, почему gcc не может скомпилировать эту функцию?

1 Ответ

0 голосов
/ 07 ноября 2018

Следующая программа работает должным образом с использованием выпуска GNAT и GPS 2018 года.

with Ada.text_IO; use Ada.Text_IO;
with Ada.Tags; use Ada.Tags;

procedure Tag_Main is
   package foo is
      type A is tagged private;
      type B is tagged private;
   private
      type A is tagged null record;
      type B is tagged null record;
   end foo;

   use Foo;

   function Tag_To_String(From : Ada.Tags.Tag) return String is(
      if From = A'Tag then
         "This is tag A"
      else
         "This is tag B"
      );

begin
   Put_Line(Tag_To_String(A'Tag));
   Put_Line(Tag_To_String(B'Tag));
end Tag_Main;

Обратите внимание, что я отредактировал код для использования выражения функции. Это все еще работает на выпуске GNAT / GPS 2018. Эта версия была скомпилирована с помощью gprbuild -d -PD

...