Defect Report #163
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 011: Undeclared identifiers
The C Standard is not clear on whether the use of an undeclared
identifier as a primary expression requires a diagnostic message.
Subclause 6.3.1 states that:
An identifier is a primary expression, provided it has been
declared as designating an object (in which case it is an lvalue) or a
function (in which case it is a function designator).
It has been suggested that if no declaration of some identifier is
visible in the current scope when that identifier appears in an
expression, the identifier is not a primary expression, and therefore
the syntax of subclause 6.3.1 is violated (in other words, there is no
valid parse for the expression). This would thus require a diagnostic
for an undeclared identifier.
Is this interpretation correct? If yes, then it needs to be made
clear that this does not prevent a previously undeclared function from
being called by a strictly conforming program (see 6.3.2.2).
If not, does an undeclared identifier require a diagnostic, and if
so, why? If not, is this a deliberate policy, or is it a defect that
needs correction?
Response
Identifiers that designate objects must be declared and be visible
before they can be primary expressions (subclause 6.1.2.1, An
identifier is visible (i.e., can be used) ...). A reasonable person
could interpret that if no declaration of some identifier is visible,
the identifier cannot be a primary expression. This affects undeclared
identifiers that are intended to be used as implicitly declared
functions. The Committee's intent is that the C Standard be read in the
following order:
1. 6.3.1 Primary expressions
Syntax
primary-expression:
identifier
2. 6.3.2.2 Function calls
Semantics
If the expression that precedes the parenthesized argument list
in a function call consists solely of an identifier, and if no
declaration is visible for this identifier, the identifier is
implicitly declared exactly as if, in the innermost block containing the
function call, the declaration
extern int identifier();
appeared.
3. 6.3.1 Primary expressions
Semantics
An identifier is a primary expression, provided it has been
declared as designating ... a function (...).
However, a reasonable person may not interpret the current wording
as having that meaning (i.e., it might not be read in that order).
This needs to be clarified in the next revision of the C Standard.
Response
Identifiers must be declared and visible before they can be
primary expressions (Subclause 6.1.2.1, "An identifier is
visible (i.e., can be used) ..."). If no declaration of
some identifier is visible, the identifier cannot be a
primary expression, and a diagnostic is required for a
violation of the syntax rule.
Note that a declaration of an identifier might be visible due to
the identifier being implicitly declared (Subclause 6.3.2.2).
This should be clarified in the Standard.
Future Change
In Subclause 6.3.1, first paragraph in "Semantics"
Change
"An identifier is a primary expression, provided is has been declared
as designating an object (in which case it is an lvalue) or a function
(in which case it is a function designator)."
To
"An identifier is a primary expression, provided is has been declared
as designating an object (in which case it is an lvalue) or implicitly*
or explicitly declared as designating a function (in which case it is a
function designator)."
The * above references the new footnote:
"See 6.3.2.2."
Previous Defect Report
< - >
Next Defect Report