Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
68642fb6
Commit
68642fb6
authored
Jan 03, 2000
by
Ulrich Drepper
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(flag_isoc9x): New variable to be able to use code in c-common.c.
For now always zero. From-SVN: r31185
parent
4b3b5328
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
300 additions
and
297 deletions
+300
-297
gcc/cp/decl.c
+300
-297
No files found.
gcc/cp/decl.c
View file @
68642fb6
...
@@ -191,7 +191,7 @@ static void indent PROTO((void));
...
@@ -191,7 +191,7 @@ static void indent PROTO((void));
tree
error_mark_list
;
tree
error_mark_list
;
/* The following symbols are subsumed in the cp_global_trees array, and
/* The following symbols are subsumed in the cp_global_trees array, and
listed here individually for documentation purposes.
listed here individually for documentation purposes.
C++ extensions
C++ extensions
tree wchar_decl_node;
tree wchar_decl_node;
...
@@ -322,6 +322,10 @@ tree current_function_decl;
...
@@ -322,6 +322,10 @@ tree current_function_decl;
tree
current_function_return_value
;
tree
current_function_return_value
;
/* Nonzero means use the ISO C9x dialect of C. */
int
flag_isoc9x
;
/* Nonzero means give `double' the same size as `float'. */
/* Nonzero means give `double' the same size as `float'. */
extern
int
flag_short_double
;
extern
int
flag_short_double
;
...
@@ -490,7 +494,7 @@ struct binding_level
...
@@ -490,7 +494,7 @@ struct binding_level
};
};
#define NULL_BINDING_LEVEL ((struct binding_level *) NULL)
#define NULL_BINDING_LEVEL ((struct binding_level *) NULL)
/* The binding level currently in effect. */
/* The binding level currently in effect. */
#define current_binding_level \
#define current_binding_level \
...
@@ -1022,13 +1026,13 @@ push_class_binding (id, decl)
...
@@ -1022,13 +1026,13 @@ push_class_binding (id, decl)
/* Remove the binding for DECL which should be the innermost binding
/* Remove the binding for DECL which should be the innermost binding
for ID. */
for ID. */
static
void
static
void
pop_binding
(
id
,
decl
)
pop_binding
(
id
,
decl
)
tree
id
;
tree
id
;
tree
decl
;
tree
decl
;
{
{
tree
binding
;
tree
binding
;
if
(
id
==
NULL_TREE
)
if
(
id
==
NULL_TREE
)
/* It's easiest to write the loops that call this function without
/* It's easiest to write the loops that call this function without
checking whether or not the entities involved have names. We
checking whether or not the entities involved have names. We
...
@@ -1081,7 +1085,7 @@ pop_label (link)
...
@@ -1081,7 +1085,7 @@ pop_label (link)
}
}
/* At the end of a function, all labels declared within the fucntion
/* At the end of a function, all labels declared within the fucntion
go out of scope. BLOCK is the top-level block for the
go out of scope. BLOCK is the top-level block for the
function. */
function. */
static
void
static
void
...
@@ -1248,7 +1252,7 @@ poplevel (keep, reverse, functionbody)
...
@@ -1248,7 +1252,7 @@ poplevel (keep, reverse, functionbody)
in a for-init statement were in scope after the for-statement
in a for-init statement were in scope after the for-statement
ended. We only use the new rules in flag_new_for_scope is
ended. We only use the new rules in flag_new_for_scope is
nonzero. */
nonzero. */
leaving_for_scope
leaving_for_scope
=
current_binding_level
->
is_for_scope
&&
flag_new_for_scope
==
1
;
=
current_binding_level
->
is_for_scope
&&
flag_new_for_scope
==
1
;
/* Remove declarations for all the DECLs in this level. */
/* Remove declarations for all the DECLs in this level. */
...
@@ -1256,7 +1260,7 @@ poplevel (keep, reverse, functionbody)
...
@@ -1256,7 +1260,7 @@ poplevel (keep, reverse, functionbody)
{
{
if
(
leaving_for_scope
&&
TREE_CODE
(
link
)
==
VAR_DECL
)
if
(
leaving_for_scope
&&
TREE_CODE
(
link
)
==
VAR_DECL
)
{
{
tree
outer_binding
tree
outer_binding
=
TREE_CHAIN
(
IDENTIFIER_BINDING
(
DECL_NAME
(
link
)));
=
TREE_CHAIN
(
IDENTIFIER_BINDING
(
DECL_NAME
(
link
)));
tree
ns_binding
;
tree
ns_binding
;
...
@@ -1265,21 +1269,21 @@ poplevel (keep, reverse, functionbody)
...
@@ -1265,21 +1269,21 @@ poplevel (keep, reverse, functionbody)
else
else
ns_binding
=
NULL_TREE
;
ns_binding
=
NULL_TREE
;
if
(
outer_binding
if
(
outer_binding
&&
(
BINDING_LEVEL
(
outer_binding
)
&&
(
BINDING_LEVEL
(
outer_binding
)
==
current_binding_level
->
level_chain
))
==
current_binding_level
->
level_chain
))
/* We have something like:
/* We have something like:
int i;
int i;
for (int i; ;);
for (int i; ;);
and we are leaving the `for' scope. There's no reason to
and we are leaving the `for' scope. There's no reason to
keep the binding of the inner `i' in this case. */
keep the binding of the inner `i' in this case. */
pop_binding
(
DECL_NAME
(
link
),
link
);
pop_binding
(
DECL_NAME
(
link
),
link
);
else
if
((
outer_binding
else
if
((
outer_binding
&&
(
TREE_CODE
(
BINDING_VALUE
(
outer_binding
))
&&
(
TREE_CODE
(
BINDING_VALUE
(
outer_binding
))
==
TYPE_DECL
))
==
TYPE_DECL
))
||
(
ns_binding
||
(
ns_binding
&&
TREE_CODE
(
ns_binding
)
==
TYPE_DECL
))
&&
TREE_CODE
(
ns_binding
)
==
TYPE_DECL
))
/* Here, we have something like:
/* Here, we have something like:
...
@@ -1297,11 +1301,11 @@ poplevel (keep, reverse, functionbody)
...
@@ -1297,11 +1301,11 @@ poplevel (keep, reverse, functionbody)
/* Mark this VAR_DECL as dead so that we can tell we left it
/* Mark this VAR_DECL as dead so that we can tell we left it
there only for backward compatibility. */
there only for backward compatibility. */
DECL_DEAD_FOR_LOCAL
(
link
)
=
1
;
DECL_DEAD_FOR_LOCAL
(
link
)
=
1
;
/* Keep track of what should of have happenned when we
/* Keep track of what should of have happenned when we
popped the binding. */
popped the binding. */
if
(
outer_binding
&&
BINDING_VALUE
(
outer_binding
))
if
(
outer_binding
&&
BINDING_VALUE
(
outer_binding
))
DECL_SHADOWED_FOR_VAR
(
link
)
DECL_SHADOWED_FOR_VAR
(
link
)
=
BINDING_VALUE
(
outer_binding
);
=
BINDING_VALUE
(
outer_binding
);
/* Add it to the list of dead variables in the next
/* Add it to the list of dead variables in the next
...
@@ -1318,7 +1322,7 @@ poplevel (keep, reverse, functionbody)
...
@@ -1318,7 +1322,7 @@ poplevel (keep, reverse, functionbody)
=
0
;
=
0
;
}
}
}
}
else
else
{
{
/* Remove the binding. */
/* Remove the binding. */
decl
=
link
;
decl
=
link
;
...
@@ -1328,7 +1332,7 @@ poplevel (keep, reverse, functionbody)
...
@@ -1328,7 +1332,7 @@ poplevel (keep, reverse, functionbody)
pop_binding
(
DECL_NAME
(
decl
),
decl
);
pop_binding
(
DECL_NAME
(
decl
),
decl
);
else
if
(
TREE_CODE
(
decl
)
==
OVERLOAD
)
else
if
(
TREE_CODE
(
decl
)
==
OVERLOAD
)
pop_binding
(
DECL_NAME
(
OVL_FUNCTION
(
decl
)),
decl
);
pop_binding
(
DECL_NAME
(
OVL_FUNCTION
(
decl
)),
decl
);
else
else
my_friendly_abort
(
0
);
my_friendly_abort
(
0
);
}
}
}
}
...
@@ -1346,7 +1350,7 @@ poplevel (keep, reverse, functionbody)
...
@@ -1346,7 +1350,7 @@ poplevel (keep, reverse, functionbody)
/* Restore the IDENTIFIER_LABEL_VALUEs for local labels. */
/* Restore the IDENTIFIER_LABEL_VALUEs for local labels. */
for
(
link
=
current_binding_level
->
shadowed_labels
;
for
(
link
=
current_binding_level
->
shadowed_labels
;
link
;
link
;
link
=
TREE_CHAIN
(
link
))
link
=
TREE_CHAIN
(
link
))
pop_label
(
link
);
pop_label
(
link
);
...
@@ -1429,7 +1433,7 @@ poplevel (keep, reverse, functionbody)
...
@@ -1429,7 +1433,7 @@ poplevel (keep, reverse, functionbody)
{
{
tree
scope_stmts
;
tree
scope_stmts
;
scope_stmts
scope_stmts
=
add_scope_stmt
(
/*begin_p=*/
0
,
/*partial_p=*/
1
);
=
add_scope_stmt
(
/*begin_p=*/
0
,
/*partial_p=*/
1
);
if
(
block
)
if
(
block
)
{
{
...
@@ -1529,7 +1533,7 @@ poplevel_class ()
...
@@ -1529,7 +1533,7 @@ poplevel_class ()
tree
shadowed
;
tree
shadowed
;
my_friendly_assert
(
level
!=
0
,
354
);
my_friendly_assert
(
level
!=
0
,
354
);
/* If we're leaving a toplevel class, don't bother to do the setting
/* If we're leaving a toplevel class, don't bother to do the setting
of IDENTIFIER_CLASS_VALUE to NULL_TREE, since first of all this slot
of IDENTIFIER_CLASS_VALUE to NULL_TREE, since first of all this slot
shouldn't even be used when current_class_type isn't set, and second,
shouldn't even be used when current_class_type isn't set, and second,
...
@@ -1544,7 +1548,7 @@ poplevel_class ()
...
@@ -1544,7 +1548,7 @@ poplevel_class ()
shadowed
;
shadowed
;
shadowed
=
TREE_CHAIN
(
shadowed
))
shadowed
=
TREE_CHAIN
(
shadowed
))
IDENTIFIER_CLASS_VALUE
(
TREE_PURPOSE
(
shadowed
))
=
NULL_TREE
;
IDENTIFIER_CLASS_VALUE
(
TREE_PURPOSE
(
shadowed
))
=
NULL_TREE
;
/* Find the next enclosing class, and recreate
/* Find the next enclosing class, and recreate
IDENTIFIER_CLASS_VALUEs appropriate for that class. */
IDENTIFIER_CLASS_VALUEs appropriate for that class. */
b
=
level
->
level_chain
;
b
=
level
->
level_chain
;
...
@@ -1552,8 +1556,8 @@ poplevel_class ()
...
@@ -1552,8 +1556,8 @@ poplevel_class ()
b
=
b
->
level_chain
;
b
=
b
->
level_chain
;
if
(
b
)
if
(
b
)
for
(
shadowed
=
b
->
class_shadowed
;
for
(
shadowed
=
b
->
class_shadowed
;
shadowed
;
shadowed
;
shadowed
=
TREE_CHAIN
(
shadowed
))
shadowed
=
TREE_CHAIN
(
shadowed
))
{
{
tree
t
;
tree
t
;
...
@@ -1561,9 +1565,9 @@ poplevel_class ()
...
@@ -1561,9 +1565,9 @@ poplevel_class ()
t
=
IDENTIFIER_BINDING
(
TREE_PURPOSE
(
shadowed
));
t
=
IDENTIFIER_BINDING
(
TREE_PURPOSE
(
shadowed
));
while
(
t
&&
BINDING_LEVEL
(
t
)
!=
b
)
while
(
t
&&
BINDING_LEVEL
(
t
)
!=
b
)
t
=
TREE_CHAIN
(
t
);
t
=
TREE_CHAIN
(
t
);
if
(
t
)
if
(
t
)
IDENTIFIER_CLASS_VALUE
(
TREE_PURPOSE
(
shadowed
))
IDENTIFIER_CLASS_VALUE
(
TREE_PURPOSE
(
shadowed
))
=
BINDING_VALUE
(
t
);
=
BINDING_VALUE
(
t
);
}
}
}
}
...
@@ -1580,8 +1584,8 @@ poplevel_class ()
...
@@ -1580,8 +1584,8 @@ poplevel_class ()
SET_IDENTIFIER_TYPE_VALUE
(
TREE_PURPOSE
(
shadowed
),
TREE_VALUE
(
shadowed
));
SET_IDENTIFIER_TYPE_VALUE
(
TREE_PURPOSE
(
shadowed
),
TREE_VALUE
(
shadowed
));
/* Remove the bindings for all of the class-level declarations. */
/* Remove the bindings for all of the class-level declarations. */
for
(
shadowed
=
level
->
class_shadowed
;
for
(
shadowed
=
level
->
class_shadowed
;
shadowed
;
shadowed
;
shadowed
=
TREE_CHAIN
(
shadowed
))
shadowed
=
TREE_CHAIN
(
shadowed
))
pop_binding
(
TREE_PURPOSE
(
shadowed
),
TREE_TYPE
(
shadowed
));
pop_binding
(
TREE_PURPOSE
(
shadowed
),
TREE_TYPE
(
shadowed
));
...
@@ -1705,7 +1709,7 @@ struct walk_globals_data {
...
@@ -1705,7 +1709,7 @@ struct walk_globals_data {
for which P returns non-zero, call F with its address. If any call
for which P returns non-zero, call F with its address. If any call
to F returns a non-zero value, return a non-zero value. */
to F returns a non-zero value, return a non-zero value. */
static
int
static
int
walk_globals_r
(
namespace
,
data
)
walk_globals_r
(
namespace
,
data
)
tree
namespace
;
tree
namespace
;
void
*
data
;
void
*
data
;
...
@@ -1776,10 +1780,10 @@ wrapup_globals_for_namespace (namespace, data)
...
@@ -1776,10 +1780,10 @@ wrapup_globals_for_namespace (namespace, data)
/* Process the decls in reverse order--earliest first.
/* Process the decls in reverse order--earliest first.
Put them into VEC from back to front, then take out from front. */
Put them into VEC from back to front, then take out from front. */
for
(
i
=
0
,
decl
=
globals
;
i
<
len
;
i
++
,
decl
=
TREE_CHAIN
(
decl
))
for
(
i
=
0
,
decl
=
globals
;
i
<
len
;
i
++
,
decl
=
TREE_CHAIN
(
decl
))
vec
[
len
-
i
-
1
]
=
decl
;
vec
[
len
-
i
-
1
]
=
decl
;
if
(
last_time
)
if
(
last_time
)
{
{
check_global_declarations
(
vec
,
len
);
check_global_declarations
(
vec
,
len
);
...
@@ -1865,7 +1869,7 @@ print_binding_level (lvl)
...
@@ -1865,7 +1869,7 @@ print_binding_level (lvl)
/* We can probably fit 3 names to a line? */
/* We can probably fit 3 names to a line? */
for
(
t
=
lvl
->
names
;
t
;
t
=
TREE_CHAIN
(
t
))
for
(
t
=
lvl
->
names
;
t
;
t
=
TREE_CHAIN
(
t
))
{
{
if
(
no_print_functions
&&
(
TREE_CODE
(
t
)
==
FUNCTION_DECL
))
if
(
no_print_functions
&&
(
TREE_CODE
(
t
)
==
FUNCTION_DECL
))
continue
;
continue
;
if
(
no_print_builtins
if
(
no_print_builtins
&&
(
TREE_CODE
(
t
)
==
TYPE_DECL
)
&&
(
TREE_CODE
(
t
)
==
TYPE_DECL
)
...
@@ -2004,7 +2008,7 @@ find_binding (name, scope)
...
@@ -2004,7 +2008,7 @@ find_binding (name, scope)
tree
iter
,
prev
=
NULL_TREE
;
tree
iter
,
prev
=
NULL_TREE
;
scope
=
ORIGINAL_NAMESPACE
(
scope
);
scope
=
ORIGINAL_NAMESPACE
(
scope
);
for
(
iter
=
IDENTIFIER_NAMESPACE_BINDINGS
(
name
);
iter
;
for
(
iter
=
IDENTIFIER_NAMESPACE_BINDINGS
(
name
);
iter
;
iter
=
TREE_CHAIN
(
iter
))
iter
=
TREE_CHAIN
(
iter
))
{
{
...
@@ -2039,7 +2043,7 @@ binding_for_name (name, scope)
...
@@ -2039,7 +2043,7 @@ binding_for_name (name, scope)
tree
result
;
tree
result
;
scope
=
ORIGINAL_NAMESPACE
(
scope
);
scope
=
ORIGINAL_NAMESPACE
(
scope
);
if
(
b
&&
TREE_CODE
(
b
)
!=
CPLUS_BINDING
)
if
(
b
&&
TREE_CODE
(
b
)
!=
CPLUS_BINDING
)
{
{
/* Get rid of optimization for global scope. */
/* Get rid of optimization for global scope. */
...
@@ -2093,7 +2097,7 @@ set_namespace_binding (name, scope, val)
...
@@ -2093,7 +2097,7 @@ set_namespace_binding (name, scope, val)
if
(
scope
==
NULL_TREE
)
if
(
scope
==
NULL_TREE
)
scope
=
global_namespace
;
scope
=
global_namespace
;
if
(
scope
==
global_namespace
)
if
(
scope
==
global_namespace
)
{
{
b
=
IDENTIFIER_NAMESPACE_BINDINGS
(
name
);
b
=
IDENTIFIER_NAMESPACE_BINDINGS
(
name
);
...
@@ -2158,7 +2162,7 @@ push_namespace (name)
...
@@ -2158,7 +2162,7 @@ push_namespace (name)
}
}
}
}
}
}
if
(
need_new
)
if
(
need_new
)
{
{
/* Make a new namespace, binding the name to it. */
/* Make a new namespace, binding the name to it. */
...
@@ -2216,7 +2220,7 @@ push_nested_namespace (ns)
...
@@ -2216,7 +2220,7 @@ push_nested_namespace (ns)
/* Pop back from the scope of the namespace NS, which was previously
/* Pop back from the scope of the namespace NS, which was previously
entered with push_nested_namespace. */
entered with push_nested_namespace. */
void
void
pop_nested_namespace
(
ns
)
pop_nested_namespace
(
ns
)
tree
ns
;
tree
ns
;
...
@@ -2293,7 +2297,7 @@ store_bindings (names, old_bindings)
...
@@ -2293,7 +2297,7 @@ store_bindings (names, old_bindings)
else
else
id
=
DECL_NAME
(
t
);
id
=
DECL_NAME
(
t
);
if
(
!
id
if
(
!
id
/* Note that we may have an IDENTIFIER_CLASS_VALUE even when
/* Note that we may have an IDENTIFIER_CLASS_VALUE even when
we have no IDENTIFIER_BINDING if we have left the class
we have no IDENTIFIER_BINDING if we have left the class
scope, but cached the class-level declarations. */
scope, but cached the class-level declarations. */
...
@@ -2433,7 +2437,7 @@ pop_from_top_level ()
...
@@ -2433,7 +2437,7 @@ pop_from_top_level ()
}
}
/* Push a definition of struct, union or enum tag "name".
/* Push a definition of struct, union or enum tag "name".
into binding_level "b". "type" should be the type node,
into binding_level "b". "type" should be the type node,
We assume that the tag "name" is not already defined.
We assume that the tag "name" is not already defined.
Note that the definition may really be just a forward reference.
Note that the definition may really be just a forward reference.
...
@@ -2530,30 +2534,30 @@ pop_everything ()
...
@@ -2530,30 +2534,30 @@ pop_everything ()
Returns the TYPE_DECL for TYPE, which may have been altered by this
Returns the TYPE_DECL for TYPE, which may have been altered by this
processing. */
processing. */
static
tree
static
tree
maybe_process_template_type_declaration
(
type
,
globalize
,
b
)
maybe_process_template_type_declaration
(
type
,
globalize
,
b
)
tree
type
;
tree
type
;
int
globalize
;
int
globalize
;
struct
binding_level
*
b
;
struct
binding_level
*
b
;
{
{
tree
decl
=
TYPE_NAME
(
type
);
tree
decl
=
TYPE_NAME
(
type
);
if
(
processing_template_parmlist
)
if
(
processing_template_parmlist
)
/* You can't declare a new template type in a template parameter
/* You can't declare a new template type in a template parameter
list. But, you can declare a non-template type:
list. But, you can declare a non-template type:
template <class A*> struct S;
template <class A*> struct S;
is a forward-declaration of `A'. */
is a forward-declaration of `A'. */
;
;
else
else
{
{
maybe_check_template_type
(
type
);
maybe_check_template_type
(
type
);
my_friendly_assert
(
IS_AGGR_TYPE
(
type
)
my_friendly_assert
(
IS_AGGR_TYPE
(
type
)
||
TREE_CODE
(
type
)
==
ENUMERAL_TYPE
,
0
);
||
TREE_CODE
(
type
)
==
ENUMERAL_TYPE
,
0
);
if
(
processing_template_decl
)
if
(
processing_template_decl
)
{
{
/* This may change after the call to
/* This may change after the call to
...
@@ -2576,7 +2580,7 @@ maybe_process_template_type_declaration (type, globalize, b)
...
@@ -2576,7 +2580,7 @@ maybe_process_template_type_declaration (type, globalize, b)
/* Put this tag on the list of tags for the class, since
/* Put this tag on the list of tags for the class, since
that won't happen below because B is not the class
that won't happen below because B is not the class
binding level, but is instead the pseudo-global level. */
binding level, but is instead the pseudo-global level. */
b
->
level_chain
->
tags
=
b
->
level_chain
->
tags
=
tree_cons
(
name
,
type
,
b
->
level_chain
->
tags
);
tree_cons
(
name
,
type
,
b
->
level_chain
->
tags
);
if
(
TYPE_SIZE
(
current_class_type
)
==
NULL_TREE
)
if
(
TYPE_SIZE
(
current_class_type
)
==
NULL_TREE
)
CLASSTYPE_TAGS
(
current_class_type
)
=
b
->
level_chain
->
tags
;
CLASSTYPE_TAGS
(
current_class_type
)
=
b
->
level_chain
->
tags
;
...
@@ -2644,7 +2648,7 @@ pushtag (name, type, globalize)
...
@@ -2644,7 +2648,7 @@ pushtag (name, type, globalize)
if
(
!
globalize
)
if
(
!
globalize
)
context
=
cs
;
context
=
cs
;
else
if
(
cs
!=
NULL_TREE
else
if
(
cs
!=
NULL_TREE
&&
TREE_CODE_CLASS
(
TREE_CODE
(
cs
))
==
't'
)
&&
TREE_CODE_CLASS
(
TREE_CODE
(
cs
))
==
't'
)
/* When declaring a friend class of a local class, we want
/* When declaring a friend class of a local class, we want
to inject the newly named class into the scope
to inject the newly named class into the scope
...
@@ -2846,7 +2850,7 @@ decls_match (newdecl, olddecl)
...
@@ -2846,7 +2850,7 @@ decls_match (newdecl, olddecl)
if
(
!
comp_template_parms
(
DECL_TEMPLATE_PARMS
(
newdecl
),
if
(
!
comp_template_parms
(
DECL_TEMPLATE_PARMS
(
newdecl
),
DECL_TEMPLATE_PARMS
(
olddecl
)))
DECL_TEMPLATE_PARMS
(
olddecl
)))
return
0
;
return
0
;
if
(
TREE_CODE
(
DECL_TEMPLATE_RESULT
(
newdecl
))
==
TYPE_DECL
)
if
(
TREE_CODE
(
DECL_TEMPLATE_RESULT
(
newdecl
))
==
TYPE_DECL
)
types_match
=
1
;
types_match
=
1
;
else
else
...
@@ -2890,10 +2894,10 @@ warn_extern_redeclared_static (newdecl, olddecl)
...
@@ -2890,10 +2894,10 @@ warn_extern_redeclared_static (newdecl, olddecl)
tree
name
;
tree
name
;
if
(
TREE_CODE
(
newdecl
)
==
TYPE_DECL
if
(
TREE_CODE
(
newdecl
)
==
TYPE_DECL
||
TREE_CODE
(
newdecl
)
==
TEMPLATE_DECL
)
||
TREE_CODE
(
newdecl
)
==
TEMPLATE_DECL
)
return
;
return
;
/* Don't get confused by static member functions; that's a different
/* Don't get confused by static member functions; that's a different
use of `static'. */
use of `static'. */
if
(
TREE_CODE
(
newdecl
)
==
FUNCTION_DECL
if
(
TREE_CODE
(
newdecl
)
==
FUNCTION_DECL
...
@@ -2945,7 +2949,7 @@ duplicate_decls (newdecl, olddecl)
...
@@ -2945,7 +2949,7 @@ duplicate_decls (newdecl, olddecl)
if
(
TREE_TYPE
(
newdecl
)
==
error_mark_node
if
(
TREE_TYPE
(
newdecl
)
==
error_mark_node
||
TREE_TYPE
(
olddecl
)
==
error_mark_node
)
||
TREE_TYPE
(
olddecl
)
==
error_mark_node
)
types_match
=
1
;
types_match
=
1
;
/* Check for redeclaration and other discrepancies. */
/* Check for redeclaration and other discrepancies. */
if
(
TREE_CODE
(
olddecl
)
==
FUNCTION_DECL
if
(
TREE_CODE
(
olddecl
)
==
FUNCTION_DECL
&&
DECL_ARTIFICIAL
(
olddecl
))
&&
DECL_ARTIFICIAL
(
olddecl
))
...
@@ -3001,7 +3005,7 @@ duplicate_decls (newdecl, olddecl)
...
@@ -3001,7 +3005,7 @@ duplicate_decls (newdecl, olddecl)
/* Discard the old built-in function. */
/* Discard the old built-in function. */
return
0
;
return
0
;
}
}
if
(
DECL_THIS_STATIC
(
newdecl
)
&&
!
DECL_THIS_STATIC
(
olddecl
))
if
(
DECL_THIS_STATIC
(
newdecl
)
&&
!
DECL_THIS_STATIC
(
olddecl
))
{
{
/* If a builtin function is redeclared as `static', merge
/* If a builtin function is redeclared as `static', merge
...
@@ -3113,14 +3117,14 @@ duplicate_decls (newdecl, olddecl)
...
@@ -3113,14 +3117,14 @@ duplicate_decls (newdecl, olddecl)
cp_error_at
(
"previous declaration as `%#D'"
,
olddecl
);
cp_error_at
(
"previous declaration as `%#D'"
,
olddecl
);
}
}
}
}
else
if
(
TREE_CODE
(
newdecl
)
==
FUNCTION_DECL
else
if
(
TREE_CODE
(
newdecl
)
==
FUNCTION_DECL
&&
((
DECL_TEMPLATE_SPECIALIZATION
(
olddecl
)
&&
((
DECL_TEMPLATE_SPECIALIZATION
(
olddecl
)
&&
(
!
DECL_TEMPLATE_INFO
(
newdecl
)
&&
(
!
DECL_TEMPLATE_INFO
(
newdecl
)
||
(
DECL_TI_TEMPLATE
(
newdecl
)
||
(
DECL_TI_TEMPLATE
(
newdecl
)
!=
DECL_TI_TEMPLATE
(
olddecl
))))
!=
DECL_TI_TEMPLATE
(
olddecl
))))
||
(
DECL_TEMPLATE_SPECIALIZATION
(
newdecl
)
||
(
DECL_TEMPLATE_SPECIALIZATION
(
newdecl
)
&&
(
!
DECL_TEMPLATE_INFO
(
olddecl
)
&&
(
!
DECL_TEMPLATE_INFO
(
olddecl
)
||
(
DECL_TI_TEMPLATE
(
olddecl
)
||
(
DECL_TI_TEMPLATE
(
olddecl
)
!=
DECL_TI_TEMPLATE
(
newdecl
))))))
!=
DECL_TI_TEMPLATE
(
newdecl
))))))
/* It's OK to have a template specialization and a non-template
/* It's OK to have a template specialization and a non-template
with the same type, or to have specializations of two
with the same type, or to have specializations of two
...
@@ -3131,8 +3135,8 @@ duplicate_decls (newdecl, olddecl)
...
@@ -3131,8 +3135,8 @@ duplicate_decls (newdecl, olddecl)
specialize one of its methods. This situation is legal, but
specialize one of its methods. This situation is legal, but
the declarations must be merged in the usual way. */
the declarations must be merged in the usual way. */
return
0
;
return
0
;
else
if
(
TREE_CODE
(
newdecl
)
==
FUNCTION_DECL
else
if
(
TREE_CODE
(
newdecl
)
==
FUNCTION_DECL
&&
((
DECL_TEMPLATE_INSTANTIATION
(
olddecl
)
&&
((
DECL_TEMPLATE_INSTANTIATION
(
olddecl
)
&&
!
DECL_USE_TEMPLATE
(
newdecl
))
&&
!
DECL_USE_TEMPLATE
(
newdecl
))
||
(
DECL_TEMPLATE_INSTANTIATION
(
newdecl
)
||
(
DECL_TEMPLATE_INSTANTIATION
(
newdecl
)
&&
!
DECL_USE_TEMPLATE
(
olddecl
))))
&&
!
DECL_USE_TEMPLATE
(
olddecl
))))
...
@@ -3193,7 +3197,7 @@ duplicate_decls (newdecl, olddecl)
...
@@ -3193,7 +3197,7 @@ duplicate_decls (newdecl, olddecl)
if
(
TREE_CODE
(
TREE_TYPE
(
newdecl
))
==
METHOD_TYPE
)
if
(
TREE_CODE
(
TREE_TYPE
(
newdecl
))
==
METHOD_TYPE
)
t1
=
TREE_CHAIN
(
t1
),
t2
=
TREE_CHAIN
(
t2
);
t1
=
TREE_CHAIN
(
t1
),
t2
=
TREE_CHAIN
(
t2
);
for
(;
t1
&&
t1
!=
void_list_node
;
for
(;
t1
&&
t1
!=
void_list_node
;
t1
=
TREE_CHAIN
(
t1
),
t2
=
TREE_CHAIN
(
t2
),
i
++
)
t1
=
TREE_CHAIN
(
t1
),
t2
=
TREE_CHAIN
(
t2
),
i
++
)
if
(
TREE_PURPOSE
(
t1
)
&&
TREE_PURPOSE
(
t2
))
if
(
TREE_PURPOSE
(
t1
)
&&
TREE_PURPOSE
(
t2
))
...
@@ -3255,7 +3259,7 @@ duplicate_decls (newdecl, olddecl)
...
@@ -3255,7 +3259,7 @@ duplicate_decls (newdecl, olddecl)
DECL_NEEDS_FINAL_OVERRIDER_P
(
newdecl
)
|=
DECL_NEEDS_FINAL_OVERRIDER_P
(
olddecl
);
DECL_NEEDS_FINAL_OVERRIDER_P
(
newdecl
)
|=
DECL_NEEDS_FINAL_OVERRIDER_P
(
olddecl
);
DECL_THIS_STATIC
(
newdecl
)
|=
DECL_THIS_STATIC
(
olddecl
);
DECL_THIS_STATIC
(
newdecl
)
|=
DECL_THIS_STATIC
(
olddecl
);
new_defines_function
=
DECL_INITIAL
(
newdecl
)
!=
NULL_TREE
;
new_defines_function
=
DECL_INITIAL
(
newdecl
)
!=
NULL_TREE
;
/* Optionally warn about more than one declaration for the same
/* Optionally warn about more than one declaration for the same
name, but don't warn about a function declaration followed by a
name, but don't warn about a function declaration followed by a
definition. */
definition. */
...
@@ -3288,7 +3292,7 @@ duplicate_decls (newdecl, olddecl)
...
@@ -3288,7 +3292,7 @@ duplicate_decls (newdecl, olddecl)
/* Copy all the DECL_... slots specified in the new decl
/* Copy all the DECL_... slots specified in the new decl
except for any that we copy here from the old type. */
except for any that we copy here from the old type. */
DECL_MACHINE_ATTRIBUTES
(
newdecl
)
DECL_MACHINE_ATTRIBUTES
(
newdecl
)
=
merge_machine_decl_attributes
(
olddecl
,
newdecl
);
=
merge_machine_decl_attributes
(
olddecl
,
newdecl
);
if
(
TREE_CODE
(
newdecl
)
==
TEMPLATE_DECL
)
if
(
TREE_CODE
(
newdecl
)
==
TEMPLATE_DECL
)
...
@@ -3297,13 +3301,13 @@ duplicate_decls (newdecl, olddecl)
...
@@ -3297,13 +3301,13 @@ duplicate_decls (newdecl, olddecl)
DECL_TEMPLATE_RESULT
(
olddecl
)))
DECL_TEMPLATE_RESULT
(
olddecl
)))
cp_error
(
"invalid redeclaration of %D"
,
newdecl
);
cp_error
(
"invalid redeclaration of %D"
,
newdecl
);
TREE_TYPE
(
olddecl
)
=
TREE_TYPE
(
DECL_TEMPLATE_RESULT
(
olddecl
));
TREE_TYPE
(
olddecl
)
=
TREE_TYPE
(
DECL_TEMPLATE_RESULT
(
olddecl
));
DECL_TEMPLATE_SPECIALIZATIONS
(
olddecl
)
DECL_TEMPLATE_SPECIALIZATIONS
(
olddecl
)
=
chainon
(
DECL_TEMPLATE_SPECIALIZATIONS
(
olddecl
),
=
chainon
(
DECL_TEMPLATE_SPECIALIZATIONS
(
olddecl
),
DECL_TEMPLATE_SPECIALIZATIONS
(
newdecl
));
DECL_TEMPLATE_SPECIALIZATIONS
(
newdecl
));
return
1
;
return
1
;
}
}
if
(
types_match
)
if
(
types_match
)
{
{
/* Automatically handles default parameters. */
/* Automatically handles default parameters. */
...
@@ -3415,13 +3419,13 @@ duplicate_decls (newdecl, olddecl)
...
@@ -3415,13 +3419,13 @@ duplicate_decls (newdecl, olddecl)
TREE_STATIC
(
olddecl
)
=
TREE_STATIC
(
newdecl
)
|=
TREE_STATIC
(
olddecl
);
TREE_STATIC
(
olddecl
)
=
TREE_STATIC
(
newdecl
)
|=
TREE_STATIC
(
olddecl
);
if
(
!
DECL_EXTERNAL
(
olddecl
))
if
(
!
DECL_EXTERNAL
(
olddecl
))
DECL_EXTERNAL
(
newdecl
)
=
0
;
DECL_EXTERNAL
(
newdecl
)
=
0
;
if
(
DECL_LANG_SPECIFIC
(
newdecl
)
&&
DECL_LANG_SPECIFIC
(
olddecl
))
if
(
DECL_LANG_SPECIFIC
(
newdecl
)
&&
DECL_LANG_SPECIFIC
(
olddecl
))
{
{
DECL_INTERFACE_KNOWN
(
newdecl
)
|=
DECL_INTERFACE_KNOWN
(
olddecl
);
DECL_INTERFACE_KNOWN
(
newdecl
)
|=
DECL_INTERFACE_KNOWN
(
olddecl
);
DECL_NOT_REALLY_EXTERN
(
newdecl
)
|=
DECL_NOT_REALLY_EXTERN
(
olddecl
);
DECL_NOT_REALLY_EXTERN
(
newdecl
)
|=
DECL_NOT_REALLY_EXTERN
(
olddecl
);
DECL_COMDAT
(
newdecl
)
|=
DECL_COMDAT
(
olddecl
);
DECL_COMDAT
(
newdecl
)
|=
DECL_COMDAT
(
olddecl
);
DECL_TEMPLATE_INSTANTIATED
(
newdecl
)
DECL_TEMPLATE_INSTANTIATED
(
newdecl
)
|=
DECL_TEMPLATE_INSTANTIATED
(
olddecl
);
|=
DECL_TEMPLATE_INSTANTIATED
(
olddecl
);
/* Don't really know how much of the language-specific
/* Don't really know how much of the language-specific
values we should copy from old to new. */
values we should copy from old to new. */
...
@@ -3441,8 +3445,8 @@ duplicate_decls (newdecl, olddecl)
...
@@ -3441,8 +3445,8 @@ duplicate_decls (newdecl, olddecl)
if
(
TREE_CODE
(
newdecl
)
==
FUNCTION_DECL
)
if
(
TREE_CODE
(
newdecl
)
==
FUNCTION_DECL
)
{
{
if
(
DECL_TEMPLATE_INSTANTIATION
(
olddecl
)
if
(
DECL_TEMPLATE_INSTANTIATION
(
olddecl
)
&&
!
DECL_TEMPLATE_INSTANTIATION
(
newdecl
))
&&
!
DECL_TEMPLATE_INSTANTIATION
(
newdecl
))
{
{
/* If newdecl is not a specialization, then it is not a
/* If newdecl is not a specialization, then it is not a
template-related function at all. And that means that we
template-related function at all. And that means that we
...
@@ -3450,16 +3454,16 @@ duplicate_decls (newdecl, olddecl)
...
@@ -3450,16 +3454,16 @@ duplicate_decls (newdecl, olddecl)
my_friendly_assert
(
DECL_TEMPLATE_SPECIALIZATION
(
newdecl
),
my_friendly_assert
(
DECL_TEMPLATE_SPECIALIZATION
(
newdecl
),
0
);
0
);
if
(
TREE_USED
(
olddecl
))
if
(
TREE_USED
(
olddecl
))
/* From [temp.expl.spec]:
/* From [temp.expl.spec]:
If a template, a member template or the member of a class
If a template, a member template or the member of a class
template is explicitly specialized then that
template is explicitly specialized then that
specialization shall be declared before the first use of
specialization shall be declared before the first use of
that specialization that would cause an implicit
that specialization that would cause an implicit
instantiation to take place, in every translation unit in
instantiation to take place, in every translation unit in
which such a use occurs. */
which such a use occurs. */
cp_error
(
"explicit specialization of %D after first use"
,
cp_error
(
"explicit specialization of %D after first use"
,
olddecl
);
olddecl
);
SET_DECL_TEMPLATE_SPECIALIZATION
(
olddecl
);
SET_DECL_TEMPLATE_SPECIALIZATION
(
olddecl
);
...
@@ -3545,16 +3549,16 @@ duplicate_decls (newdecl, olddecl)
...
@@ -3545,16 +3549,16 @@ duplicate_decls (newdecl, olddecl)
the following sequence of events has occurred:
the following sequence of events has occurred:
o A friend function was declared in a class template. The
o A friend function was declared in a class template. The
class template was instantiated.
class template was instantiated.
o The instantiation of the friend declaration was
o The instantiation of the friend declaration was
recorded on the instantiation list, and is newdecl.
recorded on the instantiation list, and is newdecl.
o Later, however, instantiate_class_template called pushdecl
o Later, however, instantiate_class_template called pushdecl
on the newdecl to perform name injection. But, pushdecl in
on the newdecl to perform name injection. But, pushdecl in
turn called duplicate_decls when it discovered that another
turn called duplicate_decls when it discovered that another
declaration of a global function with the same name already
declaration of a global function with the same name already
existed.
existed.
o Here, in duplicate_decls, we decided to clobber newdecl.
o Here, in duplicate_decls, we decided to clobber newdecl.
...
@@ -3563,8 +3567,8 @@ duplicate_decls (newdecl, olddecl)
...
@@ -3563,8 +3567,8 @@ duplicate_decls (newdecl, olddecl)
instantiations so that if we try to do the instantiation
instantiations so that if we try to do the instantiation
again we won't get the clobbered declaration. */
again we won't get the clobbered declaration. */
tree
tmpl
=
DECL_TI_TEMPLATE
(
newdecl
);
tree
tmpl
=
DECL_TI_TEMPLATE
(
newdecl
);
tree
decls
=
DECL_TEMPLATE_SPECIALIZATIONS
(
tmpl
);
tree
decls
=
DECL_TEMPLATE_SPECIALIZATIONS
(
tmpl
);
for
(;
decls
;
decls
=
TREE_CHAIN
(
decls
))
for
(;
decls
;
decls
=
TREE_CHAIN
(
decls
))
if
(
TREE_VALUE
(
decls
)
==
newdecl
)
if
(
TREE_VALUE
(
decls
)
==
newdecl
)
...
@@ -3638,7 +3642,7 @@ pushdecl (x)
...
@@ -3638,7 +3642,7 @@ pushdecl (x)
/* If this is the declaration for a namespace-scope function,
/* If this is the declaration for a namespace-scope function,
but the declaration itself is in a local scope, mark the
but the declaration itself is in a local scope, mark the
declaration. */
declaration. */
if
(
TREE_CODE
(
x
)
==
FUNCTION_DECL
if
(
TREE_CODE
(
x
)
==
FUNCTION_DECL
&&
DECL_NAMESPACE_SCOPE_P
(
x
)
&&
DECL_NAMESPACE_SCOPE_P
(
x
)
&&
current_function_decl
&&
current_function_decl
&&
x
!=
current_function_decl
)
&&
x
!=
current_function_decl
)
...
@@ -3660,7 +3664,7 @@ pushdecl (x)
...
@@ -3660,7 +3664,7 @@ pushdecl (x)
#endif
#endif
if
(
TREE_CODE
(
name
)
==
TEMPLATE_ID_EXPR
)
if
(
TREE_CODE
(
name
)
==
TEMPLATE_ID_EXPR
)
name
=
TREE_OPERAND
(
name
,
0
);
name
=
TREE_OPERAND
(
name
,
0
);
/* Namespace-scoped variables are not found in the current level. */
/* Namespace-scoped variables are not found in the current level. */
if
(
TREE_CODE
(
x
)
==
VAR_DECL
&&
DECL_NAMESPACE_SCOPE_P
(
x
))
if
(
TREE_CODE
(
x
)
==
VAR_DECL
&&
DECL_NAMESPACE_SCOPE_P
(
x
))
t
=
namespace_binding
(
name
,
DECL_CONTEXT
(
x
));
t
=
namespace_binding
(
name
,
DECL_CONTEXT
(
x
));
...
@@ -3749,7 +3753,7 @@ pushdecl (x)
...
@@ -3749,7 +3753,7 @@ pushdecl (x)
else
if
(
DECL_MAIN_P
(
x
))
else
if
(
DECL_MAIN_P
(
x
))
{
{
/* A redeclaration of main, but not a duplicate of the
/* A redeclaration of main, but not a duplicate of the
previous one.
previous one.
[basic.start.main]
[basic.start.main]
...
@@ -3807,7 +3811,7 @@ pushdecl (x)
...
@@ -3807,7 +3811,7 @@ pushdecl (x)
/* We don't want to copy the type when all we're
/* We don't want to copy the type when all we're
doing is making a TYPE_DECL for the purposes of
doing is making a TYPE_DECL for the purposes of
inlining. */
inlining. */
&&
(
!
TYPE_NAME
(
type
)
&&
(
!
TYPE_NAME
(
type
)
||
TYPE_NAME
(
type
)
!=
DECL_ABSTRACT_ORIGIN
(
x
)))
||
TYPE_NAME
(
type
)
!=
DECL_ABSTRACT_ORIGIN
(
x
)))
{
{
DECL_ORIGINAL_TYPE
(
x
)
=
type
;
DECL_ORIGINAL_TYPE
(
x
)
=
type
;
...
@@ -3820,7 +3824,7 @@ pushdecl (x)
...
@@ -3820,7 +3824,7 @@ pushdecl (x)
if
(
type
!=
error_mark_node
if
(
type
!=
error_mark_node
&&
TYPE_NAME
(
type
)
&&
TYPE_NAME
(
type
)
&&
TYPE_IDENTIFIER
(
type
))
&&
TYPE_IDENTIFIER
(
type
))
set_identifier_type_value_with_scope
(
DECL_NAME
(
x
),
type
,
set_identifier_type_value_with_scope
(
DECL_NAME
(
x
),
type
,
current_binding_level
);
current_binding_level
);
}
}
...
@@ -3829,7 +3833,7 @@ pushdecl (x)
...
@@ -3829,7 +3833,7 @@ pushdecl (x)
We get warnings about inline functions where they are defined.
We get warnings about inline functions where they are defined.
We get warnings about other functions from push_overloaded_decl.
We get warnings about other functions from push_overloaded_decl.
Avoid duplicate warnings where they are used. */
Avoid duplicate warnings where they are used. */
if
(
TREE_PUBLIC
(
x
)
&&
TREE_CODE
(
x
)
!=
FUNCTION_DECL
)
if
(
TREE_PUBLIC
(
x
)
&&
TREE_CODE
(
x
)
!=
FUNCTION_DECL
)
{
{
...
@@ -3869,11 +3873,11 @@ pushdecl (x)
...
@@ -3869,11 +3873,11 @@ pushdecl (x)
the mangled name (i.e., NAME) to the DECL. But, for
the mangled name (i.e., NAME) to the DECL. But, for
an `extern "C"' function, the mangled name and the
an `extern "C"' function, the mangled name and the
ordinary name are the same so we need not do this. */
ordinary name are the same so we need not do this. */
&&
!
(
TREE_CODE
(
x
)
==
FUNCTION_DECL
&&
&&
!
(
TREE_CODE
(
x
)
==
FUNCTION_DECL
&&
DECL_LANGUAGE
(
x
)
==
lang_c
))
DECL_LANGUAGE
(
x
)
==
lang_c
))
{
{
if
(
TREE_CODE
(
x
)
==
FUNCTION_DECL
)
if
(
TREE_CODE
(
x
)
==
FUNCTION_DECL
)
my_friendly_assert
my_friendly_assert
((
IDENTIFIER_GLOBAL_VALUE
(
name
)
==
NULL_TREE
)
((
IDENTIFIER_GLOBAL_VALUE
(
name
)
==
NULL_TREE
)
||
(
IDENTIFIER_GLOBAL_VALUE
(
name
)
==
x
),
378
);
||
(
IDENTIFIER_GLOBAL_VALUE
(
name
)
==
x
),
378
);
SET_IDENTIFIER_NAMESPACE_VALUE
(
name
,
x
);
SET_IDENTIFIER_NAMESPACE_VALUE
(
name
,
x
);
...
@@ -3919,14 +3923,14 @@ pushdecl (x)
...
@@ -3919,14 +3923,14 @@ pushdecl (x)
/* If this is a TYPE_DECL, push it into the type value slot. */
/* If this is a TYPE_DECL, push it into the type value slot. */
if
(
TREE_CODE
(
x
)
==
TYPE_DECL
)
if
(
TREE_CODE
(
x
)
==
TYPE_DECL
)
set_identifier_type_value_with_scope
(
name
,
TREE_TYPE
(
x
),
set_identifier_type_value_with_scope
(
name
,
TREE_TYPE
(
x
),
current_binding_level
);
current_binding_level
);
/* Clear out any TYPE_DECL shadowed by a namespace so that
/* Clear out any TYPE_DECL shadowed by a namespace so that
we won't think this is a type. The C struct hack doesn't
we won't think this is a type. The C struct hack doesn't
go through namespaces. */
go through namespaces. */
if
(
TREE_CODE
(
x
)
==
NAMESPACE_DECL
)
if
(
TREE_CODE
(
x
)
==
NAMESPACE_DECL
)
set_identifier_type_value_with_scope
(
name
,
NULL_TREE
,
set_identifier_type_value_with_scope
(
name
,
NULL_TREE
,
current_binding_level
);
current_binding_level
);
/* If this is an extern function declaration, see if we
/* If this is an extern function declaration, see if we
...
@@ -3983,7 +3987,7 @@ pushdecl (x)
...
@@ -3983,7 +3987,7 @@ pushdecl (x)
warning
(
"variable `%s' shadows local"
,
warning
(
"variable `%s' shadows local"
,
IDENTIFIER_POINTER
(
name
));
IDENTIFIER_POINTER
(
name
));
cp_warning_at
(
" this is the shadowed declaration"
,
oldlocal
);
cp_warning_at
(
" this is the shadowed declaration"
,
oldlocal
);
}
}
/* Maybe warn if shadowing something else. */
/* Maybe warn if shadowing something else. */
else
if
(
warn_shadow
&&
!
DECL_EXTERNAL
(
x
)
else
if
(
warn_shadow
&&
!
DECL_EXTERNAL
(
x
)
/* No shadow warnings for internally generated vars. */
/* No shadow warnings for internally generated vars. */
...
@@ -4020,12 +4024,12 @@ pushdecl (x)
...
@@ -4020,12 +4024,12 @@ pushdecl (x)
/* RTTI TD entries are created while defining the type_info. */
/* RTTI TD entries are created while defining the type_info. */
||
(
TYPE_LANG_SPECIFIC
(
TREE_TYPE
(
x
))
||
(
TYPE_LANG_SPECIFIC
(
TREE_TYPE
(
x
))
&&
TYPE_BEING_DEFINED
(
TREE_TYPE
(
x
)))))
&&
TYPE_BEING_DEFINED
(
TREE_TYPE
(
x
)))))
current_binding_level
->
incomplete
current_binding_level
->
incomplete
=
tree_cons
(
NULL_TREE
,
x
,
current_binding_level
->
incomplete
);
=
tree_cons
(
NULL_TREE
,
x
,
current_binding_level
->
incomplete
);
}
}
if
(
need_new_binding
)
if
(
need_new_binding
)
add_decl_to_level
(
x
,
add_decl_to_level
(
x
,
DECL_NAMESPACE_SCOPE_P
(
x
)
DECL_NAMESPACE_SCOPE_P
(
x
)
?
NAMESPACE_LEVEL
(
CP_DECL_CONTEXT
(
x
))
?
NAMESPACE_LEVEL
(
CP_DECL_CONTEXT
(
x
))
:
current_binding_level
);
:
current_binding_level
);
...
@@ -4165,8 +4169,8 @@ maybe_push_decl (decl)
...
@@ -4165,8 +4169,8 @@ maybe_push_decl (decl)
/* Add this decl to the current binding level, but not if it comes
/* Add this decl to the current binding level, but not if it comes
from another scope, e.g. a static member variable. TEM may equal
from another scope, e.g. a static member variable. TEM may equal
DECL or it may be a previous decl of the same name. */
DECL or it may be a previous decl of the same name. */
if
((
TREE_CODE
(
decl
)
!=
PARM_DECL
if
((
TREE_CODE
(
decl
)
!=
PARM_DECL
&&
DECL_CONTEXT
(
decl
)
!=
NULL_TREE
&&
DECL_CONTEXT
(
decl
)
!=
NULL_TREE
/* Definitions of namespace members outside their namespace are
/* Definitions of namespace members outside their namespace are
possible. */
possible. */
&&
TREE_CODE
(
DECL_CONTEXT
(
decl
))
!=
NAMESPACE_DECL
)
&&
TREE_CODE
(
DECL_CONTEXT
(
decl
))
!=
NAMESPACE_DECL
)
...
@@ -4214,7 +4218,7 @@ push_class_level_binding (name, x)
...
@@ -4214,7 +4218,7 @@ push_class_level_binding (name, x)
tree
x
;
tree
x
;
{
{
tree
binding
;
tree
binding
;
/* The class_binding_level will be NULL if x is a template
/* The class_binding_level will be NULL if x is a template
parameter name in a member template. */
parameter name in a member template. */
if
(
!
class_binding_level
)
if
(
!
class_binding_level
)
return
;
return
;
...
@@ -4228,7 +4232,7 @@ push_class_level_binding (name, x)
...
@@ -4228,7 +4232,7 @@ push_class_level_binding (name, x)
class, then we will need to restore IDENTIFIER_CLASS_VALUE when
class, then we will need to restore IDENTIFIER_CLASS_VALUE when
we leave this class. Record the shadowed declaration here. */
we leave this class. Record the shadowed declaration here. */
binding
=
IDENTIFIER_BINDING
(
name
);
binding
=
IDENTIFIER_BINDING
(
name
);
if
(
binding
if
(
binding
&&
((
TREE_CODE
(
x
)
==
OVERLOAD
&&
((
TREE_CODE
(
x
)
==
OVERLOAD
&&
BINDING_VALUE
(
binding
)
&&
BINDING_VALUE
(
binding
)
&&
is_overloaded_fn
(
BINDING_VALUE
(
binding
)))
&&
is_overloaded_fn
(
BINDING_VALUE
(
binding
)))
...
@@ -4295,7 +4299,7 @@ push_using_decl (scope, name)
...
@@ -4295,7 +4299,7 @@ push_using_decl (scope, name)
tree
name
;
tree
name
;
{
{
tree
decl
;
tree
decl
;
my_friendly_assert
(
TREE_CODE
(
scope
)
==
NAMESPACE_DECL
,
383
);
my_friendly_assert
(
TREE_CODE
(
scope
)
==
NAMESPACE_DECL
,
383
);
my_friendly_assert
(
TREE_CODE
(
name
)
==
IDENTIFIER_NODE
,
384
);
my_friendly_assert
(
TREE_CODE
(
name
)
==
IDENTIFIER_NODE
,
384
);
for
(
decl
=
current_binding_level
->
usings
;
decl
;
decl
=
TREE_CHAIN
(
decl
))
for
(
decl
=
current_binding_level
->
usings
;
decl
;
decl
=
TREE_CHAIN
(
decl
))
...
@@ -4320,7 +4324,7 @@ push_using_directive (used)
...
@@ -4320,7 +4324,7 @@ push_using_directive (used)
{
{
tree
ud
=
current_binding_level
->
using_directives
;
tree
ud
=
current_binding_level
->
using_directives
;
tree
iter
,
ancestor
;
tree
iter
,
ancestor
;
/* Check if we already have this. */
/* Check if we already have this. */
if
(
purpose_member
(
used
,
ud
)
!=
NULL_TREE
)
if
(
purpose_member
(
used
,
ud
)
!=
NULL_TREE
)
return
NULL_TREE
;
return
NULL_TREE
;
...
@@ -4349,7 +4353,7 @@ push_using_directive (used)
...
@@ -4349,7 +4353,7 @@ push_using_directive (used)
PUSH_LOCAL: Bind DECL in the current scope, rather than at
PUSH_LOCAL: Bind DECL in the current scope, rather than at
namespace scope.
namespace scope.
PUSH_USING: DECL is being pushed as the result of a using
PUSH_USING: DECL is being pushed as the result of a using
declaration.
declaration.
The value returned may be a previous declaration if we guessed wrong
The value returned may be a previous declaration if we guessed wrong
about what language DECL should belong to (C or C++). Otherwise,
about what language DECL should belong to (C or C++). Otherwise,
...
@@ -4384,7 +4388,7 @@ push_overloaded_decl (decl, flags)
...
@@ -4384,7 +4388,7 @@ push_overloaded_decl (decl, flags)
else
if
(
is_overloaded_fn
(
old
))
else
if
(
is_overloaded_fn
(
old
))
{
{
tree
tmp
;
tree
tmp
;
for
(
tmp
=
old
;
tmp
;
tmp
=
OVL_NEXT
(
tmp
))
for
(
tmp
=
old
;
tmp
;
tmp
=
OVL_NEXT
(
tmp
))
{
{
tree
fn
=
OVL_CURRENT
(
tmp
);
tree
fn
=
OVL_CURRENT
(
tmp
);
...
@@ -4395,7 +4399,7 @@ push_overloaded_decl (decl, flags)
...
@@ -4395,7 +4399,7 @@ push_overloaded_decl (decl, flags)
TYPE_ARG_TYPES
(
TREE_TYPE
(
decl
))))
TYPE_ARG_TYPES
(
TREE_TYPE
(
decl
))))
cp_error
(
"`%#D' conflicts with previous using declaration `%#D'"
,
cp_error
(
"`%#D' conflicts with previous using declaration `%#D'"
,
decl
,
fn
);
decl
,
fn
);
if
(
duplicate_decls
(
decl
,
fn
))
if
(
duplicate_decls
(
decl
,
fn
))
return
fn
;
return
fn
;
}
}
...
@@ -4434,7 +4438,7 @@ push_overloaded_decl (decl, flags)
...
@@ -4434,7 +4438,7 @@ push_overloaded_decl (decl, flags)
if
(
TREE_CODE
(
new_binding
)
==
OVERLOAD
&&
old
)
if
(
TREE_CODE
(
new_binding
)
==
OVERLOAD
&&
old
)
{
{
tree
*
d
;
tree
*
d
;
for
(
d
=
&
BINDING_LEVEL
(
IDENTIFIER_BINDING
(
name
))
->
names
;
for
(
d
=
&
BINDING_LEVEL
(
IDENTIFIER_BINDING
(
name
))
->
names
;
*
d
;
*
d
;
d
=
&
TREE_CHAIN
(
*
d
))
d
=
&
TREE_CHAIN
(
*
d
))
...
@@ -4447,7 +4451,7 @@ push_overloaded_decl (decl, flags)
...
@@ -4447,7 +4451,7 @@ push_overloaded_decl (decl, flags)
TREE_VALUE
(
*
d
)
=
new_binding
;
TREE_VALUE
(
*
d
)
=
new_binding
;
else
else
/* Build a TREE_LIST to wrap the OVERLOAD. */
/* Build a TREE_LIST to wrap the OVERLOAD. */
*
d
=
tree_cons
(
NULL_TREE
,
new_binding
,
*
d
=
tree_cons
(
NULL_TREE
,
new_binding
,
TREE_CHAIN
(
*
d
));
TREE_CHAIN
(
*
d
));
/* And update the CPLUS_BINDING node. */
/* And update the CPLUS_BINDING node. */
...
@@ -4633,7 +4637,7 @@ make_label_decl (id, local_p)
...
@@ -4633,7 +4637,7 @@ make_label_decl (id, local_p)
be found, create one. (We keep track of used, but undefined,
be found, create one. (We keep track of used, but undefined,
labels, and complain about them at the end of a function.) */
labels, and complain about them at the end of a function.) */
tree
tree
lookup_label
(
id
)
lookup_label
(
id
)
tree
id
;
tree
id
;
{
{
...
@@ -4646,7 +4650,7 @@ lookup_label (id)
...
@@ -4646,7 +4650,7 @@ lookup_label (id)
IDENTIFIER_POINTER
(
id
));
IDENTIFIER_POINTER
(
id
));
return
NULL_TREE
;
return
NULL_TREE
;
}
}
/* See if we've already got this label. */
/* See if we've already got this label. */
decl
=
IDENTIFIER_LABEL_VALUE
(
id
);
decl
=
IDENTIFIER_LABEL_VALUE
(
id
);
if
(
decl
!=
NULL_TREE
&&
DECL_CONTEXT
(
decl
)
==
current_function_decl
)
if
(
decl
!=
NULL_TREE
&&
DECL_CONTEXT
(
decl
)
==
current_function_decl
)
...
@@ -4676,14 +4680,14 @@ declare_local_label (id)
...
@@ -4676,14 +4680,14 @@ declare_local_label (id)
/* Add a new entry to the SHADOWED_LABELS list so that when we leave
/* Add a new entry to the SHADOWED_LABELS list so that when we leave
this scope we can restore the old value of
this scope we can restore the old value of
IDENTIFIER_TYPE_VALUE. */
IDENTIFIER_TYPE_VALUE. */
current_binding_level
->
shadowed_labels
current_binding_level
->
shadowed_labels
=
tree_cons
(
IDENTIFIER_LABEL_VALUE
(
id
),
NULL_TREE
,
=
tree_cons
(
IDENTIFIER_LABEL_VALUE
(
id
),
NULL_TREE
,
current_binding_level
->
shadowed_labels
);
current_binding_level
->
shadowed_labels
);
/* Look for the label. */
/* Look for the label. */
decl
=
make_label_decl
(
id
,
/*local_p=*/
1
);
decl
=
make_label_decl
(
id
,
/*local_p=*/
1
);
/* Now fill in the information we didn't have before. */
/* Now fill in the information we didn't have before. */
TREE_VALUE
(
current_binding_level
->
shadowed_labels
)
=
decl
;
TREE_VALUE
(
current_binding_level
->
shadowed_labels
)
=
decl
;
return
decl
;
return
decl
;
}
}
...
@@ -4853,7 +4857,7 @@ define_case_label ()
...
@@ -4853,7 +4857,7 @@ define_case_label ()
if
(
!
switch_stack
)
if
(
!
switch_stack
)
/* Don't crash; we'll complain in do_case. */
/* Don't crash; we'll complain in do_case. */
return
;
return
;
if
(
cleanup
)
if
(
cleanup
)
{
{
static
int
explained
=
0
;
static
int
explained
=
0
;
...
@@ -4982,10 +4986,10 @@ lookup_tag (form, name, binding_level, thislevel_only)
...
@@ -4982,10 +4986,10 @@ lookup_tag (form, name, binding_level, thislevel_only)
declaration, then we use the _TYPE node for the
declaration, then we use the _TYPE node for the
template. See the example below. */
template. See the example below. */
if
(
thislevel_only
&&
!
allow_pseudo_global
if
(
thislevel_only
&&
!
allow_pseudo_global
&&
old
&&
BINDING_VALUE
(
old
)
&&
old
&&
BINDING_VALUE
(
old
)
&&
DECL_CLASS_TEMPLATE_P
(
BINDING_VALUE
(
old
)))
&&
DECL_CLASS_TEMPLATE_P
(
BINDING_VALUE
(
old
)))
old
=
TREE_TYPE
(
BINDING_VALUE
(
old
));
old
=
TREE_TYPE
(
BINDING_VALUE
(
old
));
else
else
old
=
BINDING_TYPE
(
old
);
old
=
BINDING_TYPE
(
old
);
/* If it has an original type, it is a typedef, and we
/* If it has an original type, it is a typedef, and we
...
@@ -5027,10 +5031,10 @@ lookup_tag (form, name, binding_level, thislevel_only)
...
@@ -5027,10 +5031,10 @@ lookup_tag (form, name, binding_level, thislevel_only)
if
(
level
->
pseudo_global
&&
allow_pseudo_global
)
if
(
level
->
pseudo_global
&&
allow_pseudo_global
)
{
{
/* We must deal with cases like this:
/* We must deal with cases like this:
template <class T> struct S;
template <class T> struct S;
template <class T> struct S {};
template <class T> struct S {};
When looking up `S', for the second declaration, we
When looking up `S', for the second declaration, we
would like to find the first declaration. But, we
would like to find the first declaration. But, we
are in the pseudo-global level created for the
are in the pseudo-global level created for the
...
@@ -5121,7 +5125,7 @@ lookup_namespace_name (namespace, name)
...
@@ -5121,7 +5125,7 @@ lookup_namespace_name (namespace, name)
}
}
my_friendly_assert
(
TREE_CODE
(
name
)
==
IDENTIFIER_NODE
,
373
);
my_friendly_assert
(
TREE_CODE
(
name
)
==
IDENTIFIER_NODE
,
373
);
val
=
make_node
(
CPLUS_BINDING
);
val
=
make_node
(
CPLUS_BINDING
);
if
(
!
qualified_lookup_using_namespace
(
name
,
namespace
,
val
,
0
))
if
(
!
qualified_lookup_using_namespace
(
name
,
namespace
,
val
,
0
))
return
error_mark_node
;
return
error_mark_node
;
...
@@ -5133,14 +5137,14 @@ lookup_namespace_name (namespace, name)
...
@@ -5133,14 +5137,14 @@ lookup_namespace_name (namespace, name)
if
(
template_id
)
if
(
template_id
)
{
{
if
(
DECL_CLASS_TEMPLATE_P
(
val
))
if
(
DECL_CLASS_TEMPLATE_P
(
val
))
val
=
lookup_template_class
(
val
,
val
=
lookup_template_class
(
val
,
TREE_OPERAND
(
template_id
,
1
),
TREE_OPERAND
(
template_id
,
1
),
/*in_decl=*/
NULL_TREE
,
/*in_decl=*/
NULL_TREE
,
/*context=*/
NULL_TREE
,
/*context=*/
NULL_TREE
,
/*entering_scope=*/
0
);
/*entering_scope=*/
0
);
else
if
(
DECL_FUNCTION_TEMPLATE_P
(
val
)
else
if
(
DECL_FUNCTION_TEMPLATE_P
(
val
)
||
TREE_CODE
(
val
)
==
OVERLOAD
)
||
TREE_CODE
(
val
)
==
OVERLOAD
)
val
=
lookup_template_function
(
val
,
val
=
lookup_template_function
(
val
,
TREE_OPERAND
(
template_id
,
1
));
TREE_OPERAND
(
template_id
,
1
));
else
else
{
{
...
@@ -5192,10 +5196,10 @@ typename_compare (k1, k2)
...
@@ -5192,10 +5196,10 @@ typename_compare (k1, k2)
t2
=
(
tree
)
k2
;
t2
=
(
tree
)
k2
;
d1
=
TYPE_NAME
(
t1
);
d1
=
TYPE_NAME
(
t1
);
d2
=
TYPE_NAME
(
t2
);
d2
=
TYPE_NAME
(
t2
);
return
(
DECL_NAME
(
d1
)
==
DECL_NAME
(
d2
)
return
(
DECL_NAME
(
d1
)
==
DECL_NAME
(
d2
)
&&
same_type_p
(
TYPE_CONTEXT
(
t1
),
TYPE_CONTEXT
(
t2
))
&&
same_type_p
(
TYPE_CONTEXT
(
t1
),
TYPE_CONTEXT
(
t2
))
&&
((
TREE_TYPE
(
t1
)
!=
NULL_TREE
)
&&
((
TREE_TYPE
(
t1
)
!=
NULL_TREE
)
==
(
TREE_TYPE
(
t2
)
!=
NULL_TREE
))
==
(
TREE_TYPE
(
t2
)
!=
NULL_TREE
))
&&
same_type_p
(
TREE_TYPE
(
t1
),
TREE_TYPE
(
t2
))
&&
same_type_p
(
TREE_TYPE
(
t1
),
TREE_TYPE
(
t2
))
&&
TYPENAME_TYPE_FULLNAME
(
t1
)
==
TYPENAME_TYPE_FULLNAME
(
t2
));
&&
TYPENAME_TYPE_FULLNAME
(
t1
)
==
TYPENAME_TYPE_FULLNAME
(
t2
));
...
@@ -5205,7 +5209,7 @@ typename_compare (k1, k2)
...
@@ -5205,7 +5209,7 @@ typename_compare (k1, k2)
the type of `T', NAME is the IDENTIFIER_NODE for `t'. If BASE_TYPE
the type of `T', NAME is the IDENTIFIER_NODE for `t'. If BASE_TYPE
is non-NULL, this type is being created by the implicit typename
is non-NULL, this type is being created by the implicit typename
extension, and BASE_TYPE is a type named `t' in some base class of
extension, and BASE_TYPE is a type named `t' in some base class of
`T' which depends on template parameters.
`T' which depends on template parameters.
Returns the new TYPENAME_TYPE. */
Returns the new TYPENAME_TYPE. */
...
@@ -5225,7 +5229,7 @@ build_typename_type (context, name, fullname, base_type)
...
@@ -5225,7 +5229,7 @@ build_typename_type (context, name, fullname, base_type)
if
(
!
ht
.
table
)
if
(
!
ht
.
table
)
{
{
static
struct
hash_table
*
h
=
&
ht
;
static
struct
hash_table
*
h
=
&
ht
;
if
(
!
hash_table_init
(
&
ht
,
&
hash_newfunc
,
&
typename_hash
,
if
(
!
hash_table_init
(
&
ht
,
&
hash_newfunc
,
&
typename_hash
,
&
typename_compare
))
&
typename_compare
))
fatal
(
"virtual memory exhausted"
);
fatal
(
"virtual memory exhausted"
);
ggc_add_tree_hash_table_root
(
&
h
,
1
);
ggc_add_tree_hash_table_root
(
&
h
,
1
);
...
@@ -5268,8 +5272,8 @@ make_typename_type (context, name, complain)
...
@@ -5268,8 +5272,8 @@ make_typename_type (context, name, complain)
if
(
TREE_CODE_CLASS
(
TREE_CODE
(
name
))
==
't'
)
if
(
TREE_CODE_CLASS
(
TREE_CODE
(
name
))
==
't'
)
{
{
if
(
!
(
TYPE_LANG_SPECIFIC
(
name
)
if
(
!
(
TYPE_LANG_SPECIFIC
(
name
)
&&
(
CLASSTYPE_IS_TEMPLATE
(
name
)
&&
(
CLASSTYPE_IS_TEMPLATE
(
name
)
||
CLASSTYPE_USE_TEMPLATE
(
name
))))
||
CLASSTYPE_USE_TEMPLATE
(
name
))))
name
=
TYPE_IDENTIFIER
(
name
);
name
=
TYPE_IDENTIFIER
(
name
);
else
else
...
@@ -5318,15 +5322,15 @@ make_typename_type (context, name, complain)
...
@@ -5318,15 +5322,15 @@ make_typename_type (context, name, complain)
return
error_mark_node
;
return
error_mark_node
;
}
}
return
lookup_template_class
(
tmpl
,
return
lookup_template_class
(
tmpl
,
TREE_OPERAND
(
fullname
,
1
),
TREE_OPERAND
(
fullname
,
1
),
NULL_TREE
,
context
,
NULL_TREE
,
context
,
/*entering_scope=*/
0
);
/*entering_scope=*/
0
);
}
}
else
else
{
{
tree
t
;
tree
t
;
if
(
!
IS_AGGR_TYPE
(
context
))
if
(
!
IS_AGGR_TYPE
(
context
))
{
{
if
(
complain
)
if
(
complain
)
...
@@ -5348,8 +5352,8 @@ make_typename_type (context, name, complain)
...
@@ -5348,8 +5352,8 @@ make_typename_type (context, name, complain)
cp_error
(
"no type named `%#T' in `%#T'"
,
name
,
context
);
cp_error
(
"no type named `%#T' in `%#T'"
,
name
,
context
);
return
error_mark_node
;
return
error_mark_node
;
}
}
return
build_typename_type
(
context
,
name
,
fullname
,
NULL_TREE
);
return
build_typename_type
(
context
,
name
,
fullname
,
NULL_TREE
);
}
}
...
@@ -5369,7 +5373,7 @@ select_decl (binding, flags)
...
@@ -5369,7 +5373,7 @@ select_decl (binding, flags)
return
val
;
return
val
;
return
NULL_TREE
;
return
NULL_TREE
;
}
}
/* If we could have a type and
/* If we could have a type and
we have nothing or we need a type and have none. */
we have nothing or we need a type and have none. */
if
(
BINDING_TYPE
(
binding
)
if
(
BINDING_TYPE
(
binding
)
...
@@ -5416,7 +5420,7 @@ unqualified_namespace_lookup (name, flags, spacesp)
...
@@ -5416,7 +5420,7 @@ unqualified_namespace_lookup (name, flags, spacesp)
BINDING_TYPE
(
b
)
=
BINDING_TYPE
(
val
);
BINDING_TYPE
(
b
)
=
BINDING_TYPE
(
val
);
/* Add all _DECLs seen through local using-directives. */
/* Add all _DECLs seen through local using-directives. */
for
(
level
=
current_binding_level
;
for
(
level
=
current_binding_level
;
!
level
->
namespace_p
;
!
level
->
namespace_p
;
level
=
level
->
level_chain
)
level
=
level
->
level_chain
)
if
(
!
lookup_using_namespace
(
name
,
b
,
level
->
using_directives
,
if
(
!
lookup_using_namespace
(
name
,
b
,
level
->
using_directives
,
...
@@ -5429,7 +5433,7 @@ unqualified_namespace_lookup (name, flags, spacesp)
...
@@ -5429,7 +5433,7 @@ unqualified_namespace_lookup (name, flags, spacesp)
siter
=
initial
;
siter
=
initial
;
while
(
1
)
while
(
1
)
{
{
if
(
!
lookup_using_namespace
(
name
,
b
,
DECL_NAMESPACE_USING
(
siter
),
if
(
!
lookup_using_namespace
(
name
,
b
,
DECL_NAMESPACE_USING
(
siter
),
scope
,
flags
,
spacesp
))
scope
,
flags
,
spacesp
))
/* Give up because of error. */
/* Give up because of error. */
return
error_mark_node
;
return
error_mark_node
;
...
@@ -5498,7 +5502,7 @@ warn_about_implicit_typename_lookup (typename, binding)
...
@@ -5498,7 +5502,7 @@ warn_about_implicit_typename_lookup (typename, binding)
&&
!
(
TREE_CODE
(
binding
)
==
TYPE_DECL
&&
!
(
TREE_CODE
(
binding
)
==
TYPE_DECL
&&
same_type_p
(
TREE_TYPE
(
binding
),
subtype
)))
&&
same_type_p
(
TREE_TYPE
(
binding
),
subtype
)))
{
{
cp_warning
(
"lookup of `%D' finds `%#D'"
,
cp_warning
(
"lookup of `%D' finds `%#D'"
,
name
,
binding
);
name
,
binding
);
cp_warning
(
" instead of `%D' from dependent base class"
,
cp_warning
(
" instead of `%D' from dependent base class"
,
typename
);
typename
);
...
@@ -5516,7 +5520,7 @@ warn_about_implicit_typename_lookup (typename, binding)
...
@@ -5516,7 +5520,7 @@ warn_about_implicit_typename_lookup (typename, binding)
If PREFER_TYPE is > 0, we prefer TYPE_DECLs or namespaces.
If PREFER_TYPE is > 0, we prefer TYPE_DECLs or namespaces.
If PREFER_TYPE is > 1, we reject non-type decls (e.g. namespaces).
If PREFER_TYPE is > 1, we reject non-type decls (e.g. namespaces).
If PREFER_TYPE is -2, we're being called from yylex(). (UGLY)
If PREFER_TYPE is -2, we're being called from yylex(). (UGLY)
Otherwise we prefer non-TYPE_DECLs.
Otherwise we prefer non-TYPE_DECLs.
If NONCLASS is non-zero, we don't look for the NAME in class scope,
If NONCLASS is non-zero, we don't look for the NAME in class scope,
using IDENTIFIER_CLASS_VALUE. */
using IDENTIFIER_CLASS_VALUE. */
...
@@ -5558,7 +5562,7 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
...
@@ -5558,7 +5562,7 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
type
=
got_scope
;
type
=
got_scope
;
else
if
(
got_object
!=
error_mark_node
)
else
if
(
got_object
!=
error_mark_node
)
type
=
got_object
;
type
=
got_object
;
if
(
type
)
if
(
type
)
{
{
if
(
type
==
error_mark_node
)
if
(
type
==
error_mark_node
)
...
@@ -5617,11 +5621,11 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
...
@@ -5617,11 +5621,11 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
if
(
!
LOCAL_BINDING_P
(
t
)
&&
nonclass
)
if
(
!
LOCAL_BINDING_P
(
t
)
&&
nonclass
)
/* We're not looking for class-scoped bindings, so keep going. */
/* We're not looking for class-scoped bindings, so keep going. */
continue
;
continue
;
/* If this is the kind of thing we're looking for, we're done. */
/* If this is the kind of thing we're looking for, we're done. */
if
(
qualify_lookup
(
BINDING_VALUE
(
t
),
flags
))
if
(
qualify_lookup
(
BINDING_VALUE
(
t
),
flags
))
binding
=
BINDING_VALUE
(
t
);
binding
=
BINDING_VALUE
(
t
);
else
if
((
flags
&
LOOKUP_PREFER_TYPES
)
else
if
((
flags
&
LOOKUP_PREFER_TYPES
)
&&
qualify_lookup
(
BINDING_TYPE
(
t
),
flags
))
&&
qualify_lookup
(
BINDING_TYPE
(
t
),
flags
))
binding
=
BINDING_TYPE
(
t
);
binding
=
BINDING_TYPE
(
t
);
else
else
...
@@ -5633,7 +5637,7 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
...
@@ -5633,7 +5637,7 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
if
(
val_is_implicit_typename
&&
!
yylex
)
if
(
val_is_implicit_typename
&&
!
yylex
)
warn_about_implicit_typename_lookup
(
val
,
binding
);
warn_about_implicit_typename_lookup
(
val
,
binding
);
val
=
binding
;
val
=
binding
;
val_is_implicit_typename
val_is_implicit_typename
=
IMPLICIT_TYPENAME_TYPE_DECL_P
(
val
);
=
IMPLICIT_TYPENAME_TYPE_DECL_P
(
val
);
if
(
!
val_is_implicit_typename
)
if
(
!
val_is_implicit_typename
)
break
;
break
;
...
@@ -5738,14 +5742,14 @@ lookup_name_current_level (name)
...
@@ -5738,14 +5742,14 @@ lookup_name_current_level (name)
if
(
t
!=
NULL_TREE
&&
TREE_CODE
(
t
)
==
TREE_LIST
)
if
(
t
!=
NULL_TREE
&&
TREE_CODE
(
t
)
==
TREE_LIST
)
t
=
TREE_VALUE
(
t
);
t
=
TREE_VALUE
(
t
);
}
}
else
if
(
IDENTIFIER_BINDING
(
name
)
else
if
(
IDENTIFIER_BINDING
(
name
)
&&
LOCAL_BINDING_P
(
IDENTIFIER_BINDING
(
name
)))
&&
LOCAL_BINDING_P
(
IDENTIFIER_BINDING
(
name
)))
{
{
while
(
1
)
while
(
1
)
{
{
if
(
BINDING_LEVEL
(
IDENTIFIER_BINDING
(
name
))
==
b
)
if
(
BINDING_LEVEL
(
IDENTIFIER_BINDING
(
name
))
==
b
)
return
IDENTIFIER_VALUE
(
name
);
return
IDENTIFIER_VALUE
(
name
);
if
(
b
->
keep
==
2
)
if
(
b
->
keep
==
2
)
b
=
b
->
level_chain
;
b
=
b
->
level_chain
;
else
else
...
@@ -5843,7 +5847,7 @@ record_builtin_type (rid_index, name, type)
...
@@ -5843,7 +5847,7 @@ record_builtin_type (rid_index, name, type)
tname
=
get_identifier
(
name
);
tname
=
get_identifier
(
name
);
TYPE_BUILT_IN
(
type
)
=
1
;
TYPE_BUILT_IN
(
type
)
=
1
;
if
(
tname
)
if
(
tname
)
{
{
tdecl
=
pushdecl
(
build_decl
(
TYPE_DECL
,
tname
,
type
));
tdecl
=
pushdecl
(
build_decl
(
TYPE_DECL
,
tname
,
type
));
...
@@ -5917,7 +5921,7 @@ record_unknown_type (type, name)
...
@@ -5917,7 +5921,7 @@ record_unknown_type (type, name)
TYPE_SIZE
(
type
)
=
TYPE_SIZE
(
void_type_node
);
TYPE_SIZE
(
type
)
=
TYPE_SIZE
(
void_type_node
);
TYPE_ALIGN
(
type
)
=
1
;
TYPE_ALIGN
(
type
)
=
1
;
TYPE_MODE
(
type
)
=
TYPE_MODE
(
void_type_node
);
TYPE_MODE
(
type
)
=
TYPE_MODE
(
void_type_node
);
}
}
/* Push overloaded decl, in global scope, with one argument so it
/* Push overloaded decl, in global scope, with one argument so it
can be used as a callback from define_function. */
can be used as a callback from define_function. */
...
@@ -6070,11 +6074,11 @@ init_decl_processing ()
...
@@ -6070,11 +6074,11 @@ init_decl_processing ()
/* Create the widest literal types. */
/* Create the widest literal types. */
widest_integer_literal_type_node
=
make_signed_type
(
HOST_BITS_PER_WIDE_INT
*
2
);
widest_integer_literal_type_node
=
make_signed_type
(
HOST_BITS_PER_WIDE_INT
*
2
);
pushdecl
(
build_decl
(
TYPE_DECL
,
NULL_TREE
,
pushdecl
(
build_decl
(
TYPE_DECL
,
NULL_TREE
,
widest_integer_literal_type_node
));
widest_integer_literal_type_node
));
widest_unsigned_literal_type_node
=
make_unsigned_type
(
HOST_BITS_PER_WIDE_INT
*
2
);
widest_unsigned_literal_type_node
=
make_unsigned_type
(
HOST_BITS_PER_WIDE_INT
*
2
);
pushdecl
(
build_decl
(
TYPE_DECL
,
NULL_TREE
,
pushdecl
(
build_decl
(
TYPE_DECL
,
NULL_TREE
,
widest_unsigned_literal_type_node
));
widest_unsigned_literal_type_node
));
/* These are types that type_for_size and type_for_mode use. */
/* These are types that type_for_size and type_for_mode use. */
...
@@ -6145,7 +6149,7 @@ init_decl_processing ()
...
@@ -6145,7 +6149,7 @@ init_decl_processing ()
string_type_node
=
build_pointer_type
(
char_type_node
);
string_type_node
=
build_pointer_type
(
char_type_node
);
const_string_type_node
const_string_type_node
=
build_pointer_type
(
build_qualified_type
(
char_type_node
,
=
build_pointer_type
(
build_qualified_type
(
char_type_node
,
TYPE_QUAL_CONST
));
TYPE_QUAL_CONST
));
empty_except_spec
=
build_tree_list
(
NULL_TREE
,
NULL_TREE
);
empty_except_spec
=
build_tree_list
(
NULL_TREE
,
NULL_TREE
);
#if 0
#if 0
...
@@ -6273,7 +6277,7 @@ init_decl_processing ()
...
@@ -6273,7 +6277,7 @@ init_decl_processing ()
layout_type
(
vtbl_ptr_type_node
);
layout_type
(
vtbl_ptr_type_node
);
record_builtin_type
(
RID_MAX
,
NULL_PTR
,
vtbl_ptr_type_node
);
record_builtin_type
(
RID_MAX
,
NULL_PTR
,
vtbl_ptr_type_node
);
std_node
=
build_decl
(
NAMESPACE_DECL
,
std_node
=
build_decl
(
NAMESPACE_DECL
,
get_identifier
(
flag_honor_std
?
"fake std"
:
"std"
),
get_identifier
(
flag_honor_std
?
"fake std"
:
"std"
),
void_type_node
);
void_type_node
);
pushdecl
(
std_node
);
pushdecl
(
std_node
);
...
@@ -6414,7 +6418,7 @@ define_function (name, type, pfn, library_name)
...
@@ -6414,7 +6418,7 @@ define_function (name, type, pfn, library_name)
}
}
/* Wrapper around define_function, for the benefit of
/* Wrapper around define_function, for the benefit of
c_common_nodes_and_builtins.
c_common_nodes_and_builtins.
FUNCTION_CODE tells later passes how to compile calls to this function.
FUNCTION_CODE tells later passes how to compile calls to this function.
See tree.h for its possible values. */
See tree.h for its possible values. */
...
@@ -6664,7 +6668,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
...
@@ -6664,7 +6668,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
decl
=
grokdeclarator
(
declarator
,
declspecs
,
NORMAL
,
initialized
,
decl
=
grokdeclarator
(
declarator
,
declspecs
,
NORMAL
,
initialized
,
attrlist
);
attrlist
);
if
(
decl
==
NULL_TREE
||
TREE_CODE
(
decl
)
==
VOID_TYPE
)
if
(
decl
==
NULL_TREE
||
TREE_CODE
(
decl
)
==
VOID_TYPE
)
return
NULL_TREE
;
return
NULL_TREE
;
...
@@ -6735,7 +6739,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
...
@@ -6735,7 +6739,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
#ifdef SET_DEFAULT_DECL_ATTRIBUTES
#ifdef SET_DEFAULT_DECL_ATTRIBUTES
SET_DEFAULT_DECL_ATTRIBUTES
(
decl
,
attributes
);
SET_DEFAULT_DECL_ATTRIBUTES
(
decl
,
attributes
);
#endif
#endif
/* Set attributes here so if duplicate decl, will have proper attributes. */
/* Set attributes here so if duplicate decl, will have proper attributes. */
cplus_decl_attributes
(
decl
,
attributes
,
prefix_attributes
);
cplus_decl_attributes
(
decl
,
attributes
,
prefix_attributes
);
...
@@ -6777,7 +6781,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
...
@@ -6777,7 +6781,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
/* cp_finish_decl sets DECL_EXTERNAL if DECL_IN_AGGR_P is set. */
/* cp_finish_decl sets DECL_EXTERNAL if DECL_IN_AGGR_P is set. */
DECL_IN_AGGR_P
(
decl
)
=
0
;
DECL_IN_AGGR_P
(
decl
)
=
0
;
if
((
DECL_LANG_SPECIFIC
(
decl
)
&&
DECL_USE_TEMPLATE
(
decl
))
if
((
DECL_LANG_SPECIFIC
(
decl
)
&&
DECL_USE_TEMPLATE
(
decl
))
||
CLASSTYPE_USE_TEMPLATE
(
context
))
||
CLASSTYPE_USE_TEMPLATE
(
context
))
{
{
SET_DECL_TEMPLATE_SPECIALIZATION
(
decl
);
SET_DECL_TEMPLATE_SPECIALIZATION
(
decl
);
...
@@ -6810,7 +6814,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
...
@@ -6810,7 +6814,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
data segment. */
data segment. */
DECL_COMMON
(
tem
)
=
flag_conserve_space
||
!
TREE_PUBLIC
(
tem
);
DECL_COMMON
(
tem
)
=
flag_conserve_space
||
!
TREE_PUBLIC
(
tem
);
#endif
#endif
if
(
!
processing_template_decl
)
if
(
!
processing_template_decl
)
start_decl_1
(
tem
);
start_decl_1
(
tem
);
...
@@ -6936,7 +6940,7 @@ grok_reference_init (decl, type, init)
...
@@ -6936,7 +6940,7 @@ grok_reference_init (decl, type, init)
/* Note: default conversion is only called in very special cases. */
/* Note: default conversion is only called in very special cases. */
init
=
default_conversion
(
init
);
init
=
default_conversion
(
init
);
}
}
/* Convert INIT to the reference type TYPE. This may involve the
/* Convert INIT to the reference type TYPE. This may involve the
creation of a temporary, whose lifetime must be the same as that
creation of a temporary, whose lifetime must be the same as that
of the reference. If so, a DECL_STMT for the temporary will be
of the reference. If so, a DECL_STMT for the temporary will be
...
@@ -7067,7 +7071,7 @@ layout_var_decl (decl)
...
@@ -7067,7 +7071,7 @@ layout_var_decl (decl)
/* If we haven't already layed out this declaration, do so now.
/* If we haven't already layed out this declaration, do so now.
Note that we must not call complete type for an external object
Note that we must not call complete type for an external object
because it's type might involve templates that we are not
because it's type might involve templates that we are not
supposed to isntantiate yet. (And it's perfectly legal to say
supposed to isntantiate yet. (And it's perfectly legal to say
`extern X x' for some incomplete type `X'.) */
`extern X x' for some incomplete type `X'.) */
if
(
!
DECL_EXTERNAL
(
decl
))
if
(
!
DECL_EXTERNAL
(
decl
))
complete_type
(
type
);
complete_type
(
type
);
...
@@ -7306,7 +7310,7 @@ check_initializer (decl, init)
...
@@ -7306,7 +7310,7 @@ check_initializer (decl, init)
}
}
else
else
check_for_uninitialized_const_var
(
decl
);
check_for_uninitialized_const_var
(
decl
);
return
init
;
return
init
;
}
}
...
@@ -7419,7 +7423,7 @@ maybe_inject_for_scope_var (decl)
...
@@ -7419,7 +7423,7 @@ maybe_inject_for_scope_var (decl)
{
{
if
(
current_binding_level
->
is_for_scope
)
if
(
current_binding_level
->
is_for_scope
)
{
{
struct
binding_level
*
outer
struct
binding_level
*
outer
=
current_binding_level
->
level_chain
;
=
current_binding_level
->
level_chain
;
/* Check to see if the same name is already bound at the outer
/* Check to see if the same name is already bound at the outer
...
@@ -7431,11 +7435,11 @@ maybe_inject_for_scope_var (decl)
...
@@ -7431,11 +7435,11 @@ maybe_inject_for_scope_var (decl)
Otherwise, we need to preserve the temp slot for decl to last
Otherwise, we need to preserve the temp slot for decl to last
into the outer binding level. */
into the outer binding level. */
tree
outer_binding
tree
outer_binding
=
TREE_CHAIN
(
IDENTIFIER_BINDING
(
DECL_NAME
(
decl
)));
=
TREE_CHAIN
(
IDENTIFIER_BINDING
(
DECL_NAME
(
decl
)));
if
(
outer_binding
&&
BINDING_LEVEL
(
outer_binding
)
==
outer
if
(
outer_binding
&&
BINDING_LEVEL
(
outer_binding
)
==
outer
&&
(
TREE_CODE
(
BINDING_VALUE
(
outer_binding
))
&&
(
TREE_CODE
(
BINDING_VALUE
(
outer_binding
))
==
VAR_DECL
)
==
VAR_DECL
)
&&
DECL_DEAD_FOR_LOCAL
(
BINDING_VALUE
(
outer_binding
)))
&&
DECL_DEAD_FOR_LOCAL
(
BINDING_VALUE
(
outer_binding
)))
{
{
...
@@ -7482,7 +7486,7 @@ initialize_local_var (decl, init, flags)
...
@@ -7482,7 +7486,7 @@ initialize_local_var (decl, init, flags)
if
(
DECL_SIZE
(
decl
)
&&
type
!=
error_mark_node
)
if
(
DECL_SIZE
(
decl
)
&&
type
!=
error_mark_node
)
{
{
int
already_used
;
int
already_used
;
/* Compute and store the initial value. */
/* Compute and store the initial value. */
already_used
=
TREE_USED
(
decl
)
||
TREE_USED
(
type
);
already_used
=
TREE_USED
(
decl
)
||
TREE_USED
(
type
);
...
@@ -7506,7 +7510,7 @@ initialize_local_var (decl, init, flags)
...
@@ -7506,7 +7510,7 @@ initialize_local_var (decl, init, flags)
marked used. (see TREE_USED, above.) */
marked used. (see TREE_USED, above.) */
if
(
TYPE_NEEDS_CONSTRUCTING
(
type
)
if
(
TYPE_NEEDS_CONSTRUCTING
(
type
)
&&
!
already_used
&&
!
already_used
&&
!
TYPE_NEEDS_DESTRUCTOR
(
type
)
&&
!
TYPE_NEEDS_DESTRUCTOR
(
type
)
&&
DECL_NAME
(
decl
))
&&
DECL_NAME
(
decl
))
TREE_USED
(
decl
)
=
0
;
TREE_USED
(
decl
)
=
0
;
else
if
(
already_used
)
else
if
(
already_used
)
...
@@ -7516,7 +7520,7 @@ initialize_local_var (decl, init, flags)
...
@@ -7516,7 +7520,7 @@ initialize_local_var (decl, init, flags)
/* Generate code to destroy DECL (a local variable). */
/* Generate code to destroy DECL (a local variable). */
static
void
static
void
destroy_local_var
(
decl
)
destroy_local_var
(
decl
)
tree
decl
;
tree
decl
;
{
{
...
@@ -7526,7 +7530,7 @@ destroy_local_var (decl)
...
@@ -7526,7 +7530,7 @@ destroy_local_var (decl)
/* Only variables get cleaned up. */
/* Only variables get cleaned up. */
if
(
TREE_CODE
(
decl
)
!=
VAR_DECL
)
if
(
TREE_CODE
(
decl
)
!=
VAR_DECL
)
return
;
return
;
/* And only things with destructors need cleaning up. */
/* And only things with destructors need cleaning up. */
if
(
!
TYPE_NEEDS_DESTRUCTOR
(
type
))
if
(
!
TYPE_NEEDS_DESTRUCTOR
(
type
))
return
;
return
;
...
@@ -7537,7 +7541,7 @@ destroy_local_var (decl)
...
@@ -7537,7 +7541,7 @@ destroy_local_var (decl)
translation unit, or that need a static cleanup. The latter
translation unit, or that need a static cleanup. The latter
are handled by finish_file. */
are handled by finish_file. */
return
;
return
;
/* Compute the cleanup. */
/* Compute the cleanup. */
cleanup
=
maybe_build_cleanup
(
decl
);
cleanup
=
maybe_build_cleanup
(
decl
);
...
@@ -7557,14 +7561,14 @@ emit_local_var (decl)
...
@@ -7557,14 +7561,14 @@ emit_local_var (decl)
if
(
DECL_RTL
(
decl
))
if
(
DECL_RTL
(
decl
))
/* Only a RESULT_DECL should have non-NULL RTL when arriving here.
/* Only a RESULT_DECL should have non-NULL RTL when arriving here.
All other local variables are assigned RTL in this function. */
All other local variables are assigned RTL in this function. */
my_friendly_assert
(
TREE_CODE
(
decl
)
==
RESULT_DECL
,
my_friendly_assert
(
TREE_CODE
(
decl
)
==
RESULT_DECL
,
19990828
);
19990828
);
else
else
{
{
if
(
DECL_ASSEMBLER_NAME
(
decl
)
!=
DECL_NAME
(
decl
))
if
(
DECL_ASSEMBLER_NAME
(
decl
)
!=
DECL_NAME
(
decl
))
/* The user must have specified an assembler name for this
/* The user must have specified an assembler name for this
variable. Set that up now. */
variable. Set that up now. */
rest_of_decl_compilation
rest_of_decl_compilation
(
decl
,
IDENTIFIER_POINTER
(
DECL_ASSEMBLER_NAME
(
decl
)),
(
decl
,
IDENTIFIER_POINTER
(
DECL_ASSEMBLER_NAME
(
decl
)),
/*top_level=*/
0
,
/*at_end=*/
0
);
/*top_level=*/
0
,
/*at_end=*/
0
);
else
else
...
@@ -7619,7 +7623,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
...
@@ -7619,7 +7623,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
/* Handling __FUNCTION__ and its ilk in a template-function requires
/* Handling __FUNCTION__ and its ilk in a template-function requires
some special processing because we are called from
some special processing because we are called from
language-independent code. */
language-independent code. */
if
(
cfun
&&
processing_template_decl
if
(
cfun
&&
processing_template_decl
&&
current_function_name_declared
==
2
)
&&
current_function_name_declared
==
2
)
{
{
/* Since we're in a template function, we need to
/* Since we're in a template function, we need to
...
@@ -7628,7 +7632,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
...
@@ -7628,7 +7632,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
retrofit_lang_decl
(
decl
);
retrofit_lang_decl
(
decl
);
decl
=
push_template_decl
(
decl
);
decl
=
push_template_decl
(
decl
);
if
(
strcmp
(
IDENTIFIER_POINTER
(
DECL_NAME
(
decl
)),
if
(
strcmp
(
IDENTIFIER_POINTER
(
DECL_NAME
(
decl
)),
"__PRETTY_FUNCTION__"
)
==
0
)
"__PRETTY_FUNCTION__"
)
==
0
)
{
{
init
=
build
(
FUNCTION_NAME
,
const_string_type_node
);
init
=
build
(
FUNCTION_NAME
,
const_string_type_node
);
...
@@ -7653,7 +7657,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
...
@@ -7653,7 +7657,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
&&
(
DECL_INITIAL
(
decl
)
||
init
))
&&
(
DECL_INITIAL
(
decl
)
||
init
))
DECL_DEFINED_IN_CLASS_P
(
decl
)
=
1
;
DECL_DEFINED_IN_CLASS_P
(
decl
)
=
1
;
if
(
TREE_CODE
(
decl
)
==
VAR_DECL
if
(
TREE_CODE
(
decl
)
==
VAR_DECL
&&
DECL_CONTEXT
(
decl
)
&&
DECL_CONTEXT
(
decl
)
&&
TREE_CODE
(
DECL_CONTEXT
(
decl
))
==
NAMESPACE_DECL
&&
TREE_CODE
(
DECL_CONTEXT
(
decl
))
==
NAMESPACE_DECL
&&
DECL_CONTEXT
(
decl
)
!=
current_namespace
&&
DECL_CONTEXT
(
decl
)
!=
current_namespace
...
@@ -7759,11 +7763,11 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
...
@@ -7759,11 +7763,11 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
make_rtl_for_nonlocal_decl
(
decl
,
init
,
asmspec
);
make_rtl_for_nonlocal_decl
(
decl
,
init
,
asmspec
);
if
(
TREE_CODE
(
type
)
==
FUNCTION_TYPE
if
(
TREE_CODE
(
type
)
==
FUNCTION_TYPE
||
TREE_CODE
(
type
)
==
METHOD_TYPE
)
||
TREE_CODE
(
type
)
==
METHOD_TYPE
)
abstract_virtuals_error
(
decl
,
abstract_virtuals_error
(
decl
,
strip_array_types
(
TREE_TYPE
(
type
)));
strip_array_types
(
TREE_TYPE
(
type
)));
else
else
abstract_virtuals_error
(
decl
,
strip_array_types
(
type
));
abstract_virtuals_error
(
decl
,
strip_array_types
(
type
));
if
(
TREE_CODE
(
decl
)
==
FUNCTION_DECL
)
if
(
TREE_CODE
(
decl
)
==
FUNCTION_DECL
)
...
@@ -7913,7 +7917,7 @@ get_atexit_node ()
...
@@ -7913,7 +7917,7 @@ get_atexit_node ()
We build up the argument types and then then function type
We build up the argument types and then then function type
itself. */
itself. */
/* First, build the pointer-to-function type for the first
/* First, build the pointer-to-function type for the first
argument. */
argument. */
arg_types
=
tree_cons
(
NULL_TREE
,
ptr_type_node
,
void_list_node
);
arg_types
=
tree_cons
(
NULL_TREE
,
ptr_type_node
,
void_list_node
);
...
@@ -7931,7 +7935,7 @@ get_atexit_node ()
...
@@ -7931,7 +7935,7 @@ get_atexit_node ()
else
else
{
{
/* The declaration for `atexit' is:
/* The declaration for `atexit' is:
int atexit (void (*)());
int atexit (void (*)());
We build up the argument types and then then function type
We build up the argument types and then then function type
...
@@ -8127,7 +8131,7 @@ expand_static_init (decl, init)
...
@@ -8127,7 +8131,7 @@ expand_static_init (decl, init)
initialization is complete. This ensures that an exception,
initialization is complete. This ensures that an exception,
thrown during the construction, will cause the variable to
thrown during the construction, will cause the variable to
reinitialized when we pass through this code again, as per:
reinitialized when we pass through this code again, as per:
[stmt.dcl]
[stmt.dcl]
If the initialization exits by throwing an exception, the
If the initialization exits by throwing an exception, the
...
@@ -8143,7 +8147,7 @@ expand_static_init (decl, init)
...
@@ -8143,7 +8147,7 @@ expand_static_init (decl, init)
/* Begin the conditional initialization. */
/* Begin the conditional initialization. */
if_stmt
=
begin_if_stmt
();
if_stmt
=
begin_if_stmt
();
finish_if_stmt_cond
(
build_binary_op
(
EQ_EXPR
,
temp
,
finish_if_stmt_cond
(
build_binary_op
(
EQ_EXPR
,
temp
,
integer_zero_node
),
integer_zero_node
),
if_stmt
);
if_stmt
);
then_clause
=
begin_compound_stmt
(
/*has_no_scope=*/
0
);
then_clause
=
begin_compound_stmt
(
/*has_no_scope=*/
0
);
...
@@ -8170,7 +8174,7 @@ expand_static_init (decl, init)
...
@@ -8170,7 +8174,7 @@ expand_static_init (decl, init)
if
(
assignment
)
if
(
assignment
)
{
{
assignment
=
tree_cons
(
NULL_TREE
,
assignment
,
assignment
=
tree_cons
(
NULL_TREE
,
assignment
,
build_tree_list
(
NULL_TREE
,
build_tree_list
(
NULL_TREE
,
temp_init
));
temp_init
));
assignment
=
build_compound_expr
(
assignment
);
assignment
=
build_compound_expr
(
assignment
);
}
}
...
@@ -8232,7 +8236,7 @@ complete_array_type (type, initial_value, do_default)
...
@@ -8232,7 +8236,7 @@ complete_array_type (type, initial_value, do_default)
{
{
register
tree
maxindex
=
NULL_TREE
;
register
tree
maxindex
=
NULL_TREE
;
int
value
=
0
;
int
value
=
0
;
if
(
initial_value
)
if
(
initial_value
)
{
{
/* Note MAXINDEX is really the maximum index,
/* Note MAXINDEX is really the maximum index,
...
@@ -8358,7 +8362,7 @@ bad_specifiers (object, type, virtualp, quals, inlinep, friendp, raises)
...
@@ -8358,7 +8362,7 @@ bad_specifiers (object, type, virtualp, quals, inlinep, friendp, raises)
or `volatile'.
or `volatile'.
RAISES is a list of exceptions that this function can raise.
RAISES is a list of exceptions that this function can raise.
CHECK is 1 if we must find this method in CTYPE, 0 if we should
CHECK is 1 if we must find this method in CTYPE, 0 if we should
not look, and -1 if we should not call `grokclassfn' at all.
not look, and -1 if we should not call `grokclassfn' at all.
Returns `NULL_TREE' if something goes wrong, after issuing
Returns `NULL_TREE' if something goes wrong, after issuing
applicable error messages. */
applicable error messages. */
...
@@ -8511,7 +8515,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
...
@@ -8511,7 +8515,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
if
(
PROCESSING_REAL_TEMPLATE_DECL_P
())
if
(
PROCESSING_REAL_TEMPLATE_DECL_P
())
{
{
/* Something like `template <class T> friend void f<T>()'. */
/* Something like `template <class T> friend void f<T>()'. */
cp_error
(
"template-id `%D' in declaration of primary template"
,
cp_error
(
"template-id `%D' in declaration of primary template"
,
orig_declarator
);
orig_declarator
);
return
NULL_TREE
;
return
NULL_TREE
;
}
}
...
@@ -8534,7 +8538,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
...
@@ -8534,7 +8538,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
if
(
inlinep
)
if
(
inlinep
)
{
{
cp_error
(
"`inline' is not allowed in declaration of friend template specialization `%D'"
,
cp_error
(
"`inline' is not allowed in declaration of friend template specialization `%D'"
,
decl
);
decl
);
return
NULL_TREE
;
return
NULL_TREE
;
}
}
...
@@ -8572,8 +8576,8 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
...
@@ -8572,8 +8576,8 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
grokclassfn
(
ctype
,
decl
,
flags
,
quals
);
grokclassfn
(
ctype
,
decl
,
flags
,
quals
);
decl
=
check_explicit_specialization
(
orig_declarator
,
decl
,
decl
=
check_explicit_specialization
(
orig_declarator
,
decl
,
template_count
,
template_count
,
2
*
(
funcdef_flag
!=
0
)
+
2
*
(
funcdef_flag
!=
0
)
+
4
*
(
friendp
!=
0
));
4
*
(
friendp
!=
0
));
if
(
decl
==
error_mark_node
)
if
(
decl
==
error_mark_node
)
return
NULL_TREE
;
return
NULL_TREE
;
...
@@ -8605,8 +8609,8 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
...
@@ -8605,8 +8609,8 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
grokclassfn
(
ctype
,
decl
,
flags
,
quals
);
grokclassfn
(
ctype
,
decl
,
flags
,
quals
);
decl
=
check_explicit_specialization
(
orig_declarator
,
decl
,
decl
=
check_explicit_specialization
(
orig_declarator
,
decl
,
template_count
,
template_count
,
2
*
(
funcdef_flag
!=
0
)
+
2
*
(
funcdef_flag
!=
0
)
+
4
*
(
friendp
!=
0
));
4
*
(
friendp
!=
0
));
if
(
decl
==
error_mark_node
)
if
(
decl
==
error_mark_node
)
return
NULL_TREE
;
return
NULL_TREE
;
...
@@ -8619,7 +8623,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
...
@@ -8619,7 +8623,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
if
(
tmp
&&
TREE_CODE
(
tmp
)
==
TEMPLATE_DECL
)
if
(
tmp
&&
TREE_CODE
(
tmp
)
==
TEMPLATE_DECL
)
tmp
=
DECL_TEMPLATE_RESULT
(
tmp
);
tmp
=
DECL_TEMPLATE_RESULT
(
tmp
);
if
(
tmp
&&
DECL_STATIC_FUNCTION_P
(
tmp
)
if
(
tmp
&&
DECL_STATIC_FUNCTION_P
(
tmp
)
&&
TREE_CODE
(
TREE_TYPE
(
decl
))
==
METHOD_TYPE
)
&&
TREE_CODE
(
TREE_TYPE
(
decl
))
==
METHOD_TYPE
)
{
{
...
@@ -8691,7 +8695,7 @@ grokvardecl (type, declarator, specbits_in, initialized, constp, in_namespace)
...
@@ -8691,7 +8695,7 @@ grokvardecl (type, declarator, specbits_in, initialized, constp, in_namespace)
else
else
context
=
NULL_TREE
;
context
=
NULL_TREE
;
if
(
processing_template_decl
)
if
(
processing_template_decl
)
/* If we're in a template, we need DECL_LANG_SPECIFIC so that
/* If we're in a template, we need DECL_LANG_SPECIFIC so that
we can call push_template_decl. */
we can call push_template_decl. */
decl
=
build_lang_decl
(
VAR_DECL
,
declarator
,
type
);
decl
=
build_lang_decl
(
VAR_DECL
,
declarator
,
type
);
...
@@ -8781,7 +8785,7 @@ build_ptrmemfunc_type (type)
...
@@ -8781,7 +8785,7 @@ build_ptrmemfunc_type (type)
/* Make sure that we always have the unqualified pointer-to-member
/* Make sure that we always have the unqualified pointer-to-member
type first. */
type first. */
if
(
CP_TYPE_QUALS
(
type
)
!=
TYPE_UNQUALIFIED
)
if
(
CP_TYPE_QUALS
(
type
)
!=
TYPE_UNQUALIFIED
)
unqualified_variant
unqualified_variant
=
build_ptrmemfunc_type
(
TYPE_MAIN_VARIANT
(
type
));
=
build_ptrmemfunc_type
(
TYPE_MAIN_VARIANT
(
type
));
u
=
make_aggr_type
(
UNION_TYPE
);
u
=
make_aggr_type
(
UNION_TYPE
);
...
@@ -8850,7 +8854,7 @@ check_static_variable_definition (decl, type)
...
@@ -8850,7 +8854,7 @@ check_static_variable_definition (decl, type)
required. */
required. */
if
(
CLASS_TYPE_P
(
type
)
||
TREE_CODE
(
type
)
==
REFERENCE_TYPE
)
if
(
CLASS_TYPE_P
(
type
)
||
TREE_CODE
(
type
)
==
REFERENCE_TYPE
)
{
{
cp_error
(
"in-class initialization of static data member of non-integral type `%T'"
,
cp_error
(
"in-class initialization of static data member of non-integral type `%T'"
,
type
);
type
);
/* If we just return the declaration, crashes will sometimes
/* If we just return the declaration, crashes will sometimes
occur. We therefore return void_type_node, as if this was a
occur. We therefore return void_type_node, as if this was a
...
@@ -8941,7 +8945,7 @@ compute_array_index_type (name, size)
...
@@ -8941,7 +8945,7 @@ compute_array_index_type (name, size)
size
=
integer_one_node
;
size
=
integer_one_node
;
}
}
/* Except that an extension we allow zero-sized arrays. We
/* Except that an extension we allow zero-sized arrays. We
always allow them in system headers because glibc uses
always allow them in system headers because glibc uses
them. */
them. */
else
if
(
integer_zerop
(
size
)
&&
pedantic
&&
!
in_system_header
)
else
if
(
integer_zerop
(
size
)
&&
pedantic
&&
!
in_system_header
)
{
{
...
@@ -8959,7 +8963,7 @@ compute_array_index_type (name, size)
...
@@ -8959,7 +8963,7 @@ compute_array_index_type (name, size)
cp_convert
(
ssizetype
,
size
),
cp_convert
(
ssizetype
,
size
),
cp_convert
(
ssizetype
,
cp_convert
(
ssizetype
,
integer_one_node
)));
integer_one_node
)));
/* Check for variable-sized arrays. We allow such things as an
/* Check for variable-sized arrays. We allow such things as an
extension, even though they are not allowed in ANSI/ISO C++. */
extension, even though they are not allowed in ANSI/ISO C++. */
if
(
!
TREE_CONSTANT
(
itype
))
if
(
!
TREE_CONSTANT
(
itype
))
...
@@ -8984,7 +8988,7 @@ compute_array_index_type (name, size)
...
@@ -8984,7 +8988,7 @@ compute_array_index_type (name, size)
error
(
"overflow in array dimension"
);
error
(
"overflow in array dimension"
);
TREE_OVERFLOW
(
itype
)
=
0
;
TREE_OVERFLOW
(
itype
)
=
0
;
}
}
/* Create and return the appropriate index type. */
/* Create and return the appropriate index type. */
return
build_index_type
(
itype
);
return
build_index_type
(
itype
);
}
}
...
@@ -9048,7 +9052,7 @@ create_array_type_for_decl (name, type, size)
...
@@ -9048,7 +9052,7 @@ create_array_type_for_decl (name, type, size)
}
}
/* [dcl.array]
/* [dcl.array]
The constant expressions that specify the bounds of the arrays
The constant expressions that specify the bounds of the arrays
can be omitted only for the first member of the sequence. */
can be omitted only for the first member of the sequence. */
if
(
TREE_CODE
(
type
)
==
ARRAY_TYPE
&&
!
TYPE_DOMAIN
(
type
))
if
(
TREE_CODE
(
type
)
==
ARRAY_TYPE
&&
!
TYPE_DOMAIN
(
type
))
...
@@ -9320,7 +9324,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -9320,7 +9324,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
}
}
ctype
=
NULL_TREE
;
ctype
=
NULL_TREE
;
break
;
break
;
case
TEMPLATE_ID_EXPR
:
case
TEMPLATE_ID_EXPR
:
{
{
tree
fns
=
TREE_OPERAND
(
decl
,
0
);
tree
fns
=
TREE_OPERAND
(
decl
,
0
);
...
@@ -9513,7 +9517,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -9513,7 +9517,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
if
(
name
==
NULL
)
if
(
name
==
NULL
)
name
=
decl_context
==
PARM
?
"parameter"
:
"type name"
;
name
=
decl_context
==
PARM
?
"parameter"
:
"type name"
;
/* Look through the decl specs and record which ones appear.
/* Look through the decl specs and record which ones appear.
Some typespecs are defined as built-in typenames.
Some typespecs are defined as built-in typenames.
Others, the ones that are modifiers of other types,
Others, the ones that are modifiers of other types,
...
@@ -9716,7 +9720,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -9716,7 +9720,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
&&
TYPE_MAIN_VARIANT
(
type
)
==
double_type_node
)
&&
TYPE_MAIN_VARIANT
(
type
)
==
double_type_node
)
{
{
RIDBIT_RESET
(
RID_LONG
,
specbits
);
RIDBIT_RESET
(
RID_LONG
,
specbits
);
type
=
build_qualified_type
(
long_double_type_node
,
type
=
build_qualified_type
(
long_double_type_node
,
CP_TYPE_QUALS
(
type
));
CP_TYPE_QUALS
(
type
));
}
}
...
@@ -9785,7 +9789,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -9785,7 +9789,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
It is implementation-defined whether a plain (neither
It is implementation-defined whether a plain (neither
explicitly signed or unsigned) char, short, int, or long
explicitly signed or unsigned) char, short, int, or long
bit-field is signed or unsigned.
bit-field is signed or unsigned.
Naturally, we extend this to long long as well. Note that
Naturally, we extend this to long long as well. Note that
this does not include wchar_t. */
this does not include wchar_t. */
||
(
bitfield
&&
!
flag_signed_bitfields
||
(
bitfield
&&
!
flag_signed_bitfields
...
@@ -9793,7 +9797,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -9793,7 +9797,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
/* A typedef for plain `int' without `signed' can be
/* A typedef for plain `int' without `signed' can be
controlled just like plain `int', but a typedef for
controlled just like plain `int', but a typedef for
`signed int' cannot be so controlled. */
`signed int' cannot be so controlled. */
&&
!
(
typedef_decl
&&
!
(
typedef_decl
&&
C_TYPEDEF_EXPLICITLY_SIGNED
(
typedef_decl
))
&&
C_TYPEDEF_EXPLICITLY_SIGNED
(
typedef_decl
))
&&
(
TREE_CODE
(
type
)
==
INTEGER_TYPE
&&
(
TREE_CODE
(
type
)
==
INTEGER_TYPE
||
TREE_CODE
(
type
)
==
CHAR_TYPE
)
||
TREE_CODE
(
type
)
==
CHAR_TYPE
)
...
@@ -9847,7 +9851,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -9847,7 +9851,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
type
=
build_complex_type
(
type
);
type
=
build_complex_type
(
type
);
}
}
if
(
return_type
==
return_conversion
if
(
return_type
==
return_conversion
&&
(
RIDBIT_SETP
(
RID_CONST
,
specbits
)
&&
(
RIDBIT_SETP
(
RID_CONST
,
specbits
)
||
RIDBIT_SETP
(
RID_VOLATILE
,
specbits
)
||
RIDBIT_SETP
(
RID_VOLATILE
,
specbits
)
||
RIDBIT_SETP
(
RID_RESTRICT
,
specbits
)))
||
RIDBIT_SETP
(
RID_RESTRICT
,
specbits
)))
...
@@ -9859,9 +9863,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -9859,9 +9863,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
Likewise for VOLATILEP. */
Likewise for VOLATILEP. */
constp
=
!!
RIDBIT_SETP
(
RID_CONST
,
specbits
)
+
CP_TYPE_CONST_P
(
type
);
constp
=
!!
RIDBIT_SETP
(
RID_CONST
,
specbits
)
+
CP_TYPE_CONST_P
(
type
);
restrictp
=
restrictp
=
!!
RIDBIT_SETP
(
RID_RESTRICT
,
specbits
)
+
CP_TYPE_RESTRICT_P
(
type
);
!!
RIDBIT_SETP
(
RID_RESTRICT
,
specbits
)
+
CP_TYPE_RESTRICT_P
(
type
);
volatilep
=
volatilep
=
!!
RIDBIT_SETP
(
RID_VOLATILE
,
specbits
)
+
CP_TYPE_VOLATILE_P
(
type
);
!!
RIDBIT_SETP
(
RID_VOLATILE
,
specbits
)
+
CP_TYPE_VOLATILE_P
(
type
);
type_quals
=
((
constp
?
TYPE_QUAL_CONST
:
0
)
type_quals
=
((
constp
?
TYPE_QUAL_CONST
:
0
)
|
(
restrictp
?
TYPE_QUAL_RESTRICT
:
0
)
|
(
restrictp
?
TYPE_QUAL_RESTRICT
:
0
)
...
@@ -9946,7 +9950,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -9946,7 +9950,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
if
(
declarator
)
if
(
declarator
)
{
{
/* Avoid trying to get an operand off an identifier node. */
/* Avoid trying to get an operand off an identifier node. */
if
(
TREE_CODE
(
declarator
)
==
IDENTIFIER_NODE
)
if
(
TREE_CODE
(
declarator
)
==
IDENTIFIER_NODE
)
tmp
=
declarator
;
tmp
=
declarator
;
else
else
...
@@ -9998,7 +10002,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -9998,7 +10002,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
the declared identifier (or NULL_TREE, in an absolute declarator). */
the declared identifier (or NULL_TREE, in an absolute declarator). */
inner_attrs
=
NULL_TREE
;
inner_attrs
=
NULL_TREE
;
ignore_attrs
=
0
;
ignore_attrs
=
0
;
while
(
declarator
&&
TREE_CODE
(
declarator
)
!=
IDENTIFIER_NODE
while
(
declarator
&&
TREE_CODE
(
declarator
)
!=
IDENTIFIER_NODE
&&
TREE_CODE
(
declarator
)
!=
TEMPLATE_ID_EXPR
)
&&
TREE_CODE
(
declarator
)
!=
TEMPLATE_ID_EXPR
)
...
@@ -10121,7 +10125,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -10121,7 +10125,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
if
(
inner_decl
&&
TREE_CODE
(
inner_decl
)
==
SCOPE_REF
)
if
(
inner_decl
&&
TREE_CODE
(
inner_decl
)
==
SCOPE_REF
)
inner_decl
=
TREE_OPERAND
(
inner_decl
,
1
);
inner_decl
=
TREE_OPERAND
(
inner_decl
,
1
);
if
(
inner_decl
&&
TREE_CODE
(
inner_decl
)
==
TEMPLATE_ID_EXPR
)
if
(
inner_decl
&&
TREE_CODE
(
inner_decl
)
==
TEMPLATE_ID_EXPR
)
inner_decl
=
dname
;
inner_decl
=
dname
;
/* Pick up type qualifiers which should be applied to `this'. */
/* Pick up type qualifiers which should be applied to `this'. */
...
@@ -10133,11 +10137,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -10133,11 +10137,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
/* Say it's a definition only for the CALL_EXPR
/* Say it's a definition only for the CALL_EXPR
closest to the identifier. */
closest to the identifier. */
funcdecl_p
funcdecl_p
=
inner_decl
=
inner_decl
&&
(
TREE_CODE
(
inner_decl
)
==
IDENTIFIER_NODE
&&
(
TREE_CODE
(
inner_decl
)
==
IDENTIFIER_NODE
||
TREE_CODE
(
inner_decl
)
==
TEMPLATE_ID_EXPR
||
TREE_CODE
(
inner_decl
)
==
TEMPLATE_ID_EXPR
||
TREE_CODE
(
inner_decl
)
==
BIT_NOT_EXPR
);
||
TREE_CODE
(
inner_decl
)
==
BIT_NOT_EXPR
);
if
(
ctype
==
NULL_TREE
if
(
ctype
==
NULL_TREE
&&
decl_context
==
FIELD
&&
decl_context
==
FIELD
&&
funcdecl_p
&&
funcdecl_p
...
@@ -10250,7 +10254,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -10250,7 +10254,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
want the underlying IDENTIFIER. */
want the underlying IDENTIFIER. */
if
(
TREE_CODE
(
declarator
)
==
BIT_NOT_EXPR
)
if
(
TREE_CODE
(
declarator
)
==
BIT_NOT_EXPR
)
declarator
=
TREE_OPERAND
(
declarator
,
0
);
declarator
=
TREE_OPERAND
(
declarator
,
0
);
if
(
strict_prototype
==
0
&&
arg_types
==
NULL_TREE
)
if
(
strict_prototype
==
0
&&
arg_types
==
NULL_TREE
)
arg_types
=
void_list_node
;
arg_types
=
void_list_node
;
else
if
(
arg_types
==
NULL_TREE
else
if
(
arg_types
==
NULL_TREE
...
@@ -10437,7 +10441,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -10437,7 +10441,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
ctype
=
TREE_OPERAND
(
declarator
,
0
);
ctype
=
TREE_OPERAND
(
declarator
,
0
);
t
=
ctype
;
t
=
ctype
;
while
(
t
!=
NULL_TREE
&&
CLASS_TYPE_P
(
t
))
while
(
t
!=
NULL_TREE
&&
CLASS_TYPE_P
(
t
))
{
{
if
(
CLASSTYPE_TEMPLATE_INFO
(
t
)
&&
if
(
CLASSTYPE_TEMPLATE_INFO
(
t
)
&&
!
CLASSTYPE_TEMPLATE_SPECIALIZATION
(
t
))
!
CLASSTYPE_TEMPLATE_SPECIALIZATION
(
t
))
...
@@ -10673,10 +10677,10 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -10673,10 +10677,10 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
type is a (non-primary) template. The name for the
type is a (non-primary) template. The name for the
template needs updating as well. */
template needs updating as well. */
if
(
TYPE_LANG_SPECIFIC
(
type
)
&&
CLASSTYPE_TEMPLATE_INFO
(
type
))
if
(
TYPE_LANG_SPECIFIC
(
type
)
&&
CLASSTYPE_TEMPLATE_INFO
(
type
))
DECL_NAME
(
CLASSTYPE_TI_TEMPLATE
(
type
))
DECL_NAME
(
CLASSTYPE_TI_TEMPLATE
(
type
))
=
TYPE_IDENTIFIER
(
type
);
=
TYPE_IDENTIFIER
(
type
);
/* XXX Temporarily set the scope.
/* XXX Temporarily set the scope.
When returning, start_decl expects it as NULL_TREE,
When returning, start_decl expects it as NULL_TREE,
and will then then set it using pushdecl. */
and will then then set it using pushdecl. */
my_friendly_assert
(
DECL_CONTEXT
(
decl
)
==
NULL_TREE
,
980404
);
my_friendly_assert
(
DECL_CONTEXT
(
decl
)
==
NULL_TREE
,
980404
);
...
@@ -10845,7 +10849,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -10845,7 +10849,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
return
NULL_TREE
;
return
NULL_TREE
;
}
}
}
}
{
{
register
tree
decl
;
register
tree
decl
;
...
@@ -10930,11 +10934,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -10930,11 +10934,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
}
}
/* Tell grokfndecl if it needs to set TREE_PUBLIC on the node. */
/* Tell grokfndecl if it needs to set TREE_PUBLIC on the node. */
function_context
=
(
ctype
!=
NULL_TREE
)
?
function_context
=
(
ctype
!=
NULL_TREE
)
?
hack_decl_function_context
(
TYPE_MAIN_DECL
(
ctype
))
:
NULL_TREE
;
hack_decl_function_context
(
TYPE_MAIN_DECL
(
ctype
))
:
NULL_TREE
;
publicp
=
(
!
friendp
||
!
staticp
)
publicp
=
(
!
friendp
||
!
staticp
)
&&
function_context
==
NULL_TREE
;
&&
function_context
==
NULL_TREE
;
decl
=
grokfndecl
(
ctype
,
type
,
decl
=
grokfndecl
(
ctype
,
type
,
TREE_CODE
(
declarator
)
!=
TEMPLATE_ID_EXPR
TREE_CODE
(
declarator
)
!=
TEMPLATE_ID_EXPR
?
declarator
:
dname
,
?
declarator
:
dname
,
declarator
,
declarator
,
...
@@ -10966,7 +10970,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -10966,7 +10970,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
We don't look at the first parameter, which is
We don't look at the first parameter, which is
really just the `this' parameter for the new
really just the `this' parameter for the new
object. */
object. */
tree
arg_types
=
tree
arg_types
=
TREE_CHAIN
(
TYPE_ARG_TYPES
(
TREE_TYPE
(
decl
)));
TREE_CHAIN
(
TYPE_ARG_TYPES
(
TREE_TYPE
(
decl
)));
/* Skip the `in_chrg' argument too, if present. */
/* Skip the `in_chrg' argument too, if present. */
...
@@ -10974,8 +10978,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -10974,8 +10978,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
arg_types
=
TREE_CHAIN
(
arg_types
);
arg_types
=
TREE_CHAIN
(
arg_types
);
if
(
arg_types
==
void_list_node
if
(
arg_types
==
void_list_node
||
(
arg_types
||
(
arg_types
&&
TREE_CHAIN
(
arg_types
)
&&
TREE_CHAIN
(
arg_types
)
&&
TREE_CHAIN
(
arg_types
)
!=
void_list_node
&&
TREE_CHAIN
(
arg_types
)
!=
void_list_node
&&
!
TREE_PURPOSE
(
TREE_CHAIN
(
arg_types
))))
&&
!
TREE_PURPOSE
(
TREE_CHAIN
(
arg_types
))))
DECL_NONCONVERTING_P
(
decl
)
=
1
;
DECL_NONCONVERTING_P
(
decl
)
=
1
;
...
@@ -11039,8 +11043,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -11039,8 +11043,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
{
{
if
(
template_class_depth
(
current_class_type
)
==
0
)
if
(
template_class_depth
(
current_class_type
)
==
0
)
{
{
decl
decl
=
check_explicit_specialization
=
check_explicit_specialization
(
declarator
,
decl
,
(
declarator
,
decl
,
template_count
,
2
*
(
funcdef_flag
!=
0
)
+
4
);
template_count
,
2
*
(
funcdef_flag
!=
0
)
+
4
);
if
(
decl
==
error_mark_node
)
if
(
decl
==
error_mark_node
)
...
@@ -11053,7 +11057,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -11053,7 +11057,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
}
}
if
(
t
&&
funcdef_flag
)
if
(
t
&&
funcdef_flag
)
return
t
;
return
t
;
return
void_type_node
;
return
void_type_node
;
}
}
}
}
...
@@ -11068,11 +11072,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -11068,11 +11072,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
{
{
/* An attempt is being made to initialize a non-static
/* An attempt is being made to initialize a non-static
member. But, from [class.mem]:
member. But, from [class.mem]:
4 A member-declarator can contain a
4 A member-declarator can contain a
constant-initializer only if it declares a static
constant-initializer only if it declares a static
member (_class.static_) of integral or enumeration
member (_class.static_) of integral or enumeration
type, see _class.static.data_.
type, see _class.static.data_.
This used to be relatively common practice, but
This used to be relatively common practice, but
the rest of the compiler does not correctly
the rest of the compiler does not correctly
...
@@ -11160,7 +11164,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -11160,7 +11164,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
else
else
pedwarn
(
"storage class `inline' invalid for function `%s' declared out of global scope"
,
name
);
pedwarn
(
"storage class `inline' invalid for function `%s' declared out of global scope"
,
name
);
}
}
if
(
ctype
==
NULL_TREE
)
if
(
ctype
==
NULL_TREE
)
{
{
if
(
virtualp
)
if
(
virtualp
)
...
@@ -11181,7 +11185,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -11181,7 +11185,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
decl
=
grokfndecl
(
ctype
,
type
,
original_name
,
declarator
,
decl
=
grokfndecl
(
ctype
,
type
,
original_name
,
declarator
,
virtualp
,
flags
,
quals
,
raises
,
virtualp
,
flags
,
quals
,
raises
,
1
,
friendp
,
1
,
friendp
,
publicp
,
inlinep
,
funcdef_flag
,
publicp
,
inlinep
,
funcdef_flag
,
template_count
,
in_namespace
);
template_count
,
in_namespace
);
if
(
decl
==
NULL_TREE
)
if
(
decl
==
NULL_TREE
)
return
NULL_TREE
;
return
NULL_TREE
;
...
@@ -11216,9 +11220,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
...
@@ -11216,9 +11220,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
/* It's a variable. */
/* It's a variable. */
/* An uninitialized decl with `extern' is a reference. */
/* An uninitialized decl with `extern' is a reference. */
decl
=
grokvardecl
(
type
,
declarator
,
&
specbits
,
decl
=
grokvardecl
(
type
,
declarator
,
&
specbits
,
initialized
,
initialized
,
(
type_quals
&
TYPE_QUAL_CONST
)
!=
0
,
(
type_quals
&
TYPE_QUAL_CONST
)
!=
0
,
in_namespace
);
in_namespace
);
bad_specifiers
(
decl
,
"variable"
,
virtualp
,
quals
!=
NULL_TREE
,
bad_specifiers
(
decl
,
"variable"
,
virtualp
,
quals
!=
NULL_TREE
,
inlinep
,
friendp
,
raises
!=
NULL_TREE
);
inlinep
,
friendp
,
raises
!=
NULL_TREE
);
...
@@ -11330,7 +11334,7 @@ int
...
@@ -11330,7 +11334,7 @@ int
local_variable_p
(
t
)
local_variable_p
(
t
)
tree
t
;
tree
t
;
{
{
if
((
TREE_CODE
(
t
)
==
VAR_DECL
if
((
TREE_CODE
(
t
)
==
VAR_DECL
/* A VAR_DECL with a context that is a _TYPE is a static data
/* A VAR_DECL with a context that is a _TYPE is a static data
member. */
member. */
&&
!
TYPE_P
(
CP_DECL_CONTEXT
(
t
))
&&
!
TYPE_P
(
CP_DECL_CONTEXT
(
t
))
...
@@ -11364,7 +11368,7 @@ local_variable_p_walkfn (tp, walk_subtrees, data)
...
@@ -11364,7 +11368,7 @@ local_variable_p_walkfn (tp, walk_subtrees, data)
int
*
walk_subtrees
ATTRIBUTE_UNUSED
;
int
*
walk_subtrees
ATTRIBUTE_UNUSED
;
void
*
data
ATTRIBUTE_UNUSED
;
void
*
data
ATTRIBUTE_UNUSED
;
{
{
return
((
local_variable_p
(
*
tp
)
&&
!
DECL_ARTIFICIAL
(
*
tp
))
return
((
local_variable_p
(
*
tp
)
&&
!
DECL_ARTIFICIAL
(
*
tp
))
?
*
tp
:
NULL_TREE
);
?
*
tp
:
NULL_TREE
);
}
}
...
@@ -11402,7 +11406,7 @@ check_default_argument (decl, arg)
...
@@ -11402,7 +11406,7 @@ check_default_argument (decl, arg)
else
else
decl_type
=
TREE_TYPE
(
decl
);
decl_type
=
TREE_TYPE
(
decl
);
if
(
arg
==
error_mark_node
if
(
arg
==
error_mark_node
||
decl
==
error_mark_node
||
decl
==
error_mark_node
||
TREE_TYPE
(
arg
)
==
error_mark_node
||
TREE_TYPE
(
arg
)
==
error_mark_node
||
decl_type
==
error_mark_node
)
||
decl_type
==
error_mark_node
)
...
@@ -11411,14 +11415,14 @@ check_default_argument (decl, arg)
...
@@ -11411,14 +11415,14 @@ check_default_argument (decl, arg)
return
error_mark_node
;
return
error_mark_node
;
/* [dcl.fct.default]
/* [dcl.fct.default]
A default argument expression is implicitly converted to the
A default argument expression is implicitly converted to the
parameter type. */
parameter type. */
if
(
!
TREE_TYPE
(
arg
)
if
(
!
TREE_TYPE
(
arg
)
||
!
can_convert_arg
(
decl_type
,
TREE_TYPE
(
arg
),
arg
))
||
!
can_convert_arg
(
decl_type
,
TREE_TYPE
(
arg
),
arg
))
{
{
if
(
decl
)
if
(
decl
)
cp_error
(
"default argument for `%#D' has type `%T'"
,
cp_error
(
"default argument for `%#D' has type `%T'"
,
decl
,
TREE_TYPE
(
arg
));
decl
,
TREE_TYPE
(
arg
));
else
else
cp_error
(
"default argument for parameter of type `%T' has type `%T'"
,
cp_error
(
"default argument for parameter of type `%T' has type `%T'"
,
...
@@ -11430,7 +11434,7 @@ check_default_argument (decl, arg)
...
@@ -11430,7 +11434,7 @@ check_default_argument (decl, arg)
/* [dcl.fct.default]
/* [dcl.fct.default]
Local variables shall not be used in default argument
Local variables shall not be used in default argument
expressions.
expressions.
The keyword `this' shall not be used in a default argument of a
The keyword `this' shall not be used in a default argument of a
member function. */
member function. */
...
@@ -11521,7 +11525,7 @@ grokparms (first_parm, funcdef_flag)
...
@@ -11521,7 +11525,7 @@ grokparms (first_parm, funcdef_flag)
chain
=
TREE_CHAIN
(
parm
);
chain
=
TREE_CHAIN
(
parm
);
/* @@ weak defense against parse errors. */
/* @@ weak defense against parse errors. */
if
(
TREE_CODE
(
decl
)
!=
VOID_TYPE
if
(
TREE_CODE
(
decl
)
!=
VOID_TYPE
&&
TREE_CODE
(
decl
)
!=
TREE_LIST
)
&&
TREE_CODE
(
decl
)
!=
TREE_LIST
)
{
{
/* Give various messages as the need arises. */
/* Give various messages as the need arises. */
...
@@ -11738,7 +11742,7 @@ grok_ctor_properties (ctype, decl)
...
@@ -11738,7 +11742,7 @@ grok_ctor_properties (ctype, decl)
A declaration of a constructor for a class X is ill-formed if its
A declaration of a constructor for a class X is ill-formed if its
first parameter is of type (optionally cv-qualified) X and either
first parameter is of type (optionally cv-qualified) X and either
there are no other parameters or else all other parameters have
there are no other parameters or else all other parameters have
default arguments.
default arguments.
We *don't* complain about member template instantiations that
We *don't* complain about member template instantiations that
have this form, though; they can occur as we try to decide what
have this form, though; they can occur as we try to decide what
...
@@ -11843,7 +11847,7 @@ grok_op_properties (decl, virtualp, friendp)
...
@@ -11843,7 +11847,7 @@ grok_op_properties (decl, virtualp, friendp)
doesn't look at the class declaration to find out if it's static. */
doesn't look at the class declaration to find out if it's static. */
if
(
methodp
)
if
(
methodp
)
revert_static_member_fn
(
&
decl
,
NULL
,
NULL
);
revert_static_member_fn
(
&
decl
,
NULL
,
NULL
);
/* Take care of function decl if we had syntax errors. */
/* Take care of function decl if we had syntax errors. */
if
(
argtypes
==
NULL_TREE
)
if
(
argtypes
==
NULL_TREE
)
TREE_TYPE
(
decl
)
TREE_TYPE
(
decl
)
...
@@ -11858,7 +11862,7 @@ grok_op_properties (decl, virtualp, friendp)
...
@@ -11858,7 +11862,7 @@ grok_op_properties (decl, virtualp, friendp)
{
{
if
(
methodp
)
if
(
methodp
)
revert_static_member_fn
(
&
decl
,
NULL
,
NULL
);
revert_static_member_fn
(
&
decl
,
NULL
,
NULL
);
if
(
argtypes
==
NULL_TREE
)
if
(
argtypes
==
NULL_TREE
)
TREE_TYPE
(
decl
)
TREE_TYPE
(
decl
)
=
build_function_type
(
void_type_node
,
=
build_function_type
(
void_type_node
,
...
@@ -11915,7 +11919,7 @@ grok_op_properties (decl, virtualp, friendp)
...
@@ -11915,7 +11919,7 @@ grok_op_properties (decl, virtualp, friendp)
;
;
}
}
}
}
if
(
name
==
ansi_opname
[(
int
)
CALL_EXPR
])
if
(
name
==
ansi_opname
[(
int
)
CALL_EXPR
])
return
;
/* No restrictions on args. */
return
;
/* No restrictions on args. */
...
@@ -11969,7 +11973,7 @@ grok_op_properties (decl, virtualp, friendp)
...
@@ -11969,7 +11973,7 @@ grok_op_properties (decl, virtualp, friendp)
{
{
/* 13.4.0.3 */
/* 13.4.0.3 */
cp_error
(
"ANSI C++ prohibits overloading operator ?:"
);
cp_error
(
"ANSI C++ prohibits overloading operator ?:"
);
}
}
else
if
(
ambi_op_p
(
name
))
else
if
(
ambi_op_p
(
name
))
{
{
if
(
list_length
(
argtypes
)
==
2
)
if
(
list_length
(
argtypes
)
==
2
)
...
@@ -12190,11 +12194,11 @@ xref_tag (code_type_node, name, globalize)
...
@@ -12190,11 +12194,11 @@ xref_tag (code_type_node, name, globalize)
}
}
else
else
ref
=
lookup_tag
(
code
,
name
,
b
,
0
);
ref
=
lookup_tag
(
code
,
name
,
b
,
0
);
if
(
!
ref
)
if
(
!
ref
)
{
{
/* Try finding it as a type declaration. If that wins,
/* Try finding it as a type declaration. If that wins,
use it. */
use it. */
ref
=
lookup_name
(
name
,
1
);
ref
=
lookup_name
(
name
,
1
);
if
(
ref
!=
NULL_TREE
if
(
ref
!=
NULL_TREE
...
@@ -12212,9 +12216,9 @@ xref_tag (code_type_node, name, globalize)
...
@@ -12212,9 +12216,9 @@ xref_tag (code_type_node, name, globalize)
ref
=
NULL_TREE
;
ref
=
NULL_TREE
;
}
}
if
(
ref
&&
current_class_type
if
(
ref
&&
current_class_type
&&
template_class_depth
(
current_class_type
)
&&
template_class_depth
(
current_class_type
)
&&
PROCESSING_REAL_TEMPLATE_DECL_P
())
&&
PROCESSING_REAL_TEMPLATE_DECL_P
())
{
{
/* Since GLOBALIZE is non-zero, we are not looking at a
/* Since GLOBALIZE is non-zero, we are not looking at a
definition of this tag. Since, in addition, we are currently
definition of this tag. Since, in addition, we are currently
...
@@ -12303,7 +12307,7 @@ xref_tag (code_type_node, name, globalize)
...
@@ -12303,7 +12307,7 @@ xref_tag (code_type_node, name, globalize)
else
else
{
{
/* If it no longer looks like a nested type, make sure it's
/* If it no longer looks like a nested type, make sure it's
in global scope.
in global scope.
If it is not an IDENTIFIER, this is not a declaration */
If it is not an IDENTIFIER, this is not a declaration */
if
(
b
->
namespace_p
&&
!
class_binding_level
if
(
b
->
namespace_p
&&
!
class_binding_level
&&
TREE_CODE
(
name
)
==
IDENTIFIER_NODE
&&
TREE_CODE
(
name
)
==
IDENTIFIER_NODE
...
@@ -12444,7 +12448,7 @@ xref_basetypes (code_type_node, name, ref, binfo)
...
@@ -12444,7 +12448,7 @@ xref_basetypes (code_type_node, name, ref, binfo)
}
}
if
(
TYPE_FOR_JAVA
(
basetype
)
if
(
TYPE_FOR_JAVA
(
basetype
)
&&
(
current_lang_stack
&&
(
current_lang_stack
==
&
VARRAY_TREE
(
current_lang_base
,
0
)))
==
&
VARRAY_TREE
(
current_lang_base
,
0
)))
TYPE_FOR_JAVA
(
ref
)
=
1
;
TYPE_FOR_JAVA
(
ref
)
=
1
;
...
@@ -12455,14 +12459,14 @@ xref_basetypes (code_type_node, name, ref, binfo)
...
@@ -12455,14 +12459,14 @@ xref_basetypes (code_type_node, name, ref, binfo)
derived classes. (Each BINFO record describing an
derived classes. (Each BINFO record describing an
individual inheritance contains flags which say what
individual inheritance contains flags which say what
the `accessibility' of that particular inheritance is.) */
the `accessibility' of that particular inheritance is.) */
base_binfo
base_binfo
=
make_binfo
(
integer_zero_node
,
basetype
,
=
make_binfo
(
integer_zero_node
,
basetype
,
CLASS_TYPE_P
(
basetype
)
CLASS_TYPE_P
(
basetype
)
?
TYPE_BINFO_VTABLE
(
basetype
)
:
NULL_TREE
,
?
TYPE_BINFO_VTABLE
(
basetype
)
:
NULL_TREE
,
CLASS_TYPE_P
(
basetype
)
CLASS_TYPE_P
(
basetype
)
?
TYPE_BINFO_VIRTUALS
(
basetype
)
:
NULL_TREE
);
?
TYPE_BINFO_VIRTUALS
(
basetype
)
:
NULL_TREE
);
TREE_VEC_ELT
(
binfos
,
i
)
=
base_binfo
;
TREE_VEC_ELT
(
binfos
,
i
)
=
base_binfo
;
TREE_VIA_PUBLIC
(
base_binfo
)
=
via_public
;
TREE_VIA_PUBLIC
(
base_binfo
)
=
via_public
;
TREE_VIA_PROTECTED
(
base_binfo
)
=
via_protected
;
TREE_VIA_PROTECTED
(
base_binfo
)
=
via_protected
;
...
@@ -12490,12 +12494,12 @@ xref_basetypes (code_type_node, name, ref, binfo)
...
@@ -12490,12 +12494,12 @@ xref_basetypes (code_type_node, name, ref, binfo)
TYPE_GETS_NEW
(
ref
)
|=
TYPE_GETS_NEW
(
basetype
);
TYPE_GETS_NEW
(
ref
)
|=
TYPE_GETS_NEW
(
basetype
);
TYPE_GETS_DELETE
(
ref
)
|=
TYPE_GETS_DELETE
(
basetype
);
TYPE_GETS_DELETE
(
ref
)
|=
TYPE_GETS_DELETE
(
basetype
);
/* If the base-class uses multiple inheritance, so do we. */
/* If the base-class uses multiple inheritance, so do we. */
TYPE_USES_MULTIPLE_INHERITANCE
(
ref
)
TYPE_USES_MULTIPLE_INHERITANCE
(
ref
)
|=
TYPE_USES_MULTIPLE_INHERITANCE
(
basetype
);
|=
TYPE_USES_MULTIPLE_INHERITANCE
(
basetype
);
/* Likewise, if converting to a base of the base may require
/* Likewise, if converting to a base of the base may require
code, then we may need to generate code to convert to a
code, then we may need to generate code to convert to a
base as well. */
base as well. */
TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P
(
ref
)
TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P
(
ref
)
|=
TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P
(
basetype
);
|=
TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P
(
basetype
);
}
}
...
@@ -12524,7 +12528,7 @@ xref_basetypes (code_type_node, name, ref, binfo)
...
@@ -12524,7 +12528,7 @@ xref_basetypes (code_type_node, name, ref, binfo)
bases. */
bases. */
get_vbase_types
(
ref
);
get_vbase_types
(
ref
);
}
}
/* Begin compiling the definition of an enumeration type.
/* Begin compiling the definition of an enumeration type.
NAME is its name (or null if anonymous).
NAME is its name (or null if anonymous).
...
@@ -12614,7 +12618,7 @@ finish_enum (enumtype)
...
@@ -12614,7 +12618,7 @@ finish_enum (enumtype)
reason to do that when processing_template_decl.
reason to do that when processing_template_decl.
And, if the expression is something like a
And, if the expression is something like a
TEMPLATE_PARM_INDEX or a CAST_EXPR doing so will
TEMPLATE_PARM_INDEX or a CAST_EXPR doing so will
wreak havoc on the intended type of the expression.
wreak havoc on the intended type of the expression.
Of course, there's also no point in trying to compute
Of course, there's also no point in trying to compute
minimum or maximum values if we're in a template. */
minimum or maximum values if we're in a template. */
...
@@ -12628,7 +12632,7 @@ finish_enum (enumtype)
...
@@ -12628,7 +12632,7 @@ finish_enum (enumtype)
minnode
=
value
;
minnode
=
value
;
}
}
if
(
processing_template_decl
)
if
(
processing_template_decl
)
/* If this is just a template, leave the CONST_DECL
/* If this is just a template, leave the CONST_DECL
alone. That way tsubst_copy will find CONST_DECLs for
alone. That way tsubst_copy will find CONST_DECLs for
CONST_DECLs, and not INTEGER_CSTs. */
CONST_DECLs, and not INTEGER_CSTs. */
...
@@ -12670,7 +12674,7 @@ finish_enum (enumtype)
...
@@ -12670,7 +12674,7 @@ finish_enum (enumtype)
if
(
flag_short_enums
||
(
precision
>
TYPE_PRECISION
(
integer_type_node
)))
if
(
flag_short_enums
||
(
precision
>
TYPE_PRECISION
(
integer_type_node
)))
/* Use the width of the narrowest normal C type which is wide
/* Use the width of the narrowest normal C type which is wide
enough. */
enough. */
TYPE_PRECISION
(
enumtype
)
=
TYPE_PRECISION
(
type_for_size
TYPE_PRECISION
(
enumtype
)
=
TYPE_PRECISION
(
type_for_size
(
precision
,
1
));
(
precision
,
1
));
else
else
...
@@ -12678,7 +12682,7 @@ finish_enum (enumtype)
...
@@ -12678,7 +12682,7 @@ finish_enum (enumtype)
TYPE_SIZE
(
enumtype
)
=
0
;
TYPE_SIZE
(
enumtype
)
=
0
;
layout_type
(
enumtype
);
layout_type
(
enumtype
);
/* Fix up all variant types of this enum type. */
/* Fix up all variant types of this enum type. */
for
(
tem
=
TYPE_MAIN_VARIANT
(
enumtype
);
tem
;
for
(
tem
=
TYPE_MAIN_VARIANT
(
enumtype
);
tem
;
tem
=
TYPE_NEXT_VARIANT
(
tem
))
tem
=
TYPE_NEXT_VARIANT
(
tem
))
...
@@ -12754,7 +12758,7 @@ build_enumerator (name, value, enumtype)
...
@@ -12754,7 +12758,7 @@ build_enumerator (name, value, enumtype)
prev_value
,
prev_value
,
integer_one_node
,
integer_one_node
,
PLUS_EXPR
);
PLUS_EXPR
);
if
(
tree_int_cst_lt
(
value
,
prev_value
))
if
(
tree_int_cst_lt
(
value
,
prev_value
))
cp_error
(
"overflow in enumeration values at `%D'"
,
name
);
cp_error
(
"overflow in enumeration values at `%D'"
,
name
);
}
}
...
@@ -12861,7 +12865,7 @@ check_function_type (decl)
...
@@ -12861,7 +12865,7 @@ check_function_type (decl)
TREE_TYPE
(
decl
)
TREE_TYPE
(
decl
)
=
build_function_type
(
void_type_node
,
=
build_function_type
(
void_type_node
,
TYPE_ARG_TYPES
(
TREE_TYPE
(
decl
)));
TYPE_ARG_TYPES
(
TREE_TYPE
(
decl
)));
TREE_TYPE
(
decl
)
TREE_TYPE
(
decl
)
=
build_exception_variant
(
fntype
,
=
build_exception_variant
(
fntype
,
TYPE_RAISES_EXCEPTIONS
(
fntype
));
TYPE_RAISES_EXCEPTIONS
(
fntype
));
}
}
...
@@ -12879,8 +12883,8 @@ check_function_type (decl)
...
@@ -12879,8 +12883,8 @@ check_function_type (decl)
process and that DECLSPECS should be ignored), SF_INCLASS_INLINE
process and that DECLSPECS should be ignored), SF_INCLASS_INLINE
indicating that the function is an inline defined in-class, and
indicating that the function is an inline defined in-class, and
SF_EXPAND indicating that we should generate RTL for this
SF_EXPAND indicating that we should generate RTL for this
function.
function.
This function creates a binding context for the function body
This function creates a binding context for the function body
as well as setting up the FUNCTION_DECL in current_function_decl.
as well as setting up the FUNCTION_DECL in current_function_decl.
...
@@ -12983,7 +12987,7 @@ start_function (declspecs, declarator, attrs, flags)
...
@@ -12983,7 +12987,7 @@ start_function (declspecs, declarator, attrs, flags)
}
}
}
}
}
}
/* Sometimes we don't notice that a function is a static member, and
/* Sometimes we don't notice that a function is a static member, and
build a METHOD_TYPE for it. Fix that up now. */
build a METHOD_TYPE for it. Fix that up now. */
if
(
ctype
!=
NULL_TREE
&&
DECL_STATIC_FUNCTION_P
(
decl1
)
if
(
ctype
!=
NULL_TREE
&&
DECL_STATIC_FUNCTION_P
(
decl1
)
...
@@ -13030,7 +13034,7 @@ start_function (declspecs, declarator, attrs, flags)
...
@@ -13030,7 +13034,7 @@ start_function (declspecs, declarator, attrs, flags)
#ifdef SET_DEFAULT_DECL_ATTRIBUTES
#ifdef SET_DEFAULT_DECL_ATTRIBUTES
SET_DEFAULT_DECL_ATTRIBUTES
(
decl1
,
attrs
);
SET_DEFAULT_DECL_ATTRIBUTES
(
decl1
,
attrs
);
#endif
#endif
/* This function exists in static storage.
/* This function exists in static storage.
(This does not mean `static' in the C sense!) */
(This does not mean `static' in the C sense!) */
TREE_STATIC
(
decl1
)
=
1
;
TREE_STATIC
(
decl1
)
=
1
;
...
@@ -13064,8 +13068,8 @@ start_function (declspecs, declarator, attrs, flags)
...
@@ -13064,8 +13068,8 @@ start_function (declspecs, declarator, attrs, flags)
{
{
DECL_RESULT
(
decl1
)
DECL_RESULT
(
decl1
)
=
build_decl
(
RESULT_DECL
,
0
,
TYPE_MAIN_VARIANT
(
restype
));
=
build_decl
(
RESULT_DECL
,
0
,
TYPE_MAIN_VARIANT
(
restype
));
c_apply_type_quals_to_decl
(
CP_TYPE_QUALS
(
restype
),
c_apply_type_quals_to_decl
(
CP_TYPE_QUALS
(
restype
),
DECL_RESULT
(
decl1
));
DECL_RESULT
(
decl1
));
}
}
}
}
else
else
...
@@ -13102,7 +13106,7 @@ start_function (declspecs, declarator, attrs, flags)
...
@@ -13102,7 +13106,7 @@ start_function (declspecs, declarator, attrs, flags)
if
(
!
processing_template_decl
&&
!
(
flags
&
SF_PRE_PARSED
))
if
(
!
processing_template_decl
&&
!
(
flags
&
SF_PRE_PARSED
))
{
{
/* A specialization is not used to guide overload resolution. */
/* A specialization is not used to guide overload resolution. */
if
((
flag_guiding_decls
if
((
flag_guiding_decls
||
!
DECL_TEMPLATE_SPECIALIZATION
(
decl1
))
||
!
DECL_TEMPLATE_SPECIALIZATION
(
decl1
))
&&
!
DECL_FUNCTION_MEMBER_P
(
decl1
))
&&
!
DECL_FUNCTION_MEMBER_P
(
decl1
))
decl1
=
pushdecl
(
decl1
);
decl1
=
pushdecl
(
decl1
);
...
@@ -13151,13 +13155,13 @@ start_function (declspecs, declarator, attrs, flags)
...
@@ -13151,13 +13155,13 @@ start_function (declspecs, declarator, attrs, flags)
never get us to that point. Here we keep the consistency
never get us to that point. Here we keep the consistency
between `current_class_type' and `current_class_ptr'. */
between `current_class_type' and `current_class_ptr'. */
tree
t
=
DECL_ARGUMENTS
(
decl1
);
tree
t
=
DECL_ARGUMENTS
(
decl1
);
my_friendly_assert
(
t
!=
NULL_TREE
&&
TREE_CODE
(
t
)
==
PARM_DECL
,
my_friendly_assert
(
t
!=
NULL_TREE
&&
TREE_CODE
(
t
)
==
PARM_DECL
,
162
);
162
);
my_friendly_assert
(
TREE_CODE
(
TREE_TYPE
(
t
))
==
POINTER_TYPE
,
my_friendly_assert
(
TREE_CODE
(
TREE_TYPE
(
t
))
==
POINTER_TYPE
,
19990811
);
19990811
);
cp_function_chain
->
x_current_class_ref
cp_function_chain
->
x_current_class_ref
=
build_indirect_ref
(
t
,
NULL_PTR
);
=
build_indirect_ref
(
t
,
NULL_PTR
);
cp_function_chain
->
x_current_class_ptr
=
t
;
cp_function_chain
->
x_current_class_ptr
=
t
;
...
@@ -13180,7 +13184,7 @@ start_function (declspecs, declarator, attrs, flags)
...
@@ -13180,7 +13184,7 @@ start_function (declspecs, declarator, attrs, flags)
if
(
DECL_NOT_REALLY_EXTERN
(
decl1
))
if
(
DECL_NOT_REALLY_EXTERN
(
decl1
))
DECL_EXTERNAL
(
decl1
)
=
0
;
DECL_EXTERNAL
(
decl1
)
=
0
;
if
(
ctx
!=
NULL_TREE
&&
DECL_THIS_INLINE
(
ctx
)
if
(
ctx
!=
NULL_TREE
&&
DECL_THIS_INLINE
(
ctx
)
&&
TREE_PUBLIC
(
ctx
))
&&
TREE_PUBLIC
(
ctx
))
/* This is a function in a local class in an extern inline
/* This is a function in a local class in an extern inline
function. */
function. */
...
@@ -13246,7 +13250,7 @@ start_function (declspecs, declarator, attrs, flags)
...
@@ -13246,7 +13250,7 @@ start_function (declspecs, declarator, attrs, flags)
if
(
attrs
)
if
(
attrs
)
cplus_decl_attributes
(
decl1
,
NULL_TREE
,
attrs
);
cplus_decl_attributes
(
decl1
,
NULL_TREE
,
attrs
);
if
(
!
building_stmt_tree
())
if
(
!
building_stmt_tree
())
{
{
GNU_xref_function
(
decl1
,
current_function_parms
);
GNU_xref_function
(
decl1
,
current_function_parms
);
...
@@ -13353,7 +13357,7 @@ store_parm_decls ()
...
@@ -13353,7 +13357,7 @@ store_parm_decls ()
if
(
doing_semantic_analysis_p
())
if
(
doing_semantic_analysis_p
())
{
{
tree
cleanup
;
tree
cleanup
;
if
(
DECL_NAME
(
parm
)
==
NULL_TREE
if
(
DECL_NAME
(
parm
)
==
NULL_TREE
||
TREE_CODE
(
parm
)
!=
VOID_TYPE
)
||
TREE_CODE
(
parm
)
!=
VOID_TYPE
)
pushdecl
(
parm
);
pushdecl
(
parm
);
...
@@ -13361,7 +13365,7 @@ store_parm_decls ()
...
@@ -13361,7 +13365,7 @@ store_parm_decls ()
cp_error
(
"parameter `%D' declared void"
,
parm
);
cp_error
(
"parameter `%D' declared void"
,
parm
);
cleanup
=
maybe_build_cleanup
(
parm
);
cleanup
=
maybe_build_cleanup
(
parm
);
if
(
cleanup
)
if
(
cleanup
)
cleanups
=
tree_cons
(
parm
,
cleanup
,
cleanups
);
cleanups
=
tree_cons
(
parm
,
cleanup
,
cleanups
);
}
}
...
@@ -13414,7 +13418,7 @@ store_parm_decls ()
...
@@ -13414,7 +13418,7 @@ store_parm_decls ()
should not be called before the parm can be used. */
should not be called before the parm can be used. */
while
(
cleanups
)
while
(
cleanups
)
{
{
finish_decl_cleanup
(
TREE_PURPOSE
(
cleanups
),
finish_decl_cleanup
(
TREE_PURPOSE
(
cleanups
),
TREE_VALUE
(
cleanups
));
TREE_VALUE
(
cleanups
));
cleanups
=
TREE_CHAIN
(
cleanups
);
cleanups
=
TREE_CHAIN
(
cleanups
);
}
}
...
@@ -13430,8 +13434,8 @@ store_parm_decls ()
...
@@ -13430,8 +13434,8 @@ store_parm_decls ()
}
}
/* Do the starting of the exception specifications, if we have any. */
/* Do the starting of the exception specifications, if we have any. */
if
(
flag_exceptions
&&
!
processing_template_decl
if
(
flag_exceptions
&&
!
processing_template_decl
&&
building_stmt_tree
()
&&
building_stmt_tree
()
&&
TYPE_RAISES_EXCEPTIONS
(
TREE_TYPE
(
current_function_decl
)))
&&
TYPE_RAISES_EXCEPTIONS
(
TREE_TYPE
(
current_function_decl
)))
current_eh_spec_try_block
=
expand_start_eh_spec
();
current_eh_spec_try_block
=
expand_start_eh_spec
();
}
}
...
@@ -13474,9 +13478,9 @@ save_function_data (decl)
...
@@ -13474,9 +13478,9 @@ save_function_data (decl)
get it back when we really expand this function. */
get it back when we really expand this function. */
my_friendly_assert
(
!
DECL_PENDING_INLINE_P
(
decl
),
my_friendly_assert
(
!
DECL_PENDING_INLINE_P
(
decl
),
19990908
);
19990908
);
/* Make a copy. */
/* Make a copy. */
f
=
((
struct
language_function
*
)
f
=
((
struct
language_function
*
)
xmalloc
(
sizeof
(
struct
language_function
)));
xmalloc
(
sizeof
(
struct
language_function
)));
bcopy
((
char
*
)
cp_function_chain
,
(
char
*
)
f
,
bcopy
((
char
*
)
cp_function_chain
,
(
char
*
)
f
,
sizeof
(
struct
language_function
));
sizeof
(
struct
language_function
));
...
@@ -13555,9 +13559,9 @@ finish_destructor_body ()
...
@@ -13555,9 +13559,9 @@ finish_destructor_body ()
in_charge
=
current_in_charge_parm
;
in_charge
=
current_in_charge_parm
;
exprstmt
=
build_delete
(
current_class_type
,
exprstmt
=
build_delete
(
current_class_type
,
current_class_ref
,
current_class_ref
,
in_charge
,
in_charge
,
LOOKUP_NONVIRTUAL
|
LOOKUP_DESTRUCTOR
|
LOOKUP_NORMAL
,
LOOKUP_NONVIRTUAL
|
LOOKUP_DESTRUCTOR
|
LOOKUP_NORMAL
,
0
);
0
);
if
(
exprstmt
!=
error_mark_node
if
(
exprstmt
!=
error_mark_node
...
@@ -13576,7 +13580,7 @@ finish_destructor_body ()
...
@@ -13576,7 +13580,7 @@ finish_destructor_body ()
tree
vbases
=
nreverse
(
copy_list
(
CLASSTYPE_VBASECLASSES
(
current_class_type
)));
tree
vbases
=
nreverse
(
copy_list
(
CLASSTYPE_VBASECLASSES
(
current_class_type
)));
tree
if_stmt
=
begin_if_stmt
();
tree
if_stmt
=
begin_if_stmt
();
finish_if_stmt_cond
(
build
(
BIT_AND_EXPR
,
integer_type_node
,
finish_if_stmt_cond
(
build
(
BIT_AND_EXPR
,
integer_type_node
,
current_in_charge_parm
,
current_in_charge_parm
,
integer_two_node
),
integer_two_node
),
if_stmt
);
if_stmt
);
...
@@ -13599,16 +13603,16 @@ finish_destructor_body ()
...
@@ -13599,16 +13603,16 @@ finish_destructor_body ()
finish_if_stmt
();
finish_if_stmt
();
}
}
}
}
virtual_size
=
c_sizeof
(
current_class_type
);
virtual_size
=
c_sizeof
(
current_class_type
);
/* At the end, call delete if that's what's requested. */
/* At the end, call delete if that's what's requested. */
/* FDIS sez: At the point of definition of a virtual destructor
/* FDIS sez: At the point of definition of a virtual destructor
(including an implicit definition), non-placement operator delete
(including an implicit definition), non-placement operator delete
shall be looked up in the scope of the destructor's class and if
shall be looked up in the scope of the destructor's class and if
found shall be accessible and unambiguous.
found shall be accessible and unambiguous.
This is somewhat unclear, but I take it to mean that if the class
This is somewhat unclear, but I take it to mean that if the class
only defines placement deletes we don't do anything here. So we
only defines placement deletes we don't do anything here. So we
pass LOOKUP_SPECULATIVELY; delete_sanity will complain for us if
pass LOOKUP_SPECULATIVELY; delete_sanity will complain for us if
...
@@ -13643,8 +13647,8 @@ finish_destructor_body ()
...
@@ -13643,8 +13647,8 @@ finish_destructor_body ()
This is called after parsing the body of the function definition.
This is called after parsing the body of the function definition.
LINENO is the current line number.
LINENO is the current line number.
FLAGS is a bitwise or of the following values:
FLAGS is a bitwise or of the following values:
1 - CALL_POPLEVEL
1 - CALL_POPLEVEL
An extra call to poplevel (and expand_end_bindings) must be
An extra call to poplevel (and expand_end_bindings) must be
made to take care of the binding contour for the base
made to take care of the binding contour for the base
initializers. This is only relevant for constructors.
initializers. This is only relevant for constructors.
...
@@ -13709,7 +13713,7 @@ finish_function (lineno, flags)
...
@@ -13709,7 +13713,7 @@ finish_function (lineno, flags)
/* Finish dealing with exception specifiers. */
/* Finish dealing with exception specifiers. */
if
(
flag_exceptions
&&
!
processing_template_decl
if
(
flag_exceptions
&&
!
processing_template_decl
&&
TYPE_RAISES_EXCEPTIONS
(
TREE_TYPE
(
current_function_decl
)))
&&
TYPE_RAISES_EXCEPTIONS
(
TREE_TYPE
(
current_function_decl
)))
expand_end_eh_spec
(
TYPE_RAISES_EXCEPTIONS
expand_end_eh_spec
(
TYPE_RAISES_EXCEPTIONS
(
TREE_TYPE
(
current_function_decl
)),
(
TREE_TYPE
(
current_function_decl
)),
current_eh_spec_try_block
);
current_eh_spec_try_block
);
}
}
...
@@ -13760,7 +13764,7 @@ finish_function (lineno, flags)
...
@@ -13760,7 +13764,7 @@ finish_function (lineno, flags)
/* If this function is supposed to return a value, ensure that
/* If this function is supposed to return a value, ensure that
we do not fall into the cleanups by mistake. The end of our
we do not fall into the cleanups by mistake. The end of our
function will look like this:
function will look like this:
user code (may have return stmt somewhere)
user code (may have return stmt somewhere)
goto no_return_label
goto no_return_label
cleanup_label:
cleanup_label:
...
@@ -13770,7 +13774,7 @@ finish_function (lineno, flags)
...
@@ -13770,7 +13774,7 @@ finish_function (lineno, flags)
NOTE_INSN_FUNCTION_END
NOTE_INSN_FUNCTION_END
return_label:
return_label:
things for return
things for return
If the user omits a return stmt in the USER CODE section, we
If the user omits a return stmt in the USER CODE section, we
will have a control path which reaches NOTE_INSN_FUNCTION_END.
will have a control path which reaches NOTE_INSN_FUNCTION_END.
Otherwise, we won't. */
Otherwise, we won't. */
...
@@ -13825,7 +13829,7 @@ finish_function (lineno, flags)
...
@@ -13825,7 +13829,7 @@ finish_function (lineno, flags)
maybe_end_member_template_processing decides to pop all the
maybe_end_member_template_processing decides to pop all the
template parameters. */
template parameters. */
expand_p
=
!
building_stmt_tree
();
expand_p
=
!
building_stmt_tree
();
/* If we're saving up tree structure, tie off the function now. */
/* If we're saving up tree structure, tie off the function now. */
if
(
!
expand_p
)
if
(
!
expand_p
)
finish_stmt_tree
(
&
DECL_SAVED_TREE
(
fndecl
));
finish_stmt_tree
(
&
DECL_SAVED_TREE
(
fndecl
));
...
@@ -14067,7 +14071,7 @@ start_method (declspecs, declarator, attrlist)
...
@@ -14067,7 +14071,7 @@ start_method (declspecs, declarator, attrlist)
{
{
if
(
IDENTIFIER_ERROR_LOCUS
(
DECL_ASSEMBLER_NAME
(
fndecl
))
!=
current_class_type
)
if
(
IDENTIFIER_ERROR_LOCUS
(
DECL_ASSEMBLER_NAME
(
fndecl
))
!=
current_class_type
)
{
{
if
(
DECL_CONTEXT
(
fndecl
)
if
(
DECL_CONTEXT
(
fndecl
)
&&
TREE_CODE
(
DECL_CONTEXT
(
fndecl
))
!=
NAMESPACE_DECL
)
&&
TREE_CODE
(
DECL_CONTEXT
(
fndecl
))
!=
NAMESPACE_DECL
)
cp_error
(
"`%D' is already defined in class %s"
,
fndecl
,
cp_error
(
"`%D' is already defined in class %s"
,
fndecl
,
TYPE_NAME_STRING
(
DECL_CONTEXT
(
fndecl
)));
TYPE_NAME_STRING
(
DECL_CONTEXT
(
fndecl
)));
...
@@ -14114,7 +14118,7 @@ start_method (declspecs, declarator, attrlist)
...
@@ -14114,7 +14118,7 @@ start_method (declspecs, declarator, attrlist)
/* Make a place for the parms */
/* Make a place for the parms */
pushlevel
(
0
);
pushlevel
(
0
);
current_binding_level
->
parm_flag
=
1
;
current_binding_level
->
parm_flag
=
1
;
DECL_IN_AGGR_P
(
fndecl
)
=
1
;
DECL_IN_AGGR_P
(
fndecl
)
=
1
;
return
fndecl
;
return
fndecl
;
}
}
...
@@ -14307,7 +14311,7 @@ cplus_expand_expr_stmt (exp)
...
@@ -14307,7 +14311,7 @@ cplus_expand_expr_stmt (exp)
{
{
if
(
stmts_are_full_exprs_p
)
if
(
stmts_are_full_exprs_p
)
exp
=
convert_to_void
(
exp
,
"statement"
);
exp
=
convert_to_void
(
exp
,
"statement"
);
#if 0
#if 0
/* We should do this eventually, but right now this causes regex.o from
/* We should do this eventually, but right now this causes regex.o from
libg++ to miscompile, and tString to core dump. */
libg++ to miscompile, and tString to core dump. */
...
@@ -14347,9 +14351,9 @@ revert_static_member_fn (decl, fn, argtypes)
...
@@ -14347,9 +14351,9 @@ revert_static_member_fn (decl, fn, argtypes)
tree
function
=
fn
?
*
fn
:
TREE_TYPE
(
*
decl
);
tree
function
=
fn
?
*
fn
:
TREE_TYPE
(
*
decl
);
tree
args
=
argtypes
?
*
argtypes
:
TYPE_ARG_TYPES
(
function
);
tree
args
=
argtypes
?
*
argtypes
:
TYPE_ARG_TYPES
(
function
);
if
(
CP_TYPE_QUALS
(
TREE_TYPE
(
TREE_VALUE
(
args
)))
if
(
CP_TYPE_QUALS
(
TREE_TYPE
(
TREE_VALUE
(
args
)))
!=
TYPE_UNQUALIFIED
)
!=
TYPE_UNQUALIFIED
)
cp_error
(
"static member function `%#D' declared with type qualifiers"
,
cp_error
(
"static member function `%#D' declared with type qualifiers"
,
*
decl
);
*
decl
);
args
=
TREE_CHAIN
(
args
);
args
=
TREE_CHAIN
(
args
);
...
@@ -14367,15 +14371,15 @@ revert_static_member_fn (decl, fn, argtypes)
...
@@ -14367,15 +14371,15 @@ revert_static_member_fn (decl, fn, argtypes)
*
argtypes
=
args
;
*
argtypes
=
args
;
}
}
/* Initialize the variables used during compilation of a C++
/* Initialize the variables used during compilation of a C++
function. */
function. */
static
void
static
void
push_cp_function_context
(
f
)
push_cp_function_context
(
f
)
struct
function
*
f
;
struct
function
*
f
;
{
{
struct
language_function
*
p
struct
language_function
*
p
=
((
struct
language_function
*
)
=
((
struct
language_function
*
)
xcalloc
(
1
,
sizeof
(
struct
language_function
)));
xcalloc
(
1
,
sizeof
(
struct
language_function
)));
f
->
language
=
p
;
f
->
language
=
p
;
...
@@ -14513,7 +14517,7 @@ lang_mark_tree (t)
...
@@ -14513,7 +14517,7 @@ lang_mark_tree (t)
{
{
struct
lang_type
*
lt
=
TYPE_LANG_SPECIFIC
(
t
);
struct
lang_type
*
lt
=
TYPE_LANG_SPECIFIC
(
t
);
if
(
lt
&&
!
(
TREE_CODE
(
t
)
==
POINTER_TYPE
if
(
lt
&&
!
(
TREE_CODE
(
t
)
==
POINTER_TYPE
&&
TREE_CODE
(
TREE_TYPE
(
t
))
==
METHOD_TYPE
))
&&
TREE_CODE
(
TREE_TYPE
(
t
))
==
METHOD_TYPE
))
{
{
ggc_mark
(
lt
);
ggc_mark
(
lt
);
...
@@ -14535,4 +14539,3 @@ lang_mark_tree (t)
...
@@ -14535,4 +14539,3 @@ lang_mark_tree (t)
ggc_mark_tree
((
tree
)
lt
);
ggc_mark_tree
((
tree
)
lt
);
}
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment