summaryrefslogtreecommitdiff
path: root/share/doc/gcc/Statement-Attributes.html
blob: a4a441d1a100a4ed32ca1c84e93319dd3bd63301 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- This file documents the use of the GNU compilers.

Copyright (C) 1988-2023 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below).  A copy of the license is included in the section entitled
"GNU Free Documentation License".

(a) The FSF's Front-Cover Text is:

A GNU Manual

(b) The FSF's Back-Cover Text is:

You have freedom to copy and modify this GNU Manual, like GNU
     software.  Copies published by the Free Software Foundation raise
     funds for GNU development. -->
<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Using the GNU Compiler Collection (GCC): Statement Attributes</title>

<meta name="description" content="Using the GNU Compiler Collection (GCC): Statement Attributes">
<meta name="keywords" content="Using the GNU Compiler Collection (GCC): Statement Attributes">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Indices.html#Indices" rel="index" title="Indices">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="C-Extensions.html#C-Extensions" rel="up" title="C Extensions">
<link href="Attribute-Syntax.html#Attribute-Syntax" rel="next" title="Attribute Syntax">
<link href="Enumerator-Attributes.html#Enumerator-Attributes" rel="previous" title="Enumerator Attributes">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>


</head>

<body lang="en_US" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Statement-Attributes"></a>
<div class="header">
<p>
Next: <a href="Attribute-Syntax.html#Attribute-Syntax" accesskey="n" rel="next">Attribute Syntax</a>, Previous: <a href="Enumerator-Attributes.html#Enumerator-Attributes" accesskey="p" rel="previous">Enumerator Attributes</a>, Up: <a href="C-Extensions.html#C-Extensions" accesskey="u" rel="up">C Extensions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Indices.html#Indices" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Statement-Attributes-1"></a>
<h3 class="section">6.38 Statement Attributes</h3>
<a name="index-Statement-Attributes"></a>

<p>GCC allows attributes to be set on null statements.  See <a href="Attribute-Syntax.html#Attribute-Syntax">Attribute Syntax</a>,
for details of the exact syntax for using attributes.  Other attributes are
available for functions (see <a href="Function-Attributes.html#Function-Attributes">Function Attributes</a>), variables
(see <a href="Variable-Attributes.html#Variable-Attributes">Variable Attributes</a>), labels (see <a href="Label-Attributes.html#Label-Attributes">Label Attributes</a>), enumerators
(see <a href="Enumerator-Attributes.html#Enumerator-Attributes">Enumerator Attributes</a>), and for types (see <a href="Type-Attributes.html#Type-Attributes">Type Attributes</a>).
</p>
<dl compact="compact">
<dd><a name="index-fallthrough-statement-attribute"></a>
</dd>
<dt><code>fallthrough</code></dt>
<dd><p>The <code>fallthrough</code> attribute with a null statement serves as a
fallthrough statement.  It hints to the compiler that a statement
that falls through to another case label, or user-defined label
in a switch statement is intentional and thus the
<samp>-Wimplicit-fallthrough</samp> warning must not trigger.  The
fallthrough attribute may appear at most once in each attribute
list, and may not be mixed with other attributes.  It can only
be used in a switch statement (the compiler will issue an error
otherwise), after a preceding statement and before a logically
succeeding case label, or user-defined label.
</p>
<p>This example uses the <code>fallthrough</code> statement attribute to indicate that
the <samp>-Wimplicit-fallthrough</samp> warning should not be emitted:
</p>
<div class="smallexample">
<pre class="smallexample">switch (cond)
  {
  case 1:
    bar (1);
    __attribute__((fallthrough));
  case 2:
    &hellip;
  }
</pre></div>

<a name="index-assume-statement-attribute"></a>
</dd>
<dt><code>assume</code></dt>
<dd><p>The <code>assume</code> attribute with a null statement serves as portable
assumption.  It should have a single argument, a conditional expression,
which is not evaluated.  If the argument would evaluate to true
at the point where it appears, it has no effect, otherwise there
is undefined behavior.  This is a GNU variant of the ISO C++23
standard <code>assume</code> attribute, but it can be used in any version of
both C and C++.
</p>
<div class="smallexample">
<pre class="smallexample">int
foo (int x, int y)
{
  __attribute__((assume(x == 42)));
  __attribute__((assume(++y == 43)));
  return x + y;
}
</pre></div>

<p><code>y</code> is not actually incremented and the compiler can but does not
have to optimize it to just <code>return 42 + 42;</code>.
</p>
</dd>
</dl>

<hr>
<div class="header">
<p>
Next: <a href="Attribute-Syntax.html#Attribute-Syntax" accesskey="n" rel="next">Attribute Syntax</a>, Previous: <a href="Enumerator-Attributes.html#Enumerator-Attributes" accesskey="p" rel="previous">Enumerator Attributes</a>, Up: <a href="C-Extensions.html#C-Extensions" accesskey="u" rel="up">C Extensions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Indices.html#Indices" title="Index" rel="index">Index</a>]</p>
</div>



</body>
</html>