Features.def 12 KB

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