forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			1027 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
			
		
		
	
	
			1027 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
| ..
 | |
|   -------------------------------------------------------------------
 | |
|   NOTE: This file is automatically generated by running clang-tblgen
 | |
|   -gen-attr-docs. Do not edit this file by hand!!
 | |
|   -------------------------------------------------------------------
 | |
| 
 | |
| ===================
 | |
| Attributes in Clang
 | |
| ===================
 | |
| .. contents::
 | |
|    :local:
 | |
| 
 | |
| Introduction
 | |
| ============
 | |
| 
 | |
| This page lists the attributes currently supported by Clang.
 | |
| 
 | |
| Function Attributes
 | |
| ===================
 | |
| 
 | |
| 
 | |
| interrupt
 | |
| ---------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| Clang supports the GNU style ``__attribute__((interrupt("TYPE")))`` attribute on
 | |
| ARM targets. This attribute may be attached to a function definition and
 | |
| instructs the backend to generate appropriate function entry/exit code so that
 | |
| it can be used directly as an interrupt service routine.
 | |
| 
 | |
| The parameter passed to the interrupt attribute is optional, but if
 | |
| provided it must be a string literal with one of the following values: "IRQ",
 | |
| "FIQ", "SWI", "ABORT", "UNDEF".
 | |
| 
 | |
| The semantics are as follows:
 | |
| 
 | |
| - If the function is AAPCS, Clang instructs the backend to realign the stack to
 | |
|   8 bytes on entry. This is a general requirement of the AAPCS at public
 | |
|   interfaces, but may not hold when an exception is taken. Doing this allows
 | |
|   other AAPCS functions to be called.
 | |
| - If the CPU is M-class this is all that needs to be done since the architecture
 | |
|   itself is designed in such a way that functions obeying the normal AAPCS ABI
 | |
|   constraints are valid exception handlers.
 | |
| - If the CPU is not M-class, the prologue and epilogue are modified to save all
 | |
|   non-banked registers that are used, so that upon return the user-mode state
 | |
|   will not be corrupted. Note that to avoid unnecessary overhead, only
 | |
|   general-purpose (integer) registers are saved in this way. If VFP operations
 | |
|   are needed, that state must be saved manually.
 | |
| 
 | |
|   Specifically, interrupt kinds other than "FIQ" will save all core registers
 | |
|   except "lr" and "sp". "FIQ" interrupts will save r0-r7.
 | |
| - If the CPU is not M-class, the return instruction is changed to one of the
 | |
|   canonical sequences permitted by the architecture for exception return. Where
 | |
|   possible the function itself will make the necessary "lr" adjustments so that
 | |
|   the "preferred return address" is selected.
 | |
| 
 | |
|   Unfortunately the compiler is unable to make this guarantee for an "UNDEF"
 | |
|   handler, where the offset from "lr" to the preferred return address depends on
 | |
|   the execution state of the code which generated the exception. In this case
 | |
|   a sequence equivalent to "movs pc, lr" will be used.
 | |
| 
 | |
| 
 | |
| acquire_capability (acquire_shared_capability, clang::acquire_capability, clang::acquire_shared_capability)
 | |
| -----------------------------------------------------------------------------------------------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","X","",""
 | |
| 
 | |
| Marks a function as acquiring a capability.
 | |
| 
 | |
| 
 | |
| assert_capability (assert_shared_capability, clang::assert_capability, clang::assert_shared_capability)
 | |
| -------------------------------------------------------------------------------------------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","X","",""
 | |
| 
 | |
| Marks a function that dynamically tests whether a capability is held, and halts
 | |
| the program if it is not held.
 | |
| 
 | |
| 
 | |
| availability
 | |
| ------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| The ``availability`` attribute can be placed on declarations to describe the
 | |
| lifecycle of that declaration relative to operating system versions.  Consider
 | |
| the function declaration for a hypothetical function ``f``:
 | |
| 
 | |
| .. code-block:: c++
 | |
| 
 | |
|   void f(void) __attribute__((availability(macosx,introduced=10.4,deprecated=10.6,obsoleted=10.7)));
 | |
| 
 | |
| The availability attribute states that ``f`` was introduced in Mac OS X 10.4,
 | |
| deprecated in Mac OS X 10.6, and obsoleted in Mac OS X 10.7.  This information
 | |
| is used by Clang to determine when it is safe to use ``f``: for example, if
 | |
| Clang is instructed to compile code for Mac OS X 10.5, a call to ``f()``
 | |
| succeeds.  If Clang is instructed to compile code for Mac OS X 10.6, the call
 | |
| succeeds but Clang emits a warning specifying that the function is deprecated.
 | |
| Finally, if Clang is instructed to compile code for Mac OS X 10.7, the call
 | |
| fails because ``f()`` is no longer available.
 | |
| 
 | |
| The availability attribute is a comma-separated list starting with the
 | |
| platform name and then including clauses specifying important milestones in the
 | |
| declaration's lifetime (in any order) along with additional information.  Those
 | |
| clauses can be:
 | |
| 
 | |
| introduced=\ *version*
 | |
|   The first version in which this declaration was introduced.
 | |
| 
 | |
| deprecated=\ *version*
 | |
|   The first version in which this declaration was deprecated, meaning that
 | |
|   users should migrate away from this API.
 | |
| 
 | |
| obsoleted=\ *version*
 | |
