Defect Report #177

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 025: Preprocessing directives
Preprocessing directives are not removed from the translation unit at any point during or after translation phase 4, and thus wreck the syntax analysis in translation phase 7.
Subclause 5.1.1.1 reads in part:
A source file together with all the headers and source files included via the preprocessing directive #include, less any source lines skipped by any of the conditional inclusion preprocessing directives, is called a translation unit.
Nothing here, in the description of translation phase 4, or in subclause 6.8, states that any preprocessing directive is removed (except for #include, which is replaced).
Consider the source file:
#define QUIT return 0
#if 0
This is some junk
#else
int main (void)
{
puts ("Hello world\n");
#endif
QUIT;
}

The translation unit resulting at the end of translation phase 4 is thus:
#define QUIT return 0
#if 0
#else
int main (void)
{
puts ("Hello world\n");
#endif
return 0;
}

and this clearly does not match the syntax of translation-unit in subclause 6.7.
Suggested Technical Corrigendum
In subclause 5.1.1.2, add at the end of the description of translation phase 4: All preprocessing directives are then removed from the translation unit.

Previous Defect Report < - > Next Defect Report