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