|   The first version in which this declaration was obsoleted, meaning that it
 | |
|   was removed completely and can no longer be used.
 | |
| 
 | |
| unavailable
 | |
|   This declaration is never available on this platform.
 | |
| 
 | |
| message=\ *string-literal*
 | |
|   Additional message text that Clang will provide when emitting a warning or
 | |
|   error about use of a deprecated or obsoleted declaration.  Useful to direct
 | |
|   users to replacement APIs.
 | |
| 
 | |
| Multiple availability attributes can be placed on a declaration, which may
 | |
| correspond to different platforms.  Only the availability attribute with the
 | |
| platform corresponding to the target platform will be used; any others will be
 | |
| ignored.  If no availability attribute specifies availability for the current
 | |
| target platform, the availability attributes are ignored.  Supported platforms
 | |
| are:
 | |
| 
 | |
| ``ios``
 | |
|   Apple's iOS operating system.  The minimum deployment target is specified by
 | |
|   the ``-mios-version-min=*version*`` or ``-miphoneos-version-min=*version*``
 | |
|   command-line arguments.
 | |
| 
 | |
| ``macosx``
 | |
|   Apple's Mac OS X operating system.  The minimum deployment target is
 | |
|   specified by the ``-mmacosx-version-min=*version*`` command-line argument.
 | |
| 
 | |
| A declaration can be used even when deploying back to a platform version prior
 | |
| to when the declaration was introduced.  When this happens, the declaration is
 | |
| `weakly linked
 | |
| <https://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html>`_,
 | |
| as if the ``weak_import`` attribute were added to the declaration.  A
 | |
| weakly-linked declaration may or may not be present a run-time, and a program
 | |
| can determine whether the declaration is present by checking whether the
 | |
| address of that declaration is non-NULL.
 | |
| 
 | |
| If there are multiple declarations of the same entity, the availability
 | |
| attributes must either match on a per-platform basis or later
 | |
| declarations must not have availability attributes for that
 | |
| platform. For example:
 | |
| 
 | |
| .. code-block:: c
 | |
| 
 | |
|   void g(void) __attribute__((availability(macosx,introduced=10.4)));
 | |
|   void g(void) __attribute__((availability(macosx,introduced=10.4))); // okay, matches
 | |
|   void g(void) __attribute__((availability(ios,introduced=4.0))); // okay, adds a new platform
 | |
|   void g(void); // okay, inherits both macosx and ios availability from above.
 | |
|   void g(void) __attribute__((availability(macosx,introduced=10.5))); // error: mismatch
 | |
| 
 | |
| When one method overrides another, the overriding method can be more widely available than the overridden method, e.g.,:
 | |
| 
 | |
| .. code-block:: objc
 | |
| 
 | |
|   @interface A
 | |
|   - (id)method __attribute__((availability(macosx,introduced=10.4)));
 | |
|   - (id)method2 __attribute__((availability(macosx,introduced=10.4)));
 | |
|   @end
 | |
| 
 | |
|   @interface B : A
 | |
|   - (id)method __attribute__((availability(macosx,introduced=10.3))); // okay: method moved into base class later
 | |
|   - (id)method __attribute__((availability(macosx,introduced=10.5))); // error: this method was available via the base class in 10.4
 | |
|   @end
 | |
| 
 | |
| 
 | |
| _Noreturn
 | |
| ---------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "","","","X"
 | |
| 
 | |
| A function declared as ``_Noreturn`` shall not return to its caller. The
 | |
| compiler will generate a diagnostic for a function declared as ``_Noreturn``
 | |
| that appears to be capable of returning to its caller.
 | |
| 
 | |
| 
 | |
| noreturn
 | |
| --------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "","X","",""
 | |
| 
 | |
| A function declared as ``[[noreturn]]`` shall not return to its caller. The
 | |
| compiler will generate a diagnostic for a function declared as ``[[noreturn]]``
 | |
| that appears to be capable of returning to its caller.
 | |
| 
 | |
| 
 | |
| carries_dependency
 | |
| ------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","X","",""
 | |
| 
 | |
| The ``carries_dependency`` attribute specifies dependency propagation into and
 | |
| out of functions.
 | |
| 
 | |
| When specified on a function or Objective-C method, the ``carries_depedency``
 | |
| attribute means that the return value carries a dependency out of the function, 
 | |
| so that the implementation need not constrain ordering upon return from that
 | |
| function. Implementations of the function and its caller may choose to preserve
 | |
| dependencies instead of emitting memory ordering instructions such as fences.
 | |
| 
 | |
| Note, this attribute does not change the meaning of the program, but may result
 | |
| in generatation of more efficient code.
 | |
| 
 | |
| 
 | |
| enable_if
 | |
| ---------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| The ``enable_if`` attribute can be placed on function declarations to control
 | |
| which overload is selected based on the values of the function's arguments.
 | |
| When combined with the ``overloadable`` attribute, this feature is also
 | |
| available in C.
 | |
| 
 | |
| .. code-block:: c++
 | |
| 
 | |
|   int isdigit(int c);
 | |
|   int isdigit(int c) __attribute__((enable_if(c <= -1 || c > 255, "chosen when 'c' is out of range"))) __attribute__((unavailable("'c' must have the value of an unsigned char or EOF")));
 | |
|   
 | |
