]>
Commit | Line | Data |
---|---|---|
a5544970 | 1 | @c Copyright (C) 2001-2019 Free Software Foundation, Inc. |
d592f1c3 JM |
2 | @c This is part of the GCC manual. |
3 | @c For copying conditions, see the file gcc.texi. | |
4 | ||
5 | @node C Implementation | |
e6f3f526 | 6 | @chapter C Implementation-Defined Behavior |
d592f1c3 JM |
7 | @cindex implementation-defined behavior, C language |
8 | ||
9 | A conforming implementation of ISO C is required to document its | |
10 | choice of behavior in each of the areas that are designated | |
d78aa55c | 11 | ``implementation defined''. The following lists all such areas, |
b76f5d16 JM |
12 | along with the section numbers from the ISO/IEC 9899:1990, ISO/IEC |
13 | 9899:1999 and ISO/IEC 9899:2011 standards. Some areas are only | |
14 | implementation-defined in one version of the standard. | |
9d6e0be1 JM |
15 | |
16 | Some choices depend on the externally determined ABI for the platform | |
17 | (including standard character encodings) which GCC follows; these are | |
18 | listed as ``determined by ABI'' below. @xref{Compatibility, , Binary | |
19 | Compatibility}, and @uref{http://gcc.gnu.org/readings.html}. Some | |
20 | choices are documented in the preprocessor manual. | |
21 | @xref{Implementation-defined behavior, , Implementation-defined | |
22 | behavior, cpp, The C Preprocessor}. Some choices are made by the | |
23 | library and operating system (or other environment when compiling for | |
24 | a freestanding environment); refer to their documentation for details. | |
d592f1c3 JM |
25 | |
26 | @menu | |
27 | * Translation implementation:: | |
28 | * Environment implementation:: | |
29 | * Identifiers implementation:: | |
30 | * Characters implementation:: | |
31 | * Integers implementation:: | |
32 | * Floating point implementation:: | |
33 | * Arrays and pointers implementation:: | |
34 | * Hints implementation:: | |
35 | * Structures unions enumerations and bit-fields implementation:: | |
36 | * Qualifiers implementation:: | |
9d6e0be1 JM |
37 | * Declarators implementation:: |
38 | * Statements implementation:: | |
d592f1c3 JM |
39 | * Preprocessing directives implementation:: |
40 | * Library functions implementation:: | |
41 | * Architecture implementation:: | |
42 | * Locale-specific behavior implementation:: | |
43 | @end menu | |
44 | ||
45 | @node Translation implementation | |
46 | @section Translation | |
47 | ||
48 | @itemize @bullet | |
49 | @item | |
b76f5d16 JM |
50 | @cite{How a diagnostic is identified (C90 3.7, C99 and C11 3.10, C90, |
51 | C99 and C11 5.1.1.3).} | |
d592f1c3 | 52 | |
8a36672b | 53 | Diagnostics consist of all the output sent to stderr by GCC@. |
d592f1c3 JM |
54 | |
55 | @item | |
56 | @cite{Whether each nonempty sequence of white-space characters other than | |
57 | new-line is retained or replaced by one space character in translation | |
b76f5d16 | 58 | phase 3 (C90, C99 and C11 5.1.1.2).} |
9d6e0be1 JM |
59 | |
60 | @xref{Implementation-defined behavior, , Implementation-defined | |
61 | behavior, cpp, The C Preprocessor}. | |
62 | ||
d592f1c3 JM |
63 | @end itemize |
64 | ||
65 | @node Environment implementation | |
66 | @section Environment | |
67 | ||
9d6e0be1 | 68 | The behavior of most of these points are dependent on the implementation |
d592f1c3 JM |
69 | of the C library, and are not defined by GCC itself. |
70 | ||
9d6e0be1 JM |
71 | @itemize @bullet |
72 | @item | |
73 | @cite{The mapping between physical source file multibyte characters | |
b76f5d16 JM |
74 | and the source character set in translation phase 1 (C90, C99 and C11 |
75 | 5.1.1.2).} | |
9d6e0be1 JM |
76 | |
77 | @xref{Implementation-defined behavior, , Implementation-defined | |
78 | behavior, cpp, The C Preprocessor}. | |
79 | ||
80 | @end itemize | |
81 | ||
d592f1c3 JM |
82 | @node Identifiers implementation |
83 | @section Identifiers | |
84 | ||
85 | @itemize @bullet | |
86 | @item | |
87 | @cite{Which additional multibyte characters may appear in identifiers | |
b76f5d16 | 88 | and their correspondence to universal character names (C99 and C11 6.4.2).} |
9d6e0be1 JM |
89 | |
90 | @xref{Implementation-defined behavior, , Implementation-defined | |
91 | behavior, cpp, The C Preprocessor}. | |
d592f1c3 JM |
92 | |
93 | @item | |
94 | @cite{The number of significant initial characters in an identifier | |
b76f5d16 | 95 | (C90 6.1.2, C90, C99 and C11 5.2.4.1, C99 and C11 6.4.2).} |
d592f1c3 JM |
96 | |
97 | For internal names, all characters are significant. For external names, | |
98 | the number of significant characters are defined by the linker; for | |
99 | almost all targets, all characters are significant. | |
100 | ||
9d6e0be1 JM |
101 | @item |
102 | @cite{Whether case distinctions are significant in an identifier with | |
103 | external linkage (C90 6.1.2).} | |
104 | ||
b76f5d16 | 105 | This is a property of the linker. C99 and C11 require that case distinctions |
9d6e0be1 JM |
106 | are always significant in identifiers with external linkage and |
107 | systems without this property are not supported by GCC@. | |
108 | ||
d592f1c3 JM |
109 | @end itemize |
110 | ||
111 | @node Characters implementation | |
112 | @section Characters | |
113 | ||
114 | @itemize @bullet | |
115 | @item | |
b76f5d16 | 116 | @cite{The number of bits in a byte (C90 3.4, C99 and C11 3.6).} |
9d6e0be1 JM |
117 | |
118 | Determined by ABI@. | |
d592f1c3 JM |
119 | |
120 | @item | |
b76f5d16 JM |
121 | @cite{The values of the members of the execution character set (C90, |
122 | C99 and C11 5.2.1).} | |
9d6e0be1 JM |
123 | |
124 | Determined by ABI@. | |
d592f1c3 JM |
125 | |
126 | @item | |
127 | @cite{The unique value of the member of the execution character set produced | |
b76f5d16 JM |
128 | for each of the standard alphabetic escape sequences (C90, C99 and C11 |
129 | 5.2.2).} | |
9d6e0be1 JM |
130 | |
131 | Determined by ABI@. | |
d592f1c3 JM |
132 | |
133 | @item | |
134 | @cite{The value of a @code{char} object into which has been stored any | |
9d6e0be1 | 135 | character other than a member of the basic execution character set |
b76f5d16 | 136 | (C90 6.1.2.5, C99 and C11 6.2.5).} |
9d6e0be1 JM |
137 | |
138 | Determined by ABI@. | |
d592f1c3 JM |
139 | |
140 | @item | |
9d6e0be1 JM |
141 | @cite{Which of @code{signed char} or @code{unsigned char} has the same |
142 | range, representation, and behavior as ``plain'' @code{char} (C90 | |
b76f5d16 | 143 | 6.1.2.5, C90 6.2.1.1, C99 and C11 6.2.5, C99 and C11 6.3.1.1).} |
9d6e0be1 JM |
144 | |
145 | @opindex fsigned-char | |
146 | @opindex funsigned-char | |
147 | Determined by ABI@. The options @option{-funsigned-char} and | |
148 | @option{-fsigned-char} change the default. @xref{C Dialect Options, , | |
149 | Options Controlling C Dialect}. | |
d592f1c3 JM |
150 | |
151 | @item | |
152 | @cite{The mapping of members of the source character set (in character | |
153 | constants and string literals) to members of the execution character | |
b76f5d16 | 154 | set (C90 6.1.3.4, C99 and C11 6.4.4.4, C90, C99 and C11 5.1.1.2).} |
9d6e0be1 JM |
155 | |
156 | Determined by ABI@. | |
d592f1c3 JM |
157 | |
158 | @item | |
159 | @cite{The value of an integer character constant containing more than one | |
160 | character or containing a character or escape sequence that does not map | |
b76f5d16 | 161 | to a single-byte execution character (C90 6.1.3.4, C99 and C11 6.4.4.4).} |
9d6e0be1 JM |
162 | |
163 | @xref{Implementation-defined behavior, , Implementation-defined | |
164 | behavior, cpp, The C Preprocessor}. | |
d592f1c3 JM |
165 | |
166 | @item | |
167 | @cite{The value of a wide character constant containing more than one | |
b76f5d16 JM |
168 | multibyte character or a single multibyte character that maps to |
169 | multiple members of the extended execution character set, or | |
170 | containing a multibyte character or escape sequence not represented in | |
171 | the extended execution character set (C90 6.1.3.4, C99 and C11 | |
172 | 6.4.4.4).} | |
9d6e0be1 JM |
173 | |
174 | @xref{Implementation-defined behavior, , Implementation-defined | |
175 | behavior, cpp, The C Preprocessor}. | |
d592f1c3 JM |
176 | |
177 | @item | |
178 | @cite{The current locale used to convert a wide character constant consisting | |
179 | of a single multibyte character that maps to a member of the extended | |
9d6e0be1 | 180 | execution character set into a corresponding wide character code (C90 |
b76f5d16 | 181 | 6.1.3.4, C99 and C11 6.4.4.4).} |
9d6e0be1 JM |
182 | |
183 | @xref{Implementation-defined behavior, , Implementation-defined | |
184 | behavior, cpp, The C Preprocessor}. | |
d592f1c3 | 185 | |
b76f5d16 JM |
186 | @item |
187 | @cite{Whether differently-prefixed wide string literal tokens can be | |
188 | concatenated and, if so, the treatment of the resulting multibyte | |
189 | character sequence (C11 6.4.5).} | |
190 | ||
191 | Such tokens may not be concatenated. | |
192 | ||
d592f1c3 JM |
193 | @item |
194 | @cite{The current locale used to convert a wide string literal into | |
b76f5d16 | 195 | corresponding wide character codes (C90 6.1.4, C99 and C11 6.4.5).} |
9d6e0be1 JM |
196 | |
197 | @xref{Implementation-defined behavior, , Implementation-defined | |
198 | behavior, cpp, The C Preprocessor}. | |
d592f1c3 JM |
199 | |
200 | @item | |
201 | @cite{The value of a string literal containing a multibyte character or escape | |
b76f5d16 JM |
202 | sequence not represented in the execution character set (C90 6.1.4, |
203 | C99 and C11 6.4.5).} | |
9d6e0be1 JM |
204 | |
205 | @xref{Implementation-defined behavior, , Implementation-defined | |
206 | behavior, cpp, The C Preprocessor}. | |
b76f5d16 JM |
207 | |
208 | @item | |
209 | @cite{The encoding of any of @code{wchar_t}, @code{char16_t}, and | |
210 | @code{char32_t} where the corresponding standard encoding macro | |
211 | (@code{__STDC_ISO_10646__}, @code{__STDC_UTF_16__}, or | |
212 | @code{__STDC_UTF_32__}) is not defined (C11 6.10.8.2).} | |
213 | ||
214 | @xref{Implementation-defined behavior, , Implementation-defined | |
215 | behavior, cpp, The C Preprocessor}. @code{char16_t} and | |
216 | @code{char32_t} literals are always encoded in UTF-16 and UTF-32 | |
217 | respectively. | |
218 | ||
d592f1c3 JM |
219 | @end itemize |
220 | ||
221 | @node Integers implementation | |
222 | @section Integers | |
223 | ||
224 | @itemize @bullet | |
225 | @item | |
b76f5d16 JM |
226 | @cite{Any extended integer types that exist in the implementation (C99 |
227 | and C11 6.2.5).} | |
9d6e0be1 JM |
228 | |
229 | GCC does not support any extended integer types. | |
230 | @c The __mode__ attribute might create types of precisions not | |
231 | @c otherwise supported, but the syntax isn't right for use everywhere | |
232 | @c the standard type names might be used. Predefined typedefs should | |
233 | @c be used if any extended integer types are to be defined. The | |
234 | @c __int128_t and __uint128_t typedefs are not extended integer types | |
235 | @c as they are generally longer than the ABI-specified intmax_t. | |
d592f1c3 JM |
236 | |
237 | @item | |
238 | @cite{Whether signed integer types are represented using sign and magnitude, | |
239 | two's complement, or one's complement, and whether the extraordinary value | |
b76f5d16 | 240 | is a trap representation or an ordinary value (C99 and C11 6.2.6.2).} |
d592f1c3 JM |
241 | |
242 | GCC supports only two's complement integer types, and all bit patterns | |
243 | are ordinary values. | |
244 | ||
245 | @item | |
246 | @cite{The rank of any extended integer type relative to another extended | |
b76f5d16 | 247 | integer type with the same precision (C99 and C11 6.3.1.1).} |
9d6e0be1 JM |
248 | |
249 | GCC does not support any extended integer types. | |
250 | @c If it did, there would only be one of each precision and signedness. | |
d592f1c3 JM |
251 | |
252 | @item | |
253 | @cite{The result of, or the signal raised by, converting an integer to a | |
254 | signed integer type when the value cannot be represented in an object of | |
b76f5d16 | 255 | that type (C90 6.2.1.2, C99 and C11 6.3.1.3).} |
9d6e0be1 JM |
256 | |
257 | For conversion to a type of width @math{N}, the value is reduced | |
258 | modulo @math{2^N} to be within range of the type; no signal is raised. | |
d592f1c3 JM |
259 | |
260 | @item | |
9d6e0be1 | 261 | @cite{The results of some bitwise operations on signed integers (C90 |
b76f5d16 | 262 | 6.3, C99 and C11 6.5).} |
9d6e0be1 JM |
263 | |
264 | Bitwise operators act on the representation of the value including | |
265 | both the sign and value bits, where the sign bit is considered | |
266 | immediately above the highest-value value bit. Signed @samp{>>} acts | |
267 | on negative numbers by sign extension. | |
268 | ||
a37a22da PB |
269 | As an extension to the C language, GCC does not use the latitude given in |
270 | C99 and C11 only to treat certain aspects of signed @samp{<<} as undefined. | |
271 | However, @option{-fsanitize=shift} (and @option{-fsanitize=undefined}) will | |
272 | diagnose such cases. They are also diagnosed where constant | |
273 | expressions are required. | |
9d6e0be1 JM |
274 | |
275 | @item | |
276 | @cite{The sign of the remainder on integer division (C90 6.3.5).} | |
277 | ||
b76f5d16 | 278 | GCC always follows the C99 and C11 requirement that the result of division is |
9d6e0be1 JM |
279 | truncated towards zero. |
280 | ||
d592f1c3 JM |
281 | @end itemize |
282 | ||
283 | @node Floating point implementation | |
e6f3f526 | 284 | @section Floating Point |
d592f1c3 JM |
285 | |
286 | @itemize @bullet | |
287 | @item | |
288 | @cite{The accuracy of the floating-point operations and of the library | |
289 | functions in @code{<math.h>} and @code{<complex.h>} that return floating-point | |
b76f5d16 | 290 | results (C90, C99 and C11 5.2.4.2.2).} |
9d6e0be1 JM |
291 | |
292 | The accuracy is unknown. | |
d592f1c3 JM |
293 | |
294 | @item | |
295 | @cite{The rounding behaviors characterized by non-standard values | |
296 | of @code{FLT_ROUNDS} @gol | |
b76f5d16 | 297 | (C90, C99 and C11 5.2.4.2.2).} |
9d6e0be1 JM |
298 | |
299 | GCC does not use such values. | |
d592f1c3 JM |
300 | |
301 | @item | |
302 | @cite{The evaluation methods characterized by non-standard negative | |
b76f5d16 | 303 | values of @code{FLT_EVAL_METHOD} (C99 and C11 5.2.4.2.2).} |
9d6e0be1 JM |
304 | |
305 | GCC does not use such values. | |
d592f1c3 JM |
306 | |
307 | @item | |
308 | @cite{The direction of rounding when an integer is converted to a | |
309 | floating-point number that cannot exactly represent the original | |
b76f5d16 | 310 | value (C90 6.2.1.3, C99 and C11 6.3.1.4).} |
9d6e0be1 JM |
311 | |
312 | C99 Annex F is followed. | |
d592f1c3 JM |
313 | |
314 | @item | |
315 | @cite{The direction of rounding when a floating-point number is | |
b76f5d16 | 316 | converted to a narrower floating-point number (C90 6.2.1.4, C99 and C11 |
9d6e0be1 JM |
317 | 6.3.1.5).} |
318 | ||
319 | C99 Annex F is followed. | |
d592f1c3 JM |
320 | |
321 | @item | |
322 | @cite{How the nearest representable value or the larger or smaller | |
323 | representable value immediately adjacent to the nearest representable | |
b76f5d16 | 324 | value is chosen for certain floating constants (C90 6.1.3.1, C99 and C11 |
9d6e0be1 JM |
325 | 6.4.4.2).} |
326 | ||
327 | C99 Annex F is followed. | |
d592f1c3 JM |
328 | |
329 | @item | |
330 | @cite{Whether and how floating expressions are contracted when not | |
b76f5d16 | 331 | disallowed by the @code{FP_CONTRACT} pragma (C99 and C11 6.5).} |
9d6e0be1 | 332 | |
b76f5d16 | 333 | Expressions are currently only contracted if @option{-ffp-contract=fast}, |
9d6e0be1 JM |
334 | @option{-funsafe-math-optimizations} or @option{-ffast-math} are used. |
335 | This is subject to change. | |
d592f1c3 JM |
336 | |
337 | @item | |
b76f5d16 JM |
338 | @cite{The default state for the @code{FENV_ACCESS} pragma (C99 and C11 |
339 | 7.6.1).} | |
9d6e0be1 JM |
340 | |
341 | This pragma is not implemented, but the default is to ``off'' unless | |
342 | @option{-frounding-math} is used in which case it is ``on''. | |
d592f1c3 JM |
343 | |
344 | @item | |
345 | @cite{Additional floating-point exceptions, rounding modes, environments, | |
b76f5d16 JM |
346 | and classifications, and their macro names (C99 and C11 7.6, C99 and |
347 | C11 7.12).} | |
9d6e0be1 JM |
348 | |
349 | This is dependent on the implementation of the C library, and is not | |
350 | defined by GCC itself. | |
d592f1c3 JM |
351 | |
352 | @item | |
b76f5d16 JM |
353 | @cite{The default state for the @code{FP_CONTRACT} pragma (C99 and C11 |
354 | 7.12.2).} | |
9d6e0be1 JM |
355 | |
356 | This pragma is not implemented. Expressions are currently only | |
b76f5d16 JM |
357 | contracted if @option{-ffp-contract=fast}, |
358 | @option{-funsafe-math-optimizations} or @option{-ffast-math} are used. | |
359 | This is subject to change. | |
d592f1c3 JM |
360 | |
361 | @item | |
362 | @cite{Whether the ``inexact'' floating-point exception can be raised | |
363 | when the rounded result actually does equal the mathematical result | |
9d6e0be1 JM |
364 | in an IEC 60559 conformant implementation (C99 F.9).} |
365 | ||
366 | This is dependent on the implementation of the C library, and is not | |
367 | defined by GCC itself. | |
d592f1c3 JM |
368 | |
369 | @item | |
370 | @cite{Whether the ``underflow'' (and ``inexact'') floating-point | |
371 | exception can be raised when a result is tiny but not inexact in an | |
9d6e0be1 JM |
372 | IEC 60559 conformant implementation (C99 F.9).} |
373 | ||
374 | This is dependent on the implementation of the C library, and is not | |
375 | defined by GCC itself. | |
d592f1c3 JM |
376 | |
377 | @end itemize | |
378 | ||
379 | @node Arrays and pointers implementation | |
e6f3f526 | 380 | @section Arrays and Pointers |
d592f1c3 JM |
381 | |
382 | @itemize @bullet | |
383 | @item | |
384 | @cite{The result of converting a pointer to an integer or | |
b76f5d16 | 385 | vice versa (C90 6.3.4, C99 and C11 6.3.2.3).} |
d592f1c3 JM |
386 | |
387 | A cast from pointer to integer discards most-significant bits if the | |
388 | pointer representation is larger than the integer type, | |
389 | sign-extends@footnote{Future versions of GCC may zero-extend, or use | |
390 | a target-defined @code{ptr_extend} pattern. Do not rely on sign extension.} | |
391 | if the pointer representation is smaller than the integer type, otherwise | |
392 | the bits are unchanged. | |
393 | @c ??? We've always claimed that pointers were unsigned entities. | |
394 | @c Shouldn't we therefore be doing zero-extension? If so, the bug | |
395 | @c is in convert_to_integer, where we call type_for_size and request | |
396 | @c a signed integral type. On the other hand, it might be most useful | |
397 | @c for the target if we extend according to POINTERS_EXTEND_UNSIGNED. | |
398 | ||
399 | A cast from integer to pointer discards most-significant bits if the | |
400 | pointer representation is smaller than the integer type, extends according | |
401 | to the signedness of the integer type if the pointer representation | |
402 | is larger than the integer type, otherwise the bits are unchanged. | |
403 | ||
404 | When casting from pointer to integer and back again, the resulting | |
405 | pointer must reference the same object as the original pointer, otherwise | |
406 | the behavior is undefined. That is, one may not use integer arithmetic to | |
9d6e0be1 | 407 | avoid the undefined behavior of pointer arithmetic as proscribed in |
b76f5d16 | 408 | C99 and C11 6.5.6/8. |
d592f1c3 JM |
409 | |
410 | @item | |
411 | @cite{The size of the result of subtracting two pointers to elements | |
b76f5d16 | 412 | of the same array (C90 6.3.6, C99 and C11 6.5.6).} |
9d6e0be1 JM |
413 | |
414 | The value is as specified in the standard and the type is determined | |
415 | by the ABI@. | |
d592f1c3 JM |
416 | |
417 | @end itemize | |
418 | ||
419 | @node Hints implementation | |
420 | @section Hints | |
421 | ||
422 | @itemize @bullet | |
423 | @item | |
424 | @cite{The extent to which suggestions made by using the @code{register} | |
b76f5d16 | 425 | storage-class specifier are effective (C90 6.5.1, C99 and C11 6.7.1).} |
d592f1c3 JM |
426 | |
427 | The @code{register} specifier affects code generation only in these ways: | |
428 | ||
429 | @itemize @bullet | |
430 | @item | |
431 | When used as part of the register variable extension, see | |
88f3c6e6 | 432 | @ref{Explicit Register Variables}. |
d592f1c3 JM |
433 | |
434 | @item | |
435 | When @option{-O0} is in use, the compiler allocates distinct stack | |
436 | memory for all variables that do not have the @code{register} | |
437 | storage-class specifier; if @code{register} is specified, the variable | |
438 | may have a shorter lifespan than the code would indicate and may never | |
439 | be placed in memory. | |
440 | ||
441 | @item | |
442 | On some rare x86 targets, @code{setjmp} doesn't save the registers in | |
443 | all circumstances. In those cases, GCC doesn't allocate any variables | |
444 | in registers unless they are marked @code{register}. | |
445 | ||
446 | @end itemize | |
447 | ||
448 | @item | |
449 | @cite{The extent to which suggestions made by using the inline function | |
b76f5d16 | 450 | specifier are effective (C99 and C11 6.7.4).} |
d592f1c3 JM |
451 | |
452 | GCC will not inline any functions if the @option{-fno-inline} option is | |
453 | used or if @option{-O0} is used. Otherwise, GCC may still be unable to | |
454 | inline a function for many reasons; the @option{-Winline} option may be | |
455 | used to determine if a function has not been inlined and why not. | |
456 | ||
457 | @end itemize | |
458 | ||
459 | @node Structures unions enumerations and bit-fields implementation | |
e6f3f526 | 460 | @section Structures, Unions, Enumerations, and Bit-Fields |
d592f1c3 JM |
461 | |
462 | @itemize @bullet | |
463 | @item | |
9d6e0be1 JM |
464 | @cite{A member of a union object is accessed using a member of a |
465 | different type (C90 6.3.2.3).} | |
466 | ||
467 | The relevant bytes of the representation of the object are treated as | |
917db97b HPN |
468 | an object of the type used for the access. @xref{Type-punning}. This |
469 | may be a trap representation. | |
9d6e0be1 JM |
470 | |
471 | @item | |
472 | @cite{Whether a ``plain'' @code{int} bit-field is treated as a | |
473 | @code{signed int} bit-field or as an @code{unsigned int} bit-field | |
b76f5d16 | 474 | (C90 6.5.2, C90 6.5.2.1, C99 and C11 6.7.2, C99 and C11 6.7.2.1).} |
9d6e0be1 JM |
475 | |
476 | @opindex funsigned-bitfields | |
477 | By default it is treated as @code{signed int} but this may be changed | |
478 | by the @option{-funsigned-bitfields} option. | |
d592f1c3 JM |
479 | |
480 | @item | |
481 | @cite{Allowable bit-field types other than @code{_Bool}, @code{signed int}, | |
b76f5d16 | 482 | and @code{unsigned int} (C99 and C11 6.7.2.1).} |
9d6e0be1 | 483 | |
96066ce1 MP |
484 | Other integer types, such as @code{long int}, and enumerated types are |
485 | permitted even in strictly conforming mode. | |
b76f5d16 JM |
486 | |
487 | @item | |
488 | @cite{Whether atomic types are permitted for bit-fields (C11 6.7.2.1).} | |
489 | ||
490 | Atomic types are not permitted for bit-fields. | |
d592f1c3 JM |
491 | |
492 | @item | |
9d6e0be1 | 493 | @cite{Whether a bit-field can straddle a storage-unit boundary (C90 |
b76f5d16 | 494 | 6.5.2.1, C99 and C11 6.7.2.1).} |
9d6e0be1 JM |
495 | |
496 | Determined by ABI@. | |
d592f1c3 JM |
497 | |
498 | @item | |
9d6e0be1 | 499 | @cite{The order of allocation of bit-fields within a unit (C90 |
b76f5d16 | 500 | 6.5.2.1, C99 and C11 6.7.2.1).} |
9d6e0be1 JM |
501 | |
502 | Determined by ABI@. | |
d592f1c3 JM |
503 | |
504 | @item | |
9d6e0be1 | 505 | @cite{The alignment of non-bit-field members of structures (C90 |
b76f5d16 | 506 | 6.5.2.1, C99 and C11 6.7.2.1).} |
9d6e0be1 JM |
507 | |
508 | Determined by ABI@. | |
d592f1c3 JM |
509 | |
510 | @item | |
9d6e0be1 | 511 | @cite{The integer type compatible with each enumerated type (C90 |
b76f5d16 | 512 | 6.5.2.2, C99 and C11 6.7.2.2).} |
9d6e0be1 JM |
513 | |
514 | @opindex fshort-enums | |
515 | Normally, the type is @code{unsigned int} if there are no negative | |
516 | values in the enumeration, otherwise @code{int}. If | |
517 | @option{-fshort-enums} is specified, then if there are negative values | |
518 | it is the first of @code{signed char}, @code{short} and @code{int} | |
519 | that can represent all the values, otherwise it is the first of | |
520 | @code{unsigned char}, @code{unsigned short} and @code{unsigned int} | |
521 | that can represent all the values. | |
522 | @c On a few unusual targets with 64-bit int, this doesn't agree with | |
523 | @c the code and one of the types accessed via mode attributes (which | |
524 | @c are not currently considered extended integer types) may be used. | |
525 | @c If these types are made extended integer types, it would still be | |
526 | @c the case that -fshort-enums stops the implementation from | |
527 | @c conforming to C90 on those targets. | |
528 | ||
529 | On some targets, @option{-fshort-enums} is the default; this is | |
530 | determined by the ABI@. | |
d592f1c3 JM |
531 | |
532 | @end itemize | |
533 | ||
534 | @node Qualifiers implementation | |
535 | @section Qualifiers | |
536 | ||
537 | @itemize @bullet | |
538 | @item | |
539 | @cite{What constitutes an access to an object that has volatile-qualified | |
b76f5d16 | 540 | type (C90 6.5.3, C99 and C11 6.7.3).} |
9d6e0be1 | 541 | |
a9e64c63 EB |
542 | Such an object is normally accessed by pointers and used for accessing |
543 | hardware. In most expressions, it is intuitively obvious what is a read | |
544 | and what is a write. For example | |
545 | ||
546 | @smallexample | |
547 | volatile int *dst = @var{somevalue}; | |
548 | volatile int *src = @var{someothervalue}; | |
549 | *dst = *src; | |
550 | @end smallexample | |
551 | ||
552 | @noindent | |
553 | will cause a read of the volatile object pointed to by @var{src} and store the | |
554 | value into the volatile object pointed to by @var{dst}. There is no | |
555 | guarantee that these reads and writes are atomic, especially for objects | |
556 | larger than @code{int}. | |
557 | ||
558 | However, if the volatile storage is not being modified, and the value of | |
559 | the volatile storage is not used, then the situation is less obvious. | |
560 | For example | |
561 | ||
562 | @smallexample | |
563 | volatile int *src = @var{somevalue}; | |
564 | *src; | |
565 | @end smallexample | |
566 | ||
567 | According to the C standard, such an expression is an rvalue whose type | |
630ba2fd | 568 | is the unqualified version of its original type, i.e.@: @code{int}. Whether |
a9e64c63 | 569 | GCC interprets this as a read of the volatile object being pointed to or |
df18c24a | 570 | only as a request to evaluate the expression for its side effects depends |
a9e64c63 EB |
571 | on this type. |
572 | ||
573 | If it is a scalar type, or on most targets an aggregate type whose only | |
574 | member object is of a scalar type, or a union type whose member objects | |
575 | are of scalar types, the expression is interpreted by GCC as a read of | |
576 | the volatile object; in the other cases, the expression is only evaluated | |
df18c24a | 577 | for its side effects. |
9d6e0be1 JM |
578 | |
579 | @end itemize | |
580 | ||
581 | @node Declarators implementation | |
582 | @section Declarators | |
583 | ||
584 | @itemize @bullet | |
585 | @item | |
586 | @cite{The maximum number of declarators that may modify an arithmetic, | |
587 | structure or union type (C90 6.5.4).} | |
588 | ||
589 | GCC is only limited by available memory. | |
590 | ||
591 | @end itemize | |
592 | ||
593 | @node Statements implementation | |
594 | @section Statements | |
595 | ||
596 | @itemize @bullet | |
597 | @item | |
598 | @cite{The maximum number of @code{case} values in a @code{switch} | |
599 | statement (C90 6.6.4.2).} | |
600 | ||
601 | GCC is only limited by available memory. | |
d592f1c3 JM |
602 | |
603 | @end itemize | |
604 | ||
605 | @node Preprocessing directives implementation | |
e6f3f526 | 606 | @section Preprocessing Directives |
d592f1c3 | 607 | |
9d6e0be1 JM |
608 | @xref{Implementation-defined behavior, , Implementation-defined |
609 | behavior, cpp, The C Preprocessor}, for details of these aspects of | |
610 | implementation-defined behavior. | |
611 | ||
d592f1c3 | 612 | @itemize @bullet |
b76f5d16 JM |
613 | @item |
614 | @cite{The locations within @code{#pragma} directives where header name | |
615 | preprocessing tokens are recognized (C11 6.4, C11 6.4.7).} | |
616 | ||
d592f1c3 JM |
617 | @item |
618 | @cite{How sequences in both forms of header names are mapped to headers | |
b76f5d16 | 619 | or external source file names (C90 6.1.7, C99 and C11 6.4.7).} |
d592f1c3 JM |
620 | |
621 | @item | |
622 | @cite{Whether the value of a character constant in a constant expression | |
623 | that controls conditional inclusion matches the value of the same character | |
b76f5d16 | 624 | constant in the execution character set (C90 6.8.1, C99 and C11 6.10.1).} |
d592f1c3 JM |
625 | |
626 | @item | |
627 | @cite{Whether the value of a single-character character constant in a | |
628 | constant expression that controls conditional inclusion may have a | |
b76f5d16 | 629 | negative value (C90 6.8.1, C99 and C11 6.10.1).} |
d592f1c3 JM |
630 | |
631 | @item | |
632 | @cite{The places that are searched for an included @samp{<>} delimited | |
633 | header, and how the places are specified or the header is | |
b76f5d16 | 634 | identified (C90 6.8.2, C99 and C11 6.10.2).} |
d592f1c3 JM |
635 | |
636 | @item | |
637 | @cite{How the named source file is searched for in an included @samp{""} | |
b76f5d16 | 638 | delimited header (C90 6.8.2, C99 and C11 6.10.2).} |
d592f1c3 JM |
639 | |
640 | @item | |
641 | @cite{The method by which preprocessing tokens (possibly resulting from | |
642 | macro expansion) in a @code{#include} directive are combined into a header | |
b76f5d16 | 643 | name (C90 6.8.2, C99 and C11 6.10.2).} |
d592f1c3 JM |
644 | |
645 | @item | |
9d6e0be1 | 646 | @cite{The nesting limit for @code{#include} processing (C90 6.8.2, C99 |
b76f5d16 | 647 | and C11 6.10.2).} |
d592f1c3 JM |
648 | |
649 | @item | |
650 | @cite{Whether the @samp{#} operator inserts a @samp{\} character before | |
651 | the @samp{\} character that begins a universal character name in a | |
b76f5d16 | 652 | character constant or string literal (C99 and C11 6.10.3.2).} |
d592f1c3 JM |
653 | |
654 | @item | |
655 | @cite{The behavior on each recognized non-@code{STDC #pragma} | |
b76f5d16 | 656 | directive (C90 6.8.6, C99 and C11 6.10.6).} |
9d6e0be1 JM |
657 | |
658 | @xref{Pragmas, , Pragmas, cpp, The C Preprocessor}, for details of | |
659 | pragmas accepted by GCC on all targets. @xref{Pragmas, , Pragmas | |
660 | Accepted by GCC}, for details of target-specific pragmas. | |
d592f1c3 JM |
661 | |
662 | @item | |
663 | @cite{The definitions for @code{__DATE__} and @code{__TIME__} when | |
9d6e0be1 | 664 | respectively, the date and time of translation are not available (C90 |
b76f5d16 | 665 | 6.8.8, C99 6.10.8, C11 6.10.8.1).} |
d592f1c3 JM |
666 | |
667 | @end itemize | |
668 | ||
669 | @node Library functions implementation | |
e6f3f526 | 670 | @section Library Functions |
d592f1c3 | 671 | |
9d6e0be1 | 672 | The behavior of most of these points are dependent on the implementation |
d592f1c3 JM |
673 | of the C library, and are not defined by GCC itself. |
674 | ||
9d6e0be1 JM |
675 | @itemize @bullet |
676 | @item | |
677 | @cite{The null pointer constant to which the macro @code{NULL} expands | |
b76f5d16 | 678 | (C90 7.1.6, C99 7.17, C11 7.19).} |
9d6e0be1 JM |
679 | |
680 | In @code{<stddef.h>}, @code{NULL} expands to @code{((void *)0)}. GCC | |
681 | does not provide the other headers which define @code{NULL} and some | |
682 | library implementations may use other definitions in those headers. | |
683 | ||
684 | @end itemize | |
685 | ||
d592f1c3 JM |
686 | @node Architecture implementation |
687 | @section Architecture | |
688 | ||
689 | @itemize @bullet | |
690 | @item | |
691 | @cite{The values or expressions assigned to the macros specified in the | |
692 | headers @code{<float.h>}, @code{<limits.h>}, and @code{<stdint.h>} | |
b76f5d16 | 693 | (C90, C99 and C11 5.2.4.2, C99 7.18.2, C99 7.18.3, C11 7.20.2, C11 7.20.3).} |
9d6e0be1 JM |
694 | |
695 | Determined by ABI@. | |
d592f1c3 | 696 | |
b76f5d16 JM |
697 | @item |
698 | @cite{The result of attempting to indirectly access an object with | |
699 | automatic or thread storage duration from a thread other than the one | |
700 | with which it is associated (C11 6.2.4).} | |
701 | ||
702 | Such accesses are supported, subject to the same requirements for | |
703 | synchronization for concurrent accesses as for concurrent accesses to | |
704 | any object. | |
705 | ||
d592f1c3 JM |
706 | @item |
707 | @cite{The number, order, and encoding of bytes in any object | |
b76f5d16 JM |
708 | (when not explicitly specified in this International Standard) (C99 |
709 | and C11 6.2.6.1).} | |
9d6e0be1 JM |
710 | |
711 | Determined by ABI@. | |
d592f1c3 JM |
712 | |
713 | @item | |
b76f5d16 JM |
714 | @cite{Whether any extended alignments are supported and the contexts |
715 | in which they are supported (C11 6.2.8).} | |
716 | ||
717 | Extended alignments up to @math{2^{28}} (bytes) are supported for | |
718 | objects of automatic storage duration. Alignments supported for | |
719 | objects of static and thread storage duration are determined by the | |
720 | ABI. | |
721 | ||
722 | @item | |
723 | @cite{Valid alignment values other than those returned by an _Alignof | |
724 | expression for fundamental types, if any (C11 6.2.8).} | |
725 | ||
726 | Valid alignments are powers of 2 up to and including @math{2^{28}}. | |
727 | ||
728 | @item | |
729 | @cite{The value of the result of the @code{sizeof} and @code{_Alignof} | |
730 | operators (C90 6.3.3.4, C99 and C11 6.5.3.4).} | |
9d6e0be1 JM |
731 | |
732 | Determined by ABI@. | |
d592f1c3 JM |
733 | |
734 | @end itemize | |
735 | ||
736 | @node Locale-specific behavior implementation | |
e6f3f526 | 737 | @section Locale-Specific Behavior |
d592f1c3 JM |
738 | |
739 | The behavior of these points are dependent on the implementation | |
740 | of the C library, and are not defined by GCC itself. |