Look at the following example:
with System; use System;
with Ada.Text_Io; use Ada.Text_IO;
procedure foo is
bar : constant integer := 1;
foobar : integer renames bar;
begin
if foo'Address = foobar'Address then
Put_Line ("OK");
end if;
end foo;
The normal output of this program would be OK, but in fact the test fails.
Another example:
package foo is
bar : constant integer := 1;
foobar : integer renames bar;
end foo;
$ gcc -c foo.ads
Two symbols are created:
$ nm foo.o
00000000 D foo__bar
00000001 C foo_E
00000004 D foo__foobar
Futhermore I checked and both symbols reserve space (there 4 bytes).
$ objdump -t foo.o
[...]
00000000 g O .data 00000004 foo__bar
00000004 g O .data 00000004 foo__foobar
Nevertheless both get the right value:
$ readelf -x 2 foo.o
Hex dump of section '.data':
0x00000000 00000001 00000001 ........
If I declare a variable instead of a constant, then we get the normal behaviour
(ie only 1 symbol and 1 space for it):
package Foo is
Bar : Integer := 1;
FooBar : Integer renames Bar;
end Foo;
$ gcc -c foo.ads
$ nm foo.o
00000000 D foo__bar
00000001 C foo_E
--
Summary: constant renaming creates new constant
Product: gcc
Version: 3.4.3
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: ada
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: jc at apinc dot org
CC: gcc-bugs at gcc dot gnu dot org
GCC host triplet: i486-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19037