|   void foo(char c) {
 | |
|     isdigit(c);
 | |
|     isdigit(10);
 | |
|     isdigit(-10);  // results in a compile-time error.
 | |
|   }
 | |
| 
 | |
| The enable_if attribute takes two arguments, the first is an expression written
 | |
| in terms of the function parameters, the second is a string explaining why this
 | |
| overload candidate could not be selected to be displayed in diagnostics. The
 | |
| expression is part of the function signature for the purposes of determining
 | |
| whether it is a redeclaration (following the rules used when determining
 | |
| whether a C++ template specialization is ODR-equivalent), but is not part of
 | |
| the type.
 | |
| 
 | |
| The enable_if expression is evaluated as if it were the body of a
 | |
| bool-returning constexpr function declared with the arguments of the function
 | |
| it is being applied to, then called with the parameters at the callsite. If the
 | |
| result is false or could not be determined through constant expression
 | |
| evaluation, then this overload will not be chosen and the provided string may
 | |
| be used in a diagnostic if the compile fails as a result.
 | |
| 
 | |
| Because the enable_if expression is an unevaluated context, there are no global
 | |
| state changes, nor the ability to pass information from the enable_if
 | |
| expression to the function body. For example, suppose we want calls to
 | |
| strnlen(strbuf, maxlen) to resolve to strnlen_chk(strbuf, maxlen, size of
 | |
| strbuf) only if the size of strbuf can be determined:
 | |
| 
 | |
| .. code-block:: c++
 | |
| 
 | |
|   __attribute__((always_inline))
 | |
|   static inline size_t strnlen(const char *s, size_t maxlen)
 | |
|     __attribute__((overloadable))
 | |
|     __attribute__((enable_if(__builtin_object_size(s, 0) != -1))),
 | |
|                              "chosen when the buffer size is known but 'maxlen' is not")))
 | |
|   {
 | |
|     return strnlen_chk(s, maxlen, __builtin_object_size(s, 0));
 | |
|   }
 | |
| 
 | |
| Multiple enable_if attributes may be applied to a single declaration. In this
 | |
| case, the enable_if expressions are evaluated from left to right in the
 | |
| following manner. First, the candidates whose enable_if expressions evaluate to
 | |
| false or cannot be evaluated are discarded. If the remaining candidates do not
 | |
| share ODR-equivalent enable_if expressions, the overload resolution is
 | |
| ambiguous. Otherwise, enable_if overload resolution continues with the next
 | |
| enable_if attribute on the candidates that have not been discarded and have
 | |
| remaining enable_if attributes. In this way, we pick the most specific
 | |
| overload out of a number of viable overloads using enable_if.
 | |
| 
 | |
| .. code-block:: c++
 | |
| 
 | |
|   void f() __attribute__((enable_if(true, "")));  // #1
 | |
|   void f() __attribute__((enable_if(true, ""))) __attribute__((enable_if(true, "")));  // #2
 | |
|   
 | |
|   void g(int i, int j) __attribute__((enable_if(i, "")));  // #1
 | |
|   void g(int i, int j) __attribute__((enable_if(j, ""))) __attribute__((enable_if(true)));  // #2
 | |
| 
 | |
| In this example, a call to f() is always resolved to #2, as the first enable_if
 | |
| expression is ODR-equivalent for both declarations, but #1 does not have another
 | |
| enable_if expression to continue evaluating, so the next round of evaluation has
 | |
| only a single candidate. In a call to g(1, 1), the call is ambiguous even though
 | |
| #2 has more enable_if attributes, because the first enable_if expressions are
 | |
| not ODR-equivalent.
 | |
| 
 | |
| Query for this feature with ``__has_attribute(enable_if)``.
 | |
| 
 | |
| 
 | |
| format (gnu::format)
 | |
| --------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","X","",""
 | |
| 
 | |
| Clang supports the ``format`` attribute, which indicates that the function
 | |
| accepts a ``printf`` or ``scanf``-like format string and corresponding
 | |
| arguments or a ``va_list`` that contains these arguments.
 | |
| 
 | |
| Please see `GCC documentation about format attribute
 | |
| <http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html>`_ to find details
 | |
| about attribute syntax.
 | |
| 
 | |
| Clang implements two kinds of checks with this attribute.
 | |
| 
 | |
| #. Clang checks that the function with the ``format`` attribute is called with
 | |
|    a format string that uses format specifiers that are allowed, and that
 | |
|    arguments match the format string.  This is the ``-Wformat`` warning, it is
 | |
|    on by default.
 | |
| 
 | |
| #. Clang checks that the format string argument is a literal string.  This is
 | |
|    the ``-Wformat-nonliteral`` warning, it is off by default.
 | |
| 
 | |
|    Clang implements this mostly the same way as GCC, but there is a difference
 | |
|    for functions that accept a ``va_list`` argument (for example, ``vprintf``).
 | |
|    GCC does not emit ``-Wformat-nonliteral`` warning for calls to such
 | |
|    fuctions.  Clang does not warn if the format string comes from a function
 | |
|    parameter, where the function is annotated with a compatible attribute,
 | |
|    otherwise it warns.  For example:
 | |
| 
 | |
|    .. code-block:: c
 | |
| 
 | |
|      __attribute__((__format__ (__scanf__, 1, 3)))
 | |
|      void foo(const char* s, char *buf, ...) {
 | |
|        va_list ap;
 | |
|        va_start(ap, buf);
 | |
| 
 | |
|        vprintf(s, ap); // warning: format string is not a string literal
 | |
|      }
 | |
