preprocessor: Teach traditional about has_include [PR95889]

Traditional cpp (used by fortran) didn;t know about the new
__has_include__ implementation.  Hey, since when did traditional cpp
grow __has_include__? That wasn't in knr!

	libcpp/
	* init.c (builtin_array): Add xref comment.
	* traditional.c (fun_like_macro): Add HAS_INCLUDE codes.
	gcc/testsuite/
	* c-c++-common/cpp/has-include-1-traditional.c: New.
This commit is contained in:
Tiziano Müller 2020-07-29 07:28:23 -07:00 committed by Nathan Sidwell
parent 3c4d2b8676
commit 5e66b6c010
3 changed files with 44 additions and 1 deletions

View File

@ -0,0 +1,38 @@
/* { dg-do preprocess { target c } } */
/* { dg-options "-traditional-cpp" } */
#if __has_include ("stdlib.h")
#else
#error error 1
#endif
#if __has_include (<stdlib.h>)
#else
#error error 2
#endif
#if !__has_include ("stdlib.h")
#error error 3
#elif !__has_include (<stdlib.h>)
#error error 4
#endif
#if __has_include ("stdlib.h") && __has_include (<stdlib.h>)
#else
#error error 5
#endif
#if !defined(__has_include)
#error error 6
#endif
#ifndef __has_include
#error error 7
#endif
#ifdef __has_include
#else
#error error 8
#endif
#define m1 __has_include("stdlib.h")
#define m2 <stdlib.h>
#if !m1
#error error 9
#endif
#if !__has_include (m2)
#error error 13
#endif

View File

@ -401,6 +401,9 @@ static const struct builtin_macro builtin_array[] =
B("__LINE__", BT_SPECLINE, true),
B("__INCLUDE_LEVEL__", BT_INCLUDE_LEVEL, true),
B("__COUNTER__", BT_COUNTER, true),
/* Make sure to update the list of built-in
function-like macros in traditional.c:
fun_like_macro() when adding more following */
B("__has_attribute", BT_HAS_ATTRIBUTE, true),
B("__has_cpp_attribute", BT_HAS_ATTRIBUTE, true),
B("__has_builtin", BT_HAS_BUILTIN, true),

View File

@ -326,7 +326,9 @@ fun_like_macro (cpp_hashnode *node)
{
if (cpp_builtin_macro_p (node))
return (node->value.builtin == BT_HAS_ATTRIBUTE
|| node->value.builtin == BT_HAS_BUILTIN);
|| node->value.builtin == BT_HAS_BUILTIN
|| node->value.builtin == BT_HAS_INCLUDE
|| node->value.builtin == BT_HAS_INCLUDE_NEXT);
return node->value.macro->fun_like;
}