diff options
| -rw-r--r-- | io.c | 18 | ||||
| -rw-r--r-- | tests/096.sh | 41 |
2 files changed, 59 insertions, 0 deletions
@@ -57,6 +57,24 @@ BOOL infile_eof(InFile* f) { char infile_peek_char(InFile* f) { char c = f->buf[f->pos]; + + // Skip a pair of backslash and new-line. + if (c == '\\') { + char c2 = f->buf[f->pos + 1]; + // C23: 5.1.1.2 + // A source file that is not empty shall end in a new-line character, + // which shall not be immediately preceded by a backslash character + // before any such splicing takes place. + if (c2 == '\0') { + fatal_error("%s:%d: <new-line> expected, but got <eof>", f->loc.filename, f->loc.line); + } + // TODO: crlf + if (c2 == '\r' || c2 == '\n') { + f->pos += 2; + return infile_peek_char(f); + } + } + // Normalize new-line. // TODO: crlf if (c == '\r') diff --git a/tests/096.sh b/tests/096.sh new file mode 100644 index 0000000..8bd6848 --- /dev/null +++ b/tests/096.sh @@ -0,0 +1,41 @@ +set -e + +cat <<'EOF' > expected +10 20 +100 300 500 +EOF + +bash ../../test_diff.sh <<'EOF' +int printf(); +in\ +t ma\ +in() { + int x = 1\ +0; + + int y = 2\ +\ +\ +0; + +#def\ +ine X 100 +#define Y 100 + \ +200 +#define Z /* +*/ 500 + // comment \ + x *= 100, y *= 200; + /* comment *\ +/ + + printf("%d %d\n", x, y); + printf("%d %d %d\n", X, Y, Z); +} +EOF + +cat <<'EOF' > expected +main.c:1: <new-line> expected, but got <eof> +EOF + +echo -n 'int main() {}\' | bash ../../test_compile_error.sh |
