llvm-capstone/clang/test/Preprocessor/line-directive-output.c
Michael Kruse ae6b400002 [Preprocessor] Implement -fminimize-whitespace.
This patch adds the -fminimize-whitespace with the following effects:

 * If combined with -E, remove as much non-line-breaking whitespace as
   possible.

 * If combined with -E -P, removes as much whitespace as possible,
   including line-breaks.

The motivation is to reduce the amount of insignificant changes in the
preprocessed output with source files where only whitespace has been
changed (add/remove comments, clang-format, etc.) which is in particular
useful with ccache.

A patch for ccache for using this flag has been proposed to ccache as well:
https://github.com/ccache/ccache/pull/815, which will use
-fnormalize-whitespace when clang-13 has been detected, and additionally
uses -P in "unify_mode". ccache already had a unify_mode in an older
version which was removed because of problems that using the
preprocessor itself does not have (such that the custom tokenizer did
not recognize C++11 raw strings).

This patch slightly reorganizes which part is responsible for adding
newlines that are required for semantics. It is now either
startNewLineIfNeeded() or MoveToLine() but never both; this avoids the
ShouldUpdateCurrentLine workaround and avoids redundant lines being
inserted in some cases. It also fixes a mandatory newline not inserted
after a _Pragma("...") that is expanded into a #pragma.

Reviewed By: aaron.ballman

Differential Revision: https://reviews.llvm.org/D104601
2021-07-25 23:30:57 -05:00

87 lines
1.1 KiB
C

// RUN: %clang_cc1 -E %s 2>&1 | FileCheck %s -strict-whitespace
// RUN: %clang_cc1 -E -fminimize-whitespace %s 2>&1 | FileCheck %s -strict-whitespace
// PR6101
int a;
// CHECK: # 1 "{{.*}}line-directive-output.c"
// Check that we do not emit an enter marker for the main file.
// CHECK-NOT: # 1 "{{.*}}line-directive-output.c" 1
// CHECK: int a;
// CHECK-NEXT: # 50 "{{.*}}line-directive-output.c"
// CHECK-NEXT: int b;
#line 50
int b;
// CHECK: # 13 "{{.*}}line-directive-output.c"
// CHECK-NEXT: int c;
# 13
int c;
// CHECK-NEXT: # 1 "A.c"
#line 1 "A.c"
// CHECK-NEXT: # 2 "A.c"
#line 2
// CHECK-NEXT: # 1 "B.c"
#line 1 "B.c"
// CHECK-NEXT: # 1000 "A.c"
#line 1000 "A.c"
int y;
// CHECK: # 1010 "A.c"
int z;
extern int x;
# 3 "temp2.h" 1
extern int y;
# 7 "A.c" 2
extern int z;
// CHECK: # 25 "A.c"
// CHECK: # 50 "C.c" 1
# 50 "C.c" 1
// CHECK-NEXT: # 2000 "A.c" 2
# 2000 "A.c" 2
# 42 "A.c"
# 44 "A.c"
# 49 "A.c"
// CHECK: # 50 "a\n.c"
# 50 "a\012.c"
# 1 "system.h" 3
# 2
void sys_foo(void);
// CHECK: # 1 "system.h" 3
// CHECK-NEXT: # 2 "system.h" 3
// CHECK-NEXT: void sys_foo(void);