Defect Report #099

Submission Date: 03 Dec 93
Submittor: WG14
Source: Ron Guilmette
Question
ANSI/ISO C Defect report #rfg6:
Subclause 6.2.1.5 explicitly allows an implementation to evaluate a floating-point expression using some type which has more precision than the apparent type of the expression itself:
The values of floating operands and the results of floating expressions may be represented in greater precision and range than that required by the type, ...
A footnote on this rule also says explicitly that:
The cast and assignment operators still must perform their specified conversions, as described in 6.2.1.3 and 6.2.1.4.
As noted in the first of these two quotes (above) some compilers (most notably for x86 and mc680x0 target systems) may perform floating-point expression evaluation using a type which has more precision and/or range than that of the ``apparent type'' of the expression being evaluated.
The clear implication of the above rules is that compilers must sometimes generate code to implement narrowing of floating-point expression results, when (a) those results were generated using a format with more precision and/or range than the ``apparent type'' of the expression would seem to call for, and where (b) the expression result is the operand of a cast or is used as an operand of an ``assignment operator.''
My question is simply this: For the purposes of the above rules, does the term ``assignment operator'' mean exactly (and only) those operators listed in subclause 6.3.3.16, or should implementors and users expect that other operations described within the C Standard as being similar to ``assignment'' will also produce floating-point narrowing effects (under the right conditions)?
Specifically, may (or must) implicit floating-point narrowing occur as a result of parameter passing if the actual argument expression is evaluated in a format which is wider than its ``apparent type?'' May (or must) implicit floating-point narrowing occur as a result of a return statement if the return statement contains a floating-point expression which is evaluated in some format which is wider than its ``apparent type?''
Here are two examples illustrating these two questions. Imagine that these examples will be compiled for a type of target system which is capable of performing floating-point addition only on floating-point operands which are represented in the same floating-point format normally used to hold type long double operands in C:
Example 1:
extern void callee (); /* non-prototyped */
double a, b;

void caller ()
{
callee(a+b); /*
evaluated in long double then narrowed? */
}

Example 2:
double a, b;

double returner ()
{
return a+b; /*
evaluated in long double then narrowed? */
}

Response
A careful reading of the C Standard indicates that everything that is done ``as if by assignment'' must pass through a knot-hole (be narrowed). See the following references: subclause 6.3.16 for assignment, 6.3.2.2 for parameters, and 6.6.6.4 for return types.
Previous Defect Report < - > Next Defect Report