gcc/libcpp
Alex Coplan 06280a906c c-family: Implement __has_feature and __has_extension [PR60512]
This patch implements clang's __has_feature and __has_extension in GCC.
Currently the patch aims to implement all documented features (and some
undocumented ones) following the documentation at
https://clang.llvm.org/docs/LanguageExtensions.html with the exception
of the legacy features for C++ type traits.  These are omitted, since as
the clang documentation notes, __has_builtin is the correct "modern" way
to query for these (which GCC already implements).

gcc/c-family/ChangeLog:

	PR c++/60512
	* c-common.cc (struct hf_feature_info): New.
	(c_common_register_feature): New.
	(init_has_feature): New.
	(has_feature_p): New.
	* c-common.h (c_common_has_feature): New.
	(c_family_register_lang_features): New.
	(c_common_register_feature): New.
	(has_feature_p): New.
	* c-lex.cc (init_c_lex): Plumb through has_feature callback.
	(c_common_has_builtin): Generalize and move common part ...
	(c_common_lex_availability_macro): ... here.
	(c_common_has_feature): New.
	* c-ppoutput.cc (init_pp_output): Plumb through has_feature.

gcc/c/ChangeLog:

	PR c++/60512
	* c-lang.cc (c_family_register_lang_features): New.
	* c-objc-common.cc (struct c_feature_info): New.
	(c_register_features): New.
	* c-objc-common.h (c_register_features): New.

gcc/cp/ChangeLog:

	PR c++/60512
	* cp-lang.cc (c_family_register_lang_features): New.
	* cp-objcp-common.cc (struct cp_feature_selector): New.
	(cp_feature_selector::has_feature): New.
	(struct cp_feature_info): New.
	(cp_register_features): New.
	* cp-objcp-common.h (cp_register_features): New.

gcc/ChangeLog:

	PR c++/60512
	* doc/cpp.texi: Document __has_{feature,extension}.

gcc/objc/ChangeLog:

	PR c++/60512
	* objc-act.cc (struct objc_feature_info): New.
	(objc_nonfragile_abi_p): New.
	(objc_common_register_features): New.
	* objc-act.h (objc_common_register_features): New.
	* objc-lang.cc (c_family_register_lang_features): New.

gcc/objcp/ChangeLog:

	PR c++/60512
	* objcp-lang.cc (c_family_register_lang_features): New.

libcpp/ChangeLog:

	PR c++/60512
	* include/cpplib.h (struct cpp_callbacks): Add has_feature.
	(enum cpp_builtin_type): Add BT_HAS_{FEATURE,EXTENSION}.
	* init.cc: Add __has_{feature,extension}.
	* macro.cc (_cpp_builtin_macro_text): Handle
	BT_HAS_{FEATURE,EXTENSION}.

gcc/testsuite/ChangeLog:

	PR c++/60512
	* c-c++-common/has-feature-common.c: New test.
	* c-c++-common/has-feature-pedantic.c: New test.
	* g++.dg/ext/has-feature.C: New test.
	* gcc.dg/asan/has-feature-asan.c: New test.
	* gcc.dg/has-feature.c: New test.
	* gcc.dg/ubsan/has-feature-ubsan.c: New test.
	* obj-c++.dg/has-feature.mm: New test.
	* objc.dg/has-feature.m: New test.

Co-Authored-By: Iain Sandoe <iain@sandoe.co.uk>
2023-11-27 10:42:55 +00:00
..
include c-family: Implement __has_feature and __has_extension [PR60512] 2023-11-27 10:42:55 +00:00
po Daily bump. 2023-05-10 00:17:49 +00:00
aclocal.m4 *: add modern gettext 2023-11-14 00:47:11 +01:00
ChangeLog Daily bump. 2023-11-25 00:17:46 +00:00
ChangeLog.jit
charset.cc c++: Implement C++26 P1854R4 - Making non-encodable string literals ill-formed [PR110341] 2023-11-14 18:28:34 +01:00
combining-chars.inc diagnostics: add support for "text art" diagrams 2023-06-21 21:49:00 -04:00
config.in libcpp: configure: drop unused Valgrind detection 2023-11-24 16:13:56 +03:00
configure libcpp: configure: drop unused Valgrind detection 2023-11-24 16:13:56 +03:00
configure.ac libcpp: configure: drop unused Valgrind detection 2023-11-24 16:13:56 +03:00
directives.cc c: Refer more consistently to C23 not C2X 2023-11-07 14:20:30 +00:00
errors.cc Update copyright years. 2023-01-16 11:52:17 +01:00
expr.cc c: Refer more consistently to C23 not C2X 2023-11-07 14:20:30 +00:00
files.cc libcpp: Fix ICE on #include after a line marker directive [PR61474] 2023-09-20 16:44:24 -04:00
generated_cpp_wcwidth.h libcpp, contrib: Update to Unicode 15.1 2023-11-14 18:32:37 +01:00
identifiers.cc libcpp: Improve the diagnostic for poisoned identifiers [PR36887] 2023-10-23 18:35:26 -04:00
init.cc c-family: Implement __has_feature and __has_extension [PR60512] 2023-11-27 10:42:55 +00:00
internal.h libcpp: split decls out to rich-location.h 2023-11-19 06:26:40 -05:00
lex.cc libcpp: configure: drop unused Valgrind detection 2023-11-24 16:13:56 +03:00
line-map.cc diagnostics: cleanups to diagnostic-show-locus.cc 2023-11-09 17:22:52 -05:00
location-example.txt
macro.cc c-family: Implement __has_feature and __has_extension [PR60512] 2023-11-27 10:42:55 +00:00
Makefile.in libcpp: split decls out to rich-location.h 2023-11-19 06:26:40 -05:00
makeucnid.cc libcpp, contrib: Update to Unicode 15.1 2023-11-14 18:32:37 +01:00
makeuname2c.cc libcpp, contrib: Update to Unicode 15.1 2023-11-14 18:32:37 +01:00
mkdeps.cc p1689r5: initial support 2023-09-19 17:32:23 -04:00
pch.cc libcpp: Improve location for macro names [PR66290] 2023-06-20 16:58:12 -04:00
printable-chars.inc diagnostics: add support for "text art" diagrams 2023-06-21 21:49:00 -04:00
symtab.cc Update copyright years. 2023-01-16 11:52:17 +01:00
system.h Update copyright years. 2023-01-16 11:52:17 +01:00
traditional.cc Update copyright years. 2023-01-16 11:52:17 +01:00
ucnid.h libcpp, contrib: Update to Unicode 15.1 2023-11-14 18:32:37 +01:00
ucnid.tab Update copyright years. 2023-01-16 11:52:17 +01:00
uname2c.h libcpp, contrib: Update to Unicode 15.1 2023-11-14 18:32:37 +01:00