Defect Report #101

Submission Date: 03 Dec 93
Submittor: WG14
Source: Ron Guilmette
Question
ANSI/ISO C Defect report #rfg8:
Subclause 6.3.2.2 Function calls says:
If the expression that denotes the called function has a type that includes a prototype, the arguments are implicitly converted, as if by assignment, to the types of the corresponding parameters.
The problem with this statement is the phrase ``as if by assignment.'' The above rule fails to yield an unambiguous meaning in cases where an assignment of the actual to the formal would be prohibited by other rules of the language, as in:
void callee (const int formal);
int actual;
void caller () { callee(actual); }

(Here, the name of the formal parameter formal may be initialized but not assigned to, because it is a non-modifiable lvalue.)
A similar problem exists within subclause 6.6.6.4 The return statement. It says:
If the expression has a type different from that of the function in which it appears, it is converted as if it were assigned to an object of that type.
This statement leaves the validity of the following code open to question:
const int returner () { return 99; }
Last but not least, subclause 6.5.7 Initialization says:
The initializer for a scalar shall be a single expression, optionally enclosed in braces. The initial value of the object is that of the expression; the same type constraints and conversions as for simple assignment apply, ...
This statement leaves the validity of the following code open to question:
const int i = 99;
(Note that assignment to the data object i is not normally permitted, as its name does not represent a modifiable lvalue.)
Response
There are three questions about mismatched type qualifiers in places where conversions ``as if by assignment'' takes place. Two of these are in initialization and in function returns. A careful reading of the C Standard shows that mismatched qualifiers are allowed in these two cases; see subclauses 6.5.7 and 6.5.3 Semantics.
The other issue deals with a qualifier mismatch between arguments and the parameters of a called function. The C Standard should be modified to clarify that such a mismatch is allowed.
Correction
In subclause 6.3.2.2, page 41, second paragraph, change:
If the expression that denotes the called function has a type that includes a prototype, the arguments are implicitly converted, as if by assignment, to the types of the corresponding parameters.
to:
If the expression that denotes the called function has a type that includes a prototype, the arguments are implicitly converted, as if by assignment, to the types of the corresponding parameters, taking the type of each parameter to be the unqualified version of its declared type.
Previous Defect Report < - > Next Defect Report