aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2020-01-28 07:58:29 -0800
committerNathan Sidwell <nathan@acm.org>2020-01-28 08:02:17 -0800
commit3d056cbfb3484f4037b34c908b26e1c6776c86b5 (patch)
tree591410d4cd98b8777276072cc5af998a3f97d97c /gcc
parenta5d81aaab6d54379cd3835b33d84d9be5c5be099 (diff)
downloadgcc-3d056cbfb3484f4037b34c908b26e1c6776c86b5.zip
gcc-3d056cbfb3484f4037b34c908b26e1c6776c86b5.tar.gz
gcc-3d056cbfb3484f4037b34c908b26e1c6776c86b5.tar.bz2
preprocessor: Make __has_include a builtin macro [PR93452]
The clever hack of '#define __has_include __has_include' breaks -dD and -fdirectives-only, because that emits definitions. This turns __has_include into a proper builtin macro. Thus it's never emitted via -dD, and because use outside of directive processing is undefined, we can just expand it anywhere. PR preprocessor/93452 * internal.h (struct spec_nodes): Drop n__has_include{,_next}. * directives.c (lex_macro_node): Don't check __has_include redef. * expr.c (eval_token): Drop __has_include eval. (parse_has_include): Move to ... * macro.c (builtin_has_include): ... here. (_cpp_builtin_macro_text): Eval __has_include{,_next}. * include/cpplib.h (enum cpp_builtin_type): Add BT_HAS_INCLUDE{,_NEXT}. * init.c (builtin_array): Add them. (cpp_init_builtins): Drop __has_include{,_next} init here ... * pch.c (cpp_read_state): ... and here. * traditional.c (enum ls): Drop has_include states ... (_cpp_scan_out_logical_line): ... and here.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/c-c++-common/cpp/pr93452-1.c10
-rw-r--r--gcc/testsuite/c-c++-common/cpp/pr93452-2.c11
2 files changed, 21 insertions, 0 deletions
diff --git a/gcc/testsuite/c-c++-common/cpp/pr93452-1.c b/gcc/testsuite/c-c++-common/cpp/pr93452-1.c
new file mode 100644
index 0000000..f0986e4
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/cpp/pr93452-1.c
@@ -0,0 +1,10 @@
+/* { dg-do preprocess } */
+/* { dg-additional-options "-fdirectives-only" } */
+
+int main ()
+{
+ return 0;
+}
+
+/* A regexp that doesn't match itself! */
+/* { dg-final { scan-file-not pr93452-1.i {_[_]has_include} } } */
diff --git a/gcc/testsuite/c-c++-common/cpp/pr93452-2.c b/gcc/testsuite/c-c++-common/cpp/pr93452-2.c
new file mode 100644
index 0000000..c9ab0e9
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/cpp/pr93452-2.c
@@ -0,0 +1,11 @@
+/* { dg-do preprocess } */
+/* { dg-additional-options "-dD" } */
+
+#if __has_include ("who cares" )
+#endif
+int main ()
+{
+ return 0;
+}
+
+/* { dg-final { scan-file-not pr93452-2.i {__has_include} } } */