构建GCC Ada时,使用非常旧的gnatmake编译s-excmac.adb时出现语法错误

构建GCC Ada时,使用非常旧的gnatmake编译s-excmac.adb时出现语法错误,gcc,ada,Gcc,Ada,我正在尝试更新我们已有20年历史的Ada编译器,但是您需要一个Ada编译器来构建GCC+Ada(9.2.0)的某些部分 gnatmake大约是2000年,它可能是gcc2.8.1的子调用。唉 我已经成功地构建了GCC的几个Ada部分,但我无法理解这个libgnat/文件: 编译libgnat/s-excmac.adb: $ gnatmake s-excmac.adb gcc -c -gnatpg s-excmac.adb s-excmac.ads:134:44: identifier expec

我正在尝试更新我们已有20年历史的Ada编译器,但是您需要一个Ada编译器来构建GCC+Ada(9.2.0)的某些部分

gnatmake大约是2000年,它可能是gcc2.8.1的子调用。唉

我已经成功地构建了GCC的几个Ada部分,但我无法理解这个
libgnat/
文件:

编译libgnat/s-excmac.adb:

$ gnatmake s-excmac.adb
gcc -c -gnatpg s-excmac.adb
s-excmac.ads:134:44: identifier expected
gnatmake: "s-excmac.adb" compilation error
因此,
s-excmac.ads
中有问题的一行是:

   type GCC_Exception_Access is access all Unwind_Exception;
   --  Pointer to a GCC exception

   procedure Unwind_DeleteException (Excp : not null GCC_Exception_Access );  -- <-- THIS ONE!

   pragma Import (C, Unwind_DeleteException, "_Unwind_DeleteException");

   --  Procedure to free any GCC exception
类型GCC\u Exception\u Access为Access all Unwind\u Exception;
--指向GCC异常的指针

过程展开_DeleteException(Excp:非空GCC _Exception _Access);-- 如果编译器的版本早于2005,那么编译Ada-2005
notnull访问
声明将是一个问题

要继续,您可以删除单词“
notnull
”,该行将编译并工作,但如果传入null访问类型,您将无法获得所需的行为(异常中止)。更好的修复方法是显式检查包装程序,并根据需要引发异常或调用底层C procoughvoid函数


此外,可能还有其他Ada-2005特性也无法编译,因此更好的选择是编译器升级

Brian关于
非空值的看法是正确的。但代码中可能会有更多的2005 ISM


我相信维护人员只会保证使用以前的版本构建编译器的能力,这意味着构建GCC 3,使用它构建GCC 4,等等;您可能可以跳过一两个版本。漫长的未来

我想,构建
libgnat
是最新的一步。我的意思是,您需要使用旧的gcc构建“新gcc”,然后使用“新gcc”构建
libgnat
。在这种情况下,你不会得到这个错误。

并且在GCC 4.7和更高的地方,没有C++编译器(除了艾达和C),编译该路径是不可能的。