Skip to content

Unexpected behavior when ending macro with `` #1684

@incandwo

Description

@incandwo

Calling vppreproc --simple on the file below

`define EMPTY

////////////////////////////////////////////////////////////
`define macro_v0(LABEL)     \
  class foo_``LABEL;         \
  endclass : foo_``LABEL

package p_v0;
  `macro_v0(bar)
endpackage

////////////////////////////////////////////////////////////
`define macro_v1(LABEL)     \
  class foo_``LABEL``;       \
  endclass : foo_``LABEL``

package p_v1;
  `macro_v1(bar)
endpackage

////////////////////////////////////////////////////////////
`define macro_v2(LABEL)     \
  class foo_``LABEL``;       \
  endclass : foo_``LABEL``

package p_v2;
  `macro_v2(bar)
  `EMPTY
endpackage

////////////////////////////////////////////////////////////
`define macro_v3(LABEL)     \
  class foo_``LABEL``;       \
  endclass : foo_``LABEL``   // one line comment

package p_v3;
  `macro_v3(bar)
endpackage

////////////////////////////////////////////////////////////
`define macro_v4(LABEL)     \
  class foo_``LABEL``;       \
  endclass : foo_``LABEL``   /* multi line comment */

package p_v4;
  `macro_v4(bar)
endpackage

yields

package p_v0;
  class foo_bar;         
  endclass : foo_bar
endpackage
package p_v1;
  class foo_bar;       
  endclass : 
foo_barendpackage
package p_v2;
  class foo_bar;       
  endclass : 
  foo_bar
endpackage
package p_v3;
  class foo_bar;       
  endclass : 
foo_barendpackage
package p_v4;
  class foo_bar;       
  endclass :    foo_bar 
endpackage

which is unexpected. I've annotated it below with my expectation

package p_v0;
  class foo_bar;         
  endclass : foo_bar
endpackage

package p_v1;
  class foo_bar;       
  endclass : <- unexpected newline before "foo_"
foo_barendpackage <- unexpected concatenation of "_bar" and "endpackage", expected newline post macro call to break both up

package p_v2;
  class foo_bar;       
  endclass : <- unexpected newline before "foo_"
  foo_bar
endpackage

package p_v3; <- same as v1
  class foo_bar;       
  endclass : 
foo_barendpackage

package p_v4;
  class foo_bar;       
  endclass :    foo_bar 
endpackage

Compiling the original code w/ Cadence Xcellium (xrun) passes and seems to work fine.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions