1========================= 2Clang Language Extensions 3========================= 4 5.. contents:: 6 :local: 7 :depth: 1 8 9.. toctree:: 10 :hidden: 11 12 ObjectiveCLiterals 13 BlockLanguageSpec 14 Block-ABI-Apple 15 AutomaticReferenceCounting 16 17Introduction 18============ 19 20This document describes the language extensions provided by Clang. In addition 21to the language extensions listed here, Clang aims to support a broad range of 22GCC extensions. Please see the `GCC manual 23<http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>`_ for more information on 24these extensions. 25 26.. _langext-feature_check: 27 28Feature Checking Macros 29======================= 30 31Language extensions can be very useful, but only if you know you can depend on 32them. In order to allow fine-grain features checks, we support three builtin 33function-like macros. This allows you to directly test for a feature in your 34code without having to resort to something like autoconf or fragile "compiler 35version checks". 36 37``__has_builtin`` 38----------------- 39 40This function-like macro takes a single identifier argument that is the name of 41a builtin function. It evaluates to 1 if the builtin is supported or 0 if not. 42It can be used like this: 43 44.. code-block:: c++ 45 46 #ifndef __has_builtin // Optional of course. 47 #define __has_builtin(x) 0 // Compatibility with non-clang compilers. 48 #endif 49 50 ... 51 #if __has_builtin(__builtin_trap) 52 __builtin_trap(); 53 #else 54 abort(); 55 #endif 56 ... 57 58.. _langext-__has_feature-__has_extension: 59 60``__has_feature`` and ``__has_extension`` 61----------------------------------------- 62 63These function-like macros take a single identifier argument that is the name 64of a feature. ``__has_feature`` evaluates to 1 if the feature is both 65supported by Clang and standardized in the current language standard or 0 if 66not (but see :ref:`below <langext-has-feature-back-compat>`), while 67``__has_extension`` evaluates to 1 if the feature is supported by Clang in the 68current language (either as a language extension or a standard language 69feature) or 0 if not. They can be used like this: 70 71.. code-block:: c++ 72 73 #ifndef __has_feature // Optional of course. 74 #define __has_feature(x) 0 // Compatibility with non-clang compilers. 75 #endif 76 #ifndef __has_extension 77 #define __has_extension __has_feature // Compatibility with pre-3.0 compilers. 78 #endif 79 80 ... 81 #if __has_feature(cxx_rvalue_references) 82 // This code will only be compiled with the -std=c++11 and -std=gnu++11 83 // options, because rvalue references are only standardized in C++11. 84 #endif 85 86 #if __has_extension(cxx_rvalue_references) 87 // This code will be compiled with the -std=c++11, -std=gnu++11, -std=c++98 88 // and -std=gnu++98 options, because rvalue references are supported as a 89 // language extension in C++98. 90 #endif 91 92.. _langext-has-feature-back-compat: 93 94For backward compatibility, ``__has_feature`` can also be used to test 95for support for non-standardized features, i.e. features not prefixed ``c_``, 96``cxx_`` or ``objc_``. 97 98Another use of ``__has_feature`` is to check for compiler features not related 99to the language standard, such as e.g. :doc:`AddressSanitizer 100<AddressSanitizer>`. 101 102If the ``-pedantic-errors`` option is given, ``__has_extension`` is equivalent 103to ``__has_feature``. 104 105The feature tag is described along with the language feature below. 106 107The feature name or extension name can also be specified with a preceding and 108following ``__`` (double underscore) to avoid interference from a macro with 109the same name. For instance, ``__cxx_rvalue_references__`` can be used instead 110of ``cxx_rvalue_references``. 111 112``__has_attribute`` 113------------------- 114 115This function-like macro takes a single identifier argument that is the name of 116an attribute. It evaluates to 1 if the attribute is supported by the current 117compilation target, or 0 if not. It can be used like this: 118 119.. code-block:: c++ 120 121 #ifndef __has_attribute // Optional of course. 122 #define __has_attribute(x) 0 // Compatibility with non-clang compilers. 123 #endif 124 125 ... 126 #if __has_attribute(always_inline) 127 #define ALWAYS_INLINE __attribute__((always_inline)) 128 #else 129 #define ALWAYS_INLINE 130 #endif 131 ... 132 133The attribute name can also be specified with a preceding and following ``__`` 134(double underscore) to avoid interference from a macro with the same name. For 135instance, ``__always_inline__`` can be used instead of ``always_inline``. 136 137``__is_identifier`` 138------------------- 139 140This function-like macro takes a single identifier argument that might be either 141a reserved word or a regular identifier. It evaluates to 1 if the argument is just 142a regular identifier and not a reserved word, in the sense that it can then be 143used as the name of a user-defined function or variable. Otherwise it evaluates 144to 0. It can be used like this: 145 146.. code-block:: c++ 147 148 ... 149 #ifdef __is_identifier // Compatibility with non-clang compilers. 150 #if __is_identifier(__wchar_t) 151 typedef wchar_t __wchar_t; 152 #endif 153 #endif 154 155 __wchar_t WideCharacter; 156 ... 157 158Include File Checking Macros 159============================ 160 161Not all developments systems have the same include files. The 162:ref:`langext-__has_include` and :ref:`langext-__has_include_next` macros allow 163you to check for the existence of an include file before doing a possibly 164failing ``#include`` directive. Include file checking macros must be used 165as expressions in ``#if`` or ``#elif`` preprocessing directives. 166 167.. _langext-__has_include: 168 169``__has_include`` 170----------------- 171 172This function-like macro takes a single file name string argument that is the 173name of an include file. It evaluates to 1 if the file can be found using the 174include paths, or 0 otherwise: 175 176.. code-block:: c++ 177 178 // Note the two possible file name string formats. 179 #if __has_include("myinclude.h") && __has_include(<stdint.h>) 180 # include "myinclude.h" 181 #endif 182 183To test for this feature, use ``#if defined(__has_include)``: 184 185.. code-block:: c++ 186 187 // To avoid problem with non-clang compilers not having this macro. 188 #if defined(__has_include) 189 #if __has_include("myinclude.h") 190 # include "myinclude.h" 191 #endif 192 #endif 193 194.. _langext-__has_include_next: 195 196``__has_include_next`` 197---------------------- 198 199This function-like macro takes a single file name string argument that is the 200name of an include file. It is like ``__has_include`` except that it looks for 201the second instance of the given file found in the include paths. It evaluates 202to 1 if the second instance of the file can be found using the include paths, 203or 0 otherwise: 204 205.. code-block:: c++ 206 207 // Note the two possible file name string formats. 208 #if __has_include_next("myinclude.h") && __has_include_next(<stdint.h>) 209 # include_next "myinclude.h" 210 #endif 211 212 // To avoid problem with non-clang compilers not having this macro. 213 #if defined(__has_include_next) 214 #if __has_include_next("myinclude.h") 215 # include_next "myinclude.h" 216 #endif 217 #endif 218 219Note that ``__has_include_next``, like the GNU extension ``#include_next`` 220directive, is intended for use in headers only, and will issue a warning if 221used in the top-level compilation file. A warning will also be issued if an 222absolute path is used in the file argument. 223 224``__has_warning`` 225----------------- 226 227This function-like macro takes a string literal that represents a command line 228option for a warning and returns true if that is a valid warning option. 229 230.. code-block:: c++ 231 232 #if __has_warning("-Wformat") 233 ... 234 #endif 235 236Builtin Macros 237============== 238 239``__BASE_FILE__`` 240 Defined to a string that contains the name of the main input file passed to 241 Clang. 242 243``__COUNTER__`` 244 Defined to an integer value that starts at zero and is incremented each time 245 the ``__COUNTER__`` macro is expanded. 246 247``__INCLUDE_LEVEL__`` 248 Defined to an integral value that is the include depth of the file currently 249 being translated. For the main file, this value is zero. 250 251``__TIMESTAMP__`` 252 Defined to the date and time of the last modification of the current source 253 file. 254 255``__clang__`` 256 Defined when compiling with Clang 257 258``__clang_major__`` 259 Defined to the major marketing version number of Clang (e.g., the 2 in 260 2.0.1). Note that marketing version numbers should not be used to check for 261 language features, as different vendors use different numbering schemes. 262 Instead, use the :ref:`langext-feature_check`. 263 264``__clang_minor__`` 265 Defined to the minor version number of Clang (e.g., the 0 in 2.0.1). Note 266 that marketing version numbers should not be used to check for language 267 features, as different vendors use different numbering schemes. Instead, use 268 the :ref:`langext-feature_check`. 269 270``__clang_patchlevel__`` 271 Defined to the marketing patch level of Clang (e.g., the 1 in 2.0.1). 272 273``__clang_version__`` 274 Defined to a string that captures the Clang marketing version, including the 275 Subversion tag or revision number, e.g., "``1.5 (trunk 102332)``". 276 277.. _langext-vectors: 278 279Vectors and Extended Vectors 280============================ 281 282Supports the GCC, OpenCL, AltiVec and NEON vector extensions. 283 284OpenCL vector types are created using ``ext_vector_type`` attribute. It 285support for ``V.xyzw`` syntax and other tidbits as seen in OpenCL. An example 286is: 287 288.. code-block:: c++ 289 290 typedef float float4 __attribute__((ext_vector_type(4))); 291 typedef float float2 __attribute__((ext_vector_type(2))); 292 293 float4 foo(float2 a, float2 b) { 294 float4 c; 295 c.xz = a; 296 c.yw = b; 297 return c; 298 } 299 300Query for this feature with ``__has_extension(attribute_ext_vector_type)``. 301 302Giving ``-faltivec`` option to clang enables support for AltiVec vector syntax 303and functions. For example: 304 305.. code-block:: c++ 306 307 vector float foo(vector int a) { 308 vector int b; 309 b = vec_add(a, a) + a; 310 return (vector float)b; 311 } 312 313NEON vector types are created using ``neon_vector_type`` and 314``neon_polyvector_type`` attributes. For example: 315 316.. code-block:: c++ 317 318 typedef __attribute__((neon_vector_type(8))) int8_t int8x8_t; 319 typedef __attribute__((neon_polyvector_type(16))) poly8_t poly8x16_t; 320 321 int8x8_t foo(int8x8_t a) { 322 int8x8_t v; 323 v = a; 324 return v; 325 } 326 327Vector Literals 328--------------- 329 330Vector literals can be used to create vectors from a set of scalars, or 331vectors. Either parentheses or braces form can be used. In the parentheses 332form the number of literal values specified must be one, i.e. referring to a 333scalar value, or must match the size of the vector type being created. If a 334single scalar literal value is specified, the scalar literal value will be 335replicated to all the components of the vector type. In the brackets form any 336number of literals can be specified. For example: 337 338.. code-block:: c++ 339 340 typedef int v4si __attribute__((__vector_size__(16))); 341 typedef float float4 __attribute__((ext_vector_type(4))); 342 typedef float float2 __attribute__((ext_vector_type(2))); 343 344 v4si vsi = (v4si){1, 2, 3, 4}; 345 float4 vf = (float4)(1.0f, 2.0f, 3.0f, 4.0f); 346 vector int vi1 = (vector int)(1); // vi1 will be (1, 1, 1, 1). 347 vector int vi2 = (vector int){1}; // vi2 will be (1, 0, 0, 0). 348 vector int vi3 = (vector int)(1, 2); // error 349 vector int vi4 = (vector int){1, 2}; // vi4 will be (1, 2, 0, 0). 350 vector int vi5 = (vector int)(1, 2, 3, 4); 351 float4 vf = (float4)((float2)(1.0f, 2.0f), (float2)(3.0f, 4.0f)); 352 353Vector Operations 354----------------- 355 356The table below shows the support for each operation by vector extension. A 357dash indicates that an operation is not accepted according to a corresponding 358specification. 359 360============================== ======= ======= ======= ======= 361 Opeator OpenCL AltiVec GCC NEON 362============================== ======= ======= ======= ======= 363[] yes yes yes -- 364unary operators +, -- yes yes yes -- 365++, -- -- yes yes yes -- 366+,--,*,/,% yes yes yes -- 367bitwise operators &,|,^,~ yes yes yes -- 368>>,<< yes yes yes -- 369!, &&, || yes -- -- -- 370==, !=, >, <, >=, <= yes yes -- -- 371= yes yes yes yes 372:? yes -- -- -- 373sizeof yes yes yes yes 374C-style cast yes yes yes no 375reinterpret_cast yes no yes no 376static_cast yes no yes no 377const_cast no no no no 378============================== ======= ======= ======= ======= 379 380See also :ref:`langext-__builtin_shufflevector`, :ref:`langext-__builtin_convertvector`. 381 382Messages on ``deprecated`` and ``unavailable`` Attributes 383========================================================= 384 385An optional string message can be added to the ``deprecated`` and 386``unavailable`` attributes. For example: 387 388.. code-block:: c++ 389 390 void explode(void) __attribute__((deprecated("extremely unsafe, use 'combust' instead!!!"))); 391 392If the deprecated or unavailable declaration is used, the message will be 393incorporated into the appropriate diagnostic: 394 395.. code-block:: c++ 396 397 harmless.c:4:3: warning: 'explode' is deprecated: extremely unsafe, use 'combust' instead!!! 398 [-Wdeprecated-declarations] 399 explode(); 400 ^ 401 402Query for this feature with 403``__has_extension(attribute_deprecated_with_message)`` and 404``__has_extension(attribute_unavailable_with_message)``. 405 406Attributes on Enumerators 407========================= 408 409Clang allows attributes to be written on individual enumerators. This allows 410enumerators to be deprecated, made unavailable, etc. The attribute must appear 411after the enumerator name and before any initializer, like so: 412 413.. code-block:: c++ 414 415 enum OperationMode { 416 OM_Invalid, 417 OM_Normal, 418 OM_Terrified __attribute__((deprecated)), 419 OM_AbortOnError __attribute__((deprecated)) = 4 420 }; 421 422Attributes on the ``enum`` declaration do not apply to individual enumerators. 423 424Query for this feature with ``__has_extension(enumerator_attributes)``. 425 426'User-Specified' System Frameworks 427================================== 428 429Clang provides a mechanism by which frameworks can be built in such a way that 430they will always be treated as being "system frameworks", even if they are not 431present in a system framework directory. This can be useful to system 432framework developers who want to be able to test building other applications 433with development builds of their framework, including the manner in which the 434compiler changes warning behavior for system headers. 435 436Framework developers can opt-in to this mechanism by creating a 437"``.system_framework``" file at the top-level of their framework. That is, the 438framework should have contents like: 439 440.. code-block:: none 441 442 .../TestFramework.framework 443 .../TestFramework.framework/.system_framework 444 .../TestFramework.framework/Headers 445 .../TestFramework.framework/Headers/TestFramework.h 446 ... 447 448Clang will treat the presence of this file as an indicator that the framework 449should be treated as a system framework, regardless of how it was found in the 450framework search path. For consistency, we recommend that such files never be 451included in installed versions of the framework. 452 453Checks for Standard Language Features 454===================================== 455 456The ``__has_feature`` macro can be used to query if certain standard language 457features are enabled. The ``__has_extension`` macro can be used to query if 458language features are available as an extension when compiling for a standard 459which does not provide them. The features which can be tested are listed here. 460 461C++98 462----- 463 464The features listed below are part of the C++98 standard. These features are 465enabled by default when compiling C++ code. 466 467C++ exceptions 468^^^^^^^^^^^^^^ 469 470Use ``__has_feature(cxx_exceptions)`` to determine if C++ exceptions have been 471enabled. For example, compiling code with ``-fno-exceptions`` disables C++ 472exceptions. 473 474C++ RTTI 475^^^^^^^^ 476 477Use ``__has_feature(cxx_rtti)`` to determine if C++ RTTI has been enabled. For 478example, compiling code with ``-fno-rtti`` disables the use of RTTI. 479 480C++11 481----- 482 483The features listed below are part of the C++11 standard. As a result, all 484these features are enabled with the ``-std=c++11`` or ``-std=gnu++11`` option 485when compiling C++ code. 486 487C++11 SFINAE includes access control 488^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 489 490Use ``__has_feature(cxx_access_control_sfinae)`` or 491``__has_extension(cxx_access_control_sfinae)`` to determine whether 492access-control errors (e.g., calling a private constructor) are considered to 493be template argument deduction errors (aka SFINAE errors), per `C++ DR1170 494<http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1170>`_. 495 496C++11 alias templates 497^^^^^^^^^^^^^^^^^^^^^ 498 499Use ``__has_feature(cxx_alias_templates)`` or 500``__has_extension(cxx_alias_templates)`` to determine if support for C++11's 501alias declarations and alias templates is enabled. 502 503C++11 alignment specifiers 504^^^^^^^^^^^^^^^^^^^^^^^^^^ 505 506Use ``__has_feature(cxx_alignas)`` or ``__has_extension(cxx_alignas)`` to 507determine if support for alignment specifiers using ``alignas`` is enabled. 508 509C++11 attributes 510^^^^^^^^^^^^^^^^ 511 512Use ``__has_feature(cxx_attributes)`` or ``__has_extension(cxx_attributes)`` to 513determine if support for attribute parsing with C++11's square bracket notation 514is enabled. 515 516C++11 generalized constant expressions 517^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 518 519Use ``__has_feature(cxx_constexpr)`` to determine if support for generalized 520constant expressions (e.g., ``constexpr``) is enabled. 521 522C++11 ``decltype()`` 523^^^^^^^^^^^^^^^^^^^^ 524 525Use ``__has_feature(cxx_decltype)`` or ``__has_extension(cxx_decltype)`` to 526determine if support for the ``decltype()`` specifier is enabled. C++11's 527``decltype`` does not require type-completeness of a function call expression. 528Use ``__has_feature(cxx_decltype_incomplete_return_types)`` or 529``__has_extension(cxx_decltype_incomplete_return_types)`` to determine if 530support for this feature is enabled. 531 532C++11 default template arguments in function templates 533^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 534 535Use ``__has_feature(cxx_default_function_template_args)`` or 536``__has_extension(cxx_default_function_template_args)`` to determine if support 537for default template arguments in function templates is enabled. 538 539C++11 ``default``\ ed functions 540^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 541 542Use ``__has_feature(cxx_defaulted_functions)`` or 543``__has_extension(cxx_defaulted_functions)`` to determine if support for 544defaulted function definitions (with ``= default``) is enabled. 545 546C++11 delegating constructors 547^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 548 549Use ``__has_feature(cxx_delegating_constructors)`` to determine if support for 550delegating constructors is enabled. 551 552C++11 ``deleted`` functions 553^^^^^^^^^^^^^^^^^^^^^^^^^^^ 554 555Use ``__has_feature(cxx_deleted_functions)`` or 556``__has_extension(cxx_deleted_functions)`` to determine if support for deleted 557function definitions (with ``= delete``) is enabled. 558 559C++11 explicit conversion functions 560^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 561 562Use ``__has_feature(cxx_explicit_conversions)`` to determine if support for 563``explicit`` conversion functions is enabled. 564 565C++11 generalized initializers 566^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 567 568Use ``__has_feature(cxx_generalized_initializers)`` to determine if support for 569generalized initializers (using braced lists and ``std::initializer_list``) is 570enabled. 571 572C++11 implicit move constructors/assignment operators 573^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 574 575Use ``__has_feature(cxx_implicit_moves)`` to determine if Clang will implicitly 576generate move constructors and move assignment operators where needed. 577 578C++11 inheriting constructors 579^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 580 581Use ``__has_feature(cxx_inheriting_constructors)`` to determine if support for 582inheriting constructors is enabled. 583 584C++11 inline namespaces 585^^^^^^^^^^^^^^^^^^^^^^^ 586 587Use ``__has_feature(cxx_inline_namespaces)`` or 588``__has_extension(cxx_inline_namespaces)`` to determine if support for inline 589namespaces is enabled. 590 591C++11 lambdas 592^^^^^^^^^^^^^ 593 594Use ``__has_feature(cxx_lambdas)`` or ``__has_extension(cxx_lambdas)`` to 595determine if support for lambdas is enabled. 596 597C++11 local and unnamed types as template arguments 598^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 599 600Use ``__has_feature(cxx_local_type_template_args)`` or 601``__has_extension(cxx_local_type_template_args)`` to determine if support for 602local and unnamed types as template arguments is enabled. 603 604C++11 noexcept 605^^^^^^^^^^^^^^ 606 607Use ``__has_feature(cxx_noexcept)`` or ``__has_extension(cxx_noexcept)`` to 608determine if support for noexcept exception specifications is enabled. 609 610C++11 in-class non-static data member initialization 611^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 612 613Use ``__has_feature(cxx_nonstatic_member_init)`` to determine whether in-class 614initialization of non-static data members is enabled. 615 616C++11 ``nullptr`` 617^^^^^^^^^^^^^^^^^ 618 619Use ``__has_feature(cxx_nullptr)`` or ``__has_extension(cxx_nullptr)`` to 620determine if support for ``nullptr`` is enabled. 621 622C++11 ``override control`` 623^^^^^^^^^^^^^^^^^^^^^^^^^^ 624 625Use ``__has_feature(cxx_override_control)`` or 626``__has_extension(cxx_override_control)`` to determine if support for the 627override control keywords is enabled. 628 629C++11 reference-qualified functions 630^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 631 632Use ``__has_feature(cxx_reference_qualified_functions)`` or 633``__has_extension(cxx_reference_qualified_functions)`` to determine if support 634for reference-qualified functions (e.g., member functions with ``&`` or ``&&`` 635applied to ``*this``) is enabled. 636 637C++11 range-based ``for`` loop 638^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 639 640Use ``__has_feature(cxx_range_for)`` or ``__has_extension(cxx_range_for)`` to 641determine if support for the range-based for loop is enabled. 642 643C++11 raw string literals 644^^^^^^^^^^^^^^^^^^^^^^^^^ 645 646Use ``__has_feature(cxx_raw_string_literals)`` to determine if support for raw 647string literals (e.g., ``R"x(foo\bar)x"``) is enabled. 648 649C++11 rvalue references 650^^^^^^^^^^^^^^^^^^^^^^^ 651 652Use ``__has_feature(cxx_rvalue_references)`` or 653``__has_extension(cxx_rvalue_references)`` to determine if support for rvalue 654references is enabled. 655 656C++11 ``static_assert()`` 657^^^^^^^^^^^^^^^^^^^^^^^^^ 658 659Use ``__has_feature(cxx_static_assert)`` or 660``__has_extension(cxx_static_assert)`` to determine if support for compile-time 661assertions using ``static_assert`` is enabled. 662 663C++11 ``thread_local`` 664^^^^^^^^^^^^^^^^^^^^^^ 665 666Use ``__has_feature(cxx_thread_local)`` to determine if support for 667``thread_local`` variables is enabled. 668 669C++11 type inference 670^^^^^^^^^^^^^^^^^^^^ 671 672Use ``__has_feature(cxx_auto_type)`` or ``__has_extension(cxx_auto_type)`` to 673determine C++11 type inference is supported using the ``auto`` specifier. If 674this is disabled, ``auto`` will instead be a storage class specifier, as in C 675or C++98. 676 677C++11 strongly typed enumerations 678^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 679 680Use ``__has_feature(cxx_strong_enums)`` or 681``__has_extension(cxx_strong_enums)`` to determine if support for strongly 682typed, scoped enumerations is enabled. 683 684C++11 trailing return type 685^^^^^^^^^^^^^^^^^^^^^^^^^^ 686 687Use ``__has_feature(cxx_trailing_return)`` or 688``__has_extension(cxx_trailing_return)`` to determine if support for the 689alternate function declaration syntax with trailing return type is enabled. 690 691C++11 Unicode string literals 692^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 693 694Use ``__has_feature(cxx_unicode_literals)`` to determine if support for Unicode 695string literals is enabled. 696 697C++11 unrestricted unions 698^^^^^^^^^^^^^^^^^^^^^^^^^ 699 700Use ``__has_feature(cxx_unrestricted_unions)`` to determine if support for 701unrestricted unions is enabled. 702 703C++11 user-defined literals 704^^^^^^^^^^^^^^^^^^^^^^^^^^^ 705 706Use ``__has_feature(cxx_user_literals)`` to determine if support for 707user-defined literals is enabled. 708 709C++11 variadic templates 710^^^^^^^^^^^^^^^^^^^^^^^^ 711 712Use ``__has_feature(cxx_variadic_templates)`` or 713``__has_extension(cxx_variadic_templates)`` to determine if support for 714variadic templates is enabled. 715 716C++1y 717----- 718 719The features listed below are part of the committee draft for the C++1y 720standard. As a result, all these features are enabled with the ``-std=c++1y`` 721or ``-std=gnu++1y`` option when compiling C++ code. 722 723C++1y binary literals 724^^^^^^^^^^^^^^^^^^^^^ 725 726Use ``__has_feature(cxx_binary_literals)`` or 727``__has_extension(cxx_binary_literals)`` to determine whether 728binary literals (for instance, ``0b10010``) are recognized. Clang supports this 729feature as an extension in all language modes. 730 731C++1y contextual conversions 732^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 733 734Use ``__has_feature(cxx_contextual_conversions)`` or 735``__has_extension(cxx_contextual_conversions)`` to determine if the C++1y rules 736are used when performing an implicit conversion for an array bound in a 737*new-expression*, the operand of a *delete-expression*, an integral constant 738expression, or a condition in a ``switch`` statement. 739 740C++1y decltype(auto) 741^^^^^^^^^^^^^^^^^^^^ 742 743Use ``__has_feature(cxx_decltype_auto)`` or 744``__has_extension(cxx_decltype_auto)`` to determine if support 745for the ``decltype(auto)`` placeholder type is enabled. 746 747C++1y default initializers for aggregates 748^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 749 750Use ``__has_feature(cxx_aggregate_nsdmi)`` or 751``__has_extension(cxx_aggregate_nsdmi)`` to determine if support 752for default initializers in aggregate members is enabled. 753 754C++1y generalized lambda capture 755^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 756 757Use ``__has_feature(cxx_init_captures)`` or 758``__has_extension(cxx_init_captures)`` to determine if support for 759lambda captures with explicit initializers is enabled 760(for instance, ``[n(0)] { return ++n; }``). 761 762C++1y generic lambdas 763^^^^^^^^^^^^^^^^^^^^^ 764 765Use ``__has_feature(cxx_generic_lambdas)`` or 766``__has_extension(cxx_generic_lambdas)`` to determine if support for generic 767(polymorphic) lambdas is enabled 768(for instance, ``[] (auto x) { return x + 1; }``). 769 770C++1y relaxed constexpr 771^^^^^^^^^^^^^^^^^^^^^^^ 772 773Use ``__has_feature(cxx_relaxed_constexpr)`` or 774``__has_extension(cxx_relaxed_constexpr)`` to determine if variable 775declarations, local variable modification, and control flow constructs 776are permitted in ``constexpr`` functions. 777 778C++1y return type deduction 779^^^^^^^^^^^^^^^^^^^^^^^^^^^ 780 781Use ``__has_feature(cxx_return_type_deduction)`` or 782``__has_extension(cxx_return_type_deduction)`` to determine if support 783for return type deduction for functions (using ``auto`` as a return type) 784is enabled. 785 786C++1y runtime-sized arrays 787^^^^^^^^^^^^^^^^^^^^^^^^^^ 788 789Use ``__has_feature(cxx_runtime_array)`` or 790``__has_extension(cxx_runtime_array)`` to determine if support 791for arrays of runtime bound (a restricted form of variable-length arrays) 792is enabled. 793Clang's implementation of this feature is incomplete. 794 795C++1y variable templates 796^^^^^^^^^^^^^^^^^^^^^^^^ 797 798Use ``__has_feature(cxx_variable_templates)`` or 799``__has_extension(cxx_variable_templates)`` to determine if support for 800templated variable declarations is enabled. 801 802C11 803--- 804 805The features listed below are part of the C11 standard. As a result, all these 806features are enabled with the ``-std=c11`` or ``-std=gnu11`` option when 807compiling C code. Additionally, because these features are all 808backward-compatible, they are available as extensions in all language modes. 809 810C11 alignment specifiers 811^^^^^^^^^^^^^^^^^^^^^^^^ 812 813Use ``__has_feature(c_alignas)`` or ``__has_extension(c_alignas)`` to determine 814if support for alignment specifiers using ``_Alignas`` is enabled. 815 816C11 atomic operations 817^^^^^^^^^^^^^^^^^^^^^ 818 819Use ``__has_feature(c_atomic)`` or ``__has_extension(c_atomic)`` to determine 820if support for atomic types using ``_Atomic`` is enabled. Clang also provides 821:ref:`a set of builtins <langext-__c11_atomic>` which can be used to implement 822the ``<stdatomic.h>`` operations on ``_Atomic`` types. 823 824C11 generic selections 825^^^^^^^^^^^^^^^^^^^^^^ 826 827Use ``__has_feature(c_generic_selections)`` or 828``__has_extension(c_generic_selections)`` to determine if support for generic 829selections is enabled. 830 831As an extension, the C11 generic selection expression is available in all 832languages supported by Clang. The syntax is the same as that given in the C11 833standard. 834 835In C, type compatibility is decided according to the rules given in the 836appropriate standard, but in C++, which lacks the type compatibility rules used 837in C, types are considered compatible only if they are equivalent. 838 839C11 ``_Static_assert()`` 840^^^^^^^^^^^^^^^^^^^^^^^^ 841 842Use ``__has_feature(c_static_assert)`` or ``__has_extension(c_static_assert)`` 843to determine if support for compile-time assertions using ``_Static_assert`` is 844enabled. 845 846C11 ``_Thread_local`` 847^^^^^^^^^^^^^^^^^^^^^ 848 849Use ``__has_feature(c_thread_local)`` or ``__has_extension(c_thread_local)`` 850to determine if support for ``_Thread_local`` variables is enabled. 851 852Checks for Type Trait Primitives 853================================ 854 855Type trait primitives are special builtin constant expressions that can be used 856by the standard C++ library to facilitate or simplify the implementation of 857user-facing type traits in the <type_traits> header. 858 859They are not intended to be used directly by user code because they are 860implementation-defined and subject to change -- as such they're tied closely to 861the supported set of system headers, currently: 862 863* LLVM's own libc++ 864* GNU libstdc++ 865* The Microsoft standard C++ library 866 867Clang supports the `GNU C++ type traits 868<http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html>`_ and a subset of the 869`Microsoft Visual C++ Type traits 870<http://msdn.microsoft.com/en-us/library/ms177194(v=VS.100).aspx>`_. 871 872Feature detection is supported only for some of the primitives at present. User 873code should not use these checks because they bear no direct relation to the 874actual set of type traits supported by the C++ standard library. 875 876For type trait ``__X``, ``__has_extension(X)`` indicates the presence of the 877type trait primitive in the compiler. A simplistic usage example as might be 878seen in standard C++ headers follows: 879 880.. code-block:: c++ 881 882 #if __has_extension(is_convertible_to) 883 template<typename From, typename To> 884 struct is_convertible_to { 885 static const bool value = __is_convertible_to(From, To); 886 }; 887 #else 888 // Emulate type trait for compatibility with other compilers. 889 #endif 890 891The following type trait primitives are supported by Clang: 892 893* ``__has_nothrow_assign`` (GNU, Microsoft) 894* ``__has_nothrow_copy`` (GNU, Microsoft) 895* ``__has_nothrow_constructor`` (GNU, Microsoft) 896* ``__has_trivial_assign`` (GNU, Microsoft) 897* ``__has_trivial_copy`` (GNU, Microsoft) 898* ``__has_trivial_constructor`` (GNU, Microsoft) 899* ``__has_trivial_destructor`` (GNU, Microsoft) 900* ``__has_virtual_destructor`` (GNU, Microsoft) 901* ``__is_abstract`` (GNU, Microsoft) 902* ``__is_base_of`` (GNU, Microsoft) 903* ``__is_class`` (GNU, Microsoft) 904* ``__is_convertible_to`` (Microsoft) 905* ``__is_empty`` (GNU, Microsoft) 906* ``__is_enum`` (GNU, Microsoft) 907* ``__is_interface_class`` (Microsoft) 908* ``__is_pod`` (GNU, Microsoft) 909* ``__is_polymorphic`` (GNU, Microsoft) 910* ``__is_union`` (GNU, Microsoft) 911* ``__is_literal(type)``: Determines whether the given type is a literal type 912* ``__is_final``: Determines whether the given type is declared with a 913 ``final`` class-virt-specifier. 914* ``__underlying_type(type)``: Retrieves the underlying type for a given 915 ``enum`` type. This trait is required to implement the C++11 standard 916 library. 917* ``__is_trivially_assignable(totype, fromtype)``: Determines whether a value 918 of type ``totype`` can be assigned to from a value of type ``fromtype`` such 919 that no non-trivial functions are called as part of that assignment. This 920 trait is required to implement the C++11 standard library. 921* ``__is_trivially_constructible(type, argtypes...)``: Determines whether a 922 value of type ``type`` can be direct-initialized with arguments of types 923 ``argtypes...`` such that no non-trivial functions are called as part of 924 that initialization. This trait is required to implement the C++11 standard 925 library. 926* ``__is_destructible`` (MSVC 2013): partially implemented 927* ``__is_nothrow_destructible`` (MSVC 2013): partially implemented 928* ``__is_nothrow_assignable`` (MSVC 2013, clang) 929* ``__is_constructible`` (MSVC 2013, clang) 930* ``__is_nothrow_constructible`` (MSVC 2013, clang) 931 932Blocks 933====== 934 935The syntax and high level language feature description is in 936:doc:`BlockLanguageSpec<BlockLanguageSpec>`. Implementation and ABI details for 937the clang implementation are in :doc:`Block-ABI-Apple<Block-ABI-Apple>`. 938 939Query for this feature with ``__has_extension(blocks)``. 940 941Objective-C Features 942==================== 943 944Related result types 945-------------------- 946 947According to Cocoa conventions, Objective-C methods with certain names 948("``init``", "``alloc``", etc.) always return objects that are an instance of 949the receiving class's type. Such methods are said to have a "related result 950type", meaning that a message send to one of these methods will have the same 951static type as an instance of the receiver class. For example, given the 952following classes: 953 954.. code-block:: objc 955 956 @interface NSObject 957 + (id)alloc; 958 - (id)init; 959 @end 960 961 @interface NSArray : NSObject 962 @end 963 964and this common initialization pattern 965 966.. code-block:: objc 967 968 NSArray *array = [[NSArray alloc] init]; 969 970the type of the expression ``[NSArray alloc]`` is ``NSArray*`` because 971``alloc`` implicitly has a related result type. Similarly, the type of the 972expression ``[[NSArray alloc] init]`` is ``NSArray*``, since ``init`` has a 973related result type and its receiver is known to have the type ``NSArray *``. 974If neither ``alloc`` nor ``init`` had a related result type, the expressions 975would have had type ``id``, as declared in the method signature. 976 977A method with a related result type can be declared by using the type 978``instancetype`` as its result type. ``instancetype`` is a contextual keyword 979that is only permitted in the result type of an Objective-C method, e.g. 980 981.. code-block:: objc 982 983 @interface A 984 + (instancetype)constructAnA; 985 @end 986 987The related result type can also be inferred for some methods. To determine 988whether a method has an inferred related result type, the first word in the 989camel-case selector (e.g., "``init``" in "``initWithObjects``") is considered, 990and the method will have a related result type if its return type is compatible 991with the type of its class and if: 992 993* the first word is "``alloc``" or "``new``", and the method is a class method, 994 or 995 996* the first word is "``autorelease``", "``init``", "``retain``", or "``self``", 997 and the method is an instance method. 998 999If a method with a related result type is overridden by a subclass method, the 1000subclass method must also return a type that is compatible with the subclass 1001type. For example: 1002 1003.. code-block:: objc 1004 1005 @interface NSString : NSObject 1006 - (NSUnrelated *)init; // incorrect usage: NSUnrelated is not NSString or a superclass of NSString 1007 @end 1008 1009Related result types only affect the type of a message send or property access 1010via the given method. In all other respects, a method with a related result 1011type is treated the same way as method that returns ``id``. 1012 1013Use ``__has_feature(objc_instancetype)`` to determine whether the 1014``instancetype`` contextual keyword is available. 1015 1016Automatic reference counting 1017---------------------------- 1018 1019Clang provides support for :doc:`automated reference counting 1020<AutomaticReferenceCounting>` in Objective-C, which eliminates the need 1021for manual ``retain``/``release``/``autorelease`` message sends. There are two 1022feature macros associated with automatic reference counting: 1023``__has_feature(objc_arc)`` indicates the availability of automated reference 1024counting in general, while ``__has_feature(objc_arc_weak)`` indicates that 1025automated reference counting also includes support for ``__weak`` pointers to 1026Objective-C objects. 1027 1028.. _objc-fixed-enum: 1029 1030Enumerations with a fixed underlying type 1031----------------------------------------- 1032 1033Clang provides support for C++11 enumerations with a fixed underlying type 1034within Objective-C. For example, one can write an enumeration type as: 1035 1036.. code-block:: c++ 1037 1038 typedef enum : unsigned char { Red, Green, Blue } Color; 1039 1040This specifies that the underlying type, which is used to store the enumeration 1041value, is ``unsigned char``. 1042 1043Use ``__has_feature(objc_fixed_enum)`` to determine whether support for fixed 1044underlying types is available in Objective-C. 1045 1046Interoperability with C++11 lambdas 1047----------------------------------- 1048 1049Clang provides interoperability between C++11 lambdas and blocks-based APIs, by 1050permitting a lambda to be implicitly converted to a block pointer with the 1051corresponding signature. For example, consider an API such as ``NSArray``'s 1052array-sorting method: 1053 1054.. code-block:: objc 1055 1056 - (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr; 1057 1058``NSComparator`` is simply a typedef for the block pointer ``NSComparisonResult 1059(^)(id, id)``, and parameters of this type are generally provided with block 1060literals as arguments. However, one can also use a C++11 lambda so long as it 1061provides the same signature (in this case, accepting two parameters of type 1062``id`` and returning an ``NSComparisonResult``): 1063 1064.. code-block:: objc 1065 1066 NSArray *array = @[@"string 1", @"string 21", @"string 12", @"String 11", 1067 @"String 02"]; 1068 const NSStringCompareOptions comparisonOptions 1069 = NSCaseInsensitiveSearch | NSNumericSearch | 1070 NSWidthInsensitiveSearch | NSForcedOrderingSearch; 1071 NSLocale *currentLocale = [NSLocale currentLocale]; 1072 NSArray *sorted 1073 = [array sortedArrayUsingComparator:[=](id s1, id s2) -> NSComparisonResult { 1074 NSRange string1Range = NSMakeRange(0, [s1 length]); 1075 return [s1 compare:s2 options:comparisonOptions 1076 range:string1Range locale:currentLocale]; 1077 }]; 1078 NSLog(@"sorted: %@", sorted); 1079 1080This code relies on an implicit conversion from the type of the lambda 1081expression (an unnamed, local class type called the *closure type*) to the 1082corresponding block pointer type. The conversion itself is expressed by a 1083conversion operator in that closure type that produces a block pointer with the 1084same signature as the lambda itself, e.g., 1085 1086.. code-block:: objc 1087 1088 operator NSComparisonResult (^)(id, id)() const; 1089 1090This conversion function returns a new block that simply forwards the two 1091parameters to the lambda object (which it captures by copy), then returns the 1092result. The returned block is first copied (with ``Block_copy``) and then 1093autoreleased. As an optimization, if a lambda expression is immediately 1094converted to a block pointer (as in the first example, above), then the block 1095is not copied and autoreleased: rather, it is given the same lifetime as a 1096block literal written at that point in the program, which avoids the overhead 1097of copying a block to the heap in the common case. 1098 1099The conversion from a lambda to a block pointer is only available in 1100Objective-C++, and not in C++ with blocks, due to its use of Objective-C memory 1101management (autorelease). 1102 1103Object Literals and Subscripting 1104-------------------------------- 1105 1106Clang provides support for :doc:`Object Literals and Subscripting 1107<ObjectiveCLiterals>` in Objective-C, which simplifies common Objective-C 1108programming patterns, makes programs more concise, and improves the safety of 1109container creation. There are several feature macros associated with object 1110literals and subscripting: ``__has_feature(objc_array_literals)`` tests the 1111availability of array literals; ``__has_feature(objc_dictionary_literals)`` 1112tests the availability of dictionary literals; 1113``__has_feature(objc_subscripting)`` tests the availability of object 1114subscripting. 1115 1116Objective-C Autosynthesis of Properties 1117--------------------------------------- 1118 1119Clang provides support for autosynthesis of declared properties. Using this 1120feature, clang provides default synthesis of those properties not declared 1121@dynamic and not having user provided backing getter and setter methods. 1122``__has_feature(objc_default_synthesize_properties)`` checks for availability 1123of this feature in version of clang being used. 1124 1125.. _langext-objc-retain-release: 1126 1127Objective-C retaining behavior attributes 1128----------------------------------------- 1129 1130In Objective-C, functions and methods are generally assumed to follow the 1131`Cocoa Memory Management 1132<http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html>`_ 1133conventions for ownership of object arguments and 1134return values. However, there are exceptions, and so Clang provides attributes 1135to allow these exceptions to be documented. This are used by ARC and the 1136`static analyzer <http://clang-analyzer.llvm.org>`_ Some exceptions may be 1137better described using the ``objc_method_family`` attribute instead. 1138 1139**Usage**: The ``ns_returns_retained``, ``ns_returns_not_retained``, 1140``ns_returns_autoreleased``, ``cf_returns_retained``, and 1141``cf_returns_not_retained`` attributes can be placed on methods and functions 1142that return Objective-C or CoreFoundation objects. They are commonly placed at 1143the end of a function prototype or method declaration: 1144 1145.. code-block:: objc 1146 1147 id foo() __attribute__((ns_returns_retained)); 1148 1149 - (NSString *)bar:(int)x __attribute__((ns_returns_retained)); 1150 1151The ``*_returns_retained`` attributes specify that the returned object has a +1 1152retain count. The ``*_returns_not_retained`` attributes specify that the return 1153object has a +0 retain count, even if the normal convention for its selector 1154would be +1. ``ns_returns_autoreleased`` specifies that the returned object is 1155+0, but is guaranteed to live at least as long as the next flush of an 1156autorelease pool. 1157 1158**Usage**: The ``ns_consumed`` and ``cf_consumed`` attributes can be placed on 1159an parameter declaration; they specify that the argument is expected to have a 1160+1 retain count, which will be balanced in some way by the function or method. 1161The ``ns_consumes_self`` attribute can only be placed on an Objective-C 1162method; it specifies that the method expects its ``self`` parameter to have a 1163+1 retain count, which it will balance in some way. 1164 1165.. code-block:: objc 1166 1167 void foo(__attribute__((ns_consumed)) NSString *string); 1168 1169 - (void) bar __attribute__((ns_consumes_self)); 1170 - (void) baz:(id) __attribute__((ns_consumed)) x; 1171 1172Further examples of these attributes are available in the static analyzer's `list of annotations for analysis 1173<http://clang-analyzer.llvm.org/annotations.html#cocoa_mem>`_. 1174 1175Query for these features with ``__has_attribute(ns_consumed)``, 1176``__has_attribute(ns_returns_retained)``, etc. 1177 1178 1179Objective-C++ ABI: protocol-qualifier mangling of parameters 1180------------------------------------------------------------ 1181 1182Starting with LLVM 3.4, Clang produces a new mangling for parameters whose 1183type is a qualified-``id`` (e.g., ``id<Foo>``). This mangling allows such 1184parameters to be differentiated from those with the regular unqualified ``id`` 1185type. 1186 1187This was a non-backward compatible mangling change to the ABI. This change 1188allows proper overloading, and also prevents mangling conflicts with template 1189parameters of protocol-qualified type. 1190 1191Query the presence of this new mangling with 1192``__has_feature(objc_protocol_qualifier_mangling)``. 1193 1194.. _langext-overloading: 1195 1196Initializer lists for complex numbers in C 1197========================================== 1198 1199clang supports an extension which allows the following in C: 1200 1201.. code-block:: c++ 1202 1203 #include <math.h> 1204 #include <complex.h> 1205 complex float x = { 1.0f, INFINITY }; // Init to (1, Inf) 1206 1207This construct is useful because there is no way to separately initialize the 1208real and imaginary parts of a complex variable in standard C, given that clang 1209does not support ``_Imaginary``. (Clang also supports the ``__real__`` and 1210``__imag__`` extensions from gcc, which help in some cases, but are not usable 1211in static initializers.) 1212 1213Note that this extension does not allow eliding the braces; the meaning of the 1214following two lines is different: 1215 1216.. code-block:: c++ 1217 1218 complex float x[] = { { 1.0f, 1.0f } }; // [0] = (1, 1) 1219 complex float x[] = { 1.0f, 1.0f }; // [0] = (1, 0), [1] = (1, 0) 1220 1221This extension also works in C++ mode, as far as that goes, but does not apply 1222to the C++ ``std::complex``. (In C++11, list initialization allows the same 1223syntax to be used with ``std::complex`` with the same meaning.) 1224 1225Builtin Functions 1226================= 1227 1228Clang supports a number of builtin library functions with the same syntax as 1229GCC, including things like ``__builtin_nan``, ``__builtin_constant_p``, 1230``__builtin_choose_expr``, ``__builtin_types_compatible_p``, 1231``__builtin_assume_aligned``, ``__sync_fetch_and_add``, etc. In addition to 1232the GCC builtins, Clang supports a number of builtins that GCC does not, which 1233are listed here. 1234 1235Please note that Clang does not and will not support all of the GCC builtins 1236for vector operations. Instead of using builtins, you should use the functions 1237defined in target-specific header files like ``<xmmintrin.h>``, which define 1238portable wrappers for these. Many of the Clang versions of these functions are 1239implemented directly in terms of :ref:`extended vector support 1240<langext-vectors>` instead of builtins, in order to reduce the number of 1241builtins that we need to implement. 1242 1243``__builtin_assume`` 1244------------------------------ 1245 1246``__builtin_assume`` is used to provide the optimizer with a boolean 1247invariant that is defined to be true. 1248 1249**Syntax**: 1250 1251.. code-block:: c++ 1252 1253 __builtin_assume(bool) 1254 1255**Example of Use**: 1256 1257.. code-block:: c++ 1258 1259 int foo(int x) { 1260 __builtin_assume(x != 0); 1261 1262 // The optimizer may short-circuit this check using the invariant. 1263 if (x == 0) 1264 return do_something(); 1265 1266 return do_something_else(); 1267 } 1268 1269**Description**: 1270 1271The boolean argument to this function is defined to be true. The optimizer may 1272analyze the form of the expression provided as the argument and deduce from 1273that information used to optimize the program. If the condition is violated 1274during execution, the behavior is undefined. The argument itself is never 1275evaluated, so any side effects of the expression will be discarded. 1276 1277Query for this feature with ``__has_builtin(__builtin_assume)``. 1278 1279``__builtin_readcyclecounter`` 1280------------------------------ 1281 1282``__builtin_readcyclecounter`` is used to access the cycle counter register (or 1283a similar low-latency, high-accuracy clock) on those targets that support it. 1284 1285**Syntax**: 1286 1287.. code-block:: c++ 1288 1289 __builtin_readcyclecounter() 1290 1291**Example of Use**: 1292 1293.. code-block:: c++ 1294 1295 unsigned long long t0 = __builtin_readcyclecounter(); 1296 do_something(); 1297 unsigned long long t1 = __builtin_readcyclecounter(); 1298 unsigned long long cycles_to_do_something = t1 - t0; // assuming no overflow 1299 1300**Description**: 1301 1302The ``__builtin_readcyclecounter()`` builtin returns the cycle counter value, 1303which may be either global or process/thread-specific depending on the target. 1304As the backing counters often overflow quickly (on the order of seconds) this 1305should only be used for timing small intervals. When not supported by the 1306target, the return value is always zero. This builtin takes no arguments and 1307produces an unsigned long long result. 1308 1309Query for this feature with ``__has_builtin(__builtin_readcyclecounter)``. Note 1310that even if present, its use may depend on run-time privilege or other OS 1311controlled state. 1312 1313.. _langext-__builtin_shufflevector: 1314 1315``__builtin_shufflevector`` 1316--------------------------- 1317 1318``__builtin_shufflevector`` is used to express generic vector 1319permutation/shuffle/swizzle operations. This builtin is also very important 1320for the implementation of various target-specific header files like 1321``<xmmintrin.h>``. 1322 1323**Syntax**: 1324 1325.. code-block:: c++ 1326 1327 __builtin_shufflevector(vec1, vec2, index1, index2, ...) 1328 1329**Examples**: 1330 1331.. code-block:: c++ 1332 1333 // identity operation - return 4-element vector v1. 1334 __builtin_shufflevector(v1, v1, 0, 1, 2, 3) 1335 1336 // "Splat" element 0 of V1 into a 4-element result. 1337 __builtin_shufflevector(V1, V1, 0, 0, 0, 0) 1338 1339 // Reverse 4-element vector V1. 1340 __builtin_shufflevector(V1, V1, 3, 2, 1, 0) 1341 1342 // Concatenate every other element of 4-element vectors V1 and V2. 1343 __builtin_shufflevector(V1, V2, 0, 2, 4, 6) 1344 1345 // Concatenate every other element of 8-element vectors V1 and V2. 1346 __builtin_shufflevector(V1, V2, 0, 2, 4, 6, 8, 10, 12, 14) 1347 1348 // Shuffle v1 with some elements being undefined 1349 __builtin_shufflevector(v1, v1, 3, -1, 1, -1) 1350 1351**Description**: 1352 1353The first two arguments to ``__builtin_shufflevector`` are vectors that have 1354the same element type. The remaining arguments are a list of integers that 1355specify the elements indices of the first two vectors that should be extracted 1356and returned in a new vector. These element indices are numbered sequentially 1357starting with the first vector, continuing into the second vector. Thus, if 1358``vec1`` is a 4-element vector, index 5 would refer to the second element of 1359``vec2``. An index of -1 can be used to indicate that the corresponding element 1360in the returned vector is a don't care and can be optimized by the backend. 1361 1362The result of ``__builtin_shufflevector`` is a vector with the same element 1363type as ``vec1``/``vec2`` but that has an element count equal to the number of 1364indices specified. 1365 1366Query for this feature with ``__has_builtin(__builtin_shufflevector)``. 1367 1368.. _langext-__builtin_convertvector: 1369 1370``__builtin_convertvector`` 1371--------------------------- 1372 1373``__builtin_convertvector`` is used to express generic vector 1374type-conversion operations. The input vector and the output vector 1375type must have the same number of elements. 1376 1377**Syntax**: 1378 1379.. code-block:: c++ 1380 1381 __builtin_convertvector(src_vec, dst_vec_type) 1382 1383**Examples**: 1384 1385.. code-block:: c++ 1386 1387 typedef double vector4double __attribute__((__vector_size__(32))); 1388 typedef float vector4float __attribute__((__vector_size__(16))); 1389 typedef short vector4short __attribute__((__vector_size__(8))); 1390 vector4float vf; vector4short vs; 1391 1392 // convert from a vector of 4 floats to a vector of 4 doubles. 1393 __builtin_convertvector(vf, vector4double) 1394 // equivalent to: 1395 (vector4double) { (double) vf[0], (double) vf[1], (double) vf[2], (double) vf[3] } 1396 1397 // convert from a vector of 4 shorts to a vector of 4 floats. 1398 __builtin_convertvector(vs, vector4float) 1399 // equivalent to: 1400 (vector4float) { (float) vs[0], (float) vs[1], (float) vs[2], (float) vs[3] } 1401 1402**Description**: 1403 1404The first argument to ``__builtin_convertvector`` is a vector, and the second 1405argument is a vector type with the same number of elements as the first 1406argument. 1407 1408The result of ``__builtin_convertvector`` is a vector with the same element 1409type as the second argument, with a value defined in terms of the action of a 1410C-style cast applied to each element of the first argument. 1411 1412Query for this feature with ``__has_builtin(__builtin_convertvector)``. 1413 1414``__builtin_unreachable`` 1415------------------------- 1416 1417``__builtin_unreachable`` is used to indicate that a specific point in the 1418program cannot be reached, even if the compiler might otherwise think it can. 1419This is useful to improve optimization and eliminates certain warnings. For 1420example, without the ``__builtin_unreachable`` in the example below, the 1421compiler assumes that the inline asm can fall through and prints a "function 1422declared '``noreturn``' should not return" warning. 1423 1424**Syntax**: 1425 1426.. code-block:: c++ 1427 1428 __builtin_unreachable() 1429 1430**Example of use**: 1431 1432.. code-block:: c++ 1433 1434 void myabort(void) __attribute__((noreturn)); 1435 void myabort(void) { 1436 asm("int3"); 1437 __builtin_unreachable(); 1438 } 1439 1440**Description**: 1441 1442The ``__builtin_unreachable()`` builtin has completely undefined behavior. 1443Since it has undefined behavior, it is a statement that it is never reached and 1444the optimizer can take advantage of this to produce better code. This builtin 1445takes no arguments and produces a void result. 1446 1447Query for this feature with ``__has_builtin(__builtin_unreachable)``. 1448 1449``__sync_swap`` 1450--------------- 1451 1452``__sync_swap`` is used to atomically swap integers or pointers in memory. 1453 1454**Syntax**: 1455 1456.. code-block:: c++ 1457 1458 type __sync_swap(type *ptr, type value, ...) 1459 1460**Example of Use**: 1461 1462.. code-block:: c++ 1463 1464 int old_value = __sync_swap(&value, new_value); 1465 1466**Description**: 1467 1468The ``__sync_swap()`` builtin extends the existing ``__sync_*()`` family of 1469atomic intrinsics to allow code to atomically swap the current value with the 1470new value. More importantly, it helps developers write more efficient and 1471correct code by avoiding expensive loops around 1472``__sync_bool_compare_and_swap()`` or relying on the platform specific 1473implementation details of ``__sync_lock_test_and_set()``. The 1474``__sync_swap()`` builtin is a full barrier. 1475 1476``__builtin_addressof`` 1477----------------------- 1478 1479``__builtin_addressof`` performs the functionality of the built-in ``&`` 1480operator, ignoring any ``operator&`` overload. This is useful in constant 1481expressions in C++11, where there is no other way to take the address of an 1482object that overloads ``operator&``. 1483 1484**Example of use**: 1485 1486.. code-block:: c++ 1487 1488 template<typename T> constexpr T *addressof(T &value) { 1489 return __builtin_addressof(value); 1490 } 1491 1492``__builtin_operator_new`` and ``__builtin_operator_delete`` 1493------------------------------------------------------------ 1494 1495``__builtin_operator_new`` allocates memory just like a non-placement non-class 1496*new-expression*. This is exactly like directly calling the normal 1497non-placement ``::operator new``, except that it allows certain optimizations 1498that the C++ standard does not permit for a direct function call to 1499``::operator new`` (in particular, removing ``new`` / ``delete`` pairs and 1500merging allocations). 1501 1502Likewise, ``__builtin_operator_delete`` deallocates memory just like a 1503non-class *delete-expression*, and is exactly like directly calling the normal 1504``::operator delete``, except that it permits optimizations. Only the unsized 1505form of ``__builtin_operator_delete`` is currently available. 1506 1507These builtins are intended for use in the implementation of ``std::allocator`` 1508and other similar allocation libraries, and are only available in C++. 1509 1510Multiprecision Arithmetic Builtins 1511---------------------------------- 1512 1513Clang provides a set of builtins which expose multiprecision arithmetic in a 1514manner amenable to C. They all have the following form: 1515 1516.. code-block:: c 1517 1518 unsigned x = ..., y = ..., carryin = ..., carryout; 1519 unsigned sum = __builtin_addc(x, y, carryin, &carryout); 1520 1521Thus one can form a multiprecision addition chain in the following manner: 1522 1523.. code-block:: c 1524 1525 unsigned *x, *y, *z, carryin=0, carryout; 1526 z[0] = __builtin_addc(x[0], y[0], carryin, &carryout); 1527 carryin = carryout; 1528 z[1] = __builtin_addc(x[1], y[1], carryin, &carryout); 1529 carryin = carryout; 1530 z[2] = __builtin_addc(x[2], y[2], carryin, &carryout); 1531 carryin = carryout; 1532 z[3] = __builtin_addc(x[3], y[3], carryin, &carryout); 1533 1534The complete list of builtins are: 1535 1536.. code-block:: c 1537 1538 unsigned char __builtin_addcb (unsigned char x, unsigned char y, unsigned char carryin, unsigned char *carryout); 1539 unsigned short __builtin_addcs (unsigned short x, unsigned short y, unsigned short carryin, unsigned short *carryout); 1540 unsigned __builtin_addc (unsigned x, unsigned y, unsigned carryin, unsigned *carryout); 1541 unsigned long __builtin_addcl (unsigned long x, unsigned long y, unsigned long carryin, unsigned long *carryout); 1542 unsigned long long __builtin_addcll(unsigned long long x, unsigned long long y, unsigned long long carryin, unsigned long long *carryout); 1543 unsigned char __builtin_subcb (unsigned char x, unsigned char y, unsigned char carryin, unsigned char *carryout); 1544 unsigned short __builtin_subcs (unsigned short x, unsigned short y, unsigned short carryin, unsigned short *carryout); 1545 unsigned __builtin_subc (unsigned x, unsigned y, unsigned carryin, unsigned *carryout); 1546 unsigned long __builtin_subcl (unsigned long x, unsigned long y, unsigned long carryin, unsigned long *carryout); 1547 unsigned long long __builtin_subcll(unsigned long long x, unsigned long long y, unsigned long long carryin, unsigned long long *carryout); 1548 1549Checked Arithmetic Builtins 1550--------------------------- 1551 1552Clang provides a set of builtins that implement checked arithmetic for security 1553critical applications in a manner that is fast and easily expressable in C. As 1554an example of their usage: 1555 1556.. code-block:: c 1557 1558 errorcode_t security_critical_application(...) { 1559 unsigned x, y, result; 1560 ... 1561 if (__builtin_umul_overflow(x, y, &result)) 1562 return kErrorCodeHackers; 1563 ... 1564 use_multiply(result); 1565 ... 1566 } 1567 1568A complete enumeration of the builtins are: 1569 1570.. code-block:: c 1571 1572 bool __builtin_uadd_overflow (unsigned x, unsigned y, unsigned *sum); 1573 bool __builtin_uaddl_overflow (unsigned long x, unsigned long y, unsigned long *sum); 1574 bool __builtin_uaddll_overflow(unsigned long long x, unsigned long long y, unsigned long long *sum); 1575 bool __builtin_usub_overflow (unsigned x, unsigned y, unsigned *diff); 1576 bool __builtin_usubl_overflow (unsigned long x, unsigned long y, unsigned long *diff); 1577 bool __builtin_usubll_overflow(unsigned long long x, unsigned long long y, unsigned long long *diff); 1578 bool __builtin_umul_overflow (unsigned x, unsigned y, unsigned *prod); 1579 bool __builtin_umull_overflow (unsigned long x, unsigned long y, unsigned long *prod); 1580 bool __builtin_umulll_overflow(unsigned long long x, unsigned long long y, unsigned long long *prod); 1581 bool __builtin_sadd_overflow (int x, int y, int *sum); 1582 bool __builtin_saddl_overflow (long x, long y, long *sum); 1583 bool __builtin_saddll_overflow(long long x, long long y, long long *sum); 1584 bool __builtin_ssub_overflow (int x, int y, int *diff); 1585 bool __builtin_ssubl_overflow (long x, long y, long *diff); 1586 bool __builtin_ssubll_overflow(long long x, long long y, long long *diff); 1587 bool __builtin_smul_overflow (int x, int y, int *prod); 1588 bool __builtin_smull_overflow (long x, long y, long *prod); 1589 bool __builtin_smulll_overflow(long long x, long long y, long long *prod); 1590 1591 1592.. _langext-__c11_atomic: 1593 1594__c11_atomic builtins 1595--------------------- 1596 1597Clang provides a set of builtins which are intended to be used to implement 1598C11's ``<stdatomic.h>`` header. These builtins provide the semantics of the 1599``_explicit`` form of the corresponding C11 operation, and are named with a 1600``__c11_`` prefix. The supported operations are: 1601 1602* ``__c11_atomic_init`` 1603* ``__c11_atomic_thread_fence`` 1604* ``__c11_atomic_signal_fence`` 1605* ``__c11_atomic_is_lock_free`` 1606* ``__c11_atomic_store`` 1607* ``__c11_atomic_load`` 1608* ``__c11_atomic_exchange`` 1609* ``__c11_atomic_compare_exchange_strong`` 1610* ``__c11_atomic_compare_exchange_weak`` 1611* ``__c11_atomic_fetch_add`` 1612* ``__c11_atomic_fetch_sub`` 1613* ``__c11_atomic_fetch_and`` 1614* ``__c11_atomic_fetch_or`` 1615* ``__c11_atomic_fetch_xor`` 1616 1617Low-level ARM exclusive memory builtins 1618--------------------------------------- 1619 1620Clang provides overloaded builtins giving direct access to the three key ARM 1621instructions for implementing atomic operations. 1622 1623.. code-block:: c 1624 1625 T __builtin_arm_ldrex(const volatile T *addr); 1626 T __builtin_arm_ldaex(const volatile T *addr); 1627 int __builtin_arm_strex(T val, volatile T *addr); 1628 int __builtin_arm_stlex(T val, volatile T *addr); 1629 void __builtin_arm_clrex(void); 1630 1631The types ``T`` currently supported are: 1632* Integer types with width at most 64 bits (or 128 bits on AArch64). 1633* Floating-point types 1634* Pointer types. 1635 1636Note that the compiler does not guarantee it will not insert stores which clear 1637the exclusive monitor in between an ``ldrex`` type operation and its paired 1638``strex``. In practice this is only usually a risk when the extra store is on 1639the same cache line as the variable being modified and Clang will only insert 1640stack stores on its own, so it is best not to use these operations on variables 1641with automatic storage duration. 1642 1643Also, loads and stores may be implicit in code written between the ``ldrex`` and 1644``strex``. Clang will not necessarily mitigate the effects of these either, so 1645care should be exercised. 1646 1647For these reasons the higher level atomic primitives should be preferred where 1648possible. 1649 1650Non-standard C++11 Attributes 1651============================= 1652 1653Clang's non-standard C++11 attributes live in the ``clang`` attribute 1654namespace. 1655 1656Clang supports GCC's ``gnu`` attribute namespace. All GCC attributes which 1657are accepted with the ``__attribute__((foo))`` syntax are also accepted as 1658``[[gnu::foo]]``. This only extends to attributes which are specified by GCC 1659(see the list of `GCC function attributes 1660<http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html>`_, `GCC variable 1661attributes <http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html>`_, and 1662`GCC type attributes 1663<http://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html>`_). As with the GCC 1664implementation, these attributes must appertain to the *declarator-id* in a 1665declaration, which means they must go either at the start of the declaration or 1666immediately after the name being declared. 1667 1668For example, this applies the GNU ``unused`` attribute to ``a`` and ``f``, and 1669also applies the GNU ``noreturn`` attribute to ``f``. 1670 1671.. code-block:: c++ 1672 1673 [[gnu::unused]] int a, f [[gnu::noreturn]] (); 1674 1675Target-Specific Extensions 1676========================== 1677 1678Clang supports some language features conditionally on some targets. 1679 1680ARM/AArch64 Language Extensions 1681------------------------------- 1682 1683Memory Barrier Intrinsics 1684^^^^^^^^^^^^^^^^^^^^^^^^^ 1685Clang implements the ``__dmb``, ``__dsb`` and ``__isb`` intrinsics as defined 1686in the `ARM C Language Extensions Release 2.0 1687<http://infocenter.arm.com/help/topic/com.arm.doc.ihi0053c/IHI0053C_acle_2_0.pdf>`_. 1688Note that these intrinsics are implemented as motion barriers that block 1689reordering of memory accesses and side effect instructions. Other instructions 1690like simple arithmatic may be reordered around the intrinsic. If you expect to 1691have no reordering at all, use inline assembly instead. 1692 1693X86/X86-64 Language Extensions 1694------------------------------ 1695 1696The X86 backend has these language extensions: 1697 1698Memory references off the GS segment 1699^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1700 1701Annotating a pointer with address space #256 causes it to be code generated 1702relative to the X86 GS segment register, and address space #257 causes it to be 1703relative to the X86 FS segment. Note that this is a very very low-level 1704feature that should only be used if you know what you're doing (for example in 1705an OS kernel). 1706 1707Here is an example: 1708 1709.. code-block:: c++ 1710 1711 #define GS_RELATIVE __attribute__((address_space(256))) 1712 int foo(int GS_RELATIVE *P) { 1713 return *P; 1714 } 1715 1716Which compiles to (on X86-32): 1717 1718.. code-block:: gas 1719 1720 _foo: 1721 movl 4(%esp), %eax 1722 movl %gs:(%eax), %eax 1723 ret 1724 1725Extensions for Static Analysis 1726============================== 1727 1728Clang supports additional attributes that are useful for documenting program 1729invariants and rules for static analysis tools, such as the `Clang Static 1730Analyzer <http://clang-analyzer.llvm.org/>`_. These attributes are documented 1731in the analyzer's `list of source-level annotations 1732<http://clang-analyzer.llvm.org/annotations.html>`_. 1733 1734 1735Extensions for Dynamic Analysis 1736=============================== 1737 1738Use ``__has_feature(address_sanitizer)`` to check if the code is being built 1739with :doc:`AddressSanitizer`. 1740 1741Use ``__has_feature(thread_sanitizer)`` to check if the code is being built 1742with :doc:`ThreadSanitizer`. 1743 1744Use ``__has_feature(memory_sanitizer)`` to check if the code is being built 1745with :doc:`MemorySanitizer`. 1746 1747 1748Extensions for selectively disabling optimization 1749================================================= 1750 1751Clang provides a mechanism for selectively disabling optimizations in functions 1752and methods. 1753 1754To disable optimizations in a single function definition, the GNU-style or C++11 1755non-standard attribute ``optnone`` can be used. 1756 1757.. code-block:: c++ 1758 1759 // The following functions will not be optimized. 1760 // GNU-style attribute 1761 __attribute__((optnone)) int foo() { 1762 // ... code 1763 } 1764 // C++11 attribute 1765 [[clang::optnone]] int bar() { 1766 // ... code 1767 } 1768 1769To facilitate disabling optimization for a range of function definitions, a 1770range-based pragma is provided. Its syntax is ``#pragma clang optimize`` 1771followed by ``off`` or ``on``. 1772 1773All function definitions in the region between an ``off`` and the following 1774``on`` will be decorated with the ``optnone`` attribute unless doing so would 1775conflict with explicit attributes already present on the function (e.g. the 1776ones that control inlining). 1777 1778.. code-block:: c++ 1779 1780 #pragma clang optimize off 1781 // This function will be decorated with optnone. 1782 int foo() { 1783 // ... code 1784 } 1785 1786 // optnone conflicts with always_inline, so bar() will not be decorated. 1787 __attribute__((always_inline)) int bar() { 1788 // ... code 1789 } 1790 #pragma clang optimize on 1791 1792If no ``on`` is found to close an ``off`` region, the end of the region is the 1793end of the compilation unit. 1794 1795Note that a stray ``#pragma clang optimize on`` does not selectively enable 1796additional optimizations when compiling at low optimization levels. This feature 1797can only be used to selectively disable optimizations. 1798 1799The pragma has an effect on functions only at the point of their definition; for 1800function templates, this means that the state of the pragma at the point of an 1801instantiation is not necessarily relevant. Consider the following example: 1802 1803.. code-block:: c++ 1804 1805 template<typename T> T twice(T t) { 1806 return 2 * t; 1807 } 1808 1809 #pragma clang optimize off 1810 template<typename T> T thrice(T t) { 1811 return 3 * t; 1812 } 1813 1814 int container(int a, int b) { 1815 return twice(a) + thrice(b); 1816 } 1817 #pragma clang optimize on 1818 1819In this example, the definition of the template function ``twice`` is outside 1820the pragma region, whereas the definition of ``thrice`` is inside the region. 1821The ``container`` function is also in the region and will not be optimized, but 1822it causes the instantiation of ``twice`` and ``thrice`` with an ``int`` type; of 1823these two instantiations, ``twice`` will be optimized (because its definition 1824was outside the region) and ``thrice`` will not be optimized. 1825 1826Extensions for loop hint optimizations 1827====================================== 1828 1829The ``#pragma clang loop`` directive is used to specify hints for optimizing the 1830subsequent for, while, do-while, or c++11 range-based for loop. The directive 1831provides options for vectorization, interleaving, and unrolling. Loop hints can 1832be specified before any loop and will be ignored if the optimization is not safe 1833to apply. 1834 1835Vectorization and Interleaving 1836------------------------------ 1837 1838A vectorized loop performs multiple iterations of the original loop 1839in parallel using vector instructions. The instruction set of the target 1840processor determines which vector instructions are available and their vector 1841widths. This restricts the types of loops that can be vectorized. The vectorizer 1842automatically determines if the loop is safe and profitable to vectorize. A 1843vector instruction cost model is used to select the vector width. 1844 1845Interleaving multiple loop iterations allows modern processors to further 1846improve instruction-level parallelism (ILP) using advanced hardware features, 1847such as multiple execution units and out-of-order execution. The vectorizer uses 1848a cost model that depends on the register pressure and generated code size to 1849select the interleaving count. 1850 1851Vectorization is enabled by ``vectorize(enable)`` and interleaving is enabled 1852by ``interleave(enable)``. This is useful when compiling with ``-Os`` to 1853manually enable vectorization or interleaving. 1854 1855.. code-block:: c++ 1856 1857 #pragma clang loop vectorize(enable) 1858 #pragma clang loop interleave(enable) 1859 for(...) { 1860 ... 1861 } 1862 1863The vector width is specified by ``vectorize_width(_value_)`` and the interleave 1864count is specified by ``interleave_count(_value_)``, where 1865_value_ is a positive integer. This is useful for specifying the optimal 1866width/count of the set of target architectures supported by your application. 1867 1868.. code-block:: c++ 1869 1870 #pragma clang loop vectorize_width(2) 1871 #pragma clang loop interleave_count(2) 1872 for(...) { 1873 ... 1874 } 1875 1876Specifying a width/count of 1 disables the optimization, and is equivalent to 1877``vectorize(disable)`` or ``interleave(disable)``. 1878 1879Loop Unrolling 1880-------------- 1881 1882Unrolling a loop reduces the loop control overhead and exposes more 1883opportunities for ILP. Loops can be fully or partially unrolled. Full unrolling 1884eliminates the loop and replaces it with an enumerated sequence of loop 1885iterations. Full unrolling is only possible if the loop trip count is known at 1886compile time. Partial unrolling replicates the loop body within the loop and 1887reduces the trip count. 1888 1889If ``unroll(full)`` is specified the unroller will attempt to fully unroll the 1890loop if the trip count is known at compile time. If the loop count is not known 1891or the fully unrolled code size is greater than the limit specified by the 1892`-pragma-unroll-threshold` command line option the loop will be partially 1893unrolled subject to the same limit. 1894 1895.. code-block:: c++ 1896 1897 #pragma clang loop unroll(full) 1898 for(...) { 1899 ... 1900 } 1901 1902The unroll count can be specified explicitly with ``unroll_count(_value_)`` where 1903_value_ is a positive integer. If this value is greater than the trip count the 1904loop will be fully unrolled. Otherwise the loop is partially unrolled subject 1905to the `-pragma-unroll-threshold` limit. 1906 1907.. code-block:: c++ 1908 1909 #pragma clang loop unroll_count(8) 1910 for(...) { 1911 ... 1912 } 1913 1914Unrolling of a loop can be prevented by specifying ``unroll(disable)``. 1915 1916Additional Information 1917---------------------- 1918 1919For convenience multiple loop hints can be specified on a single line. 1920 1921.. code-block:: c++ 1922 1923 #pragma clang loop vectorize_width(4) interleave_count(8) 1924 for(...) { 1925 ... 1926 } 1927 1928If an optimization cannot be applied any hints that apply to it will be ignored. 1929For example, the hint ``vectorize_width(4)`` is ignored if the loop is not 1930proven safe to vectorize. To identify and diagnose optimization issues use 1931`-Rpass`, `-Rpass-missed`, and `-Rpass-analysis` command line options. See the 1932user guide for details. 1933