diff --git a/clang/lib/Frontend/PrintPreprocessedOutput.cpp b/clang/lib/Frontend/PrintPreprocessedOutput.cpp --- a/clang/lib/Frontend/PrintPreprocessedOutput.cpp +++ b/clang/lib/Frontend/PrintPreprocessedOutput.cpp @@ -276,20 +276,27 @@ // otherwise print a #line directive. if (CurLine == LineNo) { // Nothing to do if we are already on the correct line. - } else if (!StartedNewLine && (!MinimizeWhitespace || !DisableLineMarkers) && - LineNo - CurLine == 1) { + } else if (MinimizeWhitespace && DisableLineMarkers) { + // With -E -P -fminimize-whitespace, don't emit anything if not necessary. + } else if (!StartedNewLine && LineNo - CurLine == 1) { // Printing a single line has priority over printing a #line directive, even // when minimizing whitespace which otherwise would print #line directives // for every single line. OS << '\n'; StartedNewLine = true; - } else if (!MinimizeWhitespace && LineNo - CurLine <= 8) { - const char *NewLines = "\n\n\n\n\n\n\n\n"; - OS.write(NewLines, LineNo - CurLine); - StartedNewLine = true; } else if (!DisableLineMarkers) { - // Emit a #line or line marker. - WriteLineInfo(LineNo, nullptr, 0); + if (LineNo - CurLine <= 8) { + const char *NewLines = "\n\n\n\n\n\n\n\n"; + OS.write(NewLines, LineNo - CurLine); + } else { + // Emit a #line or line marker. + WriteLineInfo(LineNo, nullptr, 0); + } + StartedNewLine = true; + } else if (!StartedNewLine) { + // If we are not on the correct line and don't need to be line-correct, + // at least ensure we start on a new line. + OS << '\n'; StartedNewLine = true; } diff --git a/clang/test/Preprocessor/line-directive-output-mincol.c b/clang/test/Preprocessor/line-directive-output-mincol.c deleted file mode 100644 --- a/clang/test/Preprocessor/line-directive-output-mincol.c +++ /dev/null @@ -1,11 +0,0 @@ -// RUN: %clang_cc1 -E -fminimize-whitespace %s 2>&1 | FileCheck %s -strict-whitespace - -// CHECK: # 6 "{{.*}}line-directive-output-mincol.c" -// CHECK-NEXT: int x; -// CHECK-NEXT: int y; -int x; -int y; -// CHECK-NEXT: # 10 "{{.*}}line-directive-output-mincol.c" -// CHECK-NEXT: int z; -int z; - diff --git a/clang/test/Preprocessor/minimize-whitespace.c b/clang/test/Preprocessor/minimize-whitespace.c --- a/clang/test/Preprocessor/minimize-whitespace.c +++ b/clang/test/Preprocessor/minimize-whitespace.c @@ -2,6 +2,12 @@ // RUN: %clang_cc1 -fminimize-whitespace -E -C %s 2>&1 | FileCheck %s --strict-whitespace --check-prefix=MINCCOL // RUN: %clang_cc1 -fminimize-whitespace -E -P %s 2>&1 | FileCheck %s --strict-whitespace --check-prefix=MINWS // RUN: %clang_cc1 -fminimize-whitespace -E -C -P %s 2>&1 | FileCheck %s --strict-whitespace --check-prefix=MINCWS +// The follow empty lines ensure that a #line directive is emitted instead of newline padding after the RUN comments. + + + + + #define NOT_OMP omp something #define HASH # @@ -16,11 +22,11 @@ f ; -// MINCOL: {{^}}# 9 "{{.*}}minimize-whitespace.c"{{$}} +// MINCOL: {{^}}# 15 "{{.*}}minimize-whitespace.c"{{$}} // MINCOL: {{^}}int a;{{$}} // MINCOL-NEXT: {{^}}int b;{{$}} // MINCOL-NEXT: {{^}}#pragma omp barrier{{$}} -// MINCOL-NEXT: # 11 "{{.*}}minimize-whitespace.c" +// MINCOL-NEXT: # 17 "{{.*}}minimize-whitespace.c" // MINCOL-NEXT: {{^}}x{{$}} // MINCOL-NEXT: {{^}}#pragma omp nothing{{$}} // MINCOL-NEXT: {{^ }}#pragma omp something{{$}} @@ -28,11 +34,11 @@ // MINCOL-NEXT: {{^}}int f;{{$}} // FIXME: Comments after pragmas disappear, even without -fminimize-whitespace -// MINCCOL: {{^}}# 9 "{{.*}}minimize-whitespace.c"{{$}} +// MINCCOL: {{^}}# 15 "{{.*}}minimize-whitespace.c"{{$}} // MINCCOL: {{^}}int a;/* span-comment */{{$}} // MINCCOL-NEXT: {{^}}int b;// line-comment{{$}} // MINCCOL-NEXT: {{^}}#pragma omp barrier{{$}} -// MINCCOL-NEXT: # 11 "{{.*}}minimize-whitespace.c" +// MINCCOL-NEXT: # 17 "{{.*}}minimize-whitespace.c" // MINCCOL-NEXT: {{^}}x// more line-comments{{$}} // MINCCOL-NEXT: {{^}}#pragma omp nothing{{$}} // MINCCOL-NEXT: {{^ }}#pragma omp something{{$}} diff --git a/clang/test/Preprocessor/skip-empty-lines.c b/clang/test/Preprocessor/skip-empty-lines.c new file mode 100644 --- /dev/null +++ b/clang/test/Preprocessor/skip-empty-lines.c @@ -0,0 +1,45 @@ + int a ; + int b ; +// A single empty line + int c ; +/* + +more than 8 empty lines +(forces a line marker instead of newline padding) + + + + +*/ + int d ; + +// RUN: %clang_cc1 -E %s 2>&1 | FileCheck %s --strict-whitespace --check-prefix=LINEMARKERS +// RUN: %clang_cc1 -E -P %s 2>&1 | FileCheck %s --strict-whitespace --check-prefix=COLSONLY +// RUN: %clang_cc1 -E -fminimize-whitespace %s 2>&1 | FileCheck %s --strict-whitespace --check-prefix=MINCOL +// RUN: %clang_cc1 -E -P -fminimize-whitespace %s 2>&1 | FileCheck %s --strict-whitespace --check-prefix=MINWS + +// Check behavior after varying number of lines without emitted tokens. + +// LINEMARKERS: {{^}}# 1 "{{.*}}skip-empty-lines.c" 2 +// LINEMARKERS-NEXT: {{^}} int a ; +// LINEMARKERS-NEXT: {{^}} int b ; +// LINEMARKERS-EMPTY: +// LINEMARKERS-NEXT: {{^}} int c ; +// LINEMARKERS-NEXT: {{^}}# 14 "{{.*}}skip-empty-lines.c" +// LINEMARKERS-NEXT: {{^}} int d ; + +// COLSONLY: {{^}} int a ; +// COLSONLY-NEXT: {{^}} int b ; +// COLSONLY-NEXT: {{^}} int c ; +// COLSONLY-NEXT: {{^}} int d ; + +// MINCOL: {{^}}# 1 "{{.*}}skip-empty-lines.c" 2 +// MINCOL-NEXT: {{^}}int a; +// MINCOL-NEXT: {{^}}int b; +// MINCOL-EMPTY: +// MINCOL-NEXT: {{^}}int c; +// MINCOL-NEXT: {{^}}# 14 "{{.*}}skip-empty-lines.c" +// MINCOL-NEXT: {{^}}int d; + +// MINWS: {{^}}int a;int b;int c;int d; +