forked from JohnLato/language-objc
/
Cee.txt
147 lines (105 loc) · 6.58 KB
/
Cee.txt
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
= C : Specification, Extensions, Subsets, Support =
== C99 ==
* Specification of C99: [http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf SPEC]
== Gnu Extensions ==
GNU extensions are documented in the [http://gcc.gnu.org/viewcvs/trunk/gcc/c-parser.c gcc C parser]
and at http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html.
Here is a summary of available extensions:
=== C99 6.5: Expressions ===
|| [http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html Statement-Exprs] || Compound Statement as Expressions ||
|| || {{{ #define maxint(a,b) ({int _a = (a), _b = (b); _a > _b ? _a : _b; }) }}} ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels-as-Values] || Taking the address of a label (see `Computed goto') ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Typeof.html Typeof] || compute type of expression ||
|| || {{{ int x = 2; typeof(x) y = 3; }}} ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Conditionals.html Conditionals] || Omitting the middle operand of a `?:' expression ||
|| || {{{ x ? : y }}} is equivalent to {{{ x ? x : y }}} ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Alignment.html Alignment] || Compute the alignment of an object ||
|| || {{{ __alignof__ (double) }}} ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Offsetof.html Offsetof] || Compute offfset of member ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html Other builtins] || Various builtin functions of gcc ||
|| || {{{__builtin_types_compatible_p}}} is supported ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Complex.htm Complex numbers] || GNU complex extensions ||
|| || {{{ __complex double c = 2 + 3i, d = __real a; }}} ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Character-Escapes.html Character-Escapes] || \e for ESC ||
|| || {{{ char c = '\e' ; }}} ||
|| {{{__builtin_va_arg}}} || {{{__builtin_va_arg}}} ||
=== C99 6.7: Declarations ===
|| [http://gcc.gnu.org/onlinedocs/gcc/Empty-Structures.html Empty-Structures] || Allow empty structures ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Incomplete-Enums.html Incomplete-Enums] || Allow incomplete enum definitions ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Initializers.html Initializers] ||Allow non-constant initializers ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html Extended Asm] || Assembler instructions with C expressions as operands ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html function attributes ] || Attributes annotating function declarations ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html variable attributes ] || Attributes annotating variable declarations ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html type attributes ] || Attributes annotating type declarations (struct, union) ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Thread_002dLocal.html Thread-Local] || Thread-local storage ||
=== C99 6.8: Statements ===
|| [http://gcc.gnu.org/onlinedocs/gcc/Local-Labels.html Local-Labels] || Labels local to a block (affects: C99 6.8.2) ||
|| || {{{ do{ __label __ back; goto back; back: ...; }while(0); }}} || || ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels-as-Values] || Computed Gotos (affects: C99 6.8.6) ||
|| || {{{ void* p = && back; ... ; goto *p; }}} ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html Asm-Labels] || Controlling Names Used in Assembler Code ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html Nested-Functions] || nested functions ||
|| || {{{ int a() { int b() { return 0;} return b(); } }}} ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html Case-Ranges] || case ranges (affects: C99 6.8.1) ||
|| || {{{ case 'A' ... 'Z': }}} ||
=== C99 6.9 :Translation unit ===
|| Empty Translation unit || allow empty translation_unit ||
|| Redundant ; || allow redundant ';' ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Alternate-Keywords.html Alternate Keywords] || allow {{{__extension__}}} keyword before external declaration, and alternate keywards {{{__asm__}}}, {{{__inline__}}}, etc. ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html Extended-Asm] || Top level asm definitions ||
=== Extensions which do not apply ===
For completeness sake, the extensions
[http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html Object Size Checking],
[http://gcc.gnu.org/onlinedocs/gcc/Constructing-Calls.html Constructing-Calls],
[http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html Zero-Length Arrays],
[http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html Pointer-Arith],
[http://gcc.gnu.org/onlinedocs/gcc/Cast-to-Union.html Cast-to-Union] and
[http://gcc.gnu.org/onlinedocs/gcc/Function-Prototypes.html Function-Prototypes]
listed on [http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html] do not affect the syntax of the program,
and can therefore be considered as `supported'.
Some other extensions simply promote C99 features to C89 and therefore aren't listed here.
[http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html Variadic-Macros],
[http://gcc.gnu.org/onlinedocs/gcc/Escaped-Newlines.html Escaped-Newlines],
[http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Comments.html C++-Comments] apply to the preprocessor only.
== Unsupported C99 Features ==
* Universal Character Names (C99 Lexer)
=== Currently Unsupported GNU Extensions ===
|| Pragmas || {{{#pragma}}} compile directives ||
|| || {{{ #pragma pack(push, p1, 1) }}} ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html Floating-Types] ||Additional Floating Types ||
|| || {{{ __float80 x = 2.30w; }}} ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Decimal-Float.html Decimal-Float] || Decimal Floating Types ||
|| || {{{ __Decimal32 x = 0.555df; }}} ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Fixed_002dPoint.html Fixed_002dPoint] || Fixed-Point Types ||
|| || {{{ _Sat long long _Fract pi = 3.14LLR }}} ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Dollar-Signs.html Dollar-Signs] || Dollar sign is allowed in identifier names ||
|| || {{{ int $x = 3; }}} ||
|| [http://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html Binary-constants] || Binary constants ||
|| || {{{ int x = 0b001; }}} ||
=== Unsupported non-standard C constructs (which GCC allows) ===
==== useless qualifiers/type names/storage specs in empty declarations ====
{{{
int;
const;
static;
void f(a,b) int; register; { } /* Empty declarations in old-style parameter declarations aren't supported either. */
}}}
==== obsolete use of designated initializer without ‘=’ ====
{{{
int e[] = { [2] 2 };
}}}
==== data definition without type or storage class ====
{{{
a; /* top-level declaration */
b();
}}}
==== GNU parameter forward declaration ====
{{{
int f1(int a; int a);
}}}
==== no semicolon at end of struct or union ====
{{{
struct s3 {
int d
};
}}}