adolph@ssc-vax.UUCP (Mark C. Adolph) (09/14/88)
Given the following package specs, I'm getting errors which I'm
confused about:
1 package Test_Pack_One is
2
3 type Enum_Type is (one, three, five, seven, nine);
4
5 end Test_Pack_One;
6
7 with Test_Pack_One;
8 package Test_Pack_Two is
9
10 subtype Enum_Type is Test_Pack_One.Enum_Type;
11
12 first_enum : Enum_Type := three;
13 second_enum : Enum_Type := Enum_Type'(three);
14 third_enum : Test_Pack_One.Enum_Type :=
15 Test_Pack_One.Enum_Type'(three);
16
17 end Test_Pack_Two;
Test_Pack_Two produces errors on the declarations of all three objects.
The DEC Ada compiler says:
10 subtype Enum_Type is Test_Pack_One.Enum_Type;
11
12 first_enum : Enum_Type := three;
.......................................1
%ADAC-E, (1) three is not declared [LRM 8.3]
%ADAC-I, (1) Possibly a selected component of (or use clause for) package Test_Pack_One in Test_Pack_One at line 1 is
intended; this would make enumeral three in Test_Pack_One at line 3 visible
13 second_enum : Enum_Type := Enum_Type'(three);
..................................................1
%ADAC-E, (1) three is not declared [LRM 8.3]
%ADAC-I, (1) Possibly a selected component of (or use clause for) package Test_Pack_One in Test_Pack_One at line 1 is
intended; this would make enumeral three in Test_Pack_One at line 3 visible
14 third_enum : Test_Pack_One.Enum_Type :=
15 Test_Pack_One.Enum_Type'(three);
.....................................................1
%ADAC-E, (1) three is not declared [LRM 8.3]
%ADAC-I, (1) Possibly a selected component of (or use clause for) package Test_Pack_One in Test_Pack_One at line 1 is
intended; this would make enumeral three in Test_Pack_One at line 3 visible
The InterACT VAX/1750A cross-compiler, though less verbose, agrees:
Detected near line 12
*** 435E-2: Identifier THREE is not visible
Detected near line 13
*** 435E-2: Identifier THREE is not visible
Detected near line 15
*** 435E-2: Identifier THREE is not visible
Am I missing something, or is a USE clause absolutely required here?
How can a type be visible, via either a SUBTYPE declaration or a WITH
and selection, but not its values? Finally, assuming that this is
correct, what is the rationale?
--
-- Mark A.
...uw-beaver!ssc-vax!adolphfred@cs.utexas.edu (Fred Hosch) (09/14/88)
In article <2223@ssc-vax.UUCP>, adolph@ssc-vax.UUCP (Mark C. Adolph) writes: > Given the following package specs, I'm getting errors which I'm > confused about: > > 1 package Test_Pack_One is > 2 > 3 type Enum_Type is (one, three, five, seven, nine); > 4 > 5 end Test_Pack_One; > 6 > 7 with Test_Pack_One; > 8 package Test_Pack_Two is > 9 > 10 subtype Enum_Type is Test_Pack_One.Enum_Type; > 11 > 12 first_enum : Enum_Type := three; ... LRM 3.5.1 states "this declaration (of an enumeration literal) is equivalent to the declaration of a parameterless function..." Either of the following will do without a use-clause: package TEST_PACK_ONE is type ENUM_TYPE is (ONE, THREE, FIVE, SEVEN); end TEST_PACK_ONE; with TEST_PACK_ONE; package TEST_PACK_TWO is subtype ENUM_TYPE is TEST_PACK_ONE.ENUM_TYPE; FIRST_ENUM: ENUM_TYPE := TEST_PACK_ONE.THREE; end TEST_PACK_TWO; or package TEST_PACK_ONE is type ENUM_TYPE is (ONE, THREE, FIVE, SEVEN); end TEST_PACK_ONE; with TEST_PACK_ONE; package TEST_PACK_TWO is type ENUM_TYPE is new TEST_PACK_ONE.ENUM_TYPE; FIRST_ENUM: ENUM_TYPE := THREE; end TEST_PACK_TWO; --- Fred Hosch fred@cs.utexas.edu
harrison@software.ORG (Tim Harrison) (09/16/88)
>> In article <2223@ssc-vax.UUCP>, adolph@ssc-vax.UUCP (Mark C. Adolph) writes: >> Given the following package specs, I'm getting errors which I'm >> confused about: >> >> 1 package Test_Pack_One is >> 2 >> 3 type Enum_Type is (one, three, five, seven, nine); >> 4 >> 5 end Test_Pack_One; >> 6 >> 7 with Test_Pack_One; >> 8 package Test_Pack_Two is >> 9 >> 10 subtype Enum_Type is Test_Pack_One.Enum_Type; >> 11 >> 12 first_enum : Enum_Type := three; >> 13 second_enum : Enum_Type := Enum_Type'(three); >> 14 third_enum : Test_Pack_One.Enum_Type := >> 15 Test_Pack_One.Enum_Type'(three); >> 16 >> 17 end Test_Pack_Two; Two solutions without a USE clause were provided by Fred Hosch <fred@cs.utexas.edu>. Another possible solution is: package Test_Pack_One is type Enum_Type is (one, three, five, seven, nine); end Test_Pack_One; with Test_Pack_One; package Test_Pack_Two is subtype Enum_Type is Test_Pack_One.Enum_Type; function three return Test_Pack_One.Enum_Type renames Test_Pack_One.three; first_enum : Enum_Type := three; end Test_Pack_Two; -- Tim Harrison Software Productivity Consortium Phone: (703) 391-1742 1880 Campus Commons Drive, North CSnet: harrison@software.org Reston, Virginia 22091 ARPAnet: harrison@ajpo.sei.cmu.edu