diff options
author | Lubos Lunak <l.lunak@centrum.cz> | 2019-09-18 19:09:41 +0000 |
---|---|---|
committer | Lubos Lunak <l.lunak@centrum.cz> | 2019-09-18 19:09:41 +0000 |
commit | 533434fc728ad457533fac2c8c4ef7b8906dd05e (patch) | |
tree | 52a84682aa11d89302af2d50f41588961fa89640 /clang/test/Frontend | |
parent | 5741d19f046f24450ebda3a421a8ce49043ad2b8 (diff) | |
download | bcm5719-llvm-533434fc728ad457533fac2c8c4ef7b8906dd05e.tar.gz bcm5719-llvm-533434fc728ad457533fac2c8c4ef7b8906dd05e.zip |
make -frewrite-includes also rewrite conditions in #if/#elif
Those conditions may use __has_include, which needs to be rewritten.
The existing code has already tried to rewrite just __has_include,
but it didn't work with macro expansion, so e.g. Qt's
"#define QT_HAS_INCLUDE(x) __has_include(x)" didn't get handled
properly. Since the preprocessor run knows what each condition evaluates
to, just rewrite the entire condition. This of course requires that
the -frewrite-include pass has the same setup as the following
compilation, but that has always been the requirement.
Differential Revision: https://reviews.llvm.org/D63508
llvm-svn: 372248
Diffstat (limited to 'clang/test/Frontend')
-rw-r--r-- | clang/test/Frontend/rewrite-includes-conditions.c | 107 | ||||
-rw-r--r-- | clang/test/Frontend/rewrite-includes.c | 53 |
2 files changed, 152 insertions, 8 deletions
diff --git a/clang/test/Frontend/rewrite-includes-conditions.c b/clang/test/Frontend/rewrite-includes-conditions.c new file mode 100644 index 00000000000..ec05805032c --- /dev/null +++ b/clang/test/Frontend/rewrite-includes-conditions.c @@ -0,0 +1,107 @@ +// RUN: %clang_cc1 -verify -E -frewrite-includes -I %S/Inputs %s -o - | FileCheck -strict-whitespace %s +// expected-no-diagnostics + +#define value1 1 +#if value1 +line1 +#else +line2 +#endif + +#define value2 2 + +#if value1 == value2 +line3 +#elif value1 > value2 +line4 +#elif value1 < value2 +line5 +#else +line6 +#endif + +#if __has_include(<rewrite-includes1.h>) +#endif + +#define HAS_INCLUDE(x) __has_include(x) + +#if HAS_INCLUDE(<rewrite-includes1.h>) +#endif + +/* +#if value1 +commented out +*/ + +#if value1 < value2 \ +|| value1 != value2 +line7 +#endif + +#if value1 /* +*/ +#endif + +// ENDCOMPARE + +// CHECK: #if 0 /* disabled by -frewrite-includes */ +// CHECK-NEXT: #if value1 +// CHECK-NEXT: #endif +// CHECK-NEXT: #endif /* disabled by -frewrite-includes */ +// CHECK-NEXT: #if 1 /* evaluated by -frewrite-includes */ +// CHECK-NEXT: # 6 "{{.*}}rewrite-includes-conditions.c" + +// CHECK: #if 0 /* disabled by -frewrite-includes */ +// CHECK-NEXT: #if value1 == value2 +// CHECK-NEXT: #endif +// CHECK-NEXT: #endif /* disabled by -frewrite-includes */ +// CHECK-NEXT: #if 0 /* evaluated by -frewrite-includes */ +// CHECK-NEXT: # 14 "{{.*}}rewrite-includes-conditions.c" + +// CHECK: #if 0 /* disabled by -frewrite-includes */ +// CHECK-NEXT: #if 0 +// CHECK-NEXT: #elif value1 > value2 +// CHECK-NEXT: #endif +// CHECK-NEXT: #endif /* disabled by -frewrite-includes */ +// CHECK-NEXT: #elif 0 /* evaluated by -frewrite-includes */ +// CHECK-NEXT: # 16 "{{.*}}rewrite-includes-conditions.c" + +// CHECK: #if 0 /* disabled by -frewrite-includes */ +// CHECK-NEXT: #if 0 +// CHECK-NEXT: #elif value1 < value2 +// CHECK-NEXT: #endif +// CHECK-NEXT: #endif /* disabled by -frewrite-includes */ +// CHECK-NEXT: #elif 1 /* evaluated by -frewrite-includes */ +// CHECK-NEXT: # 18 "{{.*}}rewrite-includes-conditions.c" + +// CHECK: #if 0 /* disabled by -frewrite-includes */ +// CHECK-NEXT: #if __has_include(<rewrite-includes1.h>) +// CHECK-NEXT: #endif +// CHECK-NEXT: #endif /* disabled by -frewrite-includes */ +// CHECK-NEXT: #if 1 /* evaluated by -frewrite-includes */ +// CHECK-NEXT: # 24 "{{.*}}rewrite-includes-conditions.c" + +// CHECK: #if 0 /* disabled by -frewrite-includes */ +// CHECK-NEXT: #if HAS_INCLUDE(<rewrite-includes1.h>) +// CHECK-NEXT: #endif +// CHECK-NEXT: #endif /* disabled by -frewrite-includes */ +// CHECK-NEXT: #if 1 /* evaluated by -frewrite-includes */ +// CHECK-NEXT: # 29 "{{.*}}rewrite-includes-conditions.c" + +// CHECK: #if 0 /* disabled by -frewrite-includes */ +// CHECK-NEXT: #if value1 < value2 \ +// CHECK-NEXT: || value1 != value2 +// CHECK-NEXT: #endif +// CHECK-NEXT: #endif /* disabled by -frewrite-includes */ +// CHECK-NEXT: #if 1 /* evaluated by -frewrite-includes */ +// CHECK-NEXT: # 38 "{{.*}}rewrite-includes-conditions.c" + +// CHECK: #if 0 /* disabled by -frewrite-includes */ +// CHECK-NEXT: #if value1 /* +// CHECK-NEXT: */ +// CHECK-NEXT: #endif +// CHECK-NEXT: #endif /* disabled by -frewrite-includes */ +// CHECK-NEXT: #if 1 /* evaluated by -frewrite-includes */ +// CHECK-NEXT: # 43 "{{.*}}rewrite-includes-conditions.c" + +// CHECK: {{^}}// ENDCOMPARE{{$}} diff --git a/clang/test/Frontend/rewrite-includes.c b/clang/test/Frontend/rewrite-includes.c index 630e761cab2..ec8c4130e32 100644 --- a/clang/test/Frontend/rewrite-includes.c +++ b/clang/test/Frontend/rewrite-includes.c @@ -110,12 +110,27 @@ A(1,2) // CHECK-NEXT: {{^}}#endif /* expanded by -frewrite-includes */{{$}} // CHECK-NEXT: {{^}}# 22 "{{.*}}rewrite-includes.c"{{$}} // CHECK-NEXT: {{^}}# 1 "{{.*[/\\]Inputs(/|\\\\)}}rewrite-includes8.h" 1{{$}} -// CHECK-NEXT: {{^}}#if (0)/*__has_include_next(<rewrite-includes8.h>)*/{{$}} -// CHECK-NEXT: {{^}}#elif (0)/*__has_include(<rewrite-includes8.hfail>)*/{{$}} +// CHECK-NEXT: {{^}}#if 0 /* disabled by -frewrite-includes */{{$}} +// CHECK-NEXT: {{^}}#if __has_include_next(<rewrite-includes8.h>){{$}} +// CHECK-NEXT: {{^}}#endif{{$}} +// CHECK-NEXT: {{^}}#endif /* disabled by -frewrite-includes */{{$}} +// CHECK-NEXT: {{^}}#if 0 /* evaluated by -frewrite-includes */{{$}} +// CHECK-NEXT: {{^}}# 2 "{{.*[/\\]Inputs(/|\\\\)}}rewrite-includes8.h"{{$}} +// CHECK-NEXT: {{^}}#if 0 /* disabled by -frewrite-includes */{{$}} +// CHECK-NEXT: {{^}}#if 0{{$}} +// CHECK-NEXT: {{^}}#elif __has_include(<rewrite-includes8.hfail>){{$}} +// CHECK-NEXT: {{^}}#endif{{$}} +// CHECK-NEXT: {{^}}#endif /* disabled by -frewrite-includes */{{$}} +// CHECK-NEXT: {{^}}#elif 0 /* evaluated by -frewrite-includes */{{$}} // CHECK-NEXT: {{^}}# 3 "{{.*[/\\]Inputs(/|\\\\)}}rewrite-includes8.h"{{$}} // CHECK-NEXT: {{^}}#endif{{$}} // CHECK-NEXT: {{^}}# 4 "{{.*[/\\]Inputs(/|\\\\)}}rewrite-includes8.h"{{$}} -// CHECK-NEXT: {{^}}#if !(1)/*__has_include("rewrite-includes8.h")*/{{$}} +// CHECK-NEXT: {{^}}#if 0 /* disabled by -frewrite-includes */{{$}} +// CHECK-NEXT: {{^}}#if !__has_include("rewrite-includes8.h"){{$}} +// CHECK-NEXT: {{^}}#endif{{$}} +// CHECK-NEXT: {{^}}#endif /* disabled by -frewrite-includes */{{$}} +// CHECK-NEXT: {{^}}#if 0 /* evaluated by -frewrite-includes */{{$}} +// CHECK-NEXT: {{^}}# 5 "{{.*[/\\]Inputs(/|\\\\)}}rewrite-includes8.h"{{$}} // CHECK-NEXT: {{^}}#endif{{$}} // CHECK-NEXT: {{^}}# 6 "{{.*[/\\]Inputs(/|\\\\)}}rewrite-includes8.h"{{$}} // CHECK-NEXT: {{^}}# 23 "{{.*}}rewrite-includes.c" 2{{$}} @@ -124,7 +139,12 @@ A(1,2) // CHECK-NEXT: {{^}}#endif /* expanded by -frewrite-includes */{{$}} // CHECK-NEXT: {{^}}# 23 "{{.*}}rewrite-includes.c"{{$}} // CHECK-NEXT: {{^}}# 1 "{{.*[/\\]Inputs(/|\\\\)}}rewrite-includes9.h" 1{{$}} -// CHECK-NEXT: {{^}}#if (1)/*__has_include_next(<rewrite-includes9.h>)*/{{$}} +// CHECK-NEXT: {{^}}#if 0 /* disabled by -frewrite-includes */{{$}} +// CHECK-NEXT: {{^}}#if __has_include_next(<rewrite-includes9.h>){{$}} +// CHECK-NEXT: {{^}}#endif{{$}} +// CHECK-NEXT: {{^}}#endif /* disabled by -frewrite-includes */{{$}} +// CHECK-NEXT: {{^}}#if 1 /* evaluated by -frewrite-includes */{{$}} +// CHECK-NEXT: {{^}}# 2 "{{.*[/\\]Inputs(/|\\\\)}}rewrite-includes9.h"{{$}} // CHECK-NEXT: {{^}}#if 0 /* expanded by -frewrite-includes */{{$}} // CHECK-NEXT: {{^}}#include_next <rewrite-includes9.h>{{$}} // CHECK-NEXT: {{^}}#endif /* expanded by -frewrite-includes */{{$}} @@ -193,15 +213,32 @@ A(1,2) // CHECKNL-NEXT: {{^}}#if 0 /* expanded by -frewrite-includes */{{$}} // CHECKNL-NEXT: {{^}}#include "rewrite-includes8.h"{{$}} // CHECKNL-NEXT: {{^}}#endif /* expanded by -frewrite-includes */{{$}} -// CHECKNL-NEXT: {{^}}#if (0)/*__has_include_next(<rewrite-includes8.h>)*/{{$}} -// CHECKNL-NEXT: {{^}}#elif (0)/*__has_include(<rewrite-includes8.hfail>)*/{{$}} +// CHECKNL-NEXT: {{^}}#if 0 /* disabled by -frewrite-includes */{{$}} +// CHECKNL-NEXT: {{^}}#if __has_include_next(<rewrite-includes8.h>){{$}} // CHECKNL-NEXT: {{^}}#endif{{$}} -// CHECKNL-NEXT: {{^}}#if !(1)/*__has_include("rewrite-includes8.h")*/{{$}} +// CHECKNL-NEXT: {{^}}#endif /* disabled by -frewrite-includes */{{$}} +// CHECKNL-NEXT: {{^}}#if 0 /* evaluated by -frewrite-includes */{{$}} +// CHECKNL-NEXT: {{^}}#if 0 /* disabled by -frewrite-includes */{{$}} +// CHECKNL-NEXT: {{^}}#if 0{{$}} +// CHECKNL-NEXT: {{^}}#elif __has_include(<rewrite-includes8.hfail>){{$}} +// CHECKNL-NEXT: {{^}}#endif{{$}} +// CHECKNL-NEXT: {{^}}#endif /* disabled by -frewrite-includes */{{$}} +// CHECKNL-NEXT: {{^}}#elif 0 /* evaluated by -frewrite-includes */{{$}} +// CHECKNL-NEXT: {{^}}#endif{{$}} +// CHECKNL-NEXT: {{^}}#if 0 /* disabled by -frewrite-includes */{{$}} +// CHECKNL-NEXT: {{^}}#if !__has_include("rewrite-includes8.h"){{$}} +// CHECKNL-NEXT: {{^}}#endif{{$}} +// CHECKNL-NEXT: {{^}}#endif /* disabled by -frewrite-includes */{{$}} +// CHECKNL-NEXT: {{^}}#if 0 /* evaluated by -frewrite-includes */{{$}} // CHECKNL-NEXT: {{^}}#endif{{$}} // CHECKNL-NEXT: {{^}}#if 0 /* expanded by -frewrite-includes */{{$}} // CHECKNL-NEXT: {{^}}#include "rewrite-includes9.h"{{$}} // CHECKNL-NEXT: {{^}}#endif /* expanded by -frewrite-includes */{{$}} -// CHECKNL-NEXT: {{^}}#if (1)/*__has_include_next(<rewrite-includes9.h>)*/{{$}} +// CHECKNL-NEXT: {{^}}#if 0 /* disabled by -frewrite-includes */{{$}} +// CHECKNL-NEXT: {{^}}#if __has_include_next(<rewrite-includes9.h>){{$}} +// CHECKNL-NEXT: {{^}}#endif{{$}} +// CHECKNL-NEXT: {{^}}#endif /* disabled by -frewrite-includes */{{$}} +// CHECKNL-NEXT: {{^}}#if 1 /* evaluated by -frewrite-includes */{{$}} // CHECKNL-NEXT: {{^}}#if 0 /* expanded by -frewrite-includes */{{$}} // CHECKNL-NEXT: {{^}}#include_next <rewrite-includes9.h>{{$}} // CHECKNL-NEXT: {{^}}#endif /* expanded by -frewrite-includes */{{$}} |