| 
 | |
|    In this case we warn because ``s`` contains a format string for a
 | |
|    ``scanf``-like function, but it is passed to a ``printf``-like function.
 | |
| 
 | |
|    If the attribute is removed, clang still warns, because the format string is
 | |
|    not a string literal.
 | |
| 
 | |
|    Another example:
 | |
| 
 | |
|    .. code-block:: c
 | |
| 
 | |
|      __attribute__((__format__ (__printf__, 1, 3)))
 | |
|      void foo(const char* s, char *buf, ...) {
 | |
|        va_list ap;
 | |
|        va_start(ap, buf);
 | |
| 
 | |
|        vprintf(s, ap); // warning
 | |
|      }
 | |
| 
 | |
|    In this case Clang does not warn because the format string ``s`` and
 | |
|    the corresponding arguments are annotated.  If the arguments are
 | |
|    incorrect, the caller of ``foo`` will receive a warning.
 | |
| 
 | |
| 
 | |
| noduplicate (clang::noduplicate)
 | |
| --------------------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","X","",""
 | |
| 
 | |
| The ``noduplicate`` attribute can be placed on function declarations to control
 | |
| whether function calls to this function can be duplicated or not as a result of
 | |
| optimizations. This is required for the implementation of functions with
 | |
| certain special requirements, like the OpenCL "barrier" function, that might
 | |
| need to be run concurrently by all the threads that are executing in lockstep
 | |
| on the hardware. For example this attribute applied on the function
 | |
| "nodupfunc" in the code below avoids that:
 | |
| 
 | |
| .. code-block:: c
 | |
| 
 | |
|   void nodupfunc() __attribute__((noduplicate));
 | |
|   // Setting it as a C++11 attribute is also valid
 | |
|   // void nodupfunc() [[clang::noduplicate]];
 | |
|   void foo();
 | |
|   void bar();
 | |
| 
 | |
|   nodupfunc();
 | |
|   if (a > n) {
 | |
|     foo();
 | |
|   } else {
 | |
|     bar();
 | |
|   }
 | |
| 
 | |
| gets possibly modified by some optimizations into code similar to this:
 | |
| 
 | |
| .. code-block:: c
 | |
| 
 | |
|   if (a > n) {
 | |
|     nodupfunc();
 | |
|     foo();
 | |
|   } else {
 | |
|     nodupfunc();
 | |
|     bar();
 | |
|   }
 | |
| 
 | |
| where the call to "nodupfunc" is duplicated and sunk into the two branches
 | |
| of the condition.
 | |
| 
 | |
| 
 | |
| no_sanitize_address (no_address_safety_analysis, gnu::no_address_safety_analysis, gnu::no_sanitize_address)
 | |
| -----------------------------------------------------------------------------------------------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","X","",""
 | |
| 
 | |
| .. _langext-address_sanitizer:
 | |
| 
 | |
| Use ``__attribute__((no_sanitize_address))`` on a function declaration to
 | |
| specify that address safety instrumentation (e.g. AddressSanitizer) should
 | |
| not be applied to that function.
 | |
| 
 | |
| 
 | |
| no_sanitize_memory
 | |
| ------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| .. _langext-memory_sanitizer:
 | |
| 
 | |
| Use ``__attribute__((no_sanitize_memory))`` on a function declaration to
 | |
| specify that checks for uninitialized memory should not be inserted 
 | |
| (e.g. by MemorySanitizer). The function may still be instrumented by the tool
 | |
| to avoid false positives in other places.
 | |
| 
 | |
| 
 | |
| no_sanitize_thread
 | |
| ------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| .. _langext-thread_sanitizer:
 | |
| 
 | |
| Use ``__attribute__((no_sanitize_thread))`` on a function declaration to
 | |
| specify that checks for data races on plain (non-atomic) memory accesses should
 | |
| not be inserted by ThreadSanitizer. The function is still instrumented by the
 | |
| tool to avoid false positives and provide meaningful stack traces.
 | |
| 
 | |
| 
 | |
| objc_method_family
 | |
| ------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| Many methods in Objective-C have conventional meanings determined by their
 | |
| selectors. It is sometimes useful to be able to mark a method as having a
 | |
| particular conventional meaning despite not having the right selector, or as
 | |
| not having the conventional meaning that its selector would suggest. For these
 | |
| use cases, we provide an attribute to specifically describe the "method family"
 | |
| that a method belongs to.
 | |
| 
 | |
| **Usage**: ``__attribute__((objc_method_family(X)))``, where ``X`` is one of
 | |
| ``none``, ``alloc``, ``copy``, ``init``, ``mutableCopy``, or ``new``.  This
 | |
| attribute can only be placed at the end of a method declaration:
 | |
| 
 | |
| .. code-block:: objc
 | |
| 
 | |
|   - (NSString *)initMyStringValue __attribute__((objc_method_family(none)));
 | |
| 
 | |
| Users who do not wish to change the conventional meaning of a method, and who
 | |
| merely want to document its non-standard retain and release semantics, should
 | |
| use the retaining behavior attributes (``ns_returns_retained``,
 | |
| ``ns_returns_not_retained``, etc).
 | |
| 
 | |
| Query for this feature with ``__has_attribute(objc_method_family)``.
 | |
| 
 | |
| 
 | |
| objc_requires_super
 | |
| -------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| Some Objective-C classes allow a subclass to override a particular method in a
 | |
| parent class but expect that the overriding method also calls the overridden
 | |
| method in the parent class. For these cases, we provide an attribute to
 | |
| designate that a method requires a "call to ``super``" in the overriding
 | |
| method in the subclass.
 | |
| 
 | |
| **Usage**: ``__attribute__((objc_requires_super))``.  This attribute can only
 | |
| be placed at the end of a method declaration:
 | |
| 
 | |
| .. code-block:: objc
 | |
| 
 | |
|   - (void)foo __attribute__((objc_requires_super));
 | |
| 
 | |
| This attribute can only be applied the method declarations within a class, and
 | |
| not a protocol.  Currently this attribute does not enforce any placement of
 | |
| where the call occurs in the overriding method (such as in the case of
 | |
| ``-dealloc`` where the call must appear at the end).  It checks only that it
 | |
| exists.
 | |
| 
 | |
| Note that on both OS X and iOS that the Foundation framework provides a
 | |
| convenience macro ``NS_REQUIRES_SUPER`` that provides syntactic sugar for this
 | |
| attribute:
 | |
| 
 | |
| .. code-block:: objc
 | |
| 
 | |
|   - (void)foo NS_REQUIRES_SUPER;
 | |
| 
 | |
| This macro is conditionally defined depending on the compiler's support for
 | |
| this attribute.  If the compiler does not support the attribute the macro
 | |
| expands to nothing.
 | |
| 
 | |
| Operationally, when a method has this annotation the compiler will warn if the
 | |
| implementation of an override in a subclass does not call super.  For example:
 | |
| 
 | |
| .. code-block:: objc
 | |
| 
 | |
|    warning: method possibly missing a [super AnnotMeth] call
 | |
|    - (void) AnnotMeth{};
 | |
|                       ^
 | |
| 
 | |
| 
 | |
| overloadable
 | |
| ------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| Clang provides support for C++ function overloading in C.  Function overloading
 | |
| in C is introduced using the ``overloadable`` attribute.  For example, one
 | |
| might provide several overloaded versions of a ``tgsin`` function that invokes
 | |
| the appropriate standard function computing the sine of a value with ``float``,
 | |
| ``double``, or ``long double`` precision:
 | |
| 
 | |
| .. code-block:: c
 | |
| 
 | |
|   #include <math.h>
 | |
|   float __attribute__((overloadable)) tgsin(float x) { return sinf(x); }
 | |
|   double __attribute__((overloadable)) tgsin(double x) { return sin(x); }
 | |
|   long double __attribute__((overloadable)) tgsin(long double x) { return sinl(x); }
 | |
| 
 | |
| Given these declarations, one can call ``tgsin`` with a ``float`` value to
 | |
| receive a ``float`` result, with a ``double`` to receive a ``double`` result,
 | |
| etc.  Function overloading in C follows the rules of C++ function overloading
 | |
| to pick the best overload given the call arguments, with a few C-specific
 | |
| semantics:
 | |
| 
 | |
| * Conversion from ``float`` or ``double`` to ``long double`` is ranked as a
 | |
|   floating-point promotion (per C99) rather than as a floating-point conversion
 | |
|   (as in C++).
 | |
| 
 | |
| * A conversion from a pointer of type ``T*`` to a pointer of type ``U*`` is
 | |
|   considered a pointer conversion (with conversion rank) if ``T`` and ``U`` are
 | |
|   compatible types.
 | |
| 
 | |
| * A conversion from type ``T`` to a value of type ``U`` is permitted if ``T``
 | |
|   and ``U`` are compatible types.  This conversion is given "conversion" rank.
 | |
| 
 | |
| The declaration of ``overloadable`` functions is restricted to function
 | |
| declarations and definitions.  Most importantly, if any function with a given
 | |
| name is given the ``overloadable`` attribute, then all function declarations
 | |
| and definitions with that name (and in that scope) must have the
 | |
| ``overloadable`` attribute.  This rule even applies to redeclarations of
 | |
| functions whose original declaration had the ``overloadable`` attribute, e.g.,
 | |
| 
 | |
| .. code-block:: c
 | |
| 
 | |
|   int f(int) __attribute__((overloadable));
 | |
|   float f(float); // error: declaration of "f" must have the "overloadable" attribute
 | |
| 
 | |
|   int g(int) __attribute__((overloadable));
 | |
|   int g(int) { } // error: redeclaration of "g" must also have the "overloadable" attribute
 | |
| 
 | |
| Functions marked ``overloadable`` must have prototypes.  Therefore, the
 | |
| following code is ill-formed:
 | |
| 
 | |
| .. code-block:: c
 | |
| 
 | |
|   int h() __attribute__((overloadable)); // error: h does not have a prototype
 | |
| 
 | |
| However, ``overloadable`` functions are allowed to use a ellipsis even if there
 | |
| are no named parameters (as is permitted in C++).  This feature is particularly
 | |
| useful when combined with the ``unavailable`` attribute:
 | |
| 
 | |
| .. code-block:: c++
 | |
| 
 | |
|   void honeypot(...) __attribute__((overloadable, unavailable)); // calling me is an error
 | |
| 
 | |
| Functions declared with the ``overloadable`` attribute have their names mangled
 | |
| according to the same rules as C++ function names.  For example, the three
 | |
