Experimenting with Gela as an ASIS implementation, I am finding incorrect code generation with -O2 but correct without optimisation.
To reproduce... 0) My environment: ------------------------------------------------------------------------ uname -a Linux Sparrowhawk 3.14-1-amd64 #1 SMP Debian 3.14.7-1 (2014-06-16) x86_64 GNU/Linux ------------------------------------------------------------------------ gnat --version GNAT 4.9 Copyright 1996-2014, Free Software Foundation, Inc. ------------------------------------------------------------------------ ( via apt-get -t testing install gnat-4.9 ) 1) From webpage http://gela.ada-ru.org/gela_asis download and unpack the latest release (640kB) http://www.ada-ru.org/files/gela-asis-0.3.2.tar.bz2 2) cd gela-asis-0.3.2 make generate Symptoms: it builds a (faulty) xml2ayacc, uses it to parse an Ada-2005 grammar written in XML, then xml2ayacc falls over with ------------------------------------------------------------------------ raised CONSTRAINT_ERROR : generate.adb:628 range check failed ------------------------------------------------------------------------ 3) edit gela-asis-0.3.2/Makefile removing -O2 flag ---------------------------------- # gnatmake flags: FLAGS ?= -j0 -g -m # -O2 ---------------------------------- make clean make generate and it runs cleanly. So the questions are: 1) can anyone else reproduce it? 2) should I report as a Gnat bug? 3) If the latter (see below) would it be better to report it to Debian, or gcc? I have narrowed the problem down to one procedure, Find_Node, in gela-asis-0.3.2/tools/xml2ayacc/nodes-database.adb which, called with Name="_Node" returns Node= <random out-of-range value> and Found=true, e.g. ---------------------------------- Name _node node 7984 found? TRUE ---------------------------------- The valid range is declared as: type Node_Index is range 1 .. 250; in gela-asis-0.3.2/tools/xml2ayacc/nodes-database.ads procedure Find_Node (Name : in String; Node : out Node_Index; Found : out Boolean) is begin for I in 1 .. Last_Node_Index loop if All_Nodes (I).Name = Name then Node := I; Found := True; return; end if; end loop; Found := False; end Find_Node; Caller is function Get_Node_Type_Name from gela-asis-0.3.2/tools/xml2ayacc/nodes.adb function Get_Node_Type_Name (Name : String) return String is use Nodes.Database; use Ada.Strings.Fixed; Type_Name : constant String := Capitalise (Name & "_Node"); Node : Node_Index; Found : Boolean; begin ... Find_Node (Type_Name, Node, Found); -- diagnostics added... Put_Line ("Name " & Type_Name & " node " & Node_Index'image(Node) & " found? " & boolean'image(Found)); ... rest of function irrelevant So Get_Node_Type_Name called with an empty Name will search for "_Node", which isn't very smart, but never mind... Now my reading of Find_Node is that the only ways out are with Node correctly set to an in-range value and Found=True, or with Node uninitialised and Found=False. However at -O2 we find Node uninitialised and Found=True. Initalising Node to 1 makes the problem "go away" but that's not a satisfactory solution. Adding -gnato to the compiler flags makes no effect I can see. My own build of upstream gnat-4.9 (prerelease snapshot) does the same; my own build of upstream gnat-4.8.2 does not, so I am leaning towards the view that it's a Gnat-4.9 regression. I haven't tried any of the Adacore builds. Any light anyone can shed on this? - Brian -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected] Archive: https://lists.debian.org/[email protected]
