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(coverage_sanitizer, LangOpts.SanitizeCoverage)
58FEATURE(assume_nonnull, true)
59FEATURE(attribute_analyzer_noreturn, true)
60FEATURE(attribute_availability, true)
61FEATURE(attribute_availability_with_message, true)
62FEATURE(attribute_availability_app_extension, true)
63FEATURE(attribute_availability_with_version_underscores, true)
64FEATURE(attribute_availability_tvos, true)
65FEATURE(attribute_availability_watchos, true)
66FEATURE(attribute_availability_driverkit, true)
67FEATURE(attribute_availability_with_strict, true)
68FEATURE(attribute_availability_with_replacement, true)
69FEATURE(attribute_availability_in_templates, true)
70FEATURE(attribute_availability_swift, true)
71FEATURE(attribute_cf_returns_not_retained, true)
72FEATURE(attribute_cf_returns_retained, true)
73FEATURE(attribute_cf_returns_on_parameters, true)
74FEATURE(attribute_deprecated_with_message, true)
75FEATURE(attribute_deprecated_with_replacement, true)
76FEATURE(attribute_ext_vector_type, true)
77FEATURE(attribute_ns_returns_not_retained, true)
78FEATURE(attribute_ns_returns_retained, true)
79FEATURE(attribute_ns_consumes_self, true)
80FEATURE(attribute_ns_consumed, true)
81FEATURE(attribute_cf_consumed, true)
82FEATURE(attribute_objc_ivar_unused, true)
83FEATURE(attribute_objc_method_family, true)
84FEATURE(attribute_overloadable, true)
85FEATURE(attribute_unavailable_with_message, true)
86FEATURE(attribute_unused_on_fields, true)
87FEATURE(attribute_diagnose_if_objc, true)
88FEATURE(blocks, LangOpts.Blocks)
89FEATURE(c_thread_safety_attributes, true)
90FEATURE(cxx_exceptions, LangOpts.CXXExceptions)
91FEATURE(cxx_rtti, LangOpts.RTTI &&LangOpts.RTTIData)
92EXTENSION(define_target_os_macros,
93 PP.getPreprocessorOpts().DefineTargetOSMacros)
94FEATURE(enumerator_attributes, true)
95FEATURE(nullability, true)
96FEATURE(nullability_on_arrays, true)
97FEATURE(nullability_nullable_result, true)
98FEATURE(memory_sanitizer,
99 LangOpts.Sanitize.hasOneOf(SanitizerKind::Memory |
100 SanitizerKind::KernelMemory))
101FEATURE(thread_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Thread))
102FEATURE(dataflow_sanitizer, LangOpts.Sanitize.has(SanitizerKind::DataFlow))
103FEATURE(scudo, LangOpts.Sanitize.hasOneOf(SanitizerKind::Scudo))
104FEATURE(swiftasynccc,
105 PP.getTargetInfo().checkCallingConvention(CC_SwiftAsync) ==
106 clang::TargetInfo::CCCR_OK)
107FEATURE(pragma_stdc_cx_limited_range, true)
108// Objective-C features
109FEATURE(objc_arr, LangOpts.ObjCAutoRefCount) // FIXME: REMOVE?
110FEATURE(objc_arc, LangOpts.ObjCAutoRefCount)
111FEATURE(objc_arc_fields, true)
112FEATURE(objc_arc_weak, LangOpts.ObjCWeak)
113FEATURE(objc_default_synthesize_properties, LangOpts.ObjC)
114FEATURE(objc_fixed_enum, LangOpts.ObjC)
115FEATURE(objc_instancetype, LangOpts.ObjC)
116FEATURE(objc_kindof, LangOpts.ObjC)
117FEATURE(objc_modules, LangOpts.ObjC && LangOpts.Modules)
118FEATURE(objc_nonfragile_abi, LangOpts.ObjCRuntime.isNonFragile())
119FEATURE(objc_property_explicit_atomic, true)
120FEATURE(objc_protocol_qualifier_mangling, true)
121FEATURE(objc_weak_class, LangOpts.ObjCRuntime.hasWeakClassImport())
122FEATURE(ownership_holds, true)
123FEATURE(ownership_returns, true)
124FEATURE(ownership_takes, true)
125FEATURE(objc_bool, true)
126FEATURE(objc_subscripting, LangOpts.ObjCRuntime.isNonFragile())
127FEATURE(objc_array_literals, LangOpts.ObjC)
128FEATURE(objc_dictionary_literals, LangOpts.ObjC)
129FEATURE(objc_boxed_expressions, LangOpts.ObjC)
130FEATURE(objc_boxed_nsvalue_expressions, LangOpts.ObjC)
131FEATURE(arc_cf_code_audited, true)
132FEATURE(objc_bridge_id, true)
133FEATURE(objc_bridge_id_on_typedefs, true)
134FEATURE(objc_generics, LangOpts.ObjC)
135FEATURE(objc_generics_variance, LangOpts.ObjC)
136FEATURE(objc_class_property, LangOpts.ObjC)
137FEATURE(objc_c_static_assert, LangOpts.C11)
138FEATURE(objc_cxx_static_assert, LangOpts.CPlusPlus11)
139EXTENSION(objc_c_static_assert, true)
140// C11 features
141FEATURE(c_alignas, LangOpts.C11)
142FEATURE(c_alignof, LangOpts.C11)
143FEATURE(c_atomic, LangOpts.C11)
144FEATURE(c_generic_selections, LangOpts.C11)
145FEATURE(c_static_assert, LangOpts.C11)
146FEATURE(c_thread_local, LangOpts.C11 &&PP.getTargetInfo().isTLSSupported())
147// C++11 features
148FEATURE(cxx_access_control_sfinae, LangOpts.CPlusPlus11)
149FEATURE(cxx_alias_templates, LangOpts.CPlusPlus11)
150FEATURE(cxx_alignas, LangOpts.CPlusPlus11)
151FEATURE(cxx_alignof, LangOpts.CPlusPlus11)
152FEATURE(cxx_atomic, LangOpts.CPlusPlus11)
153FEATURE(cxx_attributes, LangOpts.CPlusPlus11)
154FEATURE(cxx_auto_type, LangOpts.CPlusPlus11)
155FEATURE(cxx_constexpr, LangOpts.CPlusPlus11)
156FEATURE(cxx_constexpr_string_builtins, LangOpts.CPlusPlus11)
157FEATURE(cxx_decltype, LangOpts.CPlusPlus11)
158FEATURE(cxx_decltype_incomplete_return_types, LangOpts.CPlusPlus11)
159FEATURE(cxx_default_function_template_args, LangOpts.CPlusPlus11)
160FEATURE(cxx_defaulted_functions, LangOpts.CPlusPlus11)
161FEATURE(cxx_delegating_constructors, LangOpts.CPlusPlus11)
162FEATURE(cxx_deleted_functions, LangOpts.CPlusPlus11)
163FEATURE(cxx_explicit_conversions, LangOpts.CPlusPlus11)
164FEATURE(cxx_generalized_initializers, LangOpts.CPlusPlus11)
165FEATURE(cxx_implicit_moves, LangOpts.CPlusPlus11)
166FEATURE(cxx_inheriting_constructors, LangOpts.CPlusPlus11)
167FEATURE(cxx_inline_namespaces, LangOpts.CPlusPlus11)
168FEATURE(cxx_lambdas, LangOpts.CPlusPlus11)
169FEATURE(cxx_local_type_template_args, LangOpts.CPlusPlus11)
170FEATURE(cxx_nonstatic_member_init, LangOpts.CPlusPlus11)
171FEATURE(cxx_noexcept, LangOpts.CPlusPlus11)
172FEATURE(cxx_nullptr, LangOpts.CPlusPlus11)
173FEATURE(cxx_override_control, LangOpts.CPlusPlus11)
174FEATURE(cxx_range_for, LangOpts.CPlusPlus11)
175FEATURE(cxx_raw_string_literals, LangOpts.CPlusPlus11)
176FEATURE(cxx_reference_qualified_functions, LangOpts.CPlusPlus11)
177FEATURE(cxx_rvalue_references, LangOpts.CPlusPlus11)
178FEATURE(cxx_strong_enums, LangOpts.CPlusPlus11)
179FEATURE(cxx_static_assert, LangOpts.CPlusPlus11)
180FEATURE(cxx_thread_local,
181 LangOpts.CPlusPlus11 &&PP.getTargetInfo().isTLSSupported())
182FEATURE(cxx_trailing_return, LangOpts.CPlusPlus11)
183FEATURE(cxx_unicode_literals, LangOpts.CPlusPlus11)
184FEATURE(cxx_unrestricted_unions, LangOpts.CPlusPlus11)
185FEATURE(cxx_user_literals, LangOpts.CPlusPlus11)
186FEATURE(cxx_variadic_templates, LangOpts.CPlusPlus11)
187// C++14 features
188FEATURE(cxx_aggregate_nsdmi, LangOpts.CPlusPlus14)
189FEATURE(cxx_binary_literals, LangOpts.CPlusPlus14)
190FEATURE(cxx_contextual_conversions, LangOpts.CPlusPlus14)
191FEATURE(cxx_decltype_auto, LangOpts.CPlusPlus14)
192FEATURE(cxx_generic_lambdas, LangOpts.CPlusPlus14)
193FEATURE(cxx_init_captures, LangOpts.CPlusPlus14)
194FEATURE(cxx_relaxed_constexpr, LangOpts.CPlusPlus14)
195FEATURE(cxx_return_type_deduction, LangOpts.CPlusPlus14)
196FEATURE(cxx_variable_templates, LangOpts.CPlusPlus14)
197// NOTE: For features covered by SD-6, it is preferable to provide *only*
198// the SD-6 macro and not a __has_feature check.
199
200// C++ TSes
201// FEATURE(cxx_runtime_arrays, LangOpts.CPlusPlusTSArrays)
202// FEATURE(cxx_concepts, LangOpts.CPlusPlusTSConcepts)
203// FIXME: Should this be __has_feature or __has_extension?
204// FEATURE(raw_invocation_type, LangOpts.CPlusPlus)
205// Type traits
206// N.B. Additional type traits should not be added to the following list.
207// Instead, they should be detected by has_builtin.
208FEATURE(has_nothrow_assign, LangOpts.CPlusPlus)
209FEATURE(has_nothrow_copy, LangOpts.CPlusPlus)
210FEATURE(has_nothrow_constructor, LangOpts.CPlusPlus)
211FEATURE(has_trivial_assign, LangOpts.CPlusPlus)
212FEATURE(has_trivial_copy, LangOpts.CPlusPlus)
213FEATURE(has_trivial_constructor, LangOpts.CPlusPlus)
214FEATURE(has_trivial_destructor, LangOpts.CPlusPlus)
215FEATURE(has_virtual_destructor, LangOpts.CPlusPlus)
216FEATURE(is_abstract, LangOpts.CPlusPlus)
217FEATURE(is_base_of, LangOpts.CPlusPlus)
218FEATURE(is_class, LangOpts.CPlusPlus)
219FEATURE(is_constructible, LangOpts.CPlusPlus)
220FEATURE(is_convertible_to, LangOpts.CPlusPlus)
221FEATURE(is_empty, LangOpts.CPlusPlus)
222FEATURE(is_enum, LangOpts.CPlusPlus)
223FEATURE(is_final, LangOpts.CPlusPlus)
224FEATURE(is_literal, LangOpts.CPlusPlus)
225FEATURE(is_standard_layout, LangOpts.CPlusPlus)
226FEATURE(is_pod, LangOpts.CPlusPlus)
227FEATURE(is_polymorphic, LangOpts.CPlusPlus)
228FEATURE(is_sealed, LangOpts.CPlusPlus &&LangOpts.MicrosoftExt)
229FEATURE(is_trivial, LangOpts.CPlusPlus)
230FEATURE(is_trivially_assignable, LangOpts.CPlusPlus)
231FEATURE(is_trivially_constructible, LangOpts.CPlusPlus)
232FEATURE(is_trivially_copyable, LangOpts.CPlusPlus)
233FEATURE(is_union, LangOpts.CPlusPlus)
234FEATURE(kcfi, LangOpts.Sanitize.has(SanitizerKind::KCFI))
235FEATURE(modules, LangOpts.Modules)
236FEATURE(safe_stack, LangOpts.Sanitize.has(SanitizerKind::SafeStack))
237FEATURE(shadow_call_stack,
238 LangOpts.Sanitize.has(SanitizerKind::ShadowCallStack))
239FEATURE(tls, PP.getTargetInfo().isTLSSupported())
240FEATURE(underlying_type, LangOpts.CPlusPlus)
241FEATURE(experimental_library, LangOpts.ExperimentalLibrary)
242
243// C11 features supported by other languages as extensions.
244EXTENSION(c_alignas, true)
245EXTENSION(c_alignof, true)
246EXTENSION(c_atomic, true)
247EXTENSION(c_generic_selections, true)
248EXTENSION(c_generic_selection_with_controlling_type, true)
249EXTENSION(c_static_assert, true)
250EXTENSION(c_thread_local, PP.getTargetInfo().isTLSSupported())
251// C23 features supported by other languages as extensions
252EXTENSION(c_attributes, true)
253// C++11 features supported by other languages as extensions.
254EXTENSION(cxx_atomic, LangOpts.CPlusPlus)
255EXTENSION(cxx_default_function_template_args, LangOpts.CPlusPlus)
256EXTENSION(cxx_defaulted_functions, LangOpts.CPlusPlus)
257EXTENSION(cxx_deleted_functions, LangOpts.CPlusPlus)
258EXTENSION(cxx_explicit_conversions, LangOpts.CPlusPlus)
259EXTENSION(cxx_inline_namespaces, LangOpts.CPlusPlus)
260EXTENSION(cxx_local_type_template_args, LangOpts.CPlusPlus)
261EXTENSION(cxx_nonstatic_member_init, LangOpts.CPlusPlus)
262EXTENSION(cxx_override_control, LangOpts.CPlusPlus)
263EXTENSION(cxx_range_for, LangOpts.CPlusPlus)
264EXTENSION(cxx_reference_qualified_functions, LangOpts.CPlusPlus)
265EXTENSION(cxx_rvalue_references, LangOpts.CPlusPlus)
266EXTENSION(cxx_variadic_templates, LangOpts.CPlusPlus)
267EXTENSION(cxx_fixed_enum, true)
268// C++14 features supported by other languages as extensions.
269EXTENSION(cxx_binary_literals, true)
270EXTENSION(cxx_init_captures, LangOpts.CPlusPlus11)
271EXTENSION(cxx_variable_templates, LangOpts.CPlusPlus)
272//C++20
273EXTENSION(cxx_generalized_nttp, LangOpts.CPlusPlus20)
274//C++23
275EXTENSION(cxx_explicit_this_parameter, LangOpts.CPlusPlus23)
276// Miscellaneous language extensions
277EXTENSION(overloadable_unmarked, true)
278EXTENSION(pragma_clang_attribute_namespaces, true)
279EXTENSION(pragma_clang_attribute_external_declaration, true)
280EXTENSION(statement_attributes_with_gnu_syntax, true)
281EXTENSION(gnu_asm, LangOpts.GNUAsm)
282EXTENSION(gnu_asm_goto_with_outputs, LangOpts.GNUAsm)
283EXTENSION(gnu_asm_goto_with_outputs_full, LangOpts.GNUAsm)
284EXTENSION(matrix_types, LangOpts.MatrixTypes)
285EXTENSION(matrix_types_scalar_division, true)
286EXTENSION(cxx_attributes_on_using_declarations, LangOpts.CPlusPlus11)
287EXTENSION(datasizeof, LangOpts.CPlusPlus)
288
289FEATURE(cxx_abi_relative_vtable, LangOpts.CPlusPlus && LangOpts.RelativeCXXABIVTables)
290
291// CUDA/HIP Features
292FEATURE(cuda_noinline_keyword, LangOpts.CUDA)
293EXTENSION(cuda_implicit_host_device_templates, LangOpts.CUDA && LangOpts.OffloadImplicitHostDeviceTemplates)
294
295#undef EXTENSION
296#undef FEATURE
297

source code of clang/include/clang/Basic/Features.def