Skip to content

bug: Parse error with macro-generated enum values #309

@alexle0nte

Description

@alexle0nte

Did you check existing issues?

  • I have read all the tree-sitter docs if it relates to using the parser
  • I have searched the existing issues of tree-sitter-cpp

Tree-Sitter CLI Version, if relevant (output of tree-sitter --version)

tree-sitter 0.25.3 (2a835ee029dca1c325e6f1c01dbce40396f6123e)

Describe the bug

When parsing code that defines an enum using macro expansion, the parse tree incorrectly reports an ERROR node.
For example, given the following snippet:

#define ERROR_LIST(APPLY) \
    APPLY(ERR_OK, 0, "Success") \
    APPLY(ERR_FAIL, 1, "Failure")

enum Error {
  #define DEFINE(NAME, VALUE, DESC) NAME = VALUE,
      ERROR_LIST(DEFINE)
  #undef DEFINE
};

The following error appears in the parse tree: (ERROR [5, 2] - [6, 24].

Steps To Reproduce/Bad Parse Tree

  1. Write the code above in a C++ file.
  2. Run tree-sitter parse on the file.
  3. Observe the obtained parse tree:
(translation_unit [0, 0] - [10, 0]
  (preproc_function_def [0, 0] - [3, 0]
    name: (identifier [0, 8] - [0, 18])
    parameters: (preproc_params [0, 18] - [0, 25]
      (identifier [0, 19] - [0, 24]))
    value: (preproc_arg [1, 4] - [2, 33]))
  (enum_specifier [4, 0] - [8, 1]
    name: (type_identifier [4, 5] - [4, 10])
    body: (enumerator_list [4, 11] - [8, 1]
      (ERROR [5, 2] - [6, 24]
        (preproc_call [5, 2] - [6, 0]
          directive: (preproc_directive [5, 2] - [5, 9])
          argument: (preproc_arg [5, 10] - [5, 49]))
        (identifier [6, 6] - [6, 16])
        (identifier [6, 17] - [6, 23]))
      (preproc_call [7, 2] - [8, 0]
        directive: (preproc_directive [7, 2] - [7, 8])
        argument: (preproc_arg [7, 9] - [7, 15])))))

Expected Behavior/Parse Tree

The parse tree should not have errors.

Repro

#define ERROR_LIST(APPLY) \
    APPLY(ERR_OK, 0, "Success") \
    APPLY(ERR_FAIL, 1, "Failure")

enum Error {
  #define DEFINE(NAME, VALUE, DESC) NAME = VALUE,
      ERROR_LIST(DEFINE)
  #undef DEFINE
};

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions