Defect Report #129

Submission Date: 03 Dec 93
Submittor: WG14
Source: Ron Guilmette
Question
ANSI/ISO C Defect Report #rfg36:
Subject: Tags and name spaces.
Should (or must) a conforming implementation correctly translate the following code?
void *vp;
struct TAG { int i; };

void f ()
{
enum TAG { enumerator };
(struct TAG *) vp;
}

Background:
Subclause 6.1.2.3 says:
Thus, there are separate name spaces for various categories of identifiers, as follows:
...
- the tags of structures, unions, and enumerations (disambiguated by following any of the keywords struct, union, or enum);...
A footnote for this subclause states that ``There is only one name space for tags even though three are possible.''
Given that this statement is only a footnote, and given that there are neither any specific constraints nor any specific semantic rules violated by the code shown above, it appears that a conforming implementation is actually required (by the C Standard, as now written) to accept the code shown above (even though this was probably not the intent of the Committee). It also seems that the code shown above is strictly conforming.
If the Committee actually intended that such code should be considered to be invalid, then it seems necessary to amend the C Standard to make it say that. (Actually, I think that a new constraint is in order here.)
Response
No change is necessary, because subclause 6.1.2.3 (second item) states that name spaces of tags are shared. Therefore the inner enum TAG hides the outer struct TAG, and therefore the cast (struct TAG *) attempts to declare a new struct TAG, thus violating a constraint in subclause 6.5.
A conforming implementation need not translate the given code.
Previous Defect Report < - > Next Defect Report