Defect Report #170
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 018: Operators and punctuators
The description of operators and punctuators is confusing, and the
constraints are contradictory.
Subclause 6.1.5 Constraints reads:
The operators [ ], ( ), and
? : shall occur in pairs, possibly separated by
expressions. The operators # and ##
shall occur in macro-defining preprocessing directives only.
Subclause 6.1.6 Constraints reads:
The punctuators [ ], ( ), and
{ } shall occur (after translation phase 4) in pairs,
possibly separated by expressions, declarations, or statements. The
punctuator # shall occur in preprocessing directives
only.
Consider the code:
#define STR(x) #x
STR ({) /* Line A */
STR (:) /*
Line B */
STR ([) /* Line C */
STR (#) /* Line D */
Line A appears to be strictly conforming, since the first
sentence of the constraint of subclause 6.1.6 does not apply during
translation phase 4. Line B violates the constraint of subclause 6.1.5.
The interpretation of line C depends on whether the [
is an operator or a punctuator!
Line D violates both constraints, but again which one depends on
whether it is an operator or a punctuator, something which is not made
clear in the C Standard.
Assuming that the intent was for line B to be strictly conforming,
and that (after translation phase 4) was inadvertently omitted
from subclause 6.1.5, the first sentence of each of these Constraints
is nugatory, as any program that violates these constraints also
violates a syntax rule elsewhere in clause 6. The remaining sentences
would be better expressed as part of subclause 6.8. It is also arguable
that the concepts of operator and punctuator are better merged at the
syntactic level, and separated out only at the semantic level.
Suggested Technical Corrigendum
Delete the Constraints of subclauses 6.1.5 and 6.1.6. Add the
following constraint to 6.8:
A # preprocessing token shall only occur within
a replacement-list or when permitted by the syntax rules of this
subclause. A ## preprocessing token shall only occur
within a replacement-list.
Add to the end of the Constraints of subclause 6.1, just before
the full stop:
, and shall not be # or ##
Alternative Suggested Technical Corrigendum
In subclause 6.1 syntax, delete both occurences of operator
and replace the second occurence of punctuator by pp-punctuator.
Delete subclauses 6.1.5 and 6.1.6, and replace them by the
following:
6.1.5 Punctuators
Syntax:
pp-punctuator:
punctuator
pp-only-punctuator
pp-only-punctuator: one of
# ## defined
punctuator:
[ ]
( ) { } . -
++ -- & * + - ~ ! sizeof
/ % = = == != ^ | && ||
? : , :
; ...
= *= /= %= += -= = = &= ^= |=
Semantics:
A punctuator is a symbol that has independent syntactic and
semantic significance. Depending on context, some punctuators may
specify an operation to be performed (an evaluation) that yields
a value, or yields a designator, or produces a side-effect, or a
combination thereof; in that context, the punctuator is known as an operator.
An operand is an entity on which an operator acts.
Add the following constraint to 6.8:
A # preprocessing token shall only occur within
a replacement-list or when permitted by the syntax rules of this
subclause. A ## preprocessing token shall only occur
within a replacement-list.
Response
This is a work in progress item.
General feeling is that this should be cleaned up for C9X along
the lines of C++ pp-punctuator grammar.
Suggested response is to add words to subclause 6.1.5 along the
lines,
shall occur in pairs within expressions...
Previous Defect Report
< - >
Next Defect Report