| ``tgsin`` functions in our motivating example get the mangled names
 | |
| ``_Z5tgsinf``, ``_Z5tgsind``, and ``_Z5tgsine``, respectively.  There are two
 | |
| caveats to this use of name mangling:
 | |
| 
 | |
| * Future versions of Clang may change the name mangling of functions overloaded
 | |
|   in C, so you should not depend on an specific mangling.  To be completely
 | |
|   safe, we strongly urge the use of ``static inline`` with ``overloadable``
 | |
|   functions.
 | |
| 
 | |
| * The ``overloadable`` attribute has almost no meaning when used in C++,
 | |
|   because names will already be mangled and functions are already overloadable.
 | |
|   However, when an ``overloadable`` function occurs within an ``extern "C"``
 | |
|   linkage specification, it's name *will* be mangled in the same way as it
 | |
|   would in C.
 | |
| 
 | |
| Query for this feature with ``__has_extension(attribute_overloadable)``.
 | |
| 
 | |
| 
 | |
| release_capability (release_shared_capability, clang::release_capability, clang::release_shared_capability)
 | |
| -----------------------------------------------------------------------------------------------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","X","",""
 | |
| 
 | |
| Marks a function as releasing a capability.
 | |
| 
 | |
| 
 | |
| try_acquire_capability (try_acquire_shared_capability, clang::try_acquire_capability, clang::try_acquire_shared_capability)
 | |
| ---------------------------------------------------------------------------------------------------------------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","X","",""
 | |
| 
 | |
| Marks a function that attempts to acquire a capability. This function may fail to
 | |
| actually acquire the capability; they accept a Boolean value determining
 | |
| whether acquiring the capability means success (true), or failing to acquire
 | |
| the capability means success (false).
 | |
| 
 | |
| 
 | |
| Variable Attributes
 | |
| ===================
 | |
| 
 | |
| 
 | |
| tls_model (gnu::tls_model)
 | |
| --------------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","X","",""
 | |
| 
 | |
| The ``tls_model`` attribute allows you to specify which thread-local storage
 | |
| model to use. It accepts the following strings:
 | |
| 
 | |
| * global-dynamic
 | |
| * local-dynamic
 | |
| * initial-exec
 | |
| * local-exec
 | |
| 
 | |
| TLS models are mutually exclusive.
 | |
| 
 | |
| 
 | |
| Type Attributes
 | |
| ===============
 | |
| 
 | |
| 
 | |
| __single_inhertiance, __multiple_inheritance, __virtual_inheritance
 | |
| -------------------------------------------------------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "","","","X"
 | |
| 
 | |
| This collection of keywords is enabled under ``-fms-extensions`` and controls
 | |
| the pointer-to-member representation used on ``*-*-win32`` targets.
 | |
| 
 | |
| The ``*-*-win32`` targets utilize a pointer-to-member representation which
 | |
| varies in size and alignment depending on the definition of the underlying
 | |
| class.
 | |
| 
 | |
| However, this is problematic when a forward declaration is only available and
 | |
| no definition has been made yet.  In such cases, Clang is forced to utilize the
 | |
| most general representation that is available to it.
 | |
| 
 | |
| These keywords make it possible to use a pointer-to-member representation other
 | |
| than the most general one regardless of whether or not the definition will ever
 | |
| be present in the current translation unit.
 | |
| 
 | |
| This family of keywords belong between the ``class-key`` and ``class-name``:
 | |
| 
 | |
| .. code-block:: c++
 | |
| 
 | |
|   struct __single_inheritance S;
 | |
|   int S::*i;
 | |
|   struct S {};
 | |
| 
 | |
| This keyword can be applied to class templates but only has an effect when used
 | |
| on full specializations:
 | |
| 
 | |
| .. code-block:: c++
 | |
| 
 | |
|   template <typename T, typename U> struct __single_inheritance A; // warning: inheritance model ignored on primary template
 | |
|   template <typename T> struct __multiple_inheritance A<T, T>; // warning: inheritance model ignored on partial specialization
 | |
|   template <> struct __single_inheritance A<int, float>;
 | |
| 
 | |
| Note that choosing an inheritance model less general than strictly necessary is
 | |
| an error:
 | |
| 
 | |
| .. code-block:: c++
 | |
| 
 | |
|   struct __multiple_inheritance S; // error: inheritance model does not match definition
 | |
|   int S::*i;
 | |
|   struct S {};
 | |
| 
 | |
| 
 | |
| Statement Attributes
 | |
| ====================
 | |
| 
 | |
| 
 | |
| fallthrough (clang::fallthrough)
 | |
| --------------------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "","X","",""
 | |
| 
 | |
| The ``clang::fallthrough`` attribute is used along with the
 | |
| ``-Wimplicit-fallthrough`` argument to annotate intentional fall-through
 | |
| between switch labels.  It can only be applied to a null statement placed at a
 | |
| point of execution between any statement and the next switch label.  It is
 | |
| common to mark these places with a specific comment, but this attribute is
 | |
| meant to replace comments with a more strict annotation, which can be checked
 | |
| by the compiler.  This attribute doesn't change semantics of the code and can
 | |
| be used wherever an intended fall-through occurs.  It is designed to mimic
 | |
| control-flow statements like ``break;``, so it can be placed in most places
 | |
| where ``break;`` can, but only if there are no statements on the execution path
 | |
