Defect Report #177

Submission Date: 16 Oct 95
Submittor: BSI
Source: Clive D.W. Feather
QuestionSubmitted to BSI by Clive D.W. Feather clive@sco.com .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.