hc
2023-11-06 15ade055295d13f95d49e3d99b09f3bbfb4a43e7
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
237
238
239
240
241
242
243
244
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2016 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.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>GNU Compiler Collection (GCC) Internals: Classes</title>
 
<meta name="description" content="GNU Compiler Collection (GCC) Internals: Classes">
<meta name="keywords" content="GNU Compiler Collection (GCC) Internals: Classes">
<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="Option-Index.html#Option-Index" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="C-and-C_002b_002b-Trees.html#C-and-C_002b_002b-Trees" rel="up" title="C and C++ Trees">
<link href="Functions-for-C_002b_002b.html#Functions-for-C_002b_002b" rel="next" title="Functions for C++">
<link href="Namespaces.html#Namespaces" rel="prev" title="Namespaces">
<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" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Classes"></a>
<div class="header">
<p>
Next: <a href="Functions-for-C_002b_002b.html#Functions-for-C_002b_002b" accesskey="n" rel="next">Functions for C++</a>, Previous: <a href="Namespaces.html#Namespaces" accesskey="p" rel="prev">Namespaces</a>, Up: <a href="C-and-C_002b_002b-Trees.html#C-and-C_002b_002b-Trees" accesskey="u" rel="up">C and C++ Trees</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Classes-1"></a>
<h4 class="subsection">10.10.3 Classes</h4>
<a name="index-class_002c-scope"></a>
<a name="index-RECORD_005fTYPE-1"></a>
<a name="index-UNION_005fTYPE-1"></a>
<a name="index-CLASSTYPE_005fDECLARED_005fCLASS"></a>
<a name="index-TYPE_005fBINFO"></a>
<a name="index-BINFO_005fTYPE"></a>
<a name="index-TYPE_005fFIELDS-2"></a>
<a name="index-TYPE_005fVFIELD"></a>
<a name="index-TYPE_005fMETHODS"></a>
 
