Skip to content

Failing to emit line directive if included file has a #if or #define on the first line #222

@njnobles

Description

@njnobles

Wave is not emitting the line directive if the first line in the included file is a #if or #ifdef that evaluates true and has content in its block. Likewise, it won't emit the line directive if the first line is a #define. This issue only occurs if there are not multiple #define or #if occurring on subsequent lines.
When using default_preprocessing_hooks, the above applies if the #if/#ifdef/#define is the first non-empty line or non-comment line. Essentially, if the directive immediately precedes the first content emitted from the included file. With eat_whitespace, the directive must be on the very first line of the include file to exhibit the issue.

Not sure if I've explained it very well, but I think an example will help better demonstrate the issue.

Example:
a.cpp

#include "if.h"
#include "def.h"
test

if.h

#if 1 //This must be on the first line for eat_whitespace, can be on 2nd, 3rd etc, for default_preprocessing_hooks as long as it's whitespace before it
if_h
#endif

def.h

#define A
def_h

Resulting preprocessed file:
a.preproc


if_h

def_h

Expected output:

#line 2 "if.h"
if_h
#line 2 "def.h"
def_h

As mentioned, the line directives do get emitted correctly if the include file is something like this:

#define A
#define B
content

So it's only occurring when there's a single directive at the beginning.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions