1//===--- Features.def - Features and Extensions database --------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file defines features exposed via __has_feature and extensions exposed 10// via __has_extension. Users of this file must either define the FEATURE or 11// EXTENSION macros (or both) to make use of this information. Note that these 12// macros expect the following declarations to be available for the Predicate: 13// 14// const LangOptions &LangOpts; 15// const Preprocessor &PP; 16// 17// The Predicate field dictates the conditions under which the feature or 18// extension will be made available. 19// 20// FEATURE(...) should be used to advertise support for standard language 21// features, whereas EXTENSION(...) should be used for clang extensions. Note 22// that many of the identifiers in this file don't follow this rule for backward 23// compatibility reasons. 24// 25//===----------------------------------------------------------------------===// 26 27#if !defined(FEATURE) && !defined(EXTENSION) 28# error Define either the FEATURE or EXTENSION macro to handle features 29#endif 30 31#ifndef FEATURE 32#define FEATURE(Name, Predicate) 33#endif 34 35#ifndef EXTENSION 36#define EXTENSION(Name, Predicate) 37#endif 38 39FEATURE(speculative_load_hardening, LangOpts.SpeculativeLoadHardening) 40FEATURE(address_sanitizer, 41 LangOpts.Sanitize.hasOneOf(SanitizerKind::Address | 42 SanitizerKind::KernelAddress)) 43FEATURE(leak_sanitizer, 44 LangOpts.Sanitize.has(SanitizerKind::Leak)) 45FEATURE(hwaddress_sanitizer, 46 LangOpts.Sanitize.hasOneOf(SanitizerKind::HWAddress | 47 SanitizerKind::KernelHWAddress)) 48FEATURE(memtag_stack, 49 LangOpts.Sanitize.has(SanitizerKind::MemtagStack)) 50FEATURE(memtag_heap, 51 LangOpts.Sanitize.has(SanitizerKind::MemtagHeap)) 52FEATURE(memtag_globals, 53 LangOpts.Sanitize.has(SanitizerKind::MemtagGlobals)) 54FEATURE(xray_instrument, LangOpts.XRayInstrument) 55FEATURE(undefined_behavior_sanitizer, 56 LangOpts.Sanitize.hasOneOf(SanitizerKind::Undefined)) 57FEATURE(realtime_sanitizer, 58 LangOpts.Sanitize.has(SanitizerKind::Realtime)) 59FEATURE(coverage_sanitizer, LangOpts.SanitizeCoverage) 60FEATURE(assume_nonnull, true) 61FEATURE(attribute_analyzer_noreturn, true) 62FEATURE(attribute_availability, true) 63FEATURE(attribute_availability_with_message, true) 64FEATURE(attribute_availability_app_extension, true) 65FEATURE(attribute_availability_with_version_underscores, true) 66FEATURE(attribute_availability_tvos, true) 67FEATURE(attribute_availability_watchos, true) 68FEATURE(attribute_availability_driverkit, true) 69FEATURE(attribute_availability_with_strict, true) 70FEATURE(attribute_availability_with_replacement, true) 71FEATURE(attribute_availability_in_templates, true) 72FEATURE(attribute_availability_swift, true) 73FEATURE(attribute_cf_returns_not_retained, true) 74FEATURE(attribute_cf_returns_retained, true) 75FEATURE(attribute_cf_returns_on_parameters, true) 76FEATURE(attribute_deprecated_with_message, true) 77FEATURE(attribute_deprecated_with_replacement, true) 78FEATURE(attribute_ext_vector_type, true) 79FEATURE(attribute_ns_returns_not_retained, true) 80FEATURE(attribute_ns_returns_retained, true) 81FEATURE(attribute_ns_consumes_self, true) 82FEATURE(attribute_ns_consumed, true) 83FEATURE(attribute_cf_consumed, true) 84FEATURE(attribute_objc_ivar_unused, true) 85FEATURE(attribute_objc_method_family, true) 86FEATURE(attribute_overloadable, true) 87FEATURE(attribute_unavailable_with_message, true) 88FEATURE(attribute_unused_on_fields, true) 89FEATURE(attribute_diagnose_if_objc, true) 90FEATURE(blocks, LangOpts.Blocks) 91FEATURE(c_thread_safety_attributes, true) 92FEATURE(cxx_exceptions, LangOpts.CXXExceptions) 93FEATURE(cxx_rtti, LangOpts.RTTI &&LangOpts.RTTIData) 94EXTENSION(define_target_os_macros, 95 PP.getPreprocessorOpts().DefineTargetOSMacros) 96FEATURE(enumerator_attributes, true) 97FEATURE(nullability, true) 98FEATURE(nullability_on_arrays, true) 99FEATURE(nullability_on_classes, true) 100FEATURE(nullability_nullable_result, true) 101FEATURE(numerical_stability_sanitizer, LangOpts.Sanitize.has(SanitizerKind::NumericalStability)) 102FEATURE(memory_sanitizer, 103 LangOpts.Sanitize.hasOneOf(SanitizerKind::Memory | 104 SanitizerKind::KernelMemory)) 105FEATURE(type_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Type)) 106FEATURE(thread_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Thread)) 107FEATURE(dataflow_sanitizer, LangOpts.Sanitize.has(SanitizerKind::DataFlow)) 108FEATURE(scudo, LangOpts.Sanitize.hasOneOf(SanitizerKind::Scudo)) 109FEATURE(ptrauth_intrinsics, LangOpts.PointerAuthIntrinsics) 110FEATURE(ptrauth_calls, LangOpts.PointerAuthCalls) 111FEATURE(ptrauth_returns, LangOpts.PointerAuthReturns) 112FEATURE(ptrauth_vtable_pointer_address_discrimination, LangOpts.PointerAuthVTPtrAddressDiscrimination) 113FEATURE(ptrauth_vtable_pointer_type_discrimination, LangOpts.PointerAuthVTPtrTypeDiscrimination) 114FEATURE(ptrauth_type_info_vtable_pointer_discrimination, LangOpts.PointerAuthTypeInfoVTPtrDiscrimination) 115FEATURE(ptrauth_member_function_pointer_type_discrimination, LangOpts.PointerAuthCalls) 116FEATURE(ptrauth_function_pointer_type_discrimination, LangOpts.PointerAuthFunctionTypeDiscrimination) 117FEATURE(ptrauth_indirect_gotos, LangOpts.PointerAuthIndirectGotos) 118FEATURE(ptrauth_init_fini, LangOpts.PointerAuthInitFini) 119FEATURE(ptrauth_init_fini_address_discrimination, LangOpts.PointerAuthInitFiniAddressDiscrimination) 120FEATURE(ptrauth_elf_got, LangOpts.PointerAuthELFGOT) 121EXTENSION(swiftcc, 122 PP.getTargetInfo().checkCallingConvention(CC_Swift) == 123 clang::TargetInfo::CCCR_OK) 124EXTENSION(swiftasynccc, 125 PP.getTargetInfo().checkCallingConvention(CC_SwiftAsync) == 126 clang::TargetInfo::CCCR_OK) 127FEATURE(pragma_stdc_cx_limited_range, true) 128// Objective-C features 129FEATURE(objc_arr, LangOpts.ObjCAutoRefCount) // FIXME: REMOVE? 130FEATURE(objc_arc, LangOpts.ObjCAutoRefCount) 131FEATURE(objc_arc_fields, true) 132FEATURE(objc_arc_weak, LangOpts.ObjCWeak) 133FEATURE(objc_default_synthesize_properties, LangOpts.ObjC) 134FEATURE(objc_fixed_enum, LangOpts.ObjC) 135FEATURE(objc_instancetype, LangOpts.ObjC) 136FEATURE(objc_kindof, LangOpts.ObjC) 137FEATURE(objc_modules, LangOpts.ObjC && LangOpts.Modules) 138FEATURE(objc_nonfragile_abi, LangOpts.ObjCRuntime.isNonFragile()) 139FEATURE(objc_property_explicit_atomic, true) 140FEATURE(objc_protocol_qualifier_mangling, true) 141FEATURE(objc_weak_class, LangOpts.ObjCRuntime.hasWeakClassImport()) 142FEATURE(ownership_holds, true) 143FEATURE(ownership_returns, true) 144FEATURE(ownership_takes, true) 145FEATURE(objc_bool, true) 146FEATURE(objc_subscripting, LangOpts.ObjCRuntime.isNonFragile()) 147FEATURE(objc_array_literals, LangOpts.ObjC) 148FEATURE(objc_dictionary_literals, LangOpts.ObjC) 149FEATURE(objc_boxed_expressions, LangOpts.ObjC) 150FEATURE(objc_boxed_nsvalue_expressions, LangOpts.ObjC) 151FEATURE(arc_cf_code_audited, true) 152FEATURE(objc_bridge_id, true) 153FEATURE(objc_bridge_id_on_typedefs, true) 154FEATURE(objc_generics, LangOpts.ObjC) 155FEATURE(objc_generics_variance, LangOpts.ObjC) 156FEATURE(objc_class_property, LangOpts.ObjC) 157FEATURE(objc_c_static_assert, LangOpts.C11) 158FEATURE(objc_cxx_static_assert, LangOpts.CPlusPlus11) 159EXTENSION(objc_c_static_assert, true) 160// C11 features 161FEATURE(c_alignas, LangOpts.C11) 162FEATURE(c_alignof, LangOpts.C11) 163FEATURE(c_atomic, LangOpts.C11) 164FEATURE(c_generic_selections, LangOpts.C11) 165FEATURE(c_static_assert, LangOpts.C11) 166FEATURE(c_thread_local, LangOpts.C11 &&PP.getTargetInfo().isTLSSupported()) 167// C23 features 168FEATURE(c_fixed_enum, LangOpts.C23) 169// C++11 features 170FEATURE(cxx_access_control_sfinae, LangOpts.CPlusPlus11) 171FEATURE(cxx_alias_templates, LangOpts.CPlusPlus11) 172FEATURE(cxx_alignas, LangOpts.CPlusPlus11) 173FEATURE(cxx_alignof, LangOpts.CPlusPlus11) 174FEATURE(cxx_atomic, LangOpts.CPlusPlus11) 175FEATURE(cxx_attributes, LangOpts.CPlusPlus11) 176FEATURE(cxx_auto_type, LangOpts.CPlusPlus11) 177FEATURE(cxx_constexpr, LangOpts.CPlusPlus11) 178FEATURE(cxx_constexpr_string_builtins, LangOpts.CPlusPlus11) 179FEATURE(cxx_decltype, LangOpts.CPlusPlus11) 180FEATURE(cxx_decltype_incomplete_return_types, LangOpts.CPlusPlus11) 181FEATURE(cxx_default_function_template_args, LangOpts.CPlusPlus11) 182FEATURE(cxx_defaulted_functions, LangOpts.CPlusPlus11) 183FEATURE(cxx_delegating_constructors, LangOpts.CPlusPlus11) 184FEATURE(cxx_deleted_functions, LangOpts.CPlusPlus11) 185FEATURE(cxx_explicit_conversions, LangOpts.CPlusPlus11) 186FEATURE(cxx_generalized_initializers, LangOpts.CPlusPlus11) 187FEATURE(cxx_implicit_moves, LangOpts.CPlusPlus11) 188FEATURE(cxx_inheriting_constructors, LangOpts.CPlusPlus11) 189FEATURE(cxx_inline_namespaces, LangOpts.CPlusPlus11) 190FEATURE(cxx_lambdas, LangOpts.CPlusPlus11) 191FEATURE(cxx_local_type_template_args, LangOpts.CPlusPlus11) 192FEATURE(cxx_nonstatic_member_init, LangOpts.CPlusPlus11) 193FEATURE(cxx_noexcept, LangOpts.CPlusPlus11) 194FEATURE(cxx_nullptr, LangOpts.CPlusPlus11) 195FEATURE(cxx_override_control, LangOpts.CPlusPlus11) 196FEATURE(cxx_range_for, LangOpts.CPlusPlus11) 197FEATURE(cxx_raw_string_literals, LangOpts.CPlusPlus11) 198FEATURE(cxx_reference_qualified_functions, LangOpts.CPlusPlus11) 199FEATURE(cxx_rvalue_references, LangOpts.CPlusPlus11) 200FEATURE(cxx_strong_enums, LangOpts.CPlusPlus11) 201FEATURE(cxx_static_assert, LangOpts.CPlusPlus11) 202FEATURE(cxx_thread_local, 203 LangOpts.CPlusPlus11 &&PP.getTargetInfo().isTLSSupported()) 204FEATURE(cxx_trailing_return, LangOpts.CPlusPlus11) 205FEATURE(cxx_unicode_literals, LangOpts.CPlusPlus11) 206FEATURE(cxx_unrestricted_unions, LangOpts.CPlusPlus11) 207FEATURE(cxx_user_literals, LangOpts.CPlusPlus11) 208FEATURE(cxx_variadic_templates, LangOpts.CPlusPlus11) 209// C++14 features 210FEATURE(cxx_aggregate_nsdmi, LangOpts.CPlusPlus14) 211FEATURE(cxx_binary_literals, LangOpts.CPlusPlus14) 212FEATURE(cxx_contextual_conversions, LangOpts.CPlusPlus14) 213FEATURE(cxx_decltype_auto, LangOpts.CPlusPlus14) 214FEATURE(cxx_generic_lambdas, LangOpts.CPlusPlus14) 215FEATURE(cxx_init_captures, LangOpts.CPlusPlus14) 216FEATURE(cxx_relaxed_constexpr, LangOpts.CPlusPlus14) 217FEATURE(cxx_return_type_deduction, LangOpts.CPlusPlus14) 218FEATURE(cxx_variable_templates, LangOpts.CPlusPlus14) 219// NOTE: For features covered by SD-6, it is preferable to provide *only* 220// the SD-6 macro and not a __has_feature check. 221 222// C++ TSes 223// FEATURE(cxx_runtime_arrays, LangOpts.CPlusPlusTSArrays) 224// FEATURE(cxx_concepts, LangOpts.CPlusPlusTSConcepts) 225// FIXME: Should this be __has_feature or __has_extension? 226// FEATURE(raw_invocation_type, LangOpts.CPlusPlus) 227// Type traits 228// N.B. Additional type traits should not be added to the following list. 229// Instead, they should be detected by has_builtin. 230FEATURE(has_nothrow_assign, LangOpts.CPlusPlus) 231FEATURE(has_nothrow_copy, LangOpts.CPlusPlus) 232FEATURE(has_nothrow_constructor, LangOpts.CPlusPlus) 233FEATURE(has_trivial_assign, LangOpts.CPlusPlus) 234FEATURE(has_trivial_copy, LangOpts.CPlusPlus) 235FEATURE(has_trivial_constructor, LangOpts.CPlusPlus) 236FEATURE(has_trivial_destructor, LangOpts.CPlusPlus) 237FEATURE(has_virtual_destructor, LangOpts.CPlusPlus) 238FEATURE(is_abstract, LangOpts.CPlusPlus) 239FEATURE(is_base_of, LangOpts.CPlusPlus) 240FEATURE(is_class, LangOpts.CPlusPlus) 241FEATURE(is_constructible, LangOpts.CPlusPlus) 242FEATURE(is_convertible_to, LangOpts.CPlusPlus) 243FEATURE(is_empty, LangOpts.CPlusPlus) 244FEATURE(is_enum, LangOpts.CPlusPlus) 245FEATURE(is_final, LangOpts.CPlusPlus) 246FEATURE(is_literal, LangOpts.CPlusPlus) 247FEATURE(is_standard_layout, LangOpts.CPlusPlus) 248FEATURE(is_pod, LangOpts.CPlusPlus) 249FEATURE(is_polymorphic, LangOpts.CPlusPlus) 250FEATURE(is_sealed, LangOpts.CPlusPlus &&LangOpts.MicrosoftExt) 251FEATURE(is_trivial, LangOpts.CPlusPlus) 252FEATURE(is_trivially_assignable, LangOpts.CPlusPlus) 253FEATURE(is_trivially_constructible, LangOpts.CPlusPlus) 254FEATURE(is_trivially_copyable, LangOpts.CPlusPlus) 255FEATURE(is_union, LangOpts.CPlusPlus) 256FEATURE(kcfi, LangOpts.Sanitize.has(SanitizerKind::KCFI)) 257FEATURE(modules, LangOpts.Modules) 258FEATURE(safe_stack, LangOpts.Sanitize.has(SanitizerKind::SafeStack)) 259FEATURE(shadow_call_stack, 260 LangOpts.Sanitize.has(SanitizerKind::ShadowCallStack)) 261FEATURE(tls, PP.getTargetInfo().isTLSSupported()) 262FEATURE(underlying_type, LangOpts.CPlusPlus) 263FEATURE(experimental_library, LangOpts.ExperimentalLibrary) 264 265// C11 features supported by other languages as extensions. 266EXTENSION(c_alignas, true) 267EXTENSION(c_alignof, true) 268EXTENSION(c_atomic, true) 269EXTENSION(c_generic_selections, true) 270EXTENSION(c_generic_selection_with_controlling_type, true) 271EXTENSION(c_static_assert, true) 272EXTENSION(c_thread_local, PP.getTargetInfo().isTLSSupported()) 273// C23 features supported by other languages as extensions 274EXTENSION(c_attributes, true) 275EXTENSION(c_fixed_enum, true) 276// C++11 features supported by other languages as extensions. 277EXTENSION(cxx_atomic, LangOpts.CPlusPlus) 278EXTENSION(cxx_default_function_template_args, LangOpts.CPlusPlus) 279EXTENSION(cxx_defaulted_functions, LangOpts.CPlusPlus) 280EXTENSION(cxx_deleted_functions, LangOpts.CPlusPlus) 281EXTENSION(cxx_explicit_conversions, LangOpts.CPlusPlus) 282EXTENSION(cxx_inline_namespaces, LangOpts.CPlusPlus) 283EXTENSION(cxx_lambdas, LangOpts.CPlusPlus) 284EXTENSION(cxx_local_type_template_args, LangOpts.CPlusPlus) 285EXTENSION(cxx_nonstatic_member_init, LangOpts.CPlusPlus) 286EXTENSION(cxx_override_control, LangOpts.CPlusPlus) 287EXTENSION(cxx_range_for, LangOpts.CPlusPlus) 288EXTENSION(cxx_reference_qualified_functions, LangOpts.CPlusPlus) 289EXTENSION(cxx_rvalue_references, LangOpts.CPlusPlus) 290EXTENSION(cxx_variadic_templates, LangOpts.CPlusPlus) 291EXTENSION(cxx_fixed_enum, true) 292// C++14 features supported by other languages as extensions. 293EXTENSION(cxx_binary_literals, true) 294EXTENSION(cxx_init_captures, LangOpts.CPlusPlus11) 295EXTENSION(cxx_variable_templates, LangOpts.CPlusPlus) 296//C++20 297EXTENSION(cxx_generalized_nttp, LangOpts.CPlusPlus20) 298//C++23 299EXTENSION(cxx_explicit_this_parameter, LangOpts.CPlusPlus23) 300// Miscellaneous language extensions 301EXTENSION(overloadable_unmarked, true) 302EXTENSION(pragma_clang_attribute_namespaces, true) 303EXTENSION(pragma_clang_attribute_external_declaration, true) 304EXTENSION(statement_attributes_with_gnu_syntax, true) 305EXTENSION(gnu_asm, LangOpts.GNUAsm) 306EXTENSION(gnu_asm_goto_with_outputs, LangOpts.GNUAsm) 307EXTENSION(gnu_asm_goto_with_outputs_full, LangOpts.GNUAsm) 308EXTENSION(matrix_types, LangOpts.MatrixTypes) 309EXTENSION(matrix_types_scalar_division, true) 310EXTENSION(cxx_attributes_on_using_declarations, LangOpts.CPlusPlus11) 311EXTENSION(datasizeof, LangOpts.CPlusPlus) 312 313FEATURE(cxx_abi_relative_vtable, LangOpts.CPlusPlus && LangOpts.RelativeCXXABIVTables) 314 315// CUDA/HIP Features 316FEATURE(cuda_noinline_keyword, LangOpts.CUDA) 317EXTENSION(cuda_implicit_host_device_templates, LangOpts.CUDA && LangOpts.OffloadImplicitHostDeviceTemplates) 318 319#undef EXTENSION 320#undef FEATURE 321