[YAML I/O] Fix bug in emission of empty sequence
authorJonas Devlieghere <jonas@devlieghere.com>
Mon, 25 Jan 2021 21:02:20 +0000 (13:02 -0800)
committerJonas Devlieghere <jonas@devlieghere.com>
Mon, 25 Jan 2021 21:35:36 +0000 (13:35 -0800)
commitf50b8ee71faeb5056df7a950e7427f3047ff9987
treec7b5ea1973c7ba8ca2db5fe546079f1710280f97
parentdb1a7089eaf0c4df5e1fbfe974716f2bb6cb77e8
[YAML I/O] Fix bug in emission of empty sequence

Don't emit an output dash for an empty sequence. Take emitting a vector
of strings for example:

  std::vector<std::string> Strings = {"foo", "bar"};
  LLVM_YAML_IS_SEQUENCE_VECTOR(std::string)
  yout << Strings;

This emits the following YAML document.

  ---
  - foo
  - bar
  ...

When the vector is empty, this generates the following result:

  ---
  - []
  ...

Although this is valid YAML, it does not match what we meant to emit.
The result is a one-element sequence consisting of an empty list.
Indeed, if we were to try to read this again we get an error:

  YAML:2:4: error: not a mapping
  - []

The problem is the output dash before the empty list. The correct output
would be:

  ---
  []
  ...

This patch fixes that by not emitting the output dash for an empty
sequence.

Differential revision: https://reviews.llvm.org/D95280
llvm/include/llvm/Support/YAMLTraits.h
llvm/lib/Support/YAMLTraits.cpp
llvm/unittests/Support/YAMLIOTest.cpp