[Bug ada/90958] New: Recent versions of GCC raise CONSTRAINT_ERROR at runtime for iterator loops with nested constrained records.
lburke at labprogramming dot net
gcc-bugzilla@gcc.gnu.org
Fri Jun 21 14:49:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90958
Bug ID: 90958
Summary: Recent versions of GCC raise CONSTRAINT_ERROR at
runtime for iterator loops with nested constrained
records.
Product: gcc
Version: 9.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: ada
Assignee: unassigned at gcc dot gnu.org
Reporter: lburke at labprogramming dot net
Target Milestone: ---
Here is source code that shows the problem:
procedure GNAT.IO.T is
type Variant (Has : Boolean := False) is
record
case Has is
when True => I : Integer;
when False => F : Float;
end case;
end record;
type VArray is array (Positive range <>) of Variant;
type VRec (Size : Natural) is
record
Arr : VArray (1 .. Size);
end record;
type VRec2 (Size : Natural) is
record
Underlying : VRec (Size);
end record;
procedure Test (Input : in out VRec2) is
begin
for X of Input.Underlying.Arr loop
if X.Has then
X.I := X.I + 1;
end if;
end loop;
end Test;
Data : VArray (1 .. 3) := (
1 => (Has => True, I => 10),
2 => (Has => False, F => 10.0),
3 => (Has => True, I => 20));
Rec : VRec := (Size => 3, Arr => Data);
Rec2 : VRec2 := (Size => 3, Underlying => Rec);
begin
Test (Rec2);
Put_Line (Rec2.Underlying.Arr (3).I'Img);
end GNAT.IO.T;
Result (from compilation to run):
[ ~/test/ada/fresh ]
louis@Wolvog $ gcc -v -save-temps -c test.adb
Using built-in specs.
COLLECT_GCC=gcc
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib
--libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=https://bugs.archlinux.org/
--enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared
--enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch
--disable-libssp --enable-gnu-unique-object --enable-linker-build-id
--enable-lto --enable-plugin --enable-install-libiberty
--with-linker-hash-style=gnu --enable-gnu-indirect-function --enable-multilib
--disable-werror --enable-checking=release --enable-default-pie
--enable-default-ssp --enable-cet=auto
Thread model: posix
gcc version 9.1.0 (GCC)
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-c' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/gnat1 -quiet -dumpbase test.adb
-auxbase test -mtune=generic -march=x86-64 test.adb -o test.s
test.adb:1:18: warning: file name does not match unit name, should be
"g-io-t.adb"
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-c' '-mtune=generic' '-march=x86-64'
as -v --64 -o test.o test.s
GNU assembler version 2.32 (x86_64-pc-linux-gnu) using BFD version (GNU
Binutils) 2.32
COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-c' '-mtune=generic' '-march=x86-64'
[ ~/test/ada/fresh ]
louis@Wolvog $ ls
test.adb test.ali test.o test.s
[ ~/test/ada/fresh ]
louis@Wolvog $ gnatbind -v -x test.ali
gnatbind -v -x test.ali
GNATBIND 9.1.0
Copyright (C) 1995-2019, Free Software Foundation, Inc.
Binding: test.ali
No errors
[ ~/test/ada/fresh ]
louis@Wolvog $ gnatlink -v test.ali -o test
GNATLINK 9.1.0
Copyright (C) 1995-2019, Free Software Foundation, Inc.
gnatlink: warning: executable name "test" may conflict with shell command
gcc -c -mtune=generic -march=x86-64 -gnatA -gnatWb -gnatiw -gnatws
/home/louis/test/ada/fresh/b~test.adb
/usr/bin/gcc b~test.o ./test.o -o test -L./
-L/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/adalib/
/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/adalib/libgnat.a -ldl -static-libgcc
[ ~/test/ada/fresh ]
louis@Wolvog $ ./test
raised CONSTRAINT_ERROR : test.adb:24 discriminant check failed
Here is code that should be functionally similar, but doesn't raise the error:
procedure GNAT.IO.T is
type Variant (Has : Boolean := False) is
record
case Has is
when True => I : Integer;
when False => F : Float;
end case;
end record;
type VArray is array (Positive range <>) of Variant;
type VRec (Size : Natural) is
record
Arr : VArray (1 .. Size);
end record;
type VRec2 (Size : Natural) is
record
Underlying : VRec (Size);
end record;
procedure Test (Input : in out VRec2) is
begin
for I in Input.Underlying.Arr'Range loop
declare
X : Variant renames Input.Underlying.Arr (I);
begin
if X.Has then
X.I := X.I + 1;
end if;
end;
end loop;
end Test;
Data : VArray (1 .. 3) := (
1 => (Has => True, I => 10),
2 => (Has => False, F => 10.0),
3 => (Has => True, I => 20));
Rec : VRec := (Size => 3, Arr => Data);
Rec2 : VRec2 := (Size => 3, Underlying => Rec);
begin
Test (Rec2);
Put_Line (Rec2.Underlying.Arr (3).I'Img);
end GNAT.IO.T;
Result (from compilation to run):
[ ~/test/ada/fresh ]
louis@Wolvog $ gcc -v -save-temps -c test.adb
Using built-in specs.
COLLECT_GCC=gcc
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib
--libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=https://bugs.archlinux.org/
--enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared
--enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch
--disable-libssp --enable-gnu-unique-object --enable-linker-build-id
--enable-lto --enable-plugin --enable-install-libiberty
--with-linker-hash-style=gnu --enable-gnu-indirect-function --enable-multilib
--disable-werror --enable-checking=release --enable-default-pie
--enable-default-ssp --enable-cet=auto
Thread model: posix
gcc version 9.1.0 (GCC)
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-c' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/gnat1 -quiet -dumpbase test.adb
-auxbase test -mtune=generic -march=x86-64 test.adb -o test.s
test.adb:1:18: warning: file name does not match unit name, should be
"g-io-t.adb"
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-c' '-mtune=generic' '-march=x86-64'
as -v --64 -o test.o test.s
GNU assembler version 2.32 (x86_64-pc-linux-gnu) using BFD version (GNU
Binutils) 2.32
COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-c' '-mtune=generic' '-march=x86-64'
[ ~/test/ada/fresh ]
louis@Wolvog $ ls
test.adb test.ali test.o test.s
[ ~/test/ada/fresh ]
louis@Wolvog $ gnatbind -v -x test.ali
gnatbind -v -x test.ali
GNATBIND 9.1.0
Copyright (C) 1995-2019, Free Software Foundation, Inc.
Binding: test.ali
No errors
[ ~/test/ada/fresh ]
louis@Wolvog $ gnatlink -v test.ali -o test
GNATLINK 9.1.0
Copyright (C) 1995-2019, Free Software Foundation, Inc.
gnatlink: warning: executable name "test" may conflict with shell command
gcc -c -mtune=generic -march=x86-64 -gnatA -gnatWb -gnatiw -gnatws
/home/louis/test/ada/fresh/b~test.adb
/usr/bin/gcc b~test.o ./test.o -o test -L./
-L/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/adalib/
/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/adalib/libgnat.a -ldl -static-libgcc
[ ~/test/ada/fresh ]
louis@Wolvog $ ./test
21
I have also tested this with 8.3.1 at tio.run:
https://tio.run/##jVPBbtNAEL33K@aGLdJV49waWqkIpVhCpYIU5YYGe2xWcnej9boofDxmZmwnIUDVXDxrv3lv9r0JlnheO4x9vw2@oLILBLd3N2uTfzRrsO0ZQNxtCb5gsOgiJO@xhUt4631D6ODyClbYtJQOUIBAhQ@llgAFtgTSMH6U34/v5GAdOoKra8iZKneRagrLPxHKKpAVQ1aNxzgByJVKPJzlNGguz/az3oSAOxYF1CK5962N9okgoKsJ3lyn4KvpSkd9n6iA5LP9Sax5h7EL2Pz7YizAkFEnmYMxIG3pMzMxd/Yy8gdXUmh21tWisZ/pb/IBLhKH7NbUcki523aRu60Dz4WKj2LfqLZOmSofYCNGKNocZI1cr/F@Ow5kK9gYiTFyMvuYNiaX@OXxGubH6djqMKrQyElqmU0deYcRT/1bpMKWaONcgtdN46fsyow3hcv5RTpTQHYM0FWZ8aIowkyYxX9IsotUrRRjR39FWJPhz4uZpsuVTDkhsxGanWKPwuIXjOCOyeIhC/VeaO67@PWDdTS8OvU7WaQmf5U/1owVs/Z/wmXf/yqqBuu2P3/6DQ
This bug does not appear to be present in version 4.8.5.
I did not check every version in between.
More information about the Gcc-bugs
mailing list