Warning, /include/clang/Basic/Features.def is written in an unsupported language. File is not indexed.
0001 //===--- Features.def - Features and Extensions database --------*- C++ -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 //
0009 // This file defines features exposed via __has_feature and extensions exposed
0010 // via __has_extension. Users of this file must either define the FEATURE or
0011 // EXTENSION macros (or both) to make use of this information. Note that these
0012 // macros expect the following declarations to be available for the Predicate:
0013 //
0014 // const LangOptions &LangOpts;
0015 // const Preprocessor &PP;
0016 //
0017 // The Predicate field dictates the conditions under which the feature or
0018 // extension will be made available.
0019 //
0020 // FEATURE(...) should be used to advertise support for standard language
0021 // features, whereas EXTENSION(...) should be used for clang extensions. Note
0022 // that many of the identifiers in this file don't follow this rule for backward
0023 // compatibility reasons.
0024 //
0025 //===----------------------------------------------------------------------===//
0026
0027 #if !defined(FEATURE) && !defined(EXTENSION)
0028 # error Define either the FEATURE or EXTENSION macro to handle features
0029 #endif
0030
0031 #ifndef FEATURE
0032 #define FEATURE(Name, Predicate)
0033 #endif
0034
0035 #ifndef EXTENSION
0036 #define EXTENSION(Name, Predicate)
0037 #endif
0038
0039 FEATURE(speculative_load_hardening, LangOpts.SpeculativeLoadHardening)
0040 FEATURE(address_sanitizer,
0041 LangOpts.Sanitize.hasOneOf(SanitizerKind::Address |
0042 SanitizerKind::KernelAddress))
0043 FEATURE(leak_sanitizer,
0044 LangOpts.Sanitize.has(SanitizerKind::Leak))
0045 FEATURE(hwaddress_sanitizer,
0046 LangOpts.Sanitize.hasOneOf(SanitizerKind::HWAddress |
0047 SanitizerKind::KernelHWAddress))
0048 FEATURE(memtag_stack,
0049 LangOpts.Sanitize.has(SanitizerKind::MemtagStack))
0050 FEATURE(memtag_heap,
0051 LangOpts.Sanitize.has(SanitizerKind::MemtagHeap))
0052 FEATURE(memtag_globals,
0053 LangOpts.Sanitize.has(SanitizerKind::MemtagGlobals))
0054 FEATURE(xray_instrument, LangOpts.XRayInstrument)
0055 FEATURE(undefined_behavior_sanitizer,
0056 LangOpts.Sanitize.hasOneOf(SanitizerKind::Undefined))
0057 FEATURE(realtime_sanitizer,
0058 LangOpts.Sanitize.has(SanitizerKind::Realtime))
0059 FEATURE(coverage_sanitizer, LangOpts.SanitizeCoverage)
0060 FEATURE(assume_nonnull, true)
0061 FEATURE(attribute_analyzer_noreturn, true)
0062 FEATURE(attribute_availability, true)
0063 FEATURE(attribute_availability_with_message, true)
0064 FEATURE(attribute_availability_app_extension, true)
0065 FEATURE(attribute_availability_with_version_underscores, true)
0066 FEATURE(attribute_availability_tvos, true)
0067 FEATURE(attribute_availability_watchos, true)
0068 FEATURE(attribute_availability_driverkit, true)
0069 FEATURE(attribute_availability_with_strict, true)
0070 FEATURE(attribute_availability_with_replacement, true)
0071 FEATURE(attribute_availability_in_templates, true)
0072 FEATURE(attribute_availability_swift, true)
0073 FEATURE(attribute_cf_returns_not_retained, true)
0074 FEATURE(attribute_cf_returns_retained, true)
0075 FEATURE(attribute_cf_returns_on_parameters, true)
0076 FEATURE(attribute_deprecated_with_message, true)
0077 FEATURE(attribute_deprecated_with_replacement, true)
0078 FEATURE(attribute_ext_vector_type, true)
0079 FEATURE(attribute_ns_returns_not_retained, true)
0080 FEATURE(attribute_ns_returns_retained, true)
0081 FEATURE(attribute_ns_consumes_self, true)
0082 FEATURE(attribute_ns_consumed, true)
0083 FEATURE(attribute_cf_consumed, true)
0084 FEATURE(attribute_objc_ivar_unused, true)
0085 FEATURE(attribute_objc_method_family, true)
0086 FEATURE(attribute_overloadable, true)
0087 FEATURE(attribute_unavailable_with_message, true)
0088 FEATURE(attribute_unused_on_fields, true)
0089 FEATURE(attribute_diagnose_if_objc, true)
0090 FEATURE(blocks, LangOpts.Blocks)
0091 FEATURE(c_thread_safety_attributes, true)
0092 FEATURE(cxx_exceptions, LangOpts.CXXExceptions)
0093 FEATURE(cxx_rtti, LangOpts.RTTI &&LangOpts.RTTIData)
0094 EXTENSION(define_target_os_macros,
0095 PP.getPreprocessorOpts().DefineTargetOSMacros)
0096 FEATURE(enumerator_attributes, true)
0097 FEATURE(nullability, true)
0098 FEATURE(nullability_on_arrays, true)
0099 FEATURE(nullability_on_classes, true)
0100 FEATURE(nullability_nullable_result, true)
0101 FEATURE(numerical_stability_sanitizer, LangOpts.Sanitize.has(SanitizerKind::NumericalStability))
0102 FEATURE(memory_sanitizer,
0103 LangOpts.Sanitize.hasOneOf(SanitizerKind::Memory |
0104 SanitizerKind::KernelMemory))
0105 FEATURE(type_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Type))
0106 FEATURE(thread_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Thread))
0107 FEATURE(dataflow_sanitizer, LangOpts.Sanitize.has(SanitizerKind::DataFlow))
0108 FEATURE(scudo, LangOpts.Sanitize.hasOneOf(SanitizerKind::Scudo))
0109 FEATURE(ptrauth_intrinsics, LangOpts.PointerAuthIntrinsics)
0110 FEATURE(ptrauth_calls, LangOpts.PointerAuthCalls)
0111 FEATURE(ptrauth_returns, LangOpts.PointerAuthReturns)
0112 FEATURE(ptrauth_vtable_pointer_address_discrimination, LangOpts.PointerAuthVTPtrAddressDiscrimination)
0113 FEATURE(ptrauth_vtable_pointer_type_discrimination, LangOpts.PointerAuthVTPtrTypeDiscrimination)
0114 FEATURE(ptrauth_type_info_vtable_pointer_discrimination, LangOpts.PointerAuthTypeInfoVTPtrDiscrimination)
0115 FEATURE(ptrauth_member_function_pointer_type_discrimination, LangOpts.PointerAuthCalls)
0116 FEATURE(ptrauth_function_pointer_type_discrimination, LangOpts.PointerAuthFunctionTypeDiscrimination)
0117 FEATURE(ptrauth_indirect_gotos, LangOpts.PointerAuthIndirectGotos)
0118 FEATURE(ptrauth_init_fini, LangOpts.PointerAuthInitFini)
0119 FEATURE(ptrauth_init_fini_address_discrimination, LangOpts.PointerAuthInitFiniAddressDiscrimination)
0120 FEATURE(ptrauth_elf_got, LangOpts.PointerAuthELFGOT)
0121 EXTENSION(swiftcc,
0122 PP.getTargetInfo().checkCallingConvention(CC_Swift) ==
0123 clang::TargetInfo::CCCR_OK)
0124 EXTENSION(swiftasynccc,
0125 PP.getTargetInfo().checkCallingConvention(CC_SwiftAsync) ==
0126 clang::TargetInfo::CCCR_OK)
0127 FEATURE(pragma_stdc_cx_limited_range, true)
0128 // Objective-C features
0129 FEATURE(objc_arr, LangOpts.ObjCAutoRefCount) // FIXME: REMOVE?
0130 FEATURE(objc_arc, LangOpts.ObjCAutoRefCount)
0131 FEATURE(objc_arc_fields, true)
0132 FEATURE(objc_arc_weak, LangOpts.ObjCWeak)
0133 FEATURE(objc_default_synthesize_properties, LangOpts.ObjC)
0134 FEATURE(objc_fixed_enum, LangOpts.ObjC)
0135 FEATURE(objc_instancetype, LangOpts.ObjC)
0136 FEATURE(objc_kindof, LangOpts.ObjC)
0137 FEATURE(objc_modules, LangOpts.ObjC && LangOpts.Modules)
0138 FEATURE(objc_nonfragile_abi, LangOpts.ObjCRuntime.isNonFragile())
0139 FEATURE(objc_property_explicit_atomic, true)
0140 FEATURE(objc_protocol_qualifier_mangling, true)
0141 FEATURE(objc_weak_class, LangOpts.ObjCRuntime.hasWeakClassImport())
0142 FEATURE(ownership_holds, true)
0143 FEATURE(ownership_returns, true)
0144 FEATURE(ownership_takes, true)
0145 FEATURE(objc_bool, true)
0146 FEATURE(objc_subscripting, LangOpts.ObjCRuntime.isNonFragile())
0147 FEATURE(objc_array_literals, LangOpts.ObjC)
0148 FEATURE(objc_dictionary_literals, LangOpts.ObjC)
0149 FEATURE(objc_boxed_expressions, LangOpts.ObjC)
0150 FEATURE(objc_boxed_nsvalue_expressions, LangOpts.ObjC)
0151 FEATURE(arc_cf_code_audited, true)
0152 FEATURE(objc_bridge_id, true)
0153 FEATURE(objc_bridge_id_on_typedefs, true)
0154 FEATURE(objc_generics, LangOpts.ObjC)
0155 FEATURE(objc_generics_variance, LangOpts.ObjC)
0156 FEATURE(objc_class_property, LangOpts.ObjC)
0157 FEATURE(objc_c_static_assert, LangOpts.C11)
0158 FEATURE(objc_cxx_static_assert, LangOpts.CPlusPlus11)
0159 EXTENSION(objc_c_static_assert, true)
0160 // C11 features
0161 FEATURE(c_alignas, LangOpts.C11)
0162 FEATURE(c_alignof, LangOpts.C11)
0163 FEATURE(c_atomic, LangOpts.C11)
0164 FEATURE(c_generic_selections, LangOpts.C11)
0165 FEATURE(c_static_assert, LangOpts.C11)
0166 FEATURE(c_thread_local, LangOpts.C11 &&PP.getTargetInfo().isTLSSupported())
0167 // C23 features
0168 FEATURE(c_fixed_enum, LangOpts.C23)
0169 // C++11 features
0170 FEATURE(cxx_access_control_sfinae, LangOpts.CPlusPlus11)
0171 FEATURE(cxx_alias_templates, LangOpts.CPlusPlus11)
0172 FEATURE(cxx_alignas, LangOpts.CPlusPlus11)
0173 FEATURE(cxx_alignof, LangOpts.CPlusPlus11)
0174 FEATURE(cxx_atomic, LangOpts.CPlusPlus11)
0175 FEATURE(cxx_attributes, LangOpts.CPlusPlus11)
0176 FEATURE(cxx_auto_type, LangOpts.CPlusPlus11)
0177 FEATURE(cxx_constexpr, LangOpts.CPlusPlus11)
0178 FEATURE(cxx_constexpr_string_builtins, LangOpts.CPlusPlus11)
0179 FEATURE(cxx_decltype, LangOpts.CPlusPlus11)
0180 FEATURE(cxx_decltype_incomplete_return_types, LangOpts.CPlusPlus11)
0181 FEATURE(cxx_default_function_template_args, LangOpts.CPlusPlus11)
0182 FEATURE(cxx_defaulted_functions, LangOpts.CPlusPlus11)
0183 FEATURE(cxx_delegating_constructors, LangOpts.CPlusPlus11)
0184 FEATURE(cxx_deleted_functions, LangOpts.CPlusPlus11)
0185 FEATURE(cxx_explicit_conversions, LangOpts.CPlusPlus11)
0186 FEATURE(cxx_generalized_initializers, LangOpts.CPlusPlus11)
0187 FEATURE(cxx_implicit_moves, LangOpts.CPlusPlus11)
0188 FEATURE(cxx_inheriting_constructors, LangOpts.CPlusPlus11)
0189 FEATURE(cxx_inline_namespaces, LangOpts.CPlusPlus11)
0190 FEATURE(cxx_lambdas, LangOpts.CPlusPlus11)
0191 FEATURE(cxx_local_type_template_args, LangOpts.CPlusPlus11)
0192 FEATURE(cxx_nonstatic_member_init, LangOpts.CPlusPlus11)
0193 FEATURE(cxx_noexcept, LangOpts.CPlusPlus11)
0194 FEATURE(cxx_nullptr, LangOpts.CPlusPlus11)
0195 FEATURE(cxx_override_control, LangOpts.CPlusPlus11)
0196 FEATURE(cxx_range_for, LangOpts.CPlusPlus11)
0197 FEATURE(cxx_raw_string_literals, LangOpts.CPlusPlus11)
0198 FEATURE(cxx_reference_qualified_functions, LangOpts.CPlusPlus11)
0199 FEATURE(cxx_rvalue_references, LangOpts.CPlusPlus11)
0200 FEATURE(cxx_strong_enums, LangOpts.CPlusPlus11)
0201 FEATURE(cxx_static_assert, LangOpts.CPlusPlus11)
0202 FEATURE(cxx_thread_local,
0203 LangOpts.CPlusPlus11 &&PP.getTargetInfo().isTLSSupported())
0204 FEATURE(cxx_trailing_return, LangOpts.CPlusPlus11)
0205 FEATURE(cxx_unicode_literals, LangOpts.CPlusPlus11)
0206 FEATURE(cxx_unrestricted_unions, LangOpts.CPlusPlus11)
0207 FEATURE(cxx_user_literals, LangOpts.CPlusPlus11)
0208 FEATURE(cxx_variadic_templates, LangOpts.CPlusPlus11)
0209 // C++14 features
0210 FEATURE(cxx_aggregate_nsdmi, LangOpts.CPlusPlus14)
0211 FEATURE(cxx_binary_literals, LangOpts.CPlusPlus14)
0212 FEATURE(cxx_contextual_conversions, LangOpts.CPlusPlus14)
0213 FEATURE(cxx_decltype_auto, LangOpts.CPlusPlus14)
0214 FEATURE(cxx_generic_lambdas, LangOpts.CPlusPlus14)
0215 FEATURE(cxx_init_captures, LangOpts.CPlusPlus14)
0216 FEATURE(cxx_relaxed_constexpr, LangOpts.CPlusPlus14)
0217 FEATURE(cxx_return_type_deduction, LangOpts.CPlusPlus14)
0218 FEATURE(cxx_variable_templates, LangOpts.CPlusPlus14)
0219 // NOTE: For features covered by SD-6, it is preferable to provide *only*
0220 // the SD-6 macro and not a __has_feature check.
0221
0222 // C++ TSes
0223 // FEATURE(cxx_runtime_arrays, LangOpts.CPlusPlusTSArrays)
0224 // FEATURE(cxx_concepts, LangOpts.CPlusPlusTSConcepts)
0225 // FIXME: Should this be __has_feature or __has_extension?
0226 // FEATURE(raw_invocation_type, LangOpts.CPlusPlus)
0227 // Type traits
0228 // N.B. Additional type traits should not be added to the following list.
0229 // Instead, they should be detected by has_builtin.
0230 FEATURE(has_nothrow_assign, LangOpts.CPlusPlus)
0231 FEATURE(has_nothrow_copy, LangOpts.CPlusPlus)
0232 FEATURE(has_nothrow_constructor, LangOpts.CPlusPlus)
0233 FEATURE(has_trivial_assign, LangOpts.CPlusPlus)
0234 FEATURE(has_trivial_copy, LangOpts.CPlusPlus)
0235 FEATURE(has_trivial_constructor, LangOpts.CPlusPlus)
0236 FEATURE(has_trivial_destructor, LangOpts.CPlusPlus)
0237 FEATURE(has_virtual_destructor, LangOpts.CPlusPlus)
0238 FEATURE(is_abstract, LangOpts.CPlusPlus)
0239 FEATURE(is_base_of, LangOpts.CPlusPlus)
0240 FEATURE(is_class, LangOpts.CPlusPlus)
0241 FEATURE(is_constructible, LangOpts.CPlusPlus)
0242 FEATURE(is_convertible_to, LangOpts.CPlusPlus)
0243 FEATURE(is_empty, LangOpts.CPlusPlus)
0244 FEATURE(is_enum, LangOpts.CPlusPlus)
0245 FEATURE(is_final, LangOpts.CPlusPlus)
0246 FEATURE(is_literal, LangOpts.CPlusPlus)
0247 FEATURE(is_standard_layout, LangOpts.CPlusPlus)
0248 FEATURE(is_pod, LangOpts.CPlusPlus)
0249 FEATURE(is_polymorphic, LangOpts.CPlusPlus)
0250 FEATURE(is_sealed, LangOpts.CPlusPlus &&LangOpts.MicrosoftExt)
0251 FEATURE(is_trivial, LangOpts.CPlusPlus)
0252 FEATURE(is_trivially_assignable, LangOpts.CPlusPlus)
0253 FEATURE(is_trivially_constructible, LangOpts.CPlusPlus)
0254 FEATURE(is_trivially_copyable, LangOpts.CPlusPlus)
0255 FEATURE(is_union, LangOpts.CPlusPlus)
0256 FEATURE(kcfi, LangOpts.Sanitize.has(SanitizerKind::KCFI))
0257 FEATURE(modules, LangOpts.Modules)
0258 FEATURE(safe_stack, LangOpts.Sanitize.has(SanitizerKind::SafeStack))
0259 FEATURE(shadow_call_stack,
0260 LangOpts.Sanitize.has(SanitizerKind::ShadowCallStack))
0261 FEATURE(tls, PP.getTargetInfo().isTLSSupported())
0262 FEATURE(underlying_type, LangOpts.CPlusPlus)
0263 FEATURE(experimental_library, LangOpts.ExperimentalLibrary)
0264
0265 // C11 features supported by other languages as extensions.
0266 EXTENSION(c_alignas, true)
0267 EXTENSION(c_alignof, true)
0268 EXTENSION(c_atomic, true)
0269 EXTENSION(c_generic_selections, true)
0270 EXTENSION(c_generic_selection_with_controlling_type, true)
0271 EXTENSION(c_static_assert, true)
0272 EXTENSION(c_thread_local, PP.getTargetInfo().isTLSSupported())
0273 // C23 features supported by other languages as extensions
0274 EXTENSION(c_attributes, true)
0275 EXTENSION(c_fixed_enum, true)
0276 // C++11 features supported by other languages as extensions.
0277 EXTENSION(cxx_atomic, LangOpts.CPlusPlus)
0278 EXTENSION(cxx_default_function_template_args, LangOpts.CPlusPlus)
0279 EXTENSION(cxx_defaulted_functions, LangOpts.CPlusPlus)
0280 EXTENSION(cxx_deleted_functions, LangOpts.CPlusPlus)
0281 EXTENSION(cxx_explicit_conversions, LangOpts.CPlusPlus)
0282 EXTENSION(cxx_inline_namespaces, LangOpts.CPlusPlus)
0283 EXTENSION(cxx_lambdas, LangOpts.CPlusPlus)
0284 EXTENSION(cxx_local_type_template_args, LangOpts.CPlusPlus)
0285 EXTENSION(cxx_nonstatic_member_init, LangOpts.CPlusPlus)
0286 EXTENSION(cxx_override_control, LangOpts.CPlusPlus)
0287 EXTENSION(cxx_range_for, LangOpts.CPlusPlus)
0288 EXTENSION(cxx_reference_qualified_functions, LangOpts.CPlusPlus)
0289 EXTENSION(cxx_rvalue_references, LangOpts.CPlusPlus)
0290 EXTENSION(cxx_variadic_templates, LangOpts.CPlusPlus)
0291 EXTENSION(cxx_fixed_enum, true)
0292 // C++14 features supported by other languages as extensions.
0293 EXTENSION(cxx_binary_literals, true)
0294 EXTENSION(cxx_init_captures, LangOpts.CPlusPlus11)
0295 EXTENSION(cxx_variable_templates, LangOpts.CPlusPlus)
0296 //C++20
0297 EXTENSION(cxx_generalized_nttp, LangOpts.CPlusPlus20)
0298 //C++23
0299 EXTENSION(cxx_explicit_this_parameter, LangOpts.CPlusPlus23)
0300 // Miscellaneous language extensions
0301 EXTENSION(overloadable_unmarked, true)
0302 EXTENSION(pragma_clang_attribute_namespaces, true)
0303 EXTENSION(pragma_clang_attribute_external_declaration, true)
0304 EXTENSION(statement_attributes_with_gnu_syntax, true)
0305 EXTENSION(gnu_asm, LangOpts.GNUAsm)
0306 EXTENSION(gnu_asm_goto_with_outputs, LangOpts.GNUAsm)
0307 EXTENSION(gnu_asm_goto_with_outputs_full, LangOpts.GNUAsm)
0308 EXTENSION(matrix_types, LangOpts.MatrixTypes)
0309 EXTENSION(matrix_types_scalar_division, true)
0310 EXTENSION(cxx_attributes_on_using_declarations, LangOpts.CPlusPlus11)
0311 EXTENSION(datasizeof, LangOpts.CPlusPlus)
0312
0313 FEATURE(cxx_abi_relative_vtable, LangOpts.CPlusPlus && LangOpts.RelativeCXXABIVTables)
0314
0315 // CUDA/HIP Features
0316 FEATURE(cuda_noinline_keyword, LangOpts.CUDA)
0317 EXTENSION(cuda_implicit_host_device_templates, LangOpts.CUDA && LangOpts.OffloadImplicitHostDeviceTemplates)
0318
0319 #undef EXTENSION
0320 #undef FEATURE