<p>Besides namespaces, the other high-level scoping construct in C++ is the
class.  (Throughout this manual the term <em>class</em> is used to mean the
types referred to in the ANSI/ISO C++ Standard as classes; these include
types defined with the <code>class</code>, <code>struct</code>, and <code>union</code>
keywords.)
</p>
<p>A class type is represented by either a <code>RECORD_TYPE</code> or a
<code>UNION_TYPE</code>.  A class declared with the <code>union</code> tag is
represented by a <code>UNION_TYPE</code>, while classes declared with either
the <code>struct</code> or the <code>class</code> tag are represented by
<code>RECORD_TYPE</code>s.  You can use the <code>CLASSTYPE_DECLARED_CLASS</code>
macro to discern whether or not a particular type is a <code>class</code> as
opposed to a <code>struct</code>.  This macro will be true only for classes
declared with the <code>class</code> tag.
</p>
<p>Almost all non-function members are available on the <code>TYPE_FIELDS</code>
list.  Given one member, the next can be found by following the
<code>TREE_CHAIN</code>.  You should not depend in any way on the order in
which fields appear on this list.  All nodes on this list will be
&lsquo;<samp>DECL</samp>&rsquo; nodes.  A <code>FIELD_DECL</code> is used to represent a non-static
data member, a <code>VAR_DECL</code> is used to represent a static data
member, and a <code>TYPE_DECL</code> is used to represent a type.  Note that
the <code>CONST_DECL</code> for an enumeration constant will appear on this
list, if the enumeration type was declared in the class.  (Of course,
the <code>TYPE_DECL</code> for the enumeration type will appear here as well.)
There are no entries for base classes on this list.  In particular,
there is no <code>FIELD_DECL</code> for the &ldquo;base-class portion&rdquo; of an
object.
</p>
<p>The <code>TYPE_VFIELD</code> is a compiler-generated field used to point to
virtual function tables.  It may or may not appear on the
<code>TYPE_FIELDS</code> list.  However, back ends should handle the
<code>TYPE_VFIELD</code> just like all the entries on the <code>TYPE_FIELDS</code>
list.
</p>
<p>The function members are available on the <code>TYPE_METHODS</code> list.
Again, subsequent members are found by following the <code>TREE_CHAIN</code>
field.  If a function is overloaded, each of the overloaded functions
appears; no <code>OVERLOAD</code> nodes appear on the <code>TYPE_METHODS</code>
list.  Implicitly declared functions (including default constructors,
copy constructors, assignment operators, and destructors) will appear on
this list as well.
</p>
<p>Every class has an associated <em>binfo</em>, which can be obtained with
<code>TYPE_BINFO</code>.  Binfos are used to represent base-classes.  The
binfo given by <code>TYPE_BINFO</code> is the degenerate case, whereby every
class is considered to be its own base-class.  The base binfos for a
particular binfo are held in a vector, whose length is obtained with
<code>BINFO_N_BASE_BINFOS</code>.  The base binfos themselves are obtained
with <code>BINFO_BASE_BINFO</code> and <code>BINFO_BASE_ITERATE</code>.  To add a
new binfo, use <code>BINFO_BASE_APPEND</code>.  The vector of base binfos can
be obtained with <code>BINFO_BASE_BINFOS</code>, but normally you do not need
to use that.  The class type associated with a binfo is given by
<code>BINFO_TYPE</code>.  It is not always the case that <code>BINFO_TYPE
(TYPE_BINFO (x))</code>, because of typedefs and qualified types.  Neither is
it the case that <code>TYPE_BINFO (BINFO_TYPE (y))</code> is the same binfo as
<code>y</code>.  The reason is that if <code>y</code> is a binfo representing a
base-class <code>B</code> of a derived class <code>D</code>, then <code>BINFO_TYPE
(y)</code> will be <code>B</code>, and <code>TYPE_BINFO (BINFO_TYPE (y))</code> will be
<code>B</code> as its own base-class, rather than as a base-class of <code>D</code>.
</p>
<p>The access to a base type can be found with <code>BINFO_BASE_ACCESS</code>.
This will produce <code>access_public_node</code>, <code>access_private_node</code>
or <code>access_protected_node</code>.  If bases are always public,
<code>BINFO_BASE_ACCESSES</code> may be <code>NULL</code>.
</p>
<p><code>BINFO_VIRTUAL_P</code> is used to specify whether the binfo is inherited
virtually or not.  The other flags, <code>BINFO_FLAG_0</code> to
<code>BINFO_FLAG_6</code>, can be used for language specific use.
</p>
<p>The following macros can be used on a tree node representing a class-type.
</p>
<dl compact="compact">
<dt><code>LOCAL_CLASS_P</code>
<a name="index-LOCAL_005fCLASS_005fP"></a>
</dt>
<dd><p>This predicate holds if the class is local class <em>i.e.</em> declared
inside a function body.
</p>
</dd>
<dt><code>TYPE_POLYMORPHIC_P</code>
<a name="index-TYPE_005fPOLYMORPHIC_005fP"></a>
</dt>
<dd><p>This predicate holds if the class has at least one virtual function
(declared or inherited).
</p>
</dd>
<dt><code>TYPE_HAS_DEFAULT_CONSTRUCTOR</code>
<a name="index-TYPE_005fHAS_005fDEFAULT_005fCONSTRUCTOR"></a>
</dt>
<dd><p>This predicate holds whenever its argument represents a class-type with
default constructor.
</p>
</dd>
<dt><code>CLASSTYPE_HAS_MUTABLE</code>
<a name="index-CLASSTYPE_005fHAS_005fMUTABLE"></a>
</dt>
<dt><code>TYPE_HAS_MUTABLE_P</code>
<a name="index-TYPE_005fHAS_005fMUTABLE_005fP"></a>
</dt>
<dd><p>These predicates hold for a class-type having a mutable data member.
</p>
</dd>
<dt><code>CLASSTYPE_NON_POD_P</code>
<a name="index-CLASSTYPE_005fNON_005fPOD_005fP"></a>
</dt>
<dd><p>This predicate holds only for class-types that are not PODs.
</p>
</dd>
<dt><code>TYPE_HAS_NEW_OPERATOR</code>
<a name="index-TYPE_005fHAS_005fNEW_005fOPERATOR"></a>
</dt>
<dd><p>This predicate holds for a class-type that defines
<code>operator new</code>.
</p>
</dd>
<dt><code>TYPE_HAS_ARRAY_NEW_OPERATOR</code>
<a name="index-TYPE_005fHAS_005fARRAY_005fNEW_005fOPERATOR"></a>
</dt>
<dd><p>This predicate holds for a class-type for which
<code>operator new[]</code> is defined.
</p>
</dd>
<dt><code>TYPE_OVERLOADS_CALL_EXPR</code>
<a name="index-TYPE_005fOVERLOADS_005fCALL_005fEXPR"></a>
</dt>
<dd><p>This predicate holds for class-type for which the function call
<code>operator()</code> is overloaded.
</p>
</dd>
<dt><code>TYPE_OVERLOADS_ARRAY_REF</code>
<a name="index-TYPE_005fOVERLOADS_005fARRAY_005fREF"></a>
</dt>
<dd><p>This predicate holds for a class-type that overloads
<code>operator[]</code>
</p>
</dd>
<dt><code>TYPE_OVERLOADS_ARROW</code>
<a name="index-TYPE_005fOVERLOADS_005fARROW"></a>
</dt>
<dd><p>This predicate holds for a class-type for which <code>operator-&gt;</code> is
overloaded.
</p>
</dd>
</dl>
 
<hr>
<div class="header">
<p>
Next: <a href="Functions-for-C_002b_002b.html#Functions-for-C_002b_002b" accesskey="n" rel="next">Functions for C++</a>, Previous: <a href="Namespaces.html#Namespaces" accesskey="p" rel="prev">Namespaces</a>, Up: <a href="C-and-C_002b_002b-Trees.html#C-and-C_002b_002b-Trees" accesskey="u" rel="up">C and C++ Trees</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
 
 
 
</body>
</html>