]> git.ipfire.org Git - thirdparty/gcc.git/commit
preprocessor: Make __has_include a builtin macro [PR93452]
authorNathan Sidwell <nathan@acm.org>
Tue, 28 Jan 2020 15:58:29 +0000 (07:58 -0800)
committerNathan Sidwell <nathan@acm.org>
Tue, 28 Jan 2020 16:02:17 +0000 (08:02 -0800)
commit3d056cbfb3484f4037b34c908b26e1c6776c86b5
tree591410d4cd98b8777276072cc5af998a3f97d97c
parenta5d81aaab6d54379cd3835b33d84d9be5c5be099
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.
gcc/testsuite/c-c++-common/cpp/pr93452-1.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/cpp/pr93452-2.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/directives.c
libcpp/expr.c
libcpp/include/cpplib.h
libcpp/init.c
libcpp/internal.h
libcpp/macro.c
libcpp/pch.c
libcpp/traditional.c