| between it and the next switch label.
 | |
| 
 | |
| Here is an example:
 | |
| 
 | |
| .. code-block:: c++
 | |
| 
 | |
|   // compile with -Wimplicit-fallthrough
 | |
|   switch (n) {
 | |
|   case 22:
 | |
|   case 33:  // no warning: no statements between case labels
 | |
|     f();
 | |
|   case 44:  // warning: unannotated fall-through
 | |
|     g();
 | |
|     [[clang::fallthrough]];
 | |
|   case 55:  // no warning
 | |
|     if (x) {
 | |
|       h();
 | |
|       break;
 | |
|     }
 | |
|     else {
 | |
|       i();
 | |
|       [[clang::fallthrough]];
 | |
|     }
 | |
|   case 66:  // no warning
 | |
|     p();
 | |
|     [[clang::fallthrough]]; // warning: fallthrough annotation does not
 | |
|                             //          directly precede case label
 | |
|     q();
 | |
|   case 77:  // warning: unannotated fall-through
 | |
|     r();
 | |
|   }
 | |
| 
 | |
| 
 | |
| Consumed Annotation Checking
 | |
| ============================
 | |
| Clang supports additional attributes for checking basic resource management
 | |
| properties, specifically for unique objects that have a single owning reference.
 | |
| The following attributes are currently supported, although **the implementation
 | |
| for these annotations is currently in development and are subject to change.**
 | |
| 
 | |
| callable_when
 | |
| -------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| Use ``__attribute__((callable_when(...)))`` to indicate what states a method
 | |
| may be called in.  Valid states are unconsumed, consumed, or unknown.  Each
 | |
| argument to this attribute must be a quoted string.  E.g.:
 | |
| 
 | |
| ``__attribute__((callable_when("unconsumed", "unknown")))``
 | |
| 
 | |
| 
 | |
| consumable
 | |
| ----------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| Each ``class`` that uses any of the typestate annotations must first be marked
 | |
| using the ``consumable`` attribute.  Failure to do so will result in a warning.
 | |
| 
 | |
| This attribute accepts a single parameter that must be one of the following:
 | |
| ``unknown``, ``consumed``, or ``unconsumed``.
 | |
| 
 | |
| 
 | |
| param_typestate
 | |
| ---------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| This attribute specifies expectations about function parameters.  Calls to an
 | |
| function with annotated parameters will issue a warning if the corresponding
 | |
| argument isn't in the expected state.  The attribute is also used to set the
 | |
| initial state of the parameter when analyzing the function's body.
 | |
| 
 | |
| 
 | |
| return_typestate
 | |
| ----------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| The ``return_typestate`` attribute can be applied to functions or parameters.
 | |
| When applied to a function the attribute specifies the state of the returned
 | |
| value.  The function's body is checked to ensure that it always returns a value
 | |
| in the specified state.  On the caller side, values returned by the annotated
 | |
| function are initialized to the given state.
 | |
| 
 | |
| When applied to a function parameter it modifies the state of an argument after
 | |
| a call to the function returns.  The function's body is checked to ensure that
 | |
| the parameter is in the expected state before returning.
 | |
| 
 | |
| 
 | |
| set_typestate
 | |
| -------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| Annotate methods that transition an object into a new state with
 | |
| ``__attribute__((set_typestate(new_state)))``.  The new new state must be
 | |
| unconsumed, consumed, or unknown.
 | |
| 
 | |
| 
 | |
| test_typestate
 | |
| --------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| Use ``__attribute__((test_typestate(tested_state)))`` to indicate that a method
 | |
| returns true if the object is in the specified state..
 | |
| 
 | |
| 
 | |
| Type Safety Checking
 | |
| ====================
 | |
| Clang supports additional attributes to enable checking type safety properties
 | |
| that can't be enforced by the C type system.  Use cases include:
 | |
| 
 | |
| * MPI library implementations, where these attributes enable checking that
 | |
|   the buffer type matches the passed ``MPI_Datatype``;
 | |
| * for HDF5 library there is a similar use case to MPI;
 | |
| * checking types of variadic functions' arguments for functions like
 | |
|   ``fcntl()`` and ``ioctl()``.
 | |
| 
 | |
| You can detect support for these attributes with ``__has_attribute()``.  For
 | |
| example:
 | |
| 
 | |
| .. code-block:: c++
 | |
| 
 | |
|   #if defined(__has_attribute)
 | |
|   #  if __has_attribute(argument_with_type_tag) && \
 | |
|         __has_attribute(pointer_with_type_tag) && \
 | |
|         __has_attribute(type_tag_for_datatype)
 | |
|   #    define ATTR_MPI_PWT(buffer_idx, type_idx) __attribute__((pointer_with_type_tag(mpi,buffer_idx,type_idx)))
 | |
|   /* ... other macros ...  */
 | |
|   #  endif
 | |
|   #endif
 | |
| 
 | |
|   #if !defined(ATTR_MPI_PWT)
 | |
|   # define ATTR_MPI_PWT(buffer_idx, type_idx)
 | |
|   #endif
 | |
| 
 | |
|   int MPI_Send(void *buf, int count, MPI_Datatype datatype /*, other args omitted */)
 | |
|       ATTR_MPI_PWT(1,3);
 | |
| 
 | |
| argument_with_type_tag
 | |
