防止在GNAT中使用Ada 202x

3

GNAT允许以下代码,因为Random(Generator, First, Last)在运行时实现,但它不是Ada 2012的一部分。 我是否可以使其生成编译错误,因为它不应该可用?

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Numerics.Discrete_Random;

procedure Main is
   package Positive_Random is new Ada.Numerics.Discrete_Random
     (Result_Subtype => Positive);
   Generator : Positive_Random.Generator;

   -- This should fail, since function isn't part of Ada 2012.
   Value : Positive := Positive_Random.Random (Generator, 1, 10);
begin
    Put_Line (Value'Image);
end Main;

这是我的gpr文件:
project Default is

   for Source_Dirs use ("src");
   for Object_Dir use "obj";
   for Main use ("main.adb");

   package Compiler is
      for Switches ("ada") use ("-gnat12");
   end Compiler;

end Default;

当我尝试编译示例时,它很好地未能编译,并显示了Random具有太多值的信息。这意味着:符合预期。 :) 您确定没有在任何地方添加-gnatX开关吗?比如环境变量等。 - thindil
这是我在Alire-Index的构建检查中某些系统上遇到的错误,但我本地没有看到。 - pyj
1
我的编译器甚至没有Random的那个版本在运行时(Ubuntu 20.04中的gnat-9软件包,所以我猜是FSF GNAT)。我知道这一点,看一下Ada.Numerics.Discrete_Random(a-nudira.ads)的规范。由Ada 2005或2012提供的扩展标有pragma Ada_05pragma Ada_2012,编译器使用这些指示根据请求的版本引发错误或不引发错误。我猜你的是GNAT Community Edition,它似乎不支持不同的语言版本(请参见https://www.adacore.com/gnatpro/comparison)。 - Gneuromante
1个回答

2

在我看来,做这件事的标准方法是添加全局限制不允许使用实现标识符

pragma Restrictions (No_Implementation_Identifiers);

没有实现定义标识符的使用名称,这些名称出现在语言定义的包或语言定义的通用包的实例中。

但是在GNAT Community Edition 2021(以及GCC 11,我想)中,这不起作用。

您可以创建自定义的GNAT运行时,并删除此子程序或使用方面Implementation_Defined标记该子程序,以使限制生效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接