10b57cec5SDimitry Andric//===--- Features.def - Features and Extensions database --------*- C++ -*-===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric//
90b57cec5SDimitry Andric// This file defines features exposed via __has_feature and extensions exposed
100b57cec5SDimitry Andric// via __has_extension. Users of this file must either define the FEATURE or
110b57cec5SDimitry Andric// EXTENSION macros (or both) to make use of this information. Note that these
120b57cec5SDimitry Andric// macros expect the following declarations to be available for the Predicate:
130b57cec5SDimitry Andric//
140b57cec5SDimitry Andric//   const LangOptions &LangOpts;
150b57cec5SDimitry Andric//   const Preprocessor &PP;
160b57cec5SDimitry Andric//
170b57cec5SDimitry Andric// The Predicate field dictates the conditions under which the feature or
180b57cec5SDimitry Andric// extension will be made available.
190b57cec5SDimitry Andric//
200b57cec5SDimitry Andric// FEATURE(...) should be used to advertise support for standard language
210b57cec5SDimitry Andric// features, whereas EXTENSION(...) should be used for clang extensions. Note
220b57cec5SDimitry Andric// that many of the identifiers in this file don't follow this rule for backward
230b57cec5SDimitry Andric// compatibility reasons.
240b57cec5SDimitry Andric//
250b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
260b57cec5SDimitry Andric
270b57cec5SDimitry Andric#if !defined(FEATURE) && !defined(EXTENSION)
280b57cec5SDimitry Andric#  error Define either the FEATURE or EXTENSION macro to handle features
290b57cec5SDimitry Andric#endif
300b57cec5SDimitry Andric
310b57cec5SDimitry Andric#ifndef FEATURE
320b57cec5SDimitry Andric#define FEATURE(Name, Predicate)
330b57cec5SDimitry Andric#endif
340b57cec5SDimitry Andric
350b57cec5SDimitry Andric#ifndef EXTENSION
360b57cec5SDimitry Andric#define EXTENSION(Name, Predicate)
370b57cec5SDimitry Andric#endif
380b57cec5SDimitry Andric
395ffd83dbSDimitry AndricFEATURE(speculative_load_hardening, LangOpts.SpeculativeLoadHardening)
400b57cec5SDimitry AndricFEATURE(address_sanitizer,
410b57cec5SDimitry Andric        LangOpts.Sanitize.hasOneOf(SanitizerKind::Address |
420b57cec5SDimitry Andric                                   SanitizerKind::KernelAddress))
43a7dea167SDimitry AndricFEATURE(leak_sanitizer,
44a7dea167SDimitry Andric        LangOpts.Sanitize.has(SanitizerKind::Leak))
450b57cec5SDimitry AndricFEATURE(hwaddress_sanitizer,
460b57cec5SDimitry Andric        LangOpts.Sanitize.hasOneOf(SanitizerKind::HWAddress |
470b57cec5SDimitry Andric                                   SanitizerKind::KernelHWAddress))
4881ad6265SDimitry AndricFEATURE(memtag_stack,
4981ad6265SDimitry Andric        LangOpts.Sanitize.has(SanitizerKind::MemtagStack))
5081ad6265SDimitry AndricFEATURE(memtag_heap,
5181ad6265SDimitry Andric        LangOpts.Sanitize.has(SanitizerKind::MemtagHeap))
5281ad6265SDimitry AndricFEATURE(memtag_globals,
5381ad6265SDimitry Andric        LangOpts.Sanitize.has(SanitizerKind::MemtagGlobals))
540b57cec5SDimitry AndricFEATURE(xray_instrument, LangOpts.XRayInstrument)
550b57cec5SDimitry AndricFEATURE(undefined_behavior_sanitizer,
560b57cec5SDimitry Andric        LangOpts.Sanitize.hasOneOf(SanitizerKind::Undefined))
57fe6060f1SDimitry AndricFEATURE(coverage_sanitizer, LangOpts.SanitizeCoverage)
580b57cec5SDimitry AndricFEATURE(assume_nonnull, true)
590b57cec5SDimitry AndricFEATURE(attribute_analyzer_noreturn, true)
600b57cec5SDimitry AndricFEATURE(attribute_availability, true)
610b57cec5SDimitry AndricFEATURE(attribute_availability_with_message, true)
620b57cec5SDimitry AndricFEATURE(attribute_availability_app_extension, true)
630b57cec5SDimitry AndricFEATURE(attribute_availability_with_version_underscores, true)
640b57cec5SDimitry AndricFEATURE(attribute_availability_tvos, true)
650b57cec5SDimitry AndricFEATURE(attribute_availability_watchos, true)
6681ad6265SDimitry AndricFEATURE(attribute_availability_driverkit, true)
670b57cec5SDimitry AndricFEATURE(attribute_availability_with_strict, true)
680b57cec5SDimitry AndricFEATURE(attribute_availability_with_replacement, true)
690b57cec5SDimitry AndricFEATURE(attribute_availability_in_templates, true)
700b57cec5SDimitry AndricFEATURE(attribute_availability_swift, true)
710b57cec5SDimitry AndricFEATURE(attribute_cf_returns_not_retained, true)
720b57cec5SDimitry AndricFEATURE(attribute_cf_returns_retained, true)
730b57cec5SDimitry AndricFEATURE(attribute_cf_returns_on_parameters, true)
740b57cec5SDimitry AndricFEATURE(attribute_deprecated_with_message, true)
750b57cec5SDimitry AndricFEATURE(attribute_deprecated_with_replacement, true)
760b57cec5SDimitry AndricFEATURE(attribute_ext_vector_type, true)
770b57cec5SDimitry AndricFEATURE(attribute_ns_returns_not_retained, true)
780b57cec5SDimitry AndricFEATURE(attribute_ns_returns_retained, true)
790b57cec5SDimitry AndricFEATURE(attribute_ns_consumes_self, true)
800b57cec5SDimitry AndricFEATURE(attribute_ns_consumed, true)
810b57cec5SDimitry AndricFEATURE(attribute_cf_consumed, true)
820b57cec5SDimitry AndricFEATURE(attribute_objc_ivar_unused, true)
830b57cec5SDimitry AndricFEATURE(attribute_objc_method_family, true)
840b57cec5SDimitry AndricFEATURE(attribute_overloadable, true)
850b57cec5SDimitry AndricFEATURE(attribute_unavailable_with_message, true)
860b57cec5SDimitry AndricFEATURE(attribute_unused_on_fields, true)
870b57cec5SDimitry AndricFEATURE(attribute_diagnose_if_objc, true)
880b57cec5SDimitry AndricFEATURE(blocks, LangOpts.Blocks)
890b57cec5SDimitry AndricFEATURE(c_thread_safety_attributes, true)
900b57cec5SDimitry AndricFEATURE(cxx_exceptions, LangOpts.CXXExceptions)
910b57cec5SDimitry AndricFEATURE(cxx_rtti, LangOpts.RTTI &&LangOpts.RTTIData)
925f757f3fSDimitry AndricEXTENSION(define_target_os_macros,
935f757f3fSDimitry Andric          PP.getPreprocessorOpts().DefineTargetOSMacros)
940b57cec5SDimitry AndricFEATURE(enumerator_attributes, true)
950b57cec5SDimitry AndricFEATURE(nullability, true)
960b57cec5SDimitry AndricFEATURE(nullability_on_arrays, true)
97e8d8bef9SDimitry AndricFEATURE(nullability_nullable_result, true)
980b57cec5SDimitry AndricFEATURE(memory_sanitizer,
990b57cec5SDimitry Andric        LangOpts.Sanitize.hasOneOf(SanitizerKind::Memory |
1000b57cec5SDimitry Andric                                   SanitizerKind::KernelMemory))
1010b57cec5SDimitry AndricFEATURE(thread_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Thread))
1020b57cec5SDimitry AndricFEATURE(dataflow_sanitizer, LangOpts.Sanitize.has(SanitizerKind::DataFlow))
1030b57cec5SDimitry AndricFEATURE(scudo, LangOpts.Sanitize.hasOneOf(SanitizerKind::Scudo))
104fe6060f1SDimitry AndricFEATURE(swiftasynccc,
105fe6060f1SDimitry Andric  PP.getTargetInfo().checkCallingConvention(CC_SwiftAsync) ==
106fe6060f1SDimitry Andric  clang::TargetInfo::CCCR_OK)
1075f757f3fSDimitry AndricFEATURE(pragma_stdc_cx_limited_range, true)
1080b57cec5SDimitry Andric// Objective-C features
1090b57cec5SDimitry AndricFEATURE(objc_arr, LangOpts.ObjCAutoRefCount) // FIXME: REMOVE?
1100b57cec5SDimitry AndricFEATURE(objc_arc, LangOpts.ObjCAutoRefCount)
1110b57cec5SDimitry AndricFEATURE(objc_arc_fields, true)
1120b57cec5SDimitry AndricFEATURE(objc_arc_weak, LangOpts.ObjCWeak)
1130b57cec5SDimitry AndricFEATURE(objc_default_synthesize_properties, LangOpts.ObjC)
1140b57cec5SDimitry AndricFEATURE(objc_fixed_enum, LangOpts.ObjC)
1150b57cec5SDimitry AndricFEATURE(objc_instancetype, LangOpts.ObjC)
1160b57cec5SDimitry AndricFEATURE(objc_kindof, LangOpts.ObjC)
1170b57cec5SDimitry AndricFEATURE(objc_modules, LangOpts.ObjC && LangOpts.Modules)
1180b57cec5SDimitry AndricFEATURE(objc_nonfragile_abi, LangOpts.ObjCRuntime.isNonFragile())
1190b57cec5SDimitry AndricFEATURE(objc_property_explicit_atomic, true)
1200b57cec5SDimitry AndricFEATURE(objc_protocol_qualifier_mangling, true)
1210b57cec5SDimitry AndricFEATURE(objc_weak_class, LangOpts.ObjCRuntime.hasWeakClassImport())
1220b57cec5SDimitry AndricFEATURE(ownership_holds, true)
1230b57cec5SDimitry AndricFEATURE(ownership_returns, true)
1240b57cec5SDimitry AndricFEATURE(ownership_takes, true)
1250b57cec5SDimitry AndricFEATURE(objc_bool, true)
1260b57cec5SDimitry AndricFEATURE(objc_subscripting, LangOpts.ObjCRuntime.isNonFragile())
1270b57cec5SDimitry AndricFEATURE(objc_array_literals, LangOpts.ObjC)
1280b57cec5SDimitry AndricFEATURE(objc_dictionary_literals, LangOpts.ObjC)
1290b57cec5SDimitry AndricFEATURE(objc_boxed_expressions, LangOpts.ObjC)
1300b57cec5SDimitry AndricFEATURE(objc_boxed_nsvalue_expressions, LangOpts.ObjC)
1310b57cec5SDimitry AndricFEATURE(arc_cf_code_audited, true)
1320b57cec5SDimitry AndricFEATURE(objc_bridge_id, true)
1330b57cec5SDimitry AndricFEATURE(objc_bridge_id_on_typedefs, true)
1340b57cec5SDimitry AndricFEATURE(objc_generics, LangOpts.ObjC)
1350b57cec5SDimitry AndricFEATURE(objc_generics_variance, LangOpts.ObjC)
1360b57cec5SDimitry AndricFEATURE(objc_class_property, LangOpts.ObjC)
1370b57cec5SDimitry AndricFEATURE(objc_c_static_assert, LangOpts.C11)
1380b57cec5SDimitry AndricFEATURE(objc_cxx_static_assert, LangOpts.CPlusPlus11)
1390b57cec5SDimitry AndricEXTENSION(objc_c_static_assert, true)
1400b57cec5SDimitry Andric// C11 features
1410b57cec5SDimitry AndricFEATURE(c_alignas, LangOpts.C11)
1420b57cec5SDimitry AndricFEATURE(c_alignof, LangOpts.C11)
1430b57cec5SDimitry AndricFEATURE(c_atomic, LangOpts.C11)
1440b57cec5SDimitry AndricFEATURE(c_generic_selections, LangOpts.C11)
1450b57cec5SDimitry AndricFEATURE(c_static_assert, LangOpts.C11)
1460b57cec5SDimitry AndricFEATURE(c_thread_local, LangOpts.C11 &&PP.getTargetInfo().isTLSSupported())
1470b57cec5SDimitry Andric// C++11 features
1480b57cec5SDimitry AndricFEATURE(cxx_access_control_sfinae, LangOpts.CPlusPlus11)
1490b57cec5SDimitry AndricFEATURE(cxx_alias_templates, LangOpts.CPlusPlus11)
1500b57cec5SDimitry AndricFEATURE(cxx_alignas, LangOpts.CPlusPlus11)
1510b57cec5SDimitry AndricFEATURE(cxx_alignof, LangOpts.CPlusPlus11)
1520b57cec5SDimitry AndricFEATURE(cxx_atomic, LangOpts.CPlusPlus11)
1530b57cec5SDimitry AndricFEATURE(cxx_attributes, LangOpts.CPlusPlus11)
1540b57cec5SDimitry AndricFEATURE(cxx_auto_type, LangOpts.CPlusPlus11)
1550b57cec5SDimitry AndricFEATURE(cxx_constexpr, LangOpts.CPlusPlus11)
1560b57cec5SDimitry AndricFEATURE(cxx_constexpr_string_builtins, LangOpts.CPlusPlus11)
1570b57cec5SDimitry AndricFEATURE(cxx_decltype, LangOpts.CPlusPlus11)
1580b57cec5SDimitry AndricFEATURE(cxx_decltype_incomplete_return_types, LangOpts.CPlusPlus11)
1590b57cec5SDimitry AndricFEATURE(cxx_default_function_template_args, LangOpts.CPlusPlus11)
1600b57cec5SDimitry AndricFEATURE(cxx_defaulted_functions, LangOpts.CPlusPlus11)
1610b57cec5SDimitry AndricFEATURE(cxx_delegating_constructors, LangOpts.CPlusPlus11)
1620b57cec5SDimitry AndricFEATURE(cxx_deleted_functions, LangOpts.CPlusPlus11)
1630b57cec5SDimitry AndricFEATURE(cxx_explicit_conversions, LangOpts.CPlusPlus11)
1640b57cec5SDimitry AndricFEATURE(cxx_generalized_initializers, LangOpts.CPlusPlus11)
1650b57cec5SDimitry AndricFEATURE(cxx_implicit_moves, LangOpts.CPlusPlus11)
1660b57cec5SDimitry AndricFEATURE(cxx_inheriting_constructors, LangOpts.CPlusPlus11)
1670b57cec5SDimitry AndricFEATURE(cxx_inline_namespaces, LangOpts.CPlusPlus11)
1680b57cec5SDimitry AndricFEATURE(cxx_lambdas, LangOpts.CPlusPlus11)
1690b57cec5SDimitry AndricFEATURE(cxx_local_type_template_args, LangOpts.CPlusPlus11)
1700b57cec5SDimitry AndricFEATURE(cxx_nonstatic_member_init, LangOpts.CPlusPlus11)
1710b57cec5SDimitry AndricFEATURE(cxx_noexcept, LangOpts.CPlusPlus11)
1720b57cec5SDimitry AndricFEATURE(cxx_nullptr, LangOpts.CPlusPlus11)
1730b57cec5SDimitry AndricFEATURE(cxx_override_control, LangOpts.CPlusPlus11)
1740b57cec5SDimitry AndricFEATURE(cxx_range_for, LangOpts.CPlusPlus11)
1750b57cec5SDimitry AndricFEATURE(cxx_raw_string_literals, LangOpts.CPlusPlus11)
1760b57cec5SDimitry AndricFEATURE(cxx_reference_qualified_functions, LangOpts.CPlusPlus11)
1770b57cec5SDimitry AndricFEATURE(cxx_rvalue_references, LangOpts.CPlusPlus11)
1780b57cec5SDimitry AndricFEATURE(cxx_strong_enums, LangOpts.CPlusPlus11)
1790b57cec5SDimitry AndricFEATURE(cxx_static_assert, LangOpts.CPlusPlus11)
1800b57cec5SDimitry AndricFEATURE(cxx_thread_local,
1810b57cec5SDimitry Andric        LangOpts.CPlusPlus11 &&PP.getTargetInfo().isTLSSupported())
1820b57cec5SDimitry AndricFEATURE(cxx_trailing_return, LangOpts.CPlusPlus11)
1830b57cec5SDimitry AndricFEATURE(cxx_unicode_literals, LangOpts.CPlusPlus11)
1840b57cec5SDimitry AndricFEATURE(cxx_unrestricted_unions, LangOpts.CPlusPlus11)
1850b57cec5SDimitry AndricFEATURE(cxx_user_literals, LangOpts.CPlusPlus11)
1860b57cec5SDimitry AndricFEATURE(cxx_variadic_templates, LangOpts.CPlusPlus11)
1870b57cec5SDimitry Andric// C++14 features
1880b57cec5SDimitry AndricFEATURE(cxx_aggregate_nsdmi, LangOpts.CPlusPlus14)
1890b57cec5SDimitry AndricFEATURE(cxx_binary_literals, LangOpts.CPlusPlus14)
1900b57cec5SDimitry AndricFEATURE(cxx_contextual_conversions, LangOpts.CPlusPlus14)
1910b57cec5SDimitry AndricFEATURE(cxx_decltype_auto, LangOpts.CPlusPlus14)
1920b57cec5SDimitry AndricFEATURE(cxx_generic_lambdas, LangOpts.CPlusPlus14)
1930b57cec5SDimitry AndricFEATURE(cxx_init_captures, LangOpts.CPlusPlus14)
1940b57cec5SDimitry AndricFEATURE(cxx_relaxed_constexpr, LangOpts.CPlusPlus14)
1950b57cec5SDimitry AndricFEATURE(cxx_return_type_deduction, LangOpts.CPlusPlus14)
1960b57cec5SDimitry AndricFEATURE(cxx_variable_templates, LangOpts.CPlusPlus14)
1970b57cec5SDimitry Andric// NOTE: For features covered by SD-6, it is preferable to provide *only*
1980b57cec5SDimitry Andric// the SD-6 macro and not a __has_feature check.
1990b57cec5SDimitry Andric
2000b57cec5SDimitry Andric// C++ TSes
2010b57cec5SDimitry Andric// FEATURE(cxx_runtime_arrays, LangOpts.CPlusPlusTSArrays)
2020b57cec5SDimitry Andric// FEATURE(cxx_concepts, LangOpts.CPlusPlusTSConcepts)
2030b57cec5SDimitry Andric// FIXME: Should this be __has_feature or __has_extension?
2040b57cec5SDimitry Andric// FEATURE(raw_invocation_type, LangOpts.CPlusPlus)
2050b57cec5SDimitry Andric// Type traits
2060b57cec5SDimitry Andric// N.B. Additional type traits should not be added to the following list.
207a7dea167SDimitry Andric// Instead, they should be detected by has_builtin.
2080b57cec5SDimitry AndricFEATURE(has_nothrow_assign, LangOpts.CPlusPlus)
2090b57cec5SDimitry AndricFEATURE(has_nothrow_copy, LangOpts.CPlusPlus)
2100b57cec5SDimitry AndricFEATURE(has_nothrow_constructor, LangOpts.CPlusPlus)
2110b57cec5SDimitry AndricFEATURE(has_trivial_assign, LangOpts.CPlusPlus)
2120b57cec5SDimitry AndricFEATURE(has_trivial_copy, LangOpts.CPlusPlus)
2130b57cec5SDimitry AndricFEATURE(has_trivial_constructor, LangOpts.CPlusPlus)
2140b57cec5SDimitry AndricFEATURE(has_trivial_destructor, LangOpts.CPlusPlus)
2150b57cec5SDimitry AndricFEATURE(has_virtual_destructor, LangOpts.CPlusPlus)
2160b57cec5SDimitry AndricFEATURE(is_abstract, LangOpts.CPlusPlus)
2170b57cec5SDimitry AndricFEATURE(is_base_of, LangOpts.CPlusPlus)
2180b57cec5SDimitry AndricFEATURE(is_class, LangOpts.CPlusPlus)
2190b57cec5SDimitry AndricFEATURE(is_constructible, LangOpts.CPlusPlus)
2200b57cec5SDimitry AndricFEATURE(is_convertible_to, LangOpts.CPlusPlus)
2210b57cec5SDimitry AndricFEATURE(is_empty, LangOpts.CPlusPlus)
2220b57cec5SDimitry AndricFEATURE(is_enum, LangOpts.CPlusPlus)
2230b57cec5SDimitry AndricFEATURE(is_final, LangOpts.CPlusPlus)
2240b57cec5SDimitry AndricFEATURE(is_literal, LangOpts.CPlusPlus)
2250b57cec5SDimitry AndricFEATURE(is_standard_layout, LangOpts.CPlusPlus)
2260b57cec5SDimitry AndricFEATURE(is_pod, LangOpts.CPlusPlus)
2270b57cec5SDimitry AndricFEATURE(is_polymorphic, LangOpts.CPlusPlus)
2280b57cec5SDimitry AndricFEATURE(is_sealed, LangOpts.CPlusPlus &&LangOpts.MicrosoftExt)
2290b57cec5SDimitry AndricFEATURE(is_trivial, LangOpts.CPlusPlus)
2300b57cec5SDimitry AndricFEATURE(is_trivially_assignable, LangOpts.CPlusPlus)
2310b57cec5SDimitry AndricFEATURE(is_trivially_constructible, LangOpts.CPlusPlus)
2320b57cec5SDimitry AndricFEATURE(is_trivially_copyable, LangOpts.CPlusPlus)
2330b57cec5SDimitry AndricFEATURE(is_union, LangOpts.CPlusPlus)
234bdd1243dSDimitry AndricFEATURE(kcfi, LangOpts.Sanitize.has(SanitizerKind::KCFI))
2350b57cec5SDimitry AndricFEATURE(modules, LangOpts.Modules)
2360b57cec5SDimitry AndricFEATURE(safe_stack, LangOpts.Sanitize.has(SanitizerKind::SafeStack))
2370b57cec5SDimitry AndricFEATURE(shadow_call_stack,
2380b57cec5SDimitry Andric        LangOpts.Sanitize.has(SanitizerKind::ShadowCallStack))
2390b57cec5SDimitry AndricFEATURE(tls, PP.getTargetInfo().isTLSSupported())
2400b57cec5SDimitry AndricFEATURE(underlying_type, LangOpts.CPlusPlus)
241fcaf7f86SDimitry AndricFEATURE(experimental_library, LangOpts.ExperimentalLibrary)
2420b57cec5SDimitry Andric
2430b57cec5SDimitry Andric// C11 features supported by other languages as extensions.
2440b57cec5SDimitry AndricEXTENSION(c_alignas, true)
2450b57cec5SDimitry AndricEXTENSION(c_alignof, true)
2460b57cec5SDimitry AndricEXTENSION(c_atomic, true)
2470b57cec5SDimitry AndricEXTENSION(c_generic_selections, true)
24806c3fb27SDimitry AndricEXTENSION(c_generic_selection_with_controlling_type, true)
2490b57cec5SDimitry AndricEXTENSION(c_static_assert, true)
2500b57cec5SDimitry AndricEXTENSION(c_thread_local, PP.getTargetInfo().isTLSSupported())
2515f757f3fSDimitry Andric// C23 features supported by other languages as extensions
25206c3fb27SDimitry AndricEXTENSION(c_attributes, true)
2530b57cec5SDimitry Andric// C++11 features supported by other languages as extensions.
2540b57cec5SDimitry AndricEXTENSION(cxx_atomic, LangOpts.CPlusPlus)
25506c3fb27SDimitry AndricEXTENSION(cxx_default_function_template_args, LangOpts.CPlusPlus)
25606c3fb27SDimitry AndricEXTENSION(cxx_defaulted_functions, LangOpts.CPlusPlus)
2570b57cec5SDimitry AndricEXTENSION(cxx_deleted_functions, LangOpts.CPlusPlus)
2580b57cec5SDimitry AndricEXTENSION(cxx_explicit_conversions, LangOpts.CPlusPlus)
2590b57cec5SDimitry AndricEXTENSION(cxx_inline_namespaces, LangOpts.CPlusPlus)
2600b57cec5SDimitry AndricEXTENSION(cxx_local_type_template_args, LangOpts.CPlusPlus)
2610b57cec5SDimitry AndricEXTENSION(cxx_nonstatic_member_init, LangOpts.CPlusPlus)
2620b57cec5SDimitry AndricEXTENSION(cxx_override_control, LangOpts.CPlusPlus)
2630b57cec5SDimitry AndricEXTENSION(cxx_range_for, LangOpts.CPlusPlus)
2640b57cec5SDimitry AndricEXTENSION(cxx_reference_qualified_functions, LangOpts.CPlusPlus)
2650b57cec5SDimitry AndricEXTENSION(cxx_rvalue_references, LangOpts.CPlusPlus)
2660b57cec5SDimitry AndricEXTENSION(cxx_variadic_templates, LangOpts.CPlusPlus)
2670b57cec5SDimitry AndricEXTENSION(cxx_fixed_enum, true)
2680b57cec5SDimitry Andric// C++14 features supported by other languages as extensions.
2690b57cec5SDimitry AndricEXTENSION(cxx_binary_literals, true)
2700b57cec5SDimitry AndricEXTENSION(cxx_init_captures, LangOpts.CPlusPlus11)
2710b57cec5SDimitry AndricEXTENSION(cxx_variable_templates, LangOpts.CPlusPlus)
2727a6dacacSDimitry Andric//C++20
2737a6dacacSDimitry AndricEXTENSION(cxx_generalized_nttp, LangOpts.CPlusPlus20)
2747a6dacacSDimitry Andric//C++23
2757a6dacacSDimitry AndricEXTENSION(cxx_explicit_this_parameter, LangOpts.CPlusPlus23)
2760b57cec5SDimitry Andric// Miscellaneous language extensions
2770b57cec5SDimitry AndricEXTENSION(overloadable_unmarked, true)
2780b57cec5SDimitry AndricEXTENSION(pragma_clang_attribute_namespaces, true)
2790b57cec5SDimitry AndricEXTENSION(pragma_clang_attribute_external_declaration, true)
280fe6060f1SDimitry AndricEXTENSION(statement_attributes_with_gnu_syntax, true)
2810b57cec5SDimitry AndricEXTENSION(gnu_asm, LangOpts.GNUAsm)
2825ffd83dbSDimitry AndricEXTENSION(gnu_asm_goto_with_outputs, LangOpts.GNUAsm)
28306c3fb27SDimitry AndricEXTENSION(gnu_asm_goto_with_outputs_full, LangOpts.GNUAsm)
2845ffd83dbSDimitry AndricEXTENSION(matrix_types, LangOpts.MatrixTypes)
285fe6060f1SDimitry AndricEXTENSION(matrix_types_scalar_division, true)
286fe6060f1SDimitry AndricEXTENSION(cxx_attributes_on_using_declarations, LangOpts.CPlusPlus11)
2875f757f3fSDimitry AndricEXTENSION(datasizeof, LangOpts.CPlusPlus)
2880b57cec5SDimitry Andric
289e8d8bef9SDimitry AndricFEATURE(cxx_abi_relative_vtable, LangOpts.CPlusPlus && LangOpts.RelativeCXXABIVTables)
290e8d8bef9SDimitry Andric
29181ad6265SDimitry Andric// CUDA/HIP Features
29281ad6265SDimitry AndricFEATURE(cuda_noinline_keyword, LangOpts.CUDA)
2935f757f3fSDimitry AndricEXTENSION(cuda_implicit_host_device_templates, LangOpts.CUDA && LangOpts.OffloadImplicitHostDeviceTemplates)
29481ad6265SDimitry Andric
2950b57cec5SDimitry Andric#undef EXTENSION
2960b57cec5SDimitry Andric#undef FEATURE
297