Defect Report #157

Submission Date: 16 Oct 95
Submittor: BSI
Source: Clive D.W. Feather
Question
Submitted to BSI by Clive D.W. Feather [email protected].
In this Defect Report, identifiers lexically identical to those declared in standard headers refer to the identifiers declared in those standard headers, whether or not the header is explicitly mentioned.
This Defect Report has been prepared with considerable help from Mark Brader, Jutta Degener, Ronald Guilmette, and a person whose employment conditions require anonymity. However, except where stated, opinions expressed or implied should not be assumed to be those of any person other than myself.
Defect Report UK 005: Legitimacy of type synonyms
The C Standard does not clearly indicate when the spelling of a type name is or is not significant; in other words, when a type name may be replaced by another type name representing the same type.
Part 1
Subclause 6.5.4.3 reads in part:
The special case of void as the only item in the list specifies that the function has no parameters.
Subclause 6.7.1 reads in part:
(except in the special case of a parameter list consisting of a single parameter of type void, in which there shall not be an identifier).
In both cases, the word void is set in the typeface used to indicate C code.
In the code:
typedef void Void;
extern int f (Void);
int f (Void) { return 0; }

is the declaration on line 2 strictly conforming, and is the external definition on line 3 strictly conforming?
Part 2
Subclause 5.1.2.2.1 reads in part: It can be defined with no parameters:

int main (void) { /* ... */ }
Is the following definition of main strictly conforming?
typedef int word;
word main (void) { /*
... */ }

Part 3
Are there any circumstances in which a typedef name is not permitted instead of the type it is a synonym for? If so, what are they?
Proposed Response
A synonym is always acceptable, except that a function definition may not use a typedef for the function type.

Response

Part 1
Both function declarations are strictly conforming.
Subclause 6.7.1 makes clear that it is a single parameter having the type void (as opposed to use of the void keyword) that indicates that a function takes no parameters.
For clarity, Subclause 6.5.4.3 should be rephrased to emphasize that it is the type void, not the keyword voidthat matters.
Future Change
In Subclause 6.5.4.3,
Change
"The special case of void as the only item in the list specifies that the function has no parameters."
To
"The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters."

Part 2
Yes, the definition of main is strictly conforming.

Part 3
A synonym is not acceptable in these cases:
  1. A function definition may not use a typedef for the function type:
    typedef void F(void);
    extern F g { } /*
    Invalid */
  2. A typedef may not be combined with another type specifier:
    typedef int I;
    short I x; /*
    Invalid */
Previous Defect Report < - > Next Defect Report