https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119798

            Bug ID: 119798
           Summary: Preprocessor skipping since C17 and C++17
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: preprocessor
          Assignee: unassigned at gcc dot gnu.org
          Reporter: neilb at protonmail dot ch
  Target Milestone: ---

Consider

#if 1                  
#else foo                 
#endif                    

GCC diagnoses the #else with an error with pedantic-errors.

#if 1
#elif
#endif

However GCC accepts without complaint the #elif above even with
pedantic-errors.

This is clearly illogical, and I believe it was corrected by C17 and C++17
standards so both are conforming when noticed by the commmittees.  The updated
wording is "Only the first group whose control condition evaluates to true
(nonzero) is processed; any following groups are skipped and their controlling
directives are processed as if they were in a group that is skipped."  The
wording after the semicolon was new, the pertinent point being the part about
the controlling directive.  I understand this was viewed as a defect in earlier
standards rather than a new "feature", so if GCC developers view this as worth
fixing I suggest it be unconditional and not dependent on language standard
version.

Note both are ill-formed when replacing "#if 1" with "#if 0".

Reply via email to