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
cffa8729
Commit
cffa8729
authored
Feb 20, 1996
by
Mike Stump
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
82nd Cygnus<->FSF merge
From-SVN: r11328
parent
1144563f
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
374 additions
and
232 deletions
+374
-232
gcc/cp/ChangeLog
+100
-1
gcc/cp/class.c
+26
-9
gcc/cp/cp-tree.def
+4
-0
gcc/cp/cp-tree.h
+8
-7
gcc/cp/decl.c
+93
-79
gcc/cp/decl2.c
+30
-4
gcc/cp/error.c
+7
-0
gcc/cp/expr.c
+0
-13
gcc/cp/gxxint.texi
+9
-9
gcc/cp/init.c
+6
-76
gcc/cp/parse.y
+56
-20
gcc/cp/search.c
+4
-4
gcc/cp/typeck.c
+31
-10
No files found.
gcc/cp/ChangeLog
View file @
cffa8729
Thu Feb 15 18:44:42 1996 Mike Stump <mrs@cygnus.com>
* decl.c (cp_finish_decl): Delay emitting the debug information for
a typedef that has been installed as the canonical typedef, if the
type has not yet been defined.
Thu Feb 15 09:39:08 1996 Jason Merrill <jason@yorick.cygnus.com>
* decl2.c (grokfield): Still call pop_nested_class for access decls.
Wed Feb 14 17:30:04 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
* decl.c (lookup_label): Call label_rtx.
* decl.c (make_binding_level): New function.
(pushlevel, pushlevel_class): Call it instead of explicit
duplicate calls to xmalloc.
* decl.c (init_decl_processing): Delete useless build_pointer_type
call.
* decl.c (float_ftype_float, ldouble_ftype_ldouble): Add definitions.
(sizet_ftype_string): Delete variable.
(init_decl_processing): Add built-in functions fabsf, fabsl,
sqrtf, sqrtl, sinf, sin, sinl, cosf, cos, cosl. New local
variable strlen_ftype, used for strlen.
Wed Feb 14 16:21:25 1996 Jason Merrill <jason@yorick.cygnus.com>
* decl.c (push_to_top_level): Start from current_binding_level
again for now; the stl hacks depend on g++ being broken in this
way, and it'll be fixed in the template rewrite.
* tree.def: Add USING_DECL.
* decl2.c (do_class_using_decl): Implement.
(grokfield): Pass access decls off to do_class_using_decl instead of
grokdeclarator.
* error.c (dump_decl): Handle USING_DECLs.
* decl.c (grokdeclarator): Remove code for handling access decls.
* class.c (finish_struct_1): Adjust accordingly, treat using-decls
as access decls for now.
(finish_struct): Don't check USING_DECLs for other uses of the name.
* search.c (get_matching_virtual): Use cp_error_at.
Wed Feb 14 10:36:58 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
* typeck.c (comptypes): Default COMP_TYPE_ATTRIBUTES to 1, to
match c-typeck.c.
(self_promoting_args_p): Move the check that TYPE is non-nil
before trying to look at its main variant.
(unsigned_type, signed_type): Add checking of DI/SI/HI/QI nodes.
* cp-tree.h (DECL_WAITING_FRIENDS, SET_DECL_WAITING_FRIENDS):
Delete macros.
* init.c (xref_friend, embrace_waiting_friends): Delete functions.
(do_friend): Delete call to xref_friend.
* class.c (finish_struct_1): Delete call to embrace_waiting_friends.
* typeck.c (convert_sequence): #if 0 unused function.
* cp-tree.h (DECL_IN_MEMORY_P): New macro w/ the check that used to
be in decl_in_memory_p.
(decl_in_memory_p): Delete decl.
* expr.c (decl_in_memory_p): Delete fn.
* typeck.c (mark_addressable): Use DECL_IN_MEMORY_P.
* decl.c (cp_finish_decl): Use DECL_IN_MEMORY_P.
Tue Feb 13 12:51:21 1996 Jason Merrill <jason@yorick.cygnus.com>
* class.c (finish_struct_1): Check for a pure-specifier on a
non-virtual function here.
* decl2.c (grok_function_init): Don't check whether the function
is virtual here.
(grokfield): Don't call check_for_override here.
* decl.c (push_to_top_level): Start from inner_binding_level,
check class_shadowed in class levels.
Mon Feb 12 17:46:59 1996 Mike Stump <mrs@cygnus.com>
* decl.c (resume_level): Ignore things that don't have names, instead
of core dumping.
Mon Feb 12 15:47:44 1996 Brendan Kehoe <brendan@lisa.cygnus.com>
* decl2.c (grokfield): Set DECL_VINDEX properly for FUNCTION_DECLs.
Sat Feb 10 17:59:45 1996 Jason Merrill <jason@yorick.cygnus.com>
* class.c (finish_struct_1): Set DECL_VINDEX properly on a
synthesized dtor.
* parse.y (complete_type_name): Bind global_scope earlier.
(complex_type_name): Ditto.
(qualified_type_name): Remove.
Thu Feb 8 15:15:14 1996 Jason Merrill <jason@yorick.cygnus.com>
* decl.c (grokfndecl): Move code that looks for virtuals in base
classes...
* class.c (
fixup_virtual
): ... to a new function.
* class.c (
check_for_override
): ... to a new function.
(finish_struct_1): Call it.
* cp-tree.h: Declare warn_sign_compare.
...
...
gcc/cp/class.c
View file @
cffa8729
...
...
@@ -2758,7 +2758,7 @@ mark_overriders (fndecl, base_fndecls)
mark this field as being virtual as well. */
void
fixup_virtual
(
decl
,
ctype
)
check_for_override
(
decl
,
ctype
)
tree
decl
,
ctype
;
{
tree
binfos
=
BINFO_BASETYPES
(
TYPE_BINFO
(
ctype
));
...
...
@@ -3177,7 +3177,9 @@ finish_struct_1 (t, attributes, warn_anon)
DECL_SAVED_INSNS
(
x
)
=
NULL_RTX
;
DECL_FIELD_SIZE
(
x
)
=
0
;
fixup_virtual
(
x
,
t
);
check_for_override
(
x
,
t
);
if
(
DECL_ABSTRACT_VIRTUAL_P
(
x
)
&&
!
DECL_VINDEX
(
x
))
cp_error_at
(
"initializer specified for non-virtual method `%D'"
,
x
);
/* The name of the field is the original field name
Save this in auxiliary field for later overloading. */
...
...
@@ -3198,19 +3200,36 @@ finish_struct_1 (t, attributes, warn_anon)
GNU_xref_member
(
current_class_name
,
x
);
/* Handle access declarations. */
if
(
DECL_NAME
(
x
)
&&
TREE_CODE
(
DECL_NAME
(
x
))
==
SCOPE_REF
)
if
(
TREE_CODE
(
x
)
==
USING_DECL
)
{
tree
fdecl
=
TREE_OPERAND
(
DECL_NAME
(
x
),
1
);
tree
ctype
=
DECL_INITIAL
(
x
);
tree
sname
=
DECL_NAME
(
x
);
tree
access
=
TREE_PRIVATE
(
x
)
?
access_private_node
:
TREE_PROTECTED
(
x
)
?
access_protected_node
:
access_public_node
;
tree
fdecl
,
binfo
;
if
(
last_x
)
TREE_CHAIN
(
last_x
)
=
TREE_CHAIN
(
x
);
else
fields
=
TREE_CHAIN
(
x
);
access_decls
=
tree_cons
(
access
,
fdecl
,
access_decls
);
binfo
=
binfo_or_else
(
ctype
,
t
);
if
(
!
binfo
)
continue
;
if
(
sname
==
constructor_name
(
ctype
)
||
sname
==
constructor_name_full
(
ctype
))
cp_error_at
(
"using-declaration for constructor"
,
x
);
fdecl
=
lookup_field
(
binfo
,
sname
,
0
,
0
);
if
(
!
fdecl
)
fdecl
=
lookup_fnfields
(
binfo
,
sname
,
0
);
if
(
fdecl
)
access_decls
=
tree_cons
(
access
,
fdecl
,
access_decls
);
else
cp_error_at
(
"no members matching `%D' in `%#T'"
,
x
,
ctype
);
continue
;
}
...
...
@@ -3529,6 +3548,7 @@ finish_struct_1 (t, attributes, warn_anon)
{
/* Here we must cons up a destructor on the fly. */
tree
dtor
=
cons_up_default_function
(
t
,
name
,
needs_virtual_dtor
!=
0
);
check_for_override
(
dtor
,
t
);
/* If we couldn't make it work, then pretend we didn't need it. */
if
(
dtor
==
void_type_node
)
...
...
@@ -4125,9 +4145,6 @@ finish_struct_1 (t, attributes, warn_anon)
else
if
(
TYPE_NEEDS_CONSTRUCTING
(
t
))
build_class_init_list
(
t
);
if
(
!
IS_SIGNATURE
(
t
))
embrace_waiting_friends
(
t
);
/* Write out inline function definitions. */
do_inline_function_hair
(
t
,
CLASSTYPE_INLINE_FRIENDS
(
t
));
CLASSTYPE_INLINE_FRIENDS
(
t
)
=
0
;
...
...
@@ -4289,7 +4306,7 @@ finish_struct (t, list_of_fieldlists, attributes, warn_anon)
/* Check for inconsistent use of this name in the class body.
Enums, types and static vars have already been checked. */
if
(
TREE_CODE
(
x
)
!=
TYPE_DECL
if
(
TREE_CODE
(
x
)
!=
TYPE_DECL
&&
TREE_CODE
(
x
)
!=
USING_DECL
&&
TREE_CODE
(
x
)
!=
CONST_DECL
&&
TREE_CODE
(
x
)
!=
VAR_DECL
)
{
tree
name
=
DECL_NAME
(
x
);
...
...
gcc/cp/cp-tree.def
View file @
cffa8729
...
...
@@ -114,3 +114,7 @@ DEFTREECODE (THUNK_DECL, "thunk_decl", "d", 0)
/* A namespace declaration. */
DEFTREECODE (NAMESPACE_DECL, "namespace_decl", "d", 0)
/* A using declaration. DECL_INITIAL contains the specified scope.
This is not an alias, but is later expanded into multiple aliases. */
DEFTREECODE (USING_DECL, "using_decl", "d", 0)
gcc/cp/cp-tree.h
View file @
cffa8729
...
...
@@ -973,6 +973,14 @@ struct lang_decl
#define TREE_READONLY_DECL_P(NODE) \
(TREE_READONLY (NODE) && TREE_CODE_CLASS (TREE_CODE (NODE)) == 'd')
/* Non-zero iff DECL is memory-based. The DECL_RTL of
certain const variables might be a CONST_INT, or a REG
in some cases. We cannot use `memory_operand' as a test
here because on most RISC machines, a variable's address
is not, by itself, a legitimate address. */
#define DECL_IN_MEMORY_P(NODE) \
(DECL_RTL (NODE) != NULL_RTX && GET_CODE (DECL_RTL (NODE)) == MEM)
/* For FUNCTION_DECLs: return the language in which this decl
was declared. */
#define DECL_LANGUAGE(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.language)
...
...
@@ -1302,12 +1310,6 @@ extern int flag_new_for_scope;
/* C++: all of these are overloaded! These apply only to TYPE_DECLs. */
#define DECL_FRIENDLIST(NODE) (DECL_INITIAL (NODE))
#if 0
#define DECL_UNDEFINED_FRIENDS(NODE) ((NODE)->decl.result)
#endif
#define DECL_WAITING_FRIENDS(NODE) ((tree)(NODE)->decl.rtl)
#define SET_DECL_WAITING_FRIENDS(NODE,VALUE) \
((NODE)->decl.rtl=(struct rtx_def*)VALUE)
/* The DECL_ACCESS is used to record under which context
special access rules apply. */
...
...
@@ -2124,7 +2126,6 @@ extern tree start_anon_func PROTO((void));
/* skip cplus_expand_expr */
extern
void
init_cplus_expand
PROTO
((
void
));
extern
void
fixup_result_decl
PROTO
((
tree
,
struct
rtx_def
*
));
extern
int
decl_in_memory_p
PROTO
((
tree
));
extern
tree
unsave_expr_now
PROTO
((
tree
));
/* in rtti.c */
...
...
gcc/cp/decl.c
View file @
cffa8729
...
...
@@ -220,6 +220,8 @@ tree default_function_type;
tree
double_ftype_double
,
double_ftype_double_double
;
tree
int_ftype_int
,
long_ftype_long
;
tree
float_ftype_float
;
tree
ldouble_ftype_ldouble
;
/* Function type `void (void *, void *, int)' and similar ones. */
...
...
@@ -228,9 +230,6 @@ tree void_ftype_ptr_ptr_int, int_ftype_ptr_ptr_int, void_ftype_ptr_int_int;
/* Function type `char *(char *, char *)' and similar ones */
tree
string_ftype_ptr_ptr
,
int_ftype_string_string
;
/* Function type `size_t (const char *)' */
tree
sizet_ftype_string
;
/* Function type `int (const void *, const void *, size_t)' */
tree
int_ftype_cptr_cptr_sizet
;
...
...
@@ -796,6 +795,16 @@ resume_binding_level (b)
#endif
/* defined(DEBUG_CP_BINDING_LEVELS) */
}
/* Create a new `struct binding_level'. */
static
struct
binding_level
*
make_binding_level
()
{
/* NOSTRICT */
return
(
struct
binding_level
*
)
xmalloc
(
sizeof
(
struct
binding_level
));
}
/* Nonzero if we are currently in the global binding level. */
int
...
...
@@ -924,9 +933,9 @@ pushlevel (tag_transparent)
}
else
{
/* Create a new `struct binding_level'. */
newlevel
=
(
struct
binding_level
*
)
xmalloc
(
sizeof
(
struct
binding_level
));
newlevel
=
make_binding_level
();
}
push_binding_level
(
newlevel
,
tag_transparent
,
keep_next_level_flag
);
GNU_xref_start_scope
((
HOST_WIDE_INT
)
newlevel
);
keep_next_level_flag
=
0
;
...
...
@@ -1283,8 +1292,11 @@ resume_level (b)
for
(
link
=
decls
;
link
;
link
=
TREE_CHAIN
(
link
))
{
if
(
DECL_NAME
(
link
)
!=
NULL_TREE
)
IDENTIFIER_LOCAL_VALUE
(
DECL_NAME
(
link
))
=
link
;
/* If it doesn't have a name, there is nothing left to do with it. */
if
(
DECL_NAME
(
link
)
==
NULL_TREE
)
continue
;
IDENTIFIER_LOCAL_VALUE
(
DECL_NAME
(
link
))
=
link
;
/* If this is a TYPE_DECL, push it into the type value slot. */
if
(
TREE_CODE
(
link
)
==
TYPE_DECL
)
...
...
@@ -1366,8 +1378,7 @@ pushlevel_class ()
}
else
{
/* Create a new `struct binding_level'. */
newlevel
=
(
struct
binding_level
*
)
xmalloc
(
sizeof
(
struct
binding_level
));
newlevel
=
make_binding_level
();
}
#if defined(DEBUG_CP_BINDING_LEVELS)
...
...
@@ -1818,10 +1829,10 @@ push_to_top_level ()
continue
;
old_bindings
=
store_bindings
(
b
->
names
,
old_bindings
);
/* We also need to check
type
_shadowed to save class-level type
/* We also need to check
class
_shadowed to save class-level type
bindings, since pushclass doesn't fill in b->names. */
if
(
b
->
parm_flag
==
2
)
old_bindings
=
store_bindings
(
b
->
type
_shadowed
,
old_bindings
);
old_bindings
=
store_bindings
(
b
->
class
_shadowed
,
old_bindings
);
/* Unwind type-value slots back to top level. */
for
(
t
=
b
->
type_shadowed
;
t
;
t
=
TREE_CHAIN
(
t
))
...
...
@@ -3754,6 +3765,9 @@ lookup_label (id)
decl
=
build_decl
(
LABEL_DECL
,
id
,
void_type_node
);
/* Make sure every label has an rtx. */
label_rtx
(
decl
);
/* A label not explicitly declared must be local to where it's ref'd. */
DECL_CONTEXT
(
decl
)
=
current_function_decl
;
...
...
@@ -4016,8 +4030,8 @@ storetags (tags)
static
tree
lookup_tag
(
form
,
name
,
binding_level
,
thislevel_only
)
enum
tree_code
form
;
struct
binding_level
*
binding_level
;
tree
name
;
struct
binding_level
*
binding_level
;
int
thislevel_only
;
{
register
struct
binding_level
*
level
;
...
...
@@ -4561,12 +4575,12 @@ void
init_decl_processing
()
{
tree
decl
;
register
tree
endlink
,
int_endlink
,
double_endlink
,
ptr_endlink
;
register
tree
endlink
,
int_endlink
,
double_endlink
,
ptr_endlink
,
float_endlink
;
tree
fields
[
20
];
/* Either char* or void*. */
tree
traditional_ptr_type_node
;
/* Data type of memcpy. */
tree
memcpy_ftype
;
tree
memcpy_ftype
,
strlen_ftype
;
int
wchar_type_size
;
tree
temp
;
tree
array_domain_type
;
...
...
@@ -4810,7 +4824,6 @@ init_decl_processing ()
default_function_type
=
build_function_type
(
integer_type_node
,
NULL_TREE
);
build_pointer_type
(
default_function_type
);
ptr_type_node
=
build_pointer_type
(
void_type_node
);
const_ptr_type_node
=
...
...
@@ -4819,11 +4832,21 @@ init_decl_processing ()
endlink
=
void_list_node
;
int_endlink
=
tree_cons
(
NULL_TREE
,
integer_type_node
,
endlink
);
double_endlink
=
tree_cons
(
NULL_TREE
,
double_type_node
,
endlink
);
float_endlink
=
tree_cons
(
NULL_TREE
,
float_type_node
,
endlink
);
ptr_endlink
=
tree_cons
(
NULL_TREE
,
ptr_type_node
,
endlink
);
float_ftype_float
=
build_function_type
(
float_type_node
,
tree_cons
(
NULL_TREE
,
float_type_node
,
endlink
));
double_ftype_double
=
build_function_type
(
double_type_node
,
double_endlink
);
ldouble_ftype_ldouble
=
build_function_type
(
long_double_type_node
,
tree_cons
(
NULL_TREE
,
long_double_type_node
,
endlink
));
double_ftype_double_double
=
build_function_type
(
double_type_node
,
tree_cons
(
NULL_TREE
,
double_type_node
,
...
...
@@ -4871,7 +4894,7 @@ init_decl_processing ()
const_string_type_node
,
endlink
)));
s
izet_ftype_string
/* strlen prototype */
s
trlen_ftype
/* strlen prototype */
=
build_function_type
(
sizetype
,
tree_cons
(
NULL_TREE
,
const_string_type_node
,
endlink
));
...
...
@@ -4910,13 +4933,13 @@ init_decl_processing ()
endlink
)),
BUILT_IN_FRAME_ADDRESS
,
NULL_PTR
);
builtin_function
(
"__builtin_alloca"
,
build_function_type
(
ptr_type_node
,
tree_cons
(
NULL_TREE
,
sizetype
,
endlink
)),
BUILT_IN_ALLOCA
,
"alloca"
);
builtin_function
(
"__builtin_ffs"
,
int_ftype_int
,
BUILT_IN_FFS
,
NULL_PTR
);
/* Define alloca, ffs as builtins.
Declare _exit just to mark it as volatile. */
if
(
!
flag_no_builtin
&&
!
flag_no_nonansi_builtin
)
...
...
@@ -4941,20 +4964,15 @@ init_decl_processing ()
DECL_BUILT_IN_NONANSI
(
temp
)
=
1
;
}
builtin_function
(
"__builtin_abs"
,
int_ftype_int
,
BUILT_IN_ABS
,
NULL_PTR
);
builtin_function
(
"__builtin_fabs"
,
double_ftype_double
,
BUILT_IN_FABS
,
NULL_PTR
);
builtin_function
(
"__builtin_abs"
,
int_ftype_int
,
BUILT_IN_ABS
,
NULL_PTR
);
builtin_function
(
"__builtin_fabsf"
,
float_ftype_float
,
BUILT_IN_FABS
,
NULL_PTR
);
builtin_function
(
"__builtin_fabs"
,
double_ftype_double
,
BUILT_IN_FABS
,
NULL_PTR
);
builtin_function
(
"__builtin_fabsl"
,
ldouble_ftype_ldouble
,
BUILT_IN_FABS
,
NULL_PTR
);
builtin_function
(
"__builtin_labs"
,
long_ftype_long
,
BUILT_IN_LABS
,
NULL_PTR
);
builtin_function
(
"__builtin_ffs"
,
int_ftype_int
,
BUILT_IN_FFS
,
NULL_PTR
);
builtin_function
(
"__builtin_fsqrt"
,
double_ftype_double
,
BUILT_IN_FSQRT
,
NULL_PTR
);
builtin_function
(
"__builtin_sin"
,
double_ftype_double
,
BUILT_IN_SIN
,
"sin"
);
builtin_function
(
"__builtin_cos"
,
double_ftype_double
,
BUILT_IN_COS
,
"cos"
);
builtin_function
(
"__builtin_saveregs"
,
build_function_type
(
ptr_type_node
,
NULL_TREE
),
BUILT_IN_SAVEREGS
,
NULL_PTR
);
...
...
@@ -5002,8 +5020,26 @@ init_decl_processing ()
BUILT_IN_STRCMP
,
"strcmp"
);
builtin_function
(
"__builtin_strcpy"
,
string_ftype_ptr_ptr
,
BUILT_IN_STRCPY
,
"strcpy"
);
builtin_function
(
"__builtin_strlen"
,
s
izet_ftype_string
,
builtin_function
(
"__builtin_strlen"
,
s
trlen_ftype
,
BUILT_IN_STRLEN
,
"strlen"
);
builtin_function
(
"__builtin_sqrtf"
,
float_ftype_float
,
BUILT_IN_FSQRT
,
"sqrtf"
);
builtin_function
(
"__builtin_fsqrt"
,
double_ftype_double
,
BUILT_IN_FSQRT
,
NULL_PTR
);
builtin_function
(
"__builtin_sqrtl"
,
ldouble_ftype_ldouble
,
BUILT_IN_FSQRT
,
"sqrtl"
);
builtin_function
(
"__builtin_sinf"
,
float_ftype_float
,
BUILT_IN_SIN
,
"sinf"
);
builtin_function
(
"__builtin_sin"
,
double_ftype_double
,
BUILT_IN_SIN
,
"sin"
);
builtin_function
(
"__builtin_sinl"
,
ldouble_ftype_ldouble
,
BUILT_IN_SIN
,
"sinl"
);
builtin_function
(
"__builtin_cosf"
,
float_ftype_float
,
BUILT_IN_COS
,
"cosf"
);
builtin_function
(
"__builtin_cos"
,
double_ftype_double
,
BUILT_IN_COS
,
"cos"
);
builtin_function
(
"__builtin_cosl"
,
ldouble_ftype_ldouble
,
BUILT_IN_COS
,
"cosl"
);
if
(
!
flag_no_builtin
)
{
...
...
@@ -5012,15 +5048,27 @@ init_decl_processing ()
builtin_function ("fabs", double_ftype_double, BUILT_IN_FABS, NULL_PTR);
builtin_function ("labs", long_ftype_long, BUILT_IN_LABS, NULL_PTR);
#endif
builtin_function
(
"fabsf"
,
float_ftype_float
,
BUILT_IN_FABS
,
NULL_PTR
);
builtin_function
(
"fabsl"
,
ldouble_ftype_ldouble
,
BUILT_IN_FABS
,
NULL_PTR
);
builtin_function
(
"memcpy"
,
memcpy_ftype
,
BUILT_IN_MEMCPY
,
NULL_PTR
);
builtin_function
(
"memcmp"
,
int_ftype_cptr_cptr_sizet
,
BUILT_IN_MEMCMP
,
NULL_PTR
);
builtin_function
(
"strcmp"
,
int_ftype_string_string
,
BUILT_IN_STRCMP
,
NULL_PTR
);
builtin_function
(
"strcmp"
,
int_ftype_string_string
,
BUILT_IN_STRCMP
,
NULL_PTR
);
builtin_function
(
"strcpy"
,
string_ftype_ptr_ptr
,
BUILT_IN_STRCPY
,
NULL_PTR
);
builtin_function
(
"strlen"
,
sizet_ftype_string
,
BUILT_IN_STRLEN
,
NULL_PTR
);
builtin_function
(
"strlen"
,
strlen_ftype
,
BUILT_IN_STRLEN
,
NULL_PTR
);
builtin_function
(
"sqrtf"
,
float_ftype_float
,
BUILT_IN_FSQRT
,
NULL_PTR
);
builtin_function
(
"sqrt"
,
double_ftype_double
,
BUILT_IN_FSQRT
,
NULL_PTR
);
builtin_function
(
"sqrtl"
,
ldouble_ftype_ldouble
,
BUILT_IN_FSQRT
,
NULL_PTR
);
builtin_function
(
"sinf"
,
float_ftype_float
,
BUILT_IN_SIN
,
NULL_PTR
);
builtin_function
(
"sin"
,
double_ftype_double
,
BUILT_IN_SIN
,
NULL_PTR
);
builtin_function
(
"sinl"
,
ldouble_ftype_ldouble
,
BUILT_IN_SIN
,
NULL_PTR
);
builtin_function
(
"cosf"
,
float_ftype_float
,
BUILT_IN_COS
,
NULL_PTR
);
builtin_function
(
"cos"
,
double_ftype_double
,
BUILT_IN_COS
,
NULL_PTR
);
builtin_function
(
"cosl"
,
ldouble_ftype_ldouble
,
BUILT_IN_COS
,
NULL_PTR
);
/* Declare these functions volatile
to avoid spurious "control drops through" warnings. */
...
...
@@ -5047,13 +5095,14 @@ init_decl_processing ()
builtin_function ("__builtin_ldiv", default_ftype, BUILT_IN_LDIV, NULL_PTR);
builtin_function ("__builtin_ffloor", double_ftype_double, BUILT_IN_FFLOOR,
NULL_PTR);
builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL, NULL_PTR);
builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL,
NULL_PTR);
builtin_function ("__builtin_fmod", double_ftype_double_double,
BUILT_IN_FMOD, NULL_PTR);
builtin_function ("__builtin_frem", double_ftype_double_double,
BUILT_IN_FREM, NULL_PTR);
builtin_function ("__builtin_memset", ptr_ftype_ptr_int_int,
BUILT_IN_MEMSET,
NULL_PTR);
builtin_function ("__builtin_memset", ptr_ftype_ptr_int_int,
BUILT_IN_MEMSET,
NULL_PTR);
builtin_function ("__builtin_getexp", double_ftype_double, BUILT_IN_GETEXP,
NULL_PTR);
builtin_function ("__builtin_getman", double_ftype_double, BUILT_IN_GETMAN,
...
...
@@ -6109,6 +6158,14 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags)
CLASSTYPE_GOT_SEMICOLON
(
type
)
=
1
;
}
GNU_xref_decl
(
current_function_decl
,
decl
);
/* If we have installed this as the canonical typedef for this
type, and that type has not been defined yet, delay emitting
the debug informaion for it, as we will emit it later. */
if
(
TYPE_NAME
(
TREE_TYPE
(
decl
))
==
decl
&&
TYPE_SIZE
(
TREE_TYPE
(
decl
))
==
NULL_TREE
)
TYPE_DECL_SUPPRESS_DEBUG
(
decl
)
=
1
;
rest_of_decl_compilation
(
decl
,
NULL_PTR
,
DECL_CONTEXT
(
decl
)
==
NULL_TREE
,
0
);
goto
finish_end
;
...
...
@@ -6538,7 +6595,7 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags)
}
if
(
link
==
NULL
)
{
if
(
DECL_
RTL
(
decl
)
&&
GET_CODE
(
DECL_RTL
(
decl
))
==
MEM
)
if
(
DECL_
IN_MEMORY_P
(
decl
)
)
preserve_temp_slots
(
DECL_RTL
(
decl
));
break
;
}
...
...
@@ -7698,10 +7755,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises, attrli
opaque_typedef
=
1
;
type
=
copy_node
(
opaque_type_node
);
}
/* access declaration */
else
if
(
decl_context
==
FIELD
&&
declarator
&&
TREE_CODE
(
declarator
)
==
SCOPE_REF
)
type
=
void_type_node
;
else
{
if
(
funcdef_flag
)
...
...
@@ -8719,50 +8772,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises, attrli
else
if
(
TYPE_SIZE
(
ctype
)
!=
NULL_TREE
||
(
RIDBIT_SETP
(
RID_TYPEDEF
,
specbits
)))
{
tree
t
;
/* have to move this code elsewhere in this function.
this code is used for i.e., typedef int A::M; M *pm;
It is? How? jason 10/2/94 */
if
(
explicit_int
==
-
1
&&
decl_context
==
FIELD
&&
funcdef_flag
==
0
)
{
/* The code in here should only be used to build
stuff that will be grokked as access decls. */
t
=
lookup_field
(
ctype
,
sname
,
0
,
0
);
if
(
t
)
{
t
=
build_lang_field_decl
(
FIELD_DECL
,
build_nt
(
SCOPE_REF
,
ctype
,
t
),
type
);
DECL_INITIAL
(
t
)
=
init
;
return
t
;
}
/* No such field, try member functions. */
t
=
lookup_fnfields
(
TYPE_BINFO
(
ctype
),
sname
,
0
);
if
(
t
)
{
if
(
flags
==
DTOR_FLAG
)
t
=
TREE_VALUE
(
t
);
else
if
(
CLASSTYPE_METHOD_VEC
(
ctype
)
&&
TREE_VALUE
(
t
)
==
TREE_VEC_ELT
(
CLASSTYPE_METHOD_VEC
(
ctype
),
0
))
{
/* Don't include destructor with constructors. */
t
=
DECL_CHAIN
(
TREE_VALUE
(
t
));
if
(
t
==
NULL_TREE
)
cp_error
(
"`%T' does not have any constructors"
,
ctype
);
t
=
build_tree_list
(
NULL_TREE
,
t
);
}
t
=
build_lang_field_decl
(
FIELD_DECL
,
build_nt
(
SCOPE_REF
,
ctype
,
t
),
type
);
DECL_INITIAL
(
t
)
=
init
;
return
t
;
}
cp_error
(
"field `%D' is not a member of structure `%T'"
,
sname
,
ctype
);
}
if
(
current_class_type
)
{
cp_error
(
"cannot declare member `%T::%s' within `%T'"
,
...
...
gcc/cp/decl2.c
View file @
cffa8729
...
...
@@ -40,6 +40,7 @@ Boston, MA 02111-1307, USA. */
extern
tree
get_file_function_name
();
extern
tree
cleanups_this_call
;
static
void
grok_function_init
();
extern
int
current_class_depth
;
/* A list of virtual function tables we must make sure to write out. */
tree
pending_vtables
;
...
...
@@ -1328,11 +1329,20 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree, attrlist)
flags
=
0
;
}
if
(
declspecs
==
NULL_TREE
&&
TREE_CODE
(
declarator
)
==
SCOPE_REF
)
{
/* Access declaration */
if
(
TREE_COMPLEXITY
(
declarator
)
==
current_class_depth
)
pop_nested_class
(
1
);
return
do_class_using_decl
(
declarator
);
}
if
(
init
&&
TREE_CODE
(
init
)
==
TREE_LIST
&&
TREE_VALUE
(
init
)
==
error_mark_node
&&
TREE_CHAIN
(
init
)
==
NULL_TREE
)
init
=
NULL_TREE
;
init
=
NULL_TREE
;
value
=
grokdeclarator
(
declarator
,
declspecs
,
FIELD
,
init
!=
0
,
raises
,
NULL_TREE
);
...
...
@@ -1867,8 +1877,11 @@ grok_function_init (decl, init)
if
(
TREE_CODE
(
type
)
==
FUNCTION_TYPE
)
cp_error
(
"initializer specified for non-member function `%D'"
,
decl
);
#if 0
/* We'll check for this in finish_struct_1. */
else if (DECL_VINDEX (decl) == NULL_TREE)
cp_error ("initializer specified for non-virtual method `%D'", decl);
#endif
else
if
(
integer_zerop
(
init
))
{
#if 0
...
...
@@ -3404,10 +3417,23 @@ tree
do_class_using_decl
(
decl
)
tree
decl
;
{
tree
typ
e
;
tree
name
,
valu
e
;
/* Ignore for now, unimplemented. */
return
NULL_TREE
;
if
(
TREE_CODE
(
decl
)
!=
SCOPE_REF
)
{
cp_error
(
"using-declaration for non-member at class scope"
);
return
NULL_TREE
;
}
name
=
TREE_OPERAND
(
decl
,
1
);
if
(
TREE_CODE
(
name
)
==
BIT_NOT_EXPR
)
{
cp_error
(
"using-declaration for destructor"
);
return
NULL_TREE
;
}
value
=
build_lang_field_decl
(
USING_DECL
,
name
,
unknown_type_node
);
DECL_INITIAL
(
value
)
=
TREE_OPERAND
(
decl
,
0
);
return
value
;
}
void
...
...
gcc/cp/error.c
View file @
cffa8729
...
...
@@ -740,6 +740,13 @@ dump_decl (t, v)
dump_expr
(
DECL_INITIAL
(
t
),
0
);
break
;
case
USING_DECL
:
OB_PUTS
(
"using "
);
dump_type
(
DECL_INITIAL
(
t
),
0
);
OB_PUTS
(
"::"
);
OB_PUTID
(
DECL_NAME
(
t
));
break
;
default
:
sorry
(
"`%s' not supported by dump_decl"
,
tree_code_name
[(
int
)
TREE_CODE
(
t
)]);
...
...
gcc/cp/expr.c
View file @
cffa8729
...
...
@@ -278,19 +278,6 @@ fixup_result_decl (decl, result)
}
}
/* Return nonzero iff DECL is memory-based. The DECL_RTL of
certain const variables might be a CONST_INT, or a REG
in some cases. We cannot use `memory_operand' as a test
here because on most RISC machines, a variable's address
is not, by itself, a legitimate address. */
int
decl_in_memory_p
(
decl
)
tree
decl
;
{
return
DECL_RTL
(
decl
)
!=
0
&&
GET_CODE
(
DECL_RTL
(
decl
))
==
MEM
;
}
/* Expand this initialization inline and see if it's simple enough that
it can be done at compile-time. */
...
...
gcc/cp/gxxint.texi
View file @
cffa8729
...
...
@@ -1287,13 +1287,13 @@ Ln: throw value;
copy
value
onto
heap
jump
throw
(
Ln
,
id
,
address
of
copy
of
value
on
heap
)
try
{
try
@
{
+
Lstart
:
the
start
of
the
main
EH
region
|
...
...
+
Lend
:
the
end
of
the
main
EH
region
}
catch
(
T
o
)
{
@
}
catch
(
T
o
)
@
{
...
1
}
@
}
Lresume
:
nop
used
to
make
sure
there
is
something
before
the
next
region
ends
,
if
there
is
one
...
...
@@ -1314,7 +1314,7 @@ Lover:
[
[
call
throw_type_match
if
(
eq
)
{
if
(
eq
)
@
{
]
these
lines
disappear
when
there
is
no
catch
condition
+
Lsregion2
:
|
...
1
...
...
@@ -1322,7 +1322,7 @@ Lover:
|
Lhandler
:
handler
for
the
region
Lsregion2
-
Leregion2
|
rethrow
(
Lresume
,
same
id
,
same
obj
)
;
+
Leregion2
}
@
}
]
there
are
zero
or
more
of
these
sections
,
depending
upon
how
many
catch
clauses
there
are
-----------------------------
expand_end_all_catch
--------------------------
...
...
@@ -1338,7 +1338,7 @@ Ldone:
start_all_catch
emits
labels
:
Lresume
,
#
end example
@
end
example
The
__unwind_function
takes
a
pointer
to
the
throw
handler
,
and
is
expected
to
pop
the
stack
frame
that
was
built
to
call
it
,
as
well
as
...
...
@@ -1348,7 +1348,7 @@ machine state as determined by the context in which we are unwinding
into
.
The
way
I
normally
start
is
to
compile
:
void
*
g
;
foo
(
void
*
a
)
{
g
=
a
;
}
foo
(
void
*
a
)
@{
g
=
a
;
@
}
with
-
S
,
and
change
the
thing
that
alters
the
PC
(
return
,
or
ret
usually
)
to
not
alter
the
PC
,
making
sure
to
leave
all
other
semantics
...
...
@@ -1455,7 +1455,7 @@ descriptor that refers to fully contained code that has been eliminated
should
also
be
removed
,
although
not
doing
this
is
harmless
in
terms
of
semantics
.
#
end itemize
@
end
itemize
The
above
is
not
meant
to
be
exhaustive
,
but
does
include
all
things
I
have
thought
of
so
far
.
I
am
sure
other
limitations
exist
.
...
...
@@ -1517,7 +1517,7 @@ pointer, frame pointer, arg pointer and so on.
The
eh
archive
(
~
mrs
/
eh
)
might
be
good
reading
for
understanding
the
Ada
perspective
,
and
some
of
kenners
mindset
,
and
a
detailed
explanation
(
Message
-
Id
:
<
9308301130
.
AA10543
@vlsi1
.
ultra
.
nyu
.
edu
>
)
of
the
concepts
(
Message
-
Id
:
<
9308301130
.
AA10543
@
@
vlsi1
.
ultra
.
nyu
.
edu
>
)
of
the
concepts
involved
.
Here
is
a
guide
to
existing
backend
type
code
.
It
is
all
in
...
...
gcc/cp/init.c
View file @
cffa8729
...
...
@@ -2332,23 +2332,6 @@ add_friends (type, name, friend_type)
}
}
/* Set up a cross reference so that type TYPE will make member function
CTYPE::DECL a friend when CTYPE is finally defined. For more than
one, set up a cross reference so that functions with the name DECL
and type CTYPE know that they are friends of TYPE. */
static
void
xref_friend
(
type
,
decl
,
ctype
)
tree
type
,
decl
,
ctype
;
{
tree
friend_decl
=
TYPE_NAME
(
ctype
);
tree
t
=
0
;
SET_DECL_WAITING_FRIENDS
(
friend_decl
,
tree_cons
(
type
,
t
,
DECL_WAITING_FRIENDS
(
friend_decl
)));
TREE_TYPE
(
DECL_WAITING_FRIENDS
(
friend_decl
))
=
decl
;
}
/* Make FRIEND_TYPE a friend class to TYPE. If FRIEND_TYPE has already
been defined, we make all of its member functions friends of
TYPE. If not, we make it a pending friend, which can later be added
...
...
@@ -2469,24 +2452,14 @@ do_friend (ctype, declarator, decl, parmdecls, flags, quals)
/* Get the class they belong to. */
tree
ctype
=
IDENTIFIER_TYPE_VALUE
(
cname
);
tree
fields
=
lookup_fnfields
(
TYPE_BINFO
(
ctype
),
declarator
,
0
);
/* This class is defined, use its methods now. */
if
(
TYPE_SIZE
(
ctype
))
{
tree
fields
=
lookup_fnfields
(
TYPE_BINFO
(
ctype
),
declarator
,
0
);
if
(
fields
)
add_friends
(
current_class_type
,
declarator
,
ctype
);
else
error
(
"method `%s' is not a member of class `%s'"
,
IDENTIFIER_POINTER
(
declarator
),
IDENTIFIER_POINTER
(
cname
));
}
if
(
fields
)
add_friends
(
current_class_type
,
declarator
,
ctype
);
else
/* Note: DECLARATOR actually has more than one; in this
case, we're making sure that fns with the name DECLARATOR
and type CTYPE know they are friends of the current
class type. */
xref_friend
(
current_class_type
,
declarator
,
ctype
);
error
(
"method `%s' is not a member of class `%s'"
,
IDENTIFIER_POINTER
(
declarator
),
IDENTIFIER_POINTER
(
cname
));
decl
=
void_type_node
;
}
}
...
...
@@ -2561,49 +2534,6 @@ do_friend (ctype, declarator, decl, parmdecls, flags, quals)
}
return
decl
;
}
/* TYPE has now been defined. It may, however, have a number of things
waiting make make it their friend. We resolve these references
here. */
void
embrace_waiting_friends
(
type
)
tree
type
;
{
tree
decl
=
TYPE_NAME
(
type
);
tree
waiters
;
if
(
TREE_CODE
(
decl
)
!=
TYPE_DECL
)
return
;
for
(
waiters
=
DECL_WAITING_FRIENDS
(
decl
);
waiters
;
waiters
=
TREE_CHAIN
(
waiters
))
{
tree
waiter
=
TREE_PURPOSE
(
waiters
);
tree
decl
=
TREE_TYPE
(
waiters
);
tree
name
=
decl
?
(
TREE_CODE
(
decl
)
==
IDENTIFIER_NODE
?
decl
:
DECL_NAME
(
decl
))
:
NULL_TREE
;
if
(
name
)
{
/* @@ There may be work to be done since we have not verified
@@ consistency between original and friend declarations
@@ of the functions waiting to become friends. */
tree
field
=
lookup_fnfields
(
TYPE_BINFO
(
type
),
name
,
0
);
if
(
field
)
if
(
decl
==
name
)
add_friends
(
waiter
,
name
,
type
);
else
add_friend
(
waiter
,
decl
);
else
error_with_file_and_line
(
DECL_SOURCE_FILE
(
TYPE_NAME
(
waiter
)),
DECL_SOURCE_LINE
(
TYPE_NAME
(
waiter
)),
"no method `%s' defined in class `%s' to be friend"
,
IDENTIFIER_POINTER
(
DECL_NAME
(
TREE_TYPE
(
waiters
))),
TYPE_NAME_STRING
(
type
));
}
else
make_friend_class
(
type
,
waiter
);
}
}
/* Common subroutines of build_new and build_vec_delete. */
...
...
gcc/cp/parse.y
View file @
cffa8729
...
...
@@ -254,7 +254,7 @@ empty_parms ()
/* %type <itype> try_for_typename */
%type <ttype> condition xcond paren_cond_or_null
%type <ttype> type_name nested_name_specifier nested_type ptr_to_mem
%type <ttype>
qualified_type_name
complete_type_name notype_identifier
%type <ttype> complete_type_name notype_identifier
%type <ttype> complex_type_name nested_name_specifier_1
%type <itype> nomods_initdecls nomods_initdcl0
%type <ttype> new_initializer new_placement specialization type_specifier_seq
...
...
@@ -2854,23 +2854,48 @@ after_type_declarator:
| direct_after_type_declarator
;
qualified
_type_name:
complete
_type_name:
type_name %prec EMPTY
{
$$ = identifier_typedecl_value ($1);
/* Remember that this name has been used in the class
definition, as per [class.scope0] */
if (current_class_type
&& TYPE_BEING_DEFINED (current_class_type)
&& ! IDENTIFIER_TEMPLATE ($1)
&& ! IDENTIFIER_CLASS_VALUE ($1))
if (TREE_CODE ($1) == IDENTIFIER_NODE)
{
if (current_class_type
&& TYPE_BEING_DEFINED (current_class_type)
&& ! TREE_MANGLED ($1)
&& ! IDENTIFIER_CLASS_VALUE ($1))
{
/* Be sure to get an inherited typedef. */
$$ = lookup_name ($1, 1);
/* Remember that this name has been used in the class
definition, as per [class.scope0] */
pushdecl_class_level ($$);
}
else
$$ = identifier_typedecl_value ($1);
}
else
$$ = $1;
}
| global_scope type_name
{
if (TREE_CODE ($2) == IDENTIFIER_NODE)
{
/* Be sure to get an inherited typedef. */
$$ = lookup_name ($1, 1);
pushdecl_class_level ($$);
if (current_class_type
&& TYPE_BEING_DEFINED (current_class_type)
&& ! TREE_MANGLED ($2)
&& ! IDENTIFIER_CLASS_VALUE ($2))
/* Be sure to get an inherited typedef. */
$$ = lookup_name ($2, 1);
else
$$ = identifier_typedecl_value ($2);
}
else
$$ = $2;
got_scope = NULL_TREE;
}
| nested_type
| global_scope nested_type
{ $$ = $2; }
;
nested_type:
...
...
@@ -3016,15 +3041,26 @@ nested_name_specifier_1:
{ goto failed_scope; } */
;
complete_type_name:
qualified_type_name
| global_scope qualified_type_name
{ $$ = $2; }
;
complex_type_name:
nested_type
| global_scope qualified_type_name
global_scope type_name
{
if (TREE_CODE ($2) == IDENTIFIER_NODE)
{
if (current_class_type
&& TYPE_BEING_DEFINED (current_class_type)
&& ! TREE_MANGLED ($2)
&& ! IDENTIFIER_CLASS_VALUE ($2))
/* Be sure to get an inherited typedef. */
$$ = lookup_name ($2, 1);
else
$$ = identifier_typedecl_value ($2);
}
else
$$ = $2;
got_scope = NULL_TREE;
}
| nested_type
| global_scope nested_type
{ $$ = $2; }
;
...
...
gcc/cp/search.c
View file @
cffa8729
...
...
@@ -2034,13 +2034,13 @@ get_matching_virtual (binfo, fndecl, dtorp)
}
if
(
TYPE_READONLY
(
d
)
>
TYPE_READONLY
(
b
))
{
cp_error
(
"return type of `%#D' adds const"
,
fndecl
);
cp_error
_at
(
"return type of `%#D' adds const"
,
fndecl
);
cp_error_at
(
" overriding definition as `%#D'"
,
tmp
);
}
else
if
(
TYPE_VOLATILE
(
d
)
>
TYPE_VOLATILE
(
b
))
{
cp_error
(
"return type of `%#D' adds volatile"
,
cp_error
_at
(
"return type of `%#D' adds volatile"
,
fndecl
);
cp_error_at
(
" overriding definition as `%#D'"
,
tmp
);
...
...
@@ -2051,11 +2051,11 @@ get_matching_virtual (binfo, fndecl, dtorp)
{
error
(
"invalid covariant return type (must use pointer or reference)"
);
cp_error_at
(
" overriding `%#D'"
,
tmp
);
cp_error
(
" with `%#D'"
,
fndecl
);
cp_error
_at
(
" with `%#D'"
,
fndecl
);
}
else
if
(
IDENTIFIER_ERROR_LOCUS
(
name
)
==
NULL_TREE
)
{
cp_error
(
"conflicting return type specified for virtual function `%#D'"
,
fndecl
);
cp_error
_at
(
"conflicting return type specified for virtual function `%#D'"
,
fndecl
);
cp_error_at
(
" overriding definition as `%#D'"
,
tmp
);
SET_IDENTIFIER_ERROR_LOCUS
(
name
,
basetype
);
}
...
...
gcc/cp/typeck.c
View file @
cffa8729
...
...
@@ -643,13 +643,15 @@ comptypes (type1, type2, strict)
if
(
TYPE_MAIN_VARIANT
(
t1
)
==
TYPE_MAIN_VARIANT
(
t2
))
return
1
;
#ifdef COMP_TYPE_ATTRIBUTES
/* ??? COMP_TYPE_ATTRIBUTES is currently useless for variables as each
attribute is its own main variant (`val' will remain 0). */
#ifndef COMP_TYPE_ATTRIBUTES
#define COMP_TYPE_ATTRIBUTES(t1,t2) 1
#endif
/* 1 if no need for warning yet, 2 if warning cause has been seen. */
if
(
!
(
attrval
=
COMP_TYPE_ATTRIBUTES
(
t1
,
t2
)))
return
0
;
#else
/* 1 if no need for warning yet, 2 if warning cause has been seen. */
attrval
=
1
;
#endif
/* 1 if no need for warning yet, 2 if warning cause has been seen. */
val
=
0
;
...
...
@@ -1110,10 +1112,10 @@ self_promoting_args_p (parms)
if
(
TREE_CHAIN
(
t
)
==
0
&&
type
!=
void_type_node
)
return
0
;
if
(
TYPE_MAIN_VARIANT
(
type
)
==
float_type_node
)
if
(
type
==
0
)
return
0
;
if
(
type
==
0
)
if
(
TYPE_MAIN_VARIANT
(
type
)
==
float_type_node
)
return
0
;
if
(
C_PROMOTING_INTEGER_TYPE_P
(
type
))
...
...
@@ -1141,6 +1143,14 @@ unsigned_type (type)
return
long_unsigned_type_node
;
if
(
type1
==
long_long_integer_type_node
)
return
long_long_unsigned_type_node
;
if
(
type1
==
intDI_type_node
)
return
unsigned_intDI_type_node
;
if
(
type1
==
intSI_type_node
)
return
unsigned_intSI_type_node
;
if
(
type1
==
intHI_type_node
)
return
unsigned_intHI_type_node
;
if
(
type1
==
intQI_type_node
)
return
unsigned_intQI_type_node
;
return
type
;
}
...
...
@@ -1161,6 +1171,14 @@ signed_type (type)
return
long_integer_type_node
;
if
(
type1
==
long_long_unsigned_type_node
)
return
long_long_integer_type_node
;
if
(
type1
==
unsigned_intDI_type_node
)
return
intDI_type_node
;
if
(
type1
==
unsigned_intSI_type_node
)
return
intSI_type_node
;
if
(
type1
==
unsigned_intHI_type_node
)
return
intHI_type_node
;
if
(
type1
==
unsigned_intQI_type_node
)
return
intQI_type_node
;
return
type
;
}
...
...
@@ -1188,6 +1206,8 @@ signed_or_unsigned_type (unsignedp, type)
return
type
;
}
/* Compute the value of the `sizeof' operator. */
tree
c_sizeof
(
type
)
tree
type
;
...
...
@@ -4251,6 +4271,7 @@ build_unary_op (code, xarg, noconvert)
return
error_mark_node
;
}
#if 0
/* If CONVERSIONS is a conversion expression or a nested sequence of such,
convert ARG with the same conversions in the same order
and return the result. */
...
...
@@ -4277,6 +4298,7 @@ convert_sequence (conversions, arg)
return arg;
}
}
#endif
/* Apply unary lvalue-demanding operator CODE to the expression ARG
for certain kinds of expressions which are not really lvalues
...
...
@@ -4444,10 +4466,9 @@ mark_addressable (exp)
return
1
;
}
case
VAR_DECL
:
if
(
TREE_STATIC
(
x
)
&&
TREE_READONLY
(
x
)
if
(
TREE_STATIC
(
x
)
&&
TREE_READONLY
(
x
)
&&
DECL_RTL
(
x
)
!=
0
&&
!
decl_in_memory_p
(
x
))
&&
!
DECL_IN_MEMORY_P
(
x
))
{
/* We thought this would make a good constant variable,
but we were wrong. */
...
...
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