aboutsummaryrefslogtreecommitdiff
path: root/src/libmach/gpcompare.texi
blob: 7b0d573105b608f5db358b427fbcabe40f800dc5 (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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
@node ANSI
@chapter @sc{gnu} C++ Conformance to @sc{ansi} C++

These changes in the @sc{gnu} C++ compiler were made to comply more
closely with the @sc{ansi} base document, @cite{The Annotated C++
Reference Manual} (the @sc{arm}).  Further reducing the divergences from
@sc{ansi} C++ is a continued goal of the @sc{gnu} C++ Renovation
Project.

@b{Section 3.4}, @i{Start and Termination}.  It is now invalid to take
the address of the function @samp{main()}.

@b{Section 4.8}, @i{Pointers to Members}.  The compiler produces
an error for trying to convert between a pointer to a member and the type
@samp{void *}.

@b{Section 5.2.5}, @i{Increment and Decrement}.  It is an error to use
the increment and decrement operators on an enumerated type.

@b{Section 5.3.2}, @i{Sizeof}.  Doing @code{sizeof} on a function is now
an error.

@b{Section 5.3.4}, @i{Delete}.  The syntax of a @i{cast-expression} is
now more strictly controlled.

@b{Section 7.1.1}, @i{Storage Class Specifiers}.  Using the
@code{static} and @code{extern} specifiers can now only be applied to
names of objects, functions, and anonymous unions.

@b{Section 7.1.1}, @i{Storage Class Specifiers}.  The compiler no longer complains
about taking the address of a variable which has been declared to have @code{register}
storage.

@b{Section 7.1.2}, @i{Function Specifiers}.  The compiler produces an
error when the @code{inline} or @code{virtual} specifiers are
used on anything other than a function.

@b{Section 8.3}, @i{Function Definitions}.  It is now an error to shadow
a parameter name with a local variable; in the past, the compiler only
gave a warning in such a situation.

@b{Section 8.4.1}, @i{Aggregates}.  The rules concerning declaration of
an aggregate are now all checked in the @sc{gnu} C++ compiler; they
include having no private or protected members and no base classes.

@b{Section 8.4.3}, @i{References}.  Declaring an array of references is
now forbidden.  Initializing a reference with an initializer list is
also considered an error.

@b{Section 9.5}, @i{Unions}.  Global anonymous unions must be declared
@code{static}.

@b{Section 11.4}, @i{Friends}.  Declaring a member to be a friend of a
type that has not yet been defined is an error.

@b{Section 12.1}, @i{Constructors}.  The compiler generates a
default copy constructor for a class if no constructor has been declared.

@ignore
@b{Section 12.4}, @i{Destructors}.  In accordance with the @sc{ansi} C++
draft standard working paper, a pure virtual destructor must now be
defined.
@end ignore

@b{Section 12.6.2}, @i{Special Member Functions}.  When using a
@i{mem-initializer} list, the compiler will now initialize class members
in declaration order, not in the order in which you specify them.
Also, the compiler enforces the rule that non-static @code{const}
and reference members must be initialized with a @i{mem-initializer}
list when their class does not have a constructor.

@b{Section 12.8}, @i{Copying Class Objects}.  The compiler generates
default copy constructors correctly, and supplies default assignment
operators compatible with user-defined ones.

@b{Section 13.4}, @i{Overloaded Operators}.  An overloaded operator may
no longer have default arguments.

@b{Section 13.4.4}, @i{Function Call}.  An overloaded @samp{operator ()}
must be a non-static member function.

@b{Section 13.4.5}, @i{Subscripting}.  An overloaded @samp{operator []}
must be a non-static member function.

@b{Section 13.4.6}, @i{Class Member Access}.  An overloaded @samp{operator ->}
must be a non-static member function.

@b{Section 13.4.7}, @i{Increment and Decrement}.  The compiler will now
make sure a postfix @samp{@w{operator ++}} or @samp{@w{operator --}} has an
@code{int} as its second argument.


@node Encoding
@chapter Name Encoding in @sc{gnu} C++

@c FIXME!! rewrite name encoding section
@c ...to give complete rules rather than diffs from ARM.
@c To avoid plagiarism, invent some different way of structuring the
@c description of the rules than what ARM uses.

@cindex mangling
@cindex name encoding
@cindex encoding information in names
In order to support its strong typing rules and the ability to provide
function overloading, the C++ programming language @dfn{encodes}
information about functions and objects, so that conflicts across object
files can be detected during linking. @footnote{This encoding is also
sometimes called, whimsically enough, @dfn{mangling}; the corresponding
decoding is sometimes called @dfn{demangling}.} These rules tend to be
unique to each individual implementation of C++.

The scheme detailed in the commentary for 7.2.1 of @cite{The Annotated
Reference Manual} offers a description of a possible implementation
which happens to closely resemble the @code{cfront} compiler.  The
design used in @sc{gnu} C++ differs from this model in a number of ways:

@itemize @bullet
@item
In addition to the basic types @code{void}, @code{char}, @code{short},
@code{int}, @code{long}, @code{float}, @code{double}, and @code{long
double}, @sc{gnu} C++ supports two additional types: @code{wchar_t}, the wide
character type, and @code{long long} (if the host supports it).  The
encodings for these are @samp{w} and @samp{x} respectively.

@item
According to the @sc{arm}, qualified names (e.g., @samp{foo::bar::baz}) are
encoded with a leading @samp{Q}.  Followed by the number of
qualifications (in this case, three) and the respective names, this
might be encoded as @samp{Q33foo3bar3baz}.  @sc{gnu} C++ adds a leading
underscore to the list, producing @samp{_Q33foo3bar3baz}.
 
@item
The operator @samp{*=} is encoded as @samp{__aml}, not @samp{__amu}, to
match the normal @samp{*} operator, which is encoded as @samp{__ml}.

@c XXX left out ->(), __wr
@item
In addition to the normal operators, @sc{gnu} C++ also offers the minimum and
maximum operators @samp{>?} and @samp{<?}, encoded as @samp{__mx} and
@samp{__mn}, and the conditional operator @samp{?:}, encoded as @samp{__cn}.

@cindex destructors, encoding of
@cindex constructors, encoding of
@item
Constructors are encoded as simply @samp{__@var{name}}, where @var{name}
is the encoded name (e.g., @code{3foo} for the @code{foo} class
constructor).  Destructors are encoded as two leading underscores
separated by either a period or a dollar sign, depending on the
capabilities of the local host, followed by the encoded name.  For
example, the destructor @samp{foo::~foo} is encoded as @samp{_$_3foo}.

@item
Virtual tables are encoded with a prefix of @samp{_vt}, rather than
@samp{__vtbl}.  The names of their classes are separated by dollar signs
(or periods), and not encoded as normal: the virtual table for
@code{foo} is @samp{__vt$foo}, and the table for @code{foo::bar} is
named @samp{__vt$foo$bar}.

@item
Static members are encoded as a leading underscore, followed by the
encoded name of the class in which they appear, a separating dollar sign
or period, and finally the unencoded name of the variable.  For example,
if the class @code{foo} contains a static member @samp{bar}, its
encoding would be @samp{_3foo$bar}.

@item
@sc{gnu} C++ is not as aggressive as other compilers when it comes to always
generating @samp{Fv} for functions with no arguments.  In particular,
the compiler does not add the sequence to conversion operators.  The
function @samp{foo::bar()} is encoded as @samp{bar__3foo}, not
@samp{bar__3fooFv}.

@item
The argument list for methods is not prefixed by a leading @samp{F}; it
is considered implied.

@item
@sc{gnu} C++ approaches the task of saving space in encodings
differently from that noted in the @sc{arm}.  It does use the
@samp{T@var{n}} and @samp{N@var{x}@var{y}} codes to signify copying the
@var{n}th argument's type, and making the next @var{x} arguments be the
type of the @var{y}th argument, respectively.  However, the values for
@var{n} and @var{y} begin at zero with @sc{gnu} C++, whereas the
@sc{arm} describes them as starting at one.  For the function @samp{foo
(bartype, bartype)}, @sc{gnu} C++ uses @samp{foo__7bartypeT0}, while
compilers following the @sc{arm} example generate @samp{foo__7bartypeT1}.

@c Note it loses on `foo (int, int, int, int, int)'.
@item
@sc{gnu} C++ does not bother using the space-saving methods for types whose
encoding is a single character (like an integer, encoded as @samp{i}).
This is useful in the most common cases (two @code{int}s would result in
using three letters, instead of just @samp{ii}).
@end itemize

@c @node Cfront
@c @chapter @code{cfront} Compared to @sc{gnu} C++
@c 
@c 
@c FIXME!! Fill in.  Consider points in the following:
@c 
@c @display
@c Date: Thu, 2 Jan 92 21:35:20 EST
@c From: raeburn@@cygnus.com
@c Message-Id: <9201030235.AA10999@@cambridge.cygnus.com>
@c To: mrs@@charlie.secs.csun.edu
@c Cc: g++@@cygnus.com
@c Subject: Re: ARM and GNU C++ incompatabilities
@c 
@c Along with that, we should probably describe how g++ differs from
@c cfront, in ways that the users will notice.  (E.g., cfront supposedly
@c allows "free (new char[10])"; does g++?  How do the template
@c implementations differ?  "New" placement syntax?)
@c @end display
@c
@c XXX For next revision.
@c
@c GNU C++:
@c * supports expanding inline functions in many situations,
@c   including those which have static objects, use `for' statements,
@c   and other situations.  Part of this versatility is due to is
@c   ability to not always generate temporaries for assignments.
@c * deliberately allows divide by 0 and mod 0, since [according
@c   to Wilson] there are actually situations where you'd like to allow
@c   such things.  Note on most systems it will cause some sort of trap
@c   or bus error.  Cfront considers it an error.
@c * does [appear to] support nested classes within templates.
@c * conversion functions among baseclasses are all usable by
@c   a class that's derived from all of those bases.
@c * sizeof works even when the class is defined within its ()'s
@c * conditional expressions work with member fns and pointers to
@c    members.
@c * can handle non-trivial declarations of variables within switch
@c   statements.
@c
@c Cfront: