【问题标题】:Prevent Ada 202x Use in GNAT防止在 GNAT 中使用 Ada 202x
【发布时间】:2021-07-31 20:26:47
【问题描述】:

由于Random(Generator, First, Last) 在运行时中实现,GNAT 允许以下代码,但它不是 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 开关吗?像环境变量等。
  • 这是我在 Alire-Index 的构建检查中的某些系统上遇到的错误,但我没有看到 locall.y
  • 我的编译器在运行时甚至没有 Random 的那个版本(Ubuntu 20.04 中的包 gnat-9,所以我猜是 FSF GNAT)。我知道,看看 Ada.Numerics.Discrete_Random (a-nudira.ads) 的规范。 Ada 2005 或 2012 提供的扩展分别用pragma Ada_05pragma Ada_2012 标记,编译器根据请求的版本使用这些指示来引发或不引发错误。我猜你的是 GNAT 社区版,它似乎不支持不同的语言版本(见adacore.com/gnatpro/comparison

标签: ada ada2012


【解决方案1】:

在我看来,the standard way 这样做就是添加a global restriction

pragma Restrictions (No_Implementation_Identifiers);

No_Implementation_Identifiers

在语言定义的包或语言定义的通用包的实例中,没有使用名称来表示具有实现定义标识符的声明。

但这在 GNAT 社区版 2021 中不起作用(我猜在 GCC 11 中也不起作用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多