| ----------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| Use ``__attribute__((argument_with_type_tag(arg_kind, arg_idx,
 | |
| type_tag_idx)))`` on a function declaration to specify that the function
 | |
| accepts a type tag that determines the type of some other argument.
 | |
| ``arg_kind`` is an identifier that should be used when annotating all
 | |
| applicable type tags.
 | |
| 
 | |
| This attribute is primarily useful for checking arguments of variadic functions
 | |
| (``pointer_with_type_tag`` can be used in most non-variadic cases).
 | |
| 
 | |
| For example:
 | |
| 
 | |
| .. code-block:: c++
 | |
| 
 | |
|   int fcntl(int fd, int cmd, ...)
 | |
|       __attribute__(( argument_with_type_tag(fcntl,3,2) ));
 | |
| 
 | |
| 
 | |
| pointer_with_type_tag
 | |
| ---------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| Use ``__attribute__((pointer_with_type_tag(ptr_kind, ptr_idx, type_tag_idx)))``
 | |
| on a function declaration to specify that the function accepts a type tag that
 | |
| determines the pointee type of some other pointer argument.
 | |
| 
 | |
| For example:
 | |
| 
 | |
| .. code-block:: c++
 | |
| 
 | |
|   int MPI_Send(void *buf, int count, MPI_Datatype datatype /*, other args omitted */)
 | |
|       __attribute__(( pointer_with_type_tag(mpi,1,3) ));
 | |
| 
 | |
| 
 | |
| type_tag_for_datatype
 | |
| ---------------------
 | |
| .. csv-table:: Supported Syntaxes
 | |
|    :header: "GNU", "C++11", "__declspec", "Keyword"
 | |
| 
 | |
|    "X","","",""
 | |
| 
 | |
| Clang supports annotating type tags of two forms.
 | |
| 
 | |
| * **Type tag that is an expression containing a reference to some declared
 | |
|   identifier.** Use ``__attribute__((type_tag_for_datatype(kind, type)))`` on a
 | |
|   declaration with that identifier:
 | |
| 
 | |
|   .. code-block:: c++
 | |
| 
 | |
|     extern struct mpi_datatype mpi_datatype_int
 | |
|         __attribute__(( type_tag_for_datatype(mpi,int) ));
 | |
|     #define MPI_INT ((MPI_Datatype) &mpi_datatype_int)
 | |
| 
 | |
| * **Type tag that is an integral literal.** Introduce a ``static const``
 | |
|   variable with a corresponding initializer value and attach
 | |
|   ``__attribute__((type_tag_for_datatype(kind, type)))`` on that declaration,
 | |
|   for example:
 | |
| 
 | |
|   .. code-block:: c++
 | |
| 
 | |
|     #define MPI_INT ((MPI_Datatype) 42)
 | |
|     static const MPI_Datatype mpi_datatype_int
 | |
|         __attribute__(( type_tag_for_datatype(mpi,int) )) = 42
 | |
| 
 | |
| The attribute also accepts an optional third argument that determines how the
 | |
| expression is compared to the type tag.  There are two supported flags:
 | |
| 
 | |
| * ``layout_compatible`` will cause types to be compared according to
 | |
|   layout-compatibility rules (C++11 [class.mem] p 17, 18).  This is
 | |
|   implemented to support annotating types like ``MPI_DOUBLE_INT``.
 | |
| 
 | |
|   For example:
 | |
| 
 | |
|   .. code-block:: c++
 | |
| 
 | |
|     /* In mpi.h */
 | |
|     struct internal_mpi_double_int { double d; int i; };
 | |
|     extern struct mpi_datatype mpi_datatype_double_int
 | |
|         __attribute__(( type_tag_for_datatype(mpi, struct internal_mpi_double_int, layout_compatible) ));
 | |
| 
 | |
|     #define MPI_DOUBLE_INT ((MPI_Datatype) &mpi_datatype_double_int)
 | |
| 
 | |
|     /* In user code */
 | |
|     struct my_pair { double a; int b; };
 | |
|     struct my_pair *buffer;
 | |
|     MPI_Send(buffer, 1, MPI_DOUBLE_INT /*, ...  */); // no warning
 | |
| 
 | |
|     struct my_int_pair { int a; int b; }
 | |
|     struct my_int_pair *buffer2;
 | |
|     MPI_Send(buffer2, 1, MPI_DOUBLE_INT /*, ...  */); // warning: actual buffer element
 | |
|                                                       // type 'struct my_int_pair'
 | |
|                                                       // doesn't match specified MPI_Datatype
 | |
| 
 | |
| * ``must_be_null`` specifies that the expression should be a null pointer
 | |
|   constant, for example:
 | |
| 
 | |
|   .. code-block:: c++
 | |
| 
 | |
|     /* In mpi.h */
 | |
|     extern struct mpi_datatype mpi_datatype_null
 | |
|         __attribute__(( type_tag_for_datatype(mpi, void, must_be_null) ));
 | |
| 
 | |
|     #define MPI_DATATYPE_NULL ((MPI_Datatype) &mpi_datatype_null)
 | |
| 
 | |
|     /* In user code */
 | |
|     MPI_Send(buffer, 1, MPI_DATATYPE_NULL /*, ...  */); // warning: MPI_DATATYPE_NULL
 | |
|                                                         // was specified but buffer
 | |
|                                                         // is not a null pointer
 | |
| 
 | |
| 
 |