1992-02-04 20:51:11 +01:00
|
|
|
|
/* Subroutines shared by all languages that are variants of C.
|
c-common.c (decl_attributes): Set DECL_SIZE_UNIT.
* c-common.c (decl_attributes): Set DECL_SIZE_UNIT.
* c-decl.c (duplicate_decls, finish_enum): Likewise.
(finish_decl): Remove -Wlarger-than code from here.
* flags.h (id_clash_len): Now int.
(larger_than_size): Now HOST_WIDE_INT.
* fold-const.c (size_int_wide): No more HIGH parm; NUMBER is signed.
Clean up checking to see if in table.
(make_bit_field_ref): Remove extra parm to bitsize_int.
* ggc-common.c (ggc_mark_tree_children): Mark DECL_SIZE_UNIT.
* print-tree.c (print_node): Print DECL_SIZE_UNIT and TYPE_SIZE_UNIT.
* stmt.c (expand_decl): Use DECL_SIZE_UNIT for stack checking size
and for computing size of decl.
* stor-layout.c (layout_decl): Set DECL_SIZE_UNIT.
Move -Wlarger-than code to here.
(layout_record): Remove extra arg to bitsize_int.
Set TYPE_BINFO_SIZE_UNIT.
(layout_union): Remove extra arg to bitsize_int.
Use proper type for size of QUAL_UNION.
(layout_type): Remove extra arg to bitsize_int.
* toplev.c (id_clash_len): Now int.
(larger_than_size): Now HOST_WIDE_INT.
(decode_W_option): Clean up id-clash and larger-than- cases.
* tree.c (get_identifier, maybe_get_identifier): Remove unneeded casts.
(expr_align, case FUNCTION_DECL): DECL_ALIGN is not defined.
* tree.h (BINFO_SIZE_UNIT, TYPE_BINFO_SIZE_UNIT, DECL_SIZE_UNIT): New.
(struct tree_decl): New field size_unit.
(size_int_wide): No HIGH operand; NUMBER is now signed.
(size_int_2): Deleted.
(size_int, bitsize_int): Don't use it and rework args.
* varasm.c (assemble_variable, output_constructor): Use DECL_SIZE_UNIT.
* ch/decl.c (layout_enum): Set DECL_SIZE_UNIT.
* ch/satisfy.c (safe_satisfy_decl): Likewise.
* cp/class.c (build_primary_vtable, layout_vtable_decl): Likewise.
(avoid_overlap, build_base_field): Likewise.
(build_base_field, build_base_fields, is_empty_class):
Test DECL_SIZE with integer_zero.
(layout_class_type): Set CLASSTYPE_SIZE_UNIT.
* cp/cp-tree.h (struct lang_type): New field size_unit.
(CLASSTYPE_SIZE_UNIT): New macro.
* cp/decl.c (init_decl_processing): Set DECL_SIZE_UNIT.
(cp_finish_decl): Delete -Wlarger-than processing.
* cp/optimize.c (remap_decl): Walk DECL_SIZE_UNIT.
* cp/pt.c (tsubst_decl): Set DECL_SIZE_UNIT.
* cp/tree.c (make_binfo): binfo vector is one entry longer.
(walk_tree): Walk DECL_SIZE_UNIT.
* f/com.c (ffecom_sym_transform): Use DECL_SIZE_UNIT.
(ffecom_transform_common_, ffecom_transform_equiv_): Likewise.
(duplicate_decls): Likewise.
(ffecom_tree_canonize_ptr_): Delete extra arg to bitsize_int.
(finish_decl): Delete -Wlarger-than processing.
* java/class.c (build_class_ref, push_super_field): Set DECL_SIZE_UNIT.
* java/constants.c (build_constants_constructor): Likewise.
From-SVN: r32068
2000-02-20 02:11:00 +01:00
|
|
|
|
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
|
|
|
|
|
Free Software Foundation, Inc.
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
|
|
|
|
This file is part of GNU CC.
|
|
|
|
|
|
|
|
|
|
GNU CC is free software; you can redistribute it and/or modify
|
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
|
|
|
any later version.
|
|
|
|
|
|
|
|
|
|
GNU CC is distributed in the hope that it will be useful,
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
|
along with GNU CC; see the file COPYING. If not, write to
|
1995-06-15 13:33:25 +02:00
|
|
|
|
the Free Software Foundation, 59 Temple Place - Suite 330,
|
|
|
|
|
Boston, MA 02111-1307, USA. */
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
|
|
|
|
#include "config.h"
|
Major cutover to using system.h:
* Makefile.in (alias.o, bitmap.o, c-aux-info.o, c-common.o,
c-decl.o, c-iterate.o, c-lang.o, c-lex.o, c-pragma.o, c-typeck.o,
caller-save.o, calls.o, collect2.o, combine.o, cse.o, dbxout.o,
dwarf2out.o, dwarfout.o, emit-rtl.o, except.o, explow.o, expmed.o,
expr.o, final.o, flow.o, function.o, getpwd.o, global.o,
integrate.o, jump.o, local-alloc.o, loop.o, optabs.o, pexecute.o,
prefix.o, print-rtl.o, print-tree.o, profile.o, real.o, recog.o,
reg-stack.o, regclass.o, regmove.o, reload.o, reload1.o, reorg.o,
rtl.o, rtlanal.o, sdbout.o, stmt.o, stor-layout.o, stupid.o,
tlink.o, toplev.o, tree.o, unroll.o, varasm.o, xcoffout.o): Depend
on system.h.
* alias.c, bitmap.c, c-aux-info.c, c-common.c, c-decl.c,
c-iterate.c, c-lang.c, c-lex.c, c-pragma.c, c-typeck.c,
caller-save.c, calls.c, collect2.c, combine.c, cse.c, dbxout.c,
dwarf2out.c, dwarfout.c, emit-rtl.c, except.c, explow.c, expmed.c,
expr.c, final.c, flow.c, function.c, gcc.c, getpwd.c, global.c,
integrate.c, jump.c, local-alloc.c, loop.c, optabs.c, pexecute.c,
prefix.c, print-rtl.c, print-tree.c, profile.c, real.c, recog.c,
reg-stack.c, regclass.c, regmove.c, reload.c, reload1.c, reorg.c,
rtl.c, rtlanal.c, sched.c, sdbout.c, stmt.c, stor-layout.c,
stupid.c, tlink.c, toplev.c, tree.c, unroll.c, varasm.c,
xcoffout.c: Include system.h. Organize include ordering so
that stdarg/varargs comes before other system headers. Remove
spurious casts of functions assured of a prototype in system.h.
From-SVN: r18726
1998-03-20 15:58:42 +01:00
|
|
|
|
#include "system.h"
|
1992-02-04 20:51:11 +01:00
|
|
|
|
#include "tree.h"
|
|
|
|
|
#include "flags.h"
|
toplev.h: New file.
Wed May 6 06:35:38 1998 Robert Lipe <robertl@dgii.com>
* toplev.h: New file. Protypes for functions in toplev.c.
* tree.h, rtl.h: Deleted protos for functions in toplev.c.
* c-common.c, c-convert.c, c-decl.c, c-iterate.c, c-lex.c,
c-parse.in, c-parse.y, c-pragma.c, c-typeck.c, calls.c,
convert.c, dwarf2out.c, except.c, expr.c, final.c, fold-const.c,
function.c, hash.c, profile.c, real.c, reg-stack.c, regclass.c,
reload.c, reload1.c, stmt.c, stor-layout.c, tlink.c, tree.c,
varasm.c: include it.
From-SVN: r19563
1998-05-06 06:45:47 +02:00
|
|
|
|
#include "toplev.h"
|
Warning fixes:
* Makefile.in (c-lang.o): Depend on c-tree.h, c-lex.h and toplev.h.
(c-lex.o): Depend on output.h.
(c-common.o): Likewise.
(stmt.o): Likewise.
(calls.o): Likewise.
(integrate.o): Depend on toplev.h.
(regclass.o): Depend on output.h.
(final.o): Depend on reload.h.
* c-common.c: Include output.h.
(check_format_info): Remove unused variable `integral_format'.
* c-decl.c (print_lang_decl): Mark parameters `file', `node' and
`indent' with ATTRIBUTE_UNUSED.
(print_lang_type): Likewise.
(maybe_build_cleanup): Likewise for parameter `decl'.
(copy_lang_decl): Likewise for parameter `node'.
* c-lang.c: Include c-tree.h, c-lex.h and toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(lookup_interface): Likewise for parameter `arg'.
(is_class_name): Likewise.
(maybe_objc_check_decl): Likewise for parameter `decl'.
(maybe_objc_comptypes): Likewise for parameters `lhs', `rhs' and
`reflexive'.
(maybe_objc_method_name): Likewise for parameter `decl'.
(build_objc_string): Likewise for parameters `len' and `str'.
* c-lex.c: Include output.h.
* c-lex.h (position_after_white_space): Correct typo in prototype.
* c-tree.h (finish_file, c_expand_start_cond, c_expand_start_else,
c_expand_end_cond, init_iterators): Add prototypes.
* caller-save.c (set_reg_live): Mark parameters `reg' and `setter'
with ATTRIBUTE_UNUSED.
* calls.c: Include output.h.
* cccp.c (pipe_closed): Mark parameter `signo' with
ATTRIBUTE_UNUSED.
* combine.c: Move inclusion of expr.h to after insn-config.h.
* iris6.h (ASM_IDENTIFY_GCC, ASM_IDENTIFY_LANGUAGE): Don't define
as empty, rather define as ((void)0).
* sparc.c (sparc_check_64): Add braces around ambiguous `else'.
Add parentheses around assignment used as truth value.
* cplus-dem.c (squangle_mop_up): Change return type to void.
(internal_cplus_demangle): Remove unused parameter `options'.
All callers changed.
(cplus_demangle_opname): Remove function wide variable `int i' and
replace with `size_t i' at each location where it is used.
(cplus_demangle_opname): change type of `i' from int to size_t.
* cppexp.c (right_shift): Mark parameter `pfile' with
ATTRIBUTE_UNUSED.
* cpphash.c (cpp_lookup): Likewise.
(cpp_hash_cleanup): Likewise.
* cpplib.c (parse_name): Add a prototype and make it static.
(null_underflow): Mark parameter `pfile' with ATTRIBUTE_UNUSED.
(null_cleanup): Likewise for parameters `pbuf' and `pfile'.
(macro_cleanup): Likewise for parameter `pfile'.
(file_cleanup): Likewise.
* cpplib.h (cpp_reader_init, cpp_options_init, cpp_start_read,
cpp_read_check_assertion, skip_rest_of_line): Add prototypes.
* crtstuff.c (force_to_data, __CTOR_LIST__, force_to_data,
__DTOR_END__, __FRAME_END__): Mark with ATTRIBUTE_UNUSED.
* cse.c (cse_check_loop_start): Mark parameter `set' with
ATTRIBUTE_UNUSED.
* dbxout.c (flag_minimal_debug, have_used_extensions,
source_label_number): Move inside macro wrapper check against
defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO).
* dwarf2out.c (gen_entry_point_die): Hide prototype and definition.
* except.h (doing_eh): Provide prototype.
* expr.c: Move inclusion of expr.h to after insn-config.h.
* final.c: Include reload.h.
(shorten_branches): Cast the first argument of bzero to char *.
* fix-header.c (cpp_print_containing_files): Mark parameter
`pfile' with ATTRIBUTE_UNUSED.
(cpp_fatal): Likewise.
* flow.c (find_basic_blocks_1): Cast the first argument of bzero
to char *.
* genattrtab.c (make_length_attrs): Change the type of variable
`i' from int to size_t.
(zero_fn): Mark parameter `exp' with ATTRIBUTE_UNUSED.
(one_fn): Likewise.
* genextract.c (main): When generating insn-extract.c, mark
variable `junk' with ATTRIBUTE_UNUSED.
* gengenrtl.c (gencode): When generating genrtl.c, cast the first
argument of bzero to char*.
* integrate.c: Include toplev.h.
* libgcc2.c: Wrap `struct exception_table' and
`find_exception_handler' in macro DWARF2_UNWIND_INFO.
* objc/Make-lang.in (objc-act.o): Depend on toplev.h.
* objc/objc-act.c: Include toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(finish_protocol): Likewise for parameter `protocol'.
* output.h (declare_weak): Add prototype.
(decode_reg_name): Don't wrap with TREE_CODE macro.
(assemble_alias): Add prototype.
* regclass.c: Include output.h.
* reload.h (reloads_conflict): Add prototype.
* rtl.h (print_rtl_single, mark_elimiation, reg_class_subset_p,
output_func_start_profiler): Add prototypes.
* rtlanal.c (reg_set_p_1): Mark parameters `x' and `pat' with
ATTRIBUTE_UNUSED.
* scan-decls.c: Include scan.h.
* scan.h (recognized_function, recognized_extern): Add prototypes.
* stmt.c: Include output.h.
* toplev.c (error_for_asm, warning_for_asm): Remove prototypes.
(output_lang_identify): Hide prototype and definition.
(float_signal): Mark parameter `signo' with ATTRIBUTE_UNUSED.
(pipe_closed): Likewise.
* toplev.h (count_error, strip_off_ending, error_for_asm,
warning_for_asm): Add prototypes.
From-SVN: r19712
1998-05-13 14:40:39 +02:00
|
|
|
|
#include "output.h"
|
1998-10-01 12:50:15 +02:00
|
|
|
|
#include "c-pragma.h"
|
invoke.texi: Document -flang-isoc9x.
* invoke.texi: Document -flang-isoc9x.
* Makefile.in (OBJS): Add splay-tree.o.
(c-common.o): Depend on rtl.h.
(splay-tree.o): List dependencies and provide build rule.
* rtl.h (record_alias_subset): New function.
* alias.c: Include splay-tree.h.
(alias_set_entry): New type.
(CHECK_ALIAS_SETS_FOR_CONSISTENCY): Remove.
(DIFFERENT_ALIAS_SETS_P): Use mem_in_disjoint_alias_sets_p.
(mems_in_disjoin_alias_sets_p): New function.
(alias_set_compare): Likewise.
(insert_subset_children): Likewise.
(get_alias_set_entry): Likewise.
* tree.h (TYPE_RESTRICT): New macro.
(TYPE_UNQUALIFIED): New manifest constant.
(TYPE_QUAL_CONST): Likewise
(TYPE_QUAL_VOLATILE): Likewise.
(TYPE_QUAL_RESTRICT): Likewise.
(tree_type): Add restrict_flag. Reduce count of free bits.
(DECL_POINTER_ALIAS_SET): New macro.
(DECL_POINTER_ALIAS_SET_KNOWN_P): Likewise.
(tree_decl): Add pointer_alias_set.
(build_qualified_type): New function.
(build_type_variant): Define in terms of build_qualified_type.
* tree.c (set_type_quals): New function.
(make_node): Initializae DECL_POINTER_ALIAS_SET.
(build_type_attribute_variant): Use build_qualified_type and
set_type_quals.
(build_type_variant): Rename, and modify, to become...
(build_qualified_type): New function.
(build_complex_type): Use set_type_quals.
* c-tree.h (C_TYPE_OBJECT_P): New macro.
(C_TYPE_FUNCTION_P): Likewise.
(C_TYPE_INCOMPLETE_P): Likewise.
(C_TYPE_OBJECT_OR_INCOMPLETE_P): Likewise.
(c_apply_type_quals_to_decl): New function.
(c_build_qualified_type): New function.
(c_build_type_variant): Define in terms of c_build_qualified_type.
(flag_isoc9x): Declare.
* c-typeck.c (qualify_type): Use c_build_qualified_type.
(common_type): Change to use TYPE_QUALS.
(comptypes): Likewise.
(convert_for_assignment): Likewise.
* c-aux-info.c (gen_type): Likewise. Deal with `restrict'.
* c-decl.c (flag_isoc9x): Define.
(c_decode_option): Handle -flang-isoc9x.
(grokdeclarator): Update to handle restrict. Use TYPE_QUALS,
c_build_qualified_type, etc. Use c_apply_type_quals_to_decl.
* c-lex.c (init_lex): Deal with restrict.
(init_lex): Don't treat restrict as a reserved word in
-traditional mode, or without -flang-isoc9x.
* c-lex.h (rid): Add RID_RESTRICT.
* c-parse.gperf (restrict, __restrict, __restrict__): Make
equivalent to RID_RESTRICT.
* c-parse.in (TYPE_QUAL): Update comment.
* c-common.c: Include rtl.h.
(c_find_base_decl): New function.
(c_build_type_variant): Rename, and modify, to become ...
(c_build_qualified_type): New function.
(c_apply_type_quals_to_decl): Likewise.
(c_get_alias_set): For INDIRECT_REFs, check to see if we can find
a particular alias set for the reference.
* toplev.c (documented_lang_options): Add -flang-isoc9x.
From-SVN: r23212
1998-10-21 11:53:40 +02:00
|
|
|
|
#include "rtl.h"
|
1999-09-06 23:28:22 +02:00
|
|
|
|
#include "ggc.h"
|
Makefile.in (c-common.o): Depend on $(EXPR_H).
* Makefile.in (c-common.o): Depend on $(EXPR_H).
* c-common.c: Include expr.h.
* c-pragma.c (mark_align_stack): Add prototype.
* caller-save.c (add_stored_regs): Likewise.
* combine.c (record_promoted_value): Likewise.
* i386.c (ix86_sched_reorder_pentium, ix86_sched_reorder_ppro):
Likewise.
* cppinit.c (new_pending_define): Likewise.
* cpplib.c (skip_block_comment, skip_line_comment): Likewise.
* dwarf2out.c (save_rtx, splice_child_die, reverse_die_lists,
AT_class, AT_flag, AT_int, AT_unsigned, AT_string, AT_ref, AT_loc,
AT_addr, AT_lbl, get_AT_ref, free_AT, free_die, local_scope_p,
class_scope_p): Likewise.
* dwarf2out.h (dwarf2out_set_demangle_name_func,
dwarf2out_add_library_unit_info): Likewise.
* ggc.h (ggc_page_print_statistics): Likewise.
* haifa-sched.c (propagate_deps): Likewise.
* reg-stack.c (next_flags_user, record_label_references): Likewise.
* rtl.h (set_stack_check_libfunc): Likewise.
* toplev.h (set_fatal_function): Likewise.
* toplev.c (set_fatal_function): Delete prototype.
* diagnostic.c: Deconstify functions returning malloc'ed ptrs.
From-SVN: r31810
2000-02-06 04:40:46 +01:00
|
|
|
|
#include "expr.h"
|
2000-09-17 09:38:23 +02:00
|
|
|
|
#include "c-common.h"
|
2000-01-11 00:48:03 +01:00
|
|
|
|
#include "tm_p.h"
|
2000-09-15 23:16:31 +02:00
|
|
|
|
#include "intl.h"
|
2000-09-19 05:26:11 +02:00
|
|
|
|
#include "diagnostic.h"
|
c-common.c: Include <stdlib.h> and <string.h>/<strings.h>.
* c-common.c: Include <stdlib.h> and <string.h>/<strings.h>.
* calls.c (expand_call): Remove unused variables funtree,
n_regs, and tmpmode.
* dbxout.c, except.c: Include <string.h>/<strings.h>.
* explow.c: (plus_constant_for_output_wide) Removed unused
variable all_constant.
* c-decl.c, genattr.c, genattrtab.c, getconfig.c, genemit.c
genextract.c, genflags.c, genopinit.c genoutput.c, genpeep.c,
genrecog.c, global.c, integrate.c , stupid.c : Include
<stdlib.h>.
* genextract.c: (walk_rtx) Remove unused variable link.
* genrecog.c: (concat) Remove unreferenced static function.
* prefix.c: Include <string.h>/<strings.h>, <stdlib.h>
* stmt.c: Include <stdlib.h>.
(expand_asm_operands): Remove unused variable val1.
(expand_return): Remove unused variable block.
(pushcase): Remove unused variables l and n.
(pushcaserange): Likewise.
* unroll.c (unroll_loop): Remove unused variable temp.
From-SVN: r17766
1998-02-07 23:55:54 +01:00
|
|
|
|
|
1998-05-21 10:54:04 +02:00
|
|
|
|
#if USE_CPPLIB
|
|
|
|
|
#include "cpplib.h"
|
|
|
|
|
cpp_reader parse_in;
|
|
|
|
|
#endif
|
|
|
|
|
|
1999-09-23 23:03:53 +02:00
|
|
|
|
#undef WCHAR_TYPE_SIZE
|
|
|
|
|
#define WCHAR_TYPE_SIZE TYPE_PRECISION (wchar_type_node)
|
1995-12-19 01:13:24 +01:00
|
|
|
|
|
1999-07-20 12:41:10 +02:00
|
|
|
|
/* The following symbols are subsumed in the c_global_trees array, and
|
2000-01-03 22:48:49 +01:00
|
|
|
|
listed here individually for documentation purposes.
|
1999-07-20 12:41:10 +02:00
|
|
|
|
|
|
|
|
|
INTEGER_TYPE and REAL_TYPE nodes for the standard data types.
|
|
|
|
|
|
|
|
|
|
tree short_integer_type_node;
|
|
|
|
|
tree long_integer_type_node;
|
|
|
|
|
tree long_long_integer_type_node;
|
|
|
|
|
|
|
|
|
|
tree short_unsigned_type_node;
|
|
|
|
|
tree long_unsigned_type_node;
|
|
|
|
|
tree long_long_unsigned_type_node;
|
|
|
|
|
|
|
|
|
|
tree boolean_type_node;
|
|
|
|
|
tree boolean_false_node;
|
|
|
|
|
tree boolean_true_node;
|
|
|
|
|
|
|
|
|
|
tree ptrdiff_type_node;
|
|
|
|
|
|
|
|
|
|
tree unsigned_char_type_node;
|
|
|
|
|
tree signed_char_type_node;
|
|
|
|
|
tree wchar_type_node;
|
|
|
|
|
tree signed_wchar_type_node;
|
|
|
|
|
tree unsigned_wchar_type_node;
|
|
|
|
|
|
|
|
|
|
tree float_type_node;
|
|
|
|
|
tree double_type_node;
|
|
|
|
|
tree long_double_type_node;
|
|
|
|
|
|
|
|
|
|
tree complex_integer_type_node;
|
|
|
|
|
tree complex_float_type_node;
|
|
|
|
|
tree complex_double_type_node;
|
|
|
|
|
tree complex_long_double_type_node;
|
|
|
|
|
|
|
|
|
|
tree intQI_type_node;
|
|
|
|
|
tree intHI_type_node;
|
|
|
|
|
tree intSI_type_node;
|
|
|
|
|
tree intDI_type_node;
|
|
|
|
|
tree intTI_type_node;
|
|
|
|
|
|
|
|
|
|
tree unsigned_intQI_type_node;
|
|
|
|
|
tree unsigned_intHI_type_node;
|
|
|
|
|
tree unsigned_intSI_type_node;
|
|
|
|
|
tree unsigned_intDI_type_node;
|
|
|
|
|
tree unsigned_intTI_type_node;
|
|
|
|
|
|
|
|
|
|
tree widest_integer_literal_type_node;
|
|
|
|
|
tree widest_unsigned_literal_type_node;
|
|
|
|
|
|
|
|
|
|
Nodes for types `void *' and `const void *'.
|
|
|
|
|
|
|
|
|
|
tree ptr_type_node, const_ptr_type_node;
|
|
|
|
|
|
|
|
|
|
Nodes for types `char *' and `const char *'.
|
|
|
|
|
|
|
|
|
|
tree string_type_node, const_string_type_node;
|
|
|
|
|
|
|
|
|
|
Type `char[SOMENUMBER]'.
|
|
|
|
|
Used when an array of char is needed and the size is irrelevant.
|
|
|
|
|
|
|
|
|
|
tree char_array_type_node;
|
|
|
|
|
|
|
|
|
|
Type `int[SOMENUMBER]' or something like it.
|
|
|
|
|
Used when an array of int needed and the size is irrelevant.
|
|
|
|
|
|
|
|
|
|
tree int_array_type_node;
|
|
|
|
|
|
|
|
|
|
Type `wchar_t[SOMENUMBER]' or something like it.
|
|
|
|
|
Used when a wide string literal is created.
|
|
|
|
|
|
|
|
|
|
tree wchar_array_type_node;
|
|
|
|
|
|
|
|
|
|
Type `int ()' -- used for implicit declaration of functions.
|
|
|
|
|
|
|
|
|
|
tree default_function_type;
|
|
|
|
|
|
|
|
|
|
Function types `int (int)', etc.
|
|
|
|
|
|
|
|
|
|
tree int_ftype_int;
|
|
|
|
|
tree void_ftype;
|
|
|
|
|
tree void_ftype_ptr;
|
|
|
|
|
tree int_ftype_int;
|
|
|
|
|
tree ptr_ftype_sizetype;
|
|
|
|
|
|
|
|
|
|
A VOID_TYPE node, packaged in a TREE_LIST.
|
|
|
|
|
|
|
|
|
|
tree void_list_node;
|
|
|
|
|
|
top level:
* c-common.c (declare_function_name): Use func_id_node,
function_id_node, and pretty_function_id_node. Do not make
__func__ visible at file scope.
* c-common.h (c_tree_index): Add CTI_FUNCTION_ID,
CTI_PRETTY_FUNCTION_ID, and CTI_FUNC_ID.
(function_id_node, pretty_function_id_node, func_id_node): New
macros.
* c-decl.c (init_decl_processing): Initialize function_id_node,
pretty_function_id_node, and func_id_node.
(c_make_fname_decl): Correct comment.
* tree.h (struct tree_identifier): Constify pointer member.
* c-decl.c (pushdecl, implicit_decl_warning): Constify a char *.
* c-pragma.h (struct weak_syms): Constify name and value members.
(add_weak): Constify arguments.
* calls.c (special_function_p): Constify a char *.
(expand_call): Remove variable which is initialized and then
never used.
* dependence.c (struct def_use, struct induction, struct subscript):
Constify 'variable' member.
(get_low_bound, have_induction_variable): Constify char * argument.
(find_induction_variable): Add braces to avoid dangling else.
(classify_dependence): Constify char * arrays.
* profile.c (output_func_start_profiler): Constify a char *.
* stor-layout.c (finalize_record_size): Constify a char *.
* tree.c (is_attribute_p): Constify a char *.
* varasm.c (add_weak, remove_from_pending_weak_list): Constify argument.
* varasm.c (make_function_rtl, make_decl_rtl): Rearrange code
for comprehensibility. Do not call get_identifier if we did
not change the DECL_ASSEMBLER_NAME of the decl. Use alloca to
create temporary string constants, not ggc_alloc_string. No
need to copy result of ASM_FORMAT_PRIVATE_NAME. Use const
char * to hold IDENTIFIER_POINTERs.
ch:
* inout.c (add_enum_to_list): Use DECL_NAME directly, don't get
its IDENTIFIER_POINTER and immediately call get_identifier on it.
* lex.c (yywrap): Constify a char *.
cp:
* class.c (build_secondary_vtable): Constify a char *.
* decl.c (init_decl_processing): Initialize function_id_node,
pretty_function_id_node, and func_id_node.
* input.c (struct input_source): Constify 'str'.
(feed_input): Constify first argument.
* mangle.c (write_identifier): Constify argument.
* pt.c (mangle_class_name_for_template): Constify argument.
f:
* ansify.c: Use #line, not # <number>.
java:
* jcf-parse.c (set_source_filename): Constify a char *.
* jcf-write.c (append_innerclasses_attribute,
make_class_file_name): Constify a char *. Don't recycle a
variable for an unrelated purpose.
* parse.y: (build_alias_initializer_parameter_list): Constify a char *.
(breakdown_qualified): Do not modify IDENTIFIER_POINTER strings.
From-SVN: r36055
2000-08-29 23:39:49 +02:00
|
|
|
|
The identifiers __FUNCTION__, __PRETTY_FUNCTION__, and __func__.
|
|
|
|
|
|
|
|
|
|
tree function_id_node;
|
|
|
|
|
tree pretty_function_id_node;
|
|
|
|
|
tree func_id_node;
|
|
|
|
|
|
1999-07-20 12:41:10 +02:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
tree c_global_trees[CTI_MAX];
|
1993-01-30 07:06:09 +01:00
|
|
|
|
|
2000-06-30 20:20:42 +02:00
|
|
|
|
/* The elements of `ridpointers' are identifier nodes for the reserved
|
|
|
|
|
type names and storage classes. It is indexed by a RID_... value. */
|
|
|
|
|
tree *ridpointers;
|
|
|
|
|
|
2000-03-08 12:21:28 +01:00
|
|
|
|
tree (*make_fname_decl) PARAMS ((tree, const char *, int));
|
|
|
|
|
|
2000-09-07 03:36:11 +02:00
|
|
|
|
/* If non-NULL, the address of a language-specific function that
|
|
|
|
|
returns 1 for language-specific statement codes. */
|
|
|
|
|
int (*lang_statement_code_p) PARAMS ((enum tree_code));
|
|
|
|
|
|
2000-09-17 09:38:23 +02:00
|
|
|
|
/* If non-NULL, the address of a language-specific function that takes
|
|
|
|
|
any action required right before expand_function_end is called. */
|
|
|
|
|
void (*lang_expand_function_end) PARAMS ((void));
|
|
|
|
|
|
1996-12-07 23:51:24 +01:00
|
|
|
|
/* Nonzero means the expression being parsed will never be evaluated.
|
|
|
|
|
This is a count, since unevaluated expressions can nest. */
|
|
|
|
|
int skip_evaluation;
|
|
|
|
|
|
1996-05-06 20:36:48 +02:00
|
|
|
|
enum attrs {A_PACKED, A_NOCOMMON, A_COMMON, A_NORETURN, A_CONST, A_T_UNION,
|
1998-10-11 04:21:54 +02:00
|
|
|
|
A_NO_CHECK_MEMORY_USAGE, A_NO_INSTRUMENT_FUNCTION,
|
1995-04-10 14:20:09 +02:00
|
|
|
|
A_CONSTRUCTOR, A_DESTRUCTOR, A_MODE, A_SECTION, A_ALIGNED,
|
1999-12-04 04:00:04 +01:00
|
|
|
|
A_UNUSED, A_FORMAT, A_FORMAT_ARG, A_WEAK, A_ALIAS, A_MALLOC,
|
2000-04-13 15:59:00 +02:00
|
|
|
|
A_NO_LIMIT_STACK, A_PURE};
|
1995-03-30 15:59:11 +02:00
|
|
|
|
|
1998-04-12 21:52:16 +02:00
|
|
|
|
enum format_type { printf_format_type, scanf_format_type,
|
|
|
|
|
strftime_format_type };
|
|
|
|
|
|
2000-01-12 23:47:13 +01:00
|
|
|
|
static void add_attribute PARAMS ((enum attrs, const char *,
|
|
|
|
|
int, int, int));
|
|
|
|
|
static void init_attributes PARAMS ((void));
|
|
|
|
|
static void record_function_format PARAMS ((tree, tree, enum format_type,
|
|
|
|
|
int, int));
|
|
|
|
|
static void record_international_format PARAMS ((tree, tree, int));
|
|
|
|
|
static int default_valid_lang_attribute PARAMS ((tree, tree, tree, tree));
|
1993-08-15 11:30:20 +02:00
|
|
|
|
|
1998-02-17 23:28:23 +01:00
|
|
|
|
/* Keep a stack of if statements. We record the number of compound
|
|
|
|
|
statements seen up to the if keyword, as well as the line number
|
|
|
|
|
and file of the if. If a potentially ambiguous else is seen, that
|
|
|
|
|
fact is recorded; the warning is issued when we can be sure that
|
|
|
|
|
the enclosing if statement does not have an else branch. */
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
int compstmt_count;
|
|
|
|
|
int line;
|
c-aux-info.c (data_type, [...]): Qualify a char* with the `const' keyword.
* c-aux-info.c (data_type, affix_data_type, gen_decl,
gen_formal_list_for_type, gen_formal_list_for_func_def, gen_type):
Qualify a char* with the `const' keyword.
* c-common.c (declare_hidden_char_array, add_attribute, if_elt,
declare_function_name, decl_attributes, format_char_info,
check_format_info, binary_op_error): Likewise.
* cexp.y (yyerror, error, pedwarn, warning, token): Likewise.
* gcse.c (dump_hash_table): Likewise.
* integrate.c (function_cannot_inline_p): Likewise
* optabs.c: Include insn-config.h earlier.
(init_libfuncs, init_integral_libfuncs, init_floating_libfuncs):
Qualify a char* with the `const' keyword.
* real.c (asctoe24, asctoe53, asctoe64, asctoe113, asctoe,
asctoeg, mtherr, ereal_atof): Likewise.
* real.h (ereal_atof): Likewise.
* sbitmap.c (dump_sbitmap_vector): Likewise.
* sbitmap.h (dump_sbitmap_vector): Likewise.
* stmt.c (nesting, n_occurrences, expand_start_case): Likewise.
* toplev.c (rest_of_compilation): Likewise.
* tree.h (function_cannot_inline_p, expand_start_case): Likewise.
From-SVN: r25614
1999-03-06 06:34:26 +01:00
|
|
|
|
const char *file;
|
1998-02-17 23:28:23 +01:00
|
|
|
|
int needs_warning;
|
2000-09-17 09:38:23 +02:00
|
|
|
|
tree if_stmt;
|
1998-02-17 23:28:23 +01:00
|
|
|
|
} if_elt;
|
|
|
|
|
|
|
|
|
|
static if_elt *if_stack;
|
1998-02-05 21:54:49 +01:00
|
|
|
|
|
|
|
|
|
/* Amount of space in the if statement stack. */
|
|
|
|
|
static int if_stack_space = 0;
|
|
|
|
|
|
|
|
|
|
/* Stack pointer. */
|
|
|
|
|
static int if_stack_pointer = 0;
|
|
|
|
|
|
2000-09-17 09:38:23 +02:00
|
|
|
|
/* Record the start of an if-then, and record the start of it
|
1998-02-17 23:28:23 +01:00
|
|
|
|
for ambiguous else detection. */
|
|
|
|
|
|
1998-02-05 21:54:49 +01:00
|
|
|
|
void
|
2000-09-17 09:38:23 +02:00
|
|
|
|
c_expand_start_cond (cond, compstmt_count)
|
1998-02-05 21:54:49 +01:00
|
|
|
|
tree cond;
|
|
|
|
|
int compstmt_count;
|
|
|
|
|
{
|
2000-09-17 09:38:23 +02:00
|
|
|
|
tree if_stmt;
|
|
|
|
|
|
1998-02-05 21:54:49 +01:00
|
|
|
|
/* Make sure there is enough space on the stack. */
|
|
|
|
|
if (if_stack_space == 0)
|
|
|
|
|
{
|
|
|
|
|
if_stack_space = 10;
|
1998-02-17 23:28:23 +01:00
|
|
|
|
if_stack = (if_elt *)xmalloc (10 * sizeof (if_elt));
|
1998-02-05 21:54:49 +01:00
|
|
|
|
}
|
|
|
|
|
else if (if_stack_space == if_stack_pointer)
|
|
|
|
|
{
|
|
|
|
|
if_stack_space += 10;
|
1998-02-17 23:28:23 +01:00
|
|
|
|
if_stack = (if_elt *)xrealloc (if_stack, if_stack_space * sizeof (if_elt));
|
1998-02-05 21:54:49 +01:00
|
|
|
|
}
|
1998-02-17 23:28:23 +01:00
|
|
|
|
|
2000-09-17 09:38:23 +02:00
|
|
|
|
if_stmt = build_stmt (IF_STMT, NULL_TREE, NULL_TREE, NULL_TREE);
|
|
|
|
|
IF_COND (if_stmt) = cond;
|
|
|
|
|
add_stmt (if_stmt);
|
|
|
|
|
|
1998-02-05 21:54:49 +01:00
|
|
|
|
/* Record this if statement. */
|
1998-02-17 23:28:23 +01:00
|
|
|
|
if_stack[if_stack_pointer].compstmt_count = compstmt_count;
|
|
|
|
|
if_stack[if_stack_pointer].file = input_filename;
|
|
|
|
|
if_stack[if_stack_pointer].line = lineno;
|
|
|
|
|
if_stack[if_stack_pointer].needs_warning = 0;
|
2000-09-17 09:38:23 +02:00
|
|
|
|
if_stack[if_stack_pointer].if_stmt = if_stmt;
|
1998-02-17 23:28:23 +01:00
|
|
|
|
if_stack_pointer++;
|
2000-09-17 09:38:23 +02:00
|
|
|
|
}
|
1998-02-05 21:54:49 +01:00
|
|
|
|
|
2000-09-17 09:38:23 +02:00
|
|
|
|
/* Called after the then-clause for an if-statement is processed. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
c_finish_then ()
|
|
|
|
|
{
|
|
|
|
|
tree if_stmt = if_stack[if_stack_pointer - 1].if_stmt;
|
|
|
|
|
RECHAIN_STMTS (if_stmt, THEN_CLAUSE (if_stmt));
|
1998-02-05 21:54:49 +01:00
|
|
|
|
}
|
|
|
|
|
|
2000-09-17 09:38:23 +02:00
|
|
|
|
/* Record the end of an if-then. Optionally warn if a nested
|
1998-02-17 23:28:23 +01:00
|
|
|
|
if statement had an ambiguous else clause. */
|
|
|
|
|
|
1998-02-05 21:54:49 +01:00
|
|
|
|
void
|
|
|
|
|
c_expand_end_cond ()
|
|
|
|
|
{
|
|
|
|
|
if_stack_pointer--;
|
1998-02-17 23:28:23 +01:00
|
|
|
|
if (if_stack[if_stack_pointer].needs_warning)
|
|
|
|
|
warning_with_file_and_line (if_stack[if_stack_pointer].file,
|
|
|
|
|
if_stack[if_stack_pointer].line,
|
|
|
|
|
"suggest explicit braces to avoid ambiguous `else'");
|
2000-09-17 09:38:23 +02:00
|
|
|
|
last_expr_type = NULL_TREE;
|
1998-02-05 21:54:49 +01:00
|
|
|
|
}
|
|
|
|
|
|
2000-09-17 09:38:23 +02:00
|
|
|
|
/* Called between the then-clause and the else-clause
|
1998-02-17 23:28:23 +01:00
|
|
|
|
of an if-then-else. */
|
|
|
|
|
|
1998-02-05 21:54:49 +01:00
|
|
|
|
void
|
|
|
|
|
c_expand_start_else ()
|
|
|
|
|
{
|
1998-02-17 23:28:23 +01:00
|
|
|
|
/* An ambiguous else warning must be generated for the enclosing if
|
|
|
|
|
statement, unless we see an else branch for that one, too. */
|
1998-02-05 21:54:49 +01:00
|
|
|
|
if (warn_parentheses
|
|
|
|
|
&& if_stack_pointer > 1
|
1998-02-17 23:28:23 +01:00
|
|
|
|
&& (if_stack[if_stack_pointer - 1].compstmt_count
|
|
|
|
|
== if_stack[if_stack_pointer - 2].compstmt_count))
|
|
|
|
|
if_stack[if_stack_pointer - 2].needs_warning = 1;
|
|
|
|
|
|
|
|
|
|
/* Even if a nested if statement had an else branch, it can't be
|
|
|
|
|
ambiguous if this one also has an else. So don't warn in that
|
|
|
|
|
case. Also don't warn for any if statements nested in this else. */
|
|
|
|
|
if_stack[if_stack_pointer - 1].needs_warning = 0;
|
|
|
|
|
if_stack[if_stack_pointer - 1].compstmt_count--;
|
2000-09-17 09:38:23 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Called after the else-clause for an if-statement is processed. */
|
1998-02-05 21:54:49 +01:00
|
|
|
|
|
2000-09-17 09:38:23 +02:00
|
|
|
|
void
|
|
|
|
|
c_finish_else ()
|
|
|
|
|
{
|
|
|
|
|
tree if_stmt = if_stack[if_stack_pointer - 1].if_stmt;
|
|
|
|
|
RECHAIN_STMTS (if_stmt, ELSE_CLAUSE (if_stmt));
|
1998-02-05 21:54:49 +01:00
|
|
|
|
}
|
|
|
|
|
|
1998-12-01 22:05:17 +01:00
|
|
|
|
/* Make bindings for __FUNCTION__, __PRETTY_FUNCTION__, and __func__. */
|
1992-05-22 22:33:20 +02:00
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
declare_function_name ()
|
|
|
|
|
{
|
c-aux-info.c (data_type, [...]): Qualify a char* with the `const' keyword.
* c-aux-info.c (data_type, affix_data_type, gen_decl,
gen_formal_list_for_type, gen_formal_list_for_func_def, gen_type):
Qualify a char* with the `const' keyword.
* c-common.c (declare_hidden_char_array, add_attribute, if_elt,
declare_function_name, decl_attributes, format_char_info,
check_format_info, binary_op_error): Likewise.
* cexp.y (yyerror, error, pedwarn, warning, token): Likewise.
* gcse.c (dump_hash_table): Likewise.
* integrate.c (function_cannot_inline_p): Likewise
* optabs.c: Include insn-config.h earlier.
(init_libfuncs, init_integral_libfuncs, init_floating_libfuncs):
Qualify a char* with the `const' keyword.
* real.c (asctoe24, asctoe53, asctoe64, asctoe113, asctoe,
asctoeg, mtherr, ereal_atof): Likewise.
* real.h (ereal_atof): Likewise.
* sbitmap.c (dump_sbitmap_vector): Likewise.
* sbitmap.h (dump_sbitmap_vector): Likewise.
* stmt.c (nesting, n_occurrences, expand_start_case): Likewise.
* toplev.c (rest_of_compilation): Likewise.
* tree.h (function_cannot_inline_p, expand_start_case): Likewise.
From-SVN: r25614
1999-03-06 06:34:26 +01:00
|
|
|
|
const char *name, *printable_name;
|
1992-05-22 22:33:20 +02:00
|
|
|
|
|
|
|
|
|
if (current_function_decl == NULL)
|
|
|
|
|
{
|
|
|
|
|
name = "";
|
|
|
|
|
printable_name = "top level";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
1992-09-10 07:33:47 +02:00
|
|
|
|
/* Allow functions to be nameless (such as artificial ones). */
|
|
|
|
|
if (DECL_NAME (current_function_decl))
|
|
|
|
|
name = IDENTIFIER_POINTER (DECL_NAME (current_function_decl));
|
|
|
|
|
else
|
|
|
|
|
name = "";
|
1997-02-16 11:05:43 +01:00
|
|
|
|
printable_name = (*decl_printable_name) (current_function_decl, 2);
|
top level:
* c-common.c (declare_function_name): Use func_id_node,
function_id_node, and pretty_function_id_node. Do not make
__func__ visible at file scope.
* c-common.h (c_tree_index): Add CTI_FUNCTION_ID,
CTI_PRETTY_FUNCTION_ID, and CTI_FUNC_ID.
(function_id_node, pretty_function_id_node, func_id_node): New
macros.
* c-decl.c (init_decl_processing): Initialize function_id_node,
pretty_function_id_node, and func_id_node.
(c_make_fname_decl): Correct comment.
* tree.h (struct tree_identifier): Constify pointer member.
* c-decl.c (pushdecl, implicit_decl_warning): Constify a char *.
* c-pragma.h (struct weak_syms): Constify name and value members.
(add_weak): Constify arguments.
* calls.c (special_function_p): Constify a char *.
(expand_call): Remove variable which is initialized and then
never used.
* dependence.c (struct def_use, struct induction, struct subscript):
Constify 'variable' member.
(get_low_bound, have_induction_variable): Constify char * argument.
(find_induction_variable): Add braces to avoid dangling else.
(classify_dependence): Constify char * arrays.
* profile.c (output_func_start_profiler): Constify a char *.
* stor-layout.c (finalize_record_size): Constify a char *.
* tree.c (is_attribute_p): Constify a char *.
* varasm.c (add_weak, remove_from_pending_weak_list): Constify argument.
* varasm.c (make_function_rtl, make_decl_rtl): Rearrange code
for comprehensibility. Do not call get_identifier if we did
not change the DECL_ASSEMBLER_NAME of the decl. Use alloca to
create temporary string constants, not ggc_alloc_string. No
need to copy result of ASM_FORMAT_PRIVATE_NAME. Use const
char * to hold IDENTIFIER_POINTERs.
ch:
* inout.c (add_enum_to_list): Use DECL_NAME directly, don't get
its IDENTIFIER_POINTER and immediately call get_identifier on it.
* lex.c (yywrap): Constify a char *.
cp:
* class.c (build_secondary_vtable): Constify a char *.
* decl.c (init_decl_processing): Initialize function_id_node,
pretty_function_id_node, and func_id_node.
* input.c (struct input_source): Constify 'str'.
(feed_input): Constify first argument.
* mangle.c (write_identifier): Constify argument.
* pt.c (mangle_class_name_for_template): Constify argument.
f:
* ansify.c: Use #line, not # <number>.
java:
* jcf-parse.c (set_source_filename): Constify a char *.
* jcf-write.c (append_innerclasses_attribute,
make_class_file_name): Constify a char *. Don't recycle a
variable for an unrelated purpose.
* parse.y: (build_alias_initializer_parameter_list): Constify a char *.
(breakdown_qualified): Do not modify IDENTIFIER_POINTER strings.
From-SVN: r36055
2000-08-29 23:39:49 +02:00
|
|
|
|
|
|
|
|
|
/* ISO C99 defines __func__, which is a variable, not a string
|
|
|
|
|
constant, and which is not a defined symbol at file scope. */
|
|
|
|
|
(*make_fname_decl) (func_id_node, name, 0);
|
1992-05-22 22:33:20 +02:00
|
|
|
|
}
|
2000-03-08 12:21:28 +01:00
|
|
|
|
|
top level:
* c-common.c (declare_function_name): Use func_id_node,
function_id_node, and pretty_function_id_node. Do not make
__func__ visible at file scope.
* c-common.h (c_tree_index): Add CTI_FUNCTION_ID,
CTI_PRETTY_FUNCTION_ID, and CTI_FUNC_ID.
(function_id_node, pretty_function_id_node, func_id_node): New
macros.
* c-decl.c (init_decl_processing): Initialize function_id_node,
pretty_function_id_node, and func_id_node.
(c_make_fname_decl): Correct comment.
* tree.h (struct tree_identifier): Constify pointer member.
* c-decl.c (pushdecl, implicit_decl_warning): Constify a char *.
* c-pragma.h (struct weak_syms): Constify name and value members.
(add_weak): Constify arguments.
* calls.c (special_function_p): Constify a char *.
(expand_call): Remove variable which is initialized and then
never used.
* dependence.c (struct def_use, struct induction, struct subscript):
Constify 'variable' member.
(get_low_bound, have_induction_variable): Constify char * argument.
(find_induction_variable): Add braces to avoid dangling else.
(classify_dependence): Constify char * arrays.
* profile.c (output_func_start_profiler): Constify a char *.
* stor-layout.c (finalize_record_size): Constify a char *.
* tree.c (is_attribute_p): Constify a char *.
* varasm.c (add_weak, remove_from_pending_weak_list): Constify argument.
* varasm.c (make_function_rtl, make_decl_rtl): Rearrange code
for comprehensibility. Do not call get_identifier if we did
not change the DECL_ASSEMBLER_NAME of the decl. Use alloca to
create temporary string constants, not ggc_alloc_string. No
need to copy result of ASM_FORMAT_PRIVATE_NAME. Use const
char * to hold IDENTIFIER_POINTERs.
ch:
* inout.c (add_enum_to_list): Use DECL_NAME directly, don't get
its IDENTIFIER_POINTER and immediately call get_identifier on it.
* lex.c (yywrap): Constify a char *.
cp:
* class.c (build_secondary_vtable): Constify a char *.
* decl.c (init_decl_processing): Initialize function_id_node,
pretty_function_id_node, and func_id_node.
* input.c (struct input_source): Constify 'str'.
(feed_input): Constify first argument.
* mangle.c (write_identifier): Constify argument.
* pt.c (mangle_class_name_for_template): Constify argument.
f:
* ansify.c: Use #line, not # <number>.
java:
* jcf-parse.c (set_source_filename): Constify a char *.
* jcf-write.c (append_innerclasses_attribute,
make_class_file_name): Constify a char *. Don't recycle a
variable for an unrelated purpose.
* parse.y: (build_alias_initializer_parameter_list): Constify a char *.
(breakdown_qualified): Do not modify IDENTIFIER_POINTER strings.
From-SVN: r36055
2000-08-29 23:39:49 +02:00
|
|
|
|
(*make_fname_decl) (function_id_node, name, 0);
|
|
|
|
|
(*make_fname_decl) (pretty_function_id_node, printable_name, 1);
|
1992-05-22 22:33:20 +02:00
|
|
|
|
}
|
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
/* Given a chain of STRING_CST nodes,
|
|
|
|
|
concatenate them into one STRING_CST
|
|
|
|
|
and give it a suitable array-of-chars data type. */
|
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
combine_strings (strings)
|
|
|
|
|
tree strings;
|
|
|
|
|
{
|
|
|
|
|
register tree value, t;
|
|
|
|
|
register int length = 1;
|
|
|
|
|
int wide_length = 0;
|
|
|
|
|
int wide_flag = 0;
|
|
|
|
|
int wchar_bytes = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT;
|
|
|
|
|
int nchars;
|
2000-07-12 23:03:29 +02:00
|
|
|
|
const int nchars_max = flag_isoc99 ? 4095 : 509;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
|
|
|
|
if (TREE_CHAIN (strings))
|
|
|
|
|
{
|
|
|
|
|
/* More than one in the chain, so concatenate. */
|
|
|
|
|
register char *p, *q;
|
|
|
|
|
|
|
|
|
|
/* Don't include the \0 at the end of each substring,
|
|
|
|
|
except for the last one.
|
|
|
|
|
Count wide strings and ordinary strings separately. */
|
|
|
|
|
for (t = strings; t; t = TREE_CHAIN (t))
|
|
|
|
|
{
|
|
|
|
|
if (TREE_TYPE (t) == wchar_array_type_node)
|
|
|
|
|
{
|
|
|
|
|
wide_length += (TREE_STRING_LENGTH (t) - wchar_bytes);
|
|
|
|
|
wide_flag = 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
length += (TREE_STRING_LENGTH (t) - 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If anything is wide, the non-wides will be converted,
|
|
|
|
|
which makes them take more space. */
|
|
|
|
|
if (wide_flag)
|
|
|
|
|
length = length * wchar_bytes + wide_length;
|
|
|
|
|
|
c-common.c, [...]: Remove all references to obstack functions obsoleted by GC...
* c-common.c, c-decl.c, c-lang.c, c-lex.c, c-parse.in, c-pragma.c,
c-typeck.c, objc/objc-act.c: Remove all references to obstack
functions obsoleted by GC, such as push_obstacks_nochange,
end_temporary_allocation, savealloc, saveable_tree_cons, etc.
and code which existed only to decide whether or not to call
them. Remove now-unused NESTED argument from start_function;
all callers changed. Do not change behavior based on ggc_p.
The use of the ixp_obstack in c-iterate.c and the util_obstack
in objc/objc-act.c remain; these are not obsoleted by garbage
collection.
* c-tree.h: Update prototype for start_function.
* c-parse.y, c-parse.c, objc/objc-parse.c, objc/objc-parse.y: Rebuild.
From-SVN: r31611
2000-01-25 18:13:14 +01:00
|
|
|
|
p = ggc_alloc_string (NULL, length);
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
|
|
|
|
/* Copy the individual strings into the new combined string.
|
|
|
|
|
If the combined string is wide, convert the chars to ints
|
|
|
|
|
for any individual strings that are not wide. */
|
|
|
|
|
|
|
|
|
|
q = p;
|
|
|
|
|
for (t = strings; t; t = TREE_CHAIN (t))
|
|
|
|
|
{
|
|
|
|
|
int len = (TREE_STRING_LENGTH (t)
|
|
|
|
|
- ((TREE_TYPE (t) == wchar_array_type_node)
|
|
|
|
|
? wchar_bytes : 1));
|
|
|
|
|
if ((TREE_TYPE (t) == wchar_array_type_node) == wide_flag)
|
|
|
|
|
{
|
1998-09-21 01:54:10 +02:00
|
|
|
|
memcpy (q, TREE_STRING_POINTER (t), len);
|
1992-02-04 20:51:11 +01:00
|
|
|
|
q += len;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < len; i++)
|
1995-11-29 20:05:42 +01:00
|
|
|
|
{
|
|
|
|
|
if (WCHAR_TYPE_SIZE == HOST_BITS_PER_SHORT)
|
|
|
|
|
((short *) q)[i] = TREE_STRING_POINTER (t)[i];
|
|
|
|
|
else
|
|
|
|
|
((int *) q)[i] = TREE_STRING_POINTER (t)[i];
|
|
|
|
|
}
|
1992-02-04 20:51:11 +01:00
|
|
|
|
q += len * wchar_bytes;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (wide_flag)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < wchar_bytes; i++)
|
|
|
|
|
*q++ = 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
*q = 0;
|
|
|
|
|
|
|
|
|
|
value = make_node (STRING_CST);
|
|
|
|
|
TREE_STRING_POINTER (value) = p;
|
|
|
|
|
TREE_STRING_LENGTH (value) = length;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
value = strings;
|
|
|
|
|
length = TREE_STRING_LENGTH (value);
|
|
|
|
|
if (TREE_TYPE (value) == wchar_array_type_node)
|
|
|
|
|
wide_flag = 1;
|
|
|
|
|
}
|
|
|
|
|
|
1998-05-04 22:19:33 +02:00
|
|
|
|
/* Compute the number of elements, for the array type. */
|
1992-02-04 20:51:11 +01:00
|
|
|
|
nchars = wide_flag ? length / wchar_bytes : length;
|
|
|
|
|
|
2000-07-12 23:03:29 +02:00
|
|
|
|
if (pedantic && nchars > nchars_max)
|
c-common.c (combine_strings, [...]): Refer to ISO C or ISO C89 instead of ANSI C.
* c-common.c (combine_strings, check_format_info): Refer to ISO C
or ISO C89 instead of ANSI C.
* c-decl.c (grokdeclarator, xref_tag, finish_struct,
build_enumerator, do_case): Likewise.
* c-lex.c (parse_float, yylex): Likewise.
* c-parse.in: Likewise.
* c-typeck.c (common_type, build_array_ref, build_binary_op,
build_unary_op, pedantic_lvalue_warning, build_conditional_expr,
build_c_cast, convert_for_assignment, set_init_index,
set_init_label, c_expand_start_case): Likewise.
* toplev.c (documented_lang_options, display_help): Likewise.
From-SVN: r35576
2000-08-09 01:19:11 +02:00
|
|
|
|
pedwarn ("string length `%d' is greater than the minimum length `%d' ISO C%d is required to support",
|
|
|
|
|
nchars, nchars_max, flag_isoc99 ? 99 : 89);
|
2000-07-12 23:03:29 +02:00
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
/* Create the array type for the string constant.
|
|
|
|
|
-Wwrite-strings says make the string constant an array of const char
|
1998-08-24 04:08:45 +02:00
|
|
|
|
so that copying it to a non-const pointer will get a warning.
|
|
|
|
|
For C++, this is the standard behavior. */
|
|
|
|
|
if (flag_const_strings
|
1992-02-04 20:51:11 +01:00
|
|
|
|
&& (! flag_traditional && ! flag_writable_strings))
|
|
|
|
|
{
|
|
|
|
|
tree elements
|
|
|
|
|
= build_type_variant (wide_flag ? wchar_type_node : char_type_node,
|
|
|
|
|
1, 0);
|
|
|
|
|
TREE_TYPE (value)
|
|
|
|
|
= build_array_type (elements,
|
|
|
|
|
build_index_type (build_int_2 (nchars - 1, 0)));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
TREE_TYPE (value)
|
|
|
|
|
= build_array_type (wide_flag ? wchar_type_node : char_type_node,
|
|
|
|
|
build_index_type (build_int_2 (nchars - 1, 0)));
|
1998-08-24 04:08:45 +02:00
|
|
|
|
|
1999-08-25 23:05:16 +02:00
|
|
|
|
TREE_CONSTANT (value) = 1;
|
|
|
|
|
TREE_READONLY (value) = ! flag_writable_strings;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
TREE_STATIC (value) = 1;
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
|
1995-03-30 15:59:11 +02:00
|
|
|
|
/* To speed up processing of attributes, we maintain an array of
|
|
|
|
|
IDENTIFIER_NODES and the corresponding attribute types. */
|
|
|
|
|
|
|
|
|
|
/* Array to hold attribute information. */
|
|
|
|
|
|
|
|
|
|
static struct {enum attrs id; tree name; int min, max, decl_req;} attrtab[50];
|
|
|
|
|
|
|
|
|
|
static int attrtab_idx = 0;
|
|
|
|
|
|
|
|
|
|
/* Add an entry to the attribute table above. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
add_attribute (id, string, min_len, max_len, decl_req)
|
|
|
|
|
enum attrs id;
|
c-aux-info.c (data_type, [...]): Qualify a char* with the `const' keyword.
* c-aux-info.c (data_type, affix_data_type, gen_decl,
gen_formal_list_for_type, gen_formal_list_for_func_def, gen_type):
Qualify a char* with the `const' keyword.
* c-common.c (declare_hidden_char_array, add_attribute, if_elt,
declare_function_name, decl_attributes, format_char_info,
check_format_info, binary_op_error): Likewise.
* cexp.y (yyerror, error, pedwarn, warning, token): Likewise.
* gcse.c (dump_hash_table): Likewise.
* integrate.c (function_cannot_inline_p): Likewise
* optabs.c: Include insn-config.h earlier.
(init_libfuncs, init_integral_libfuncs, init_floating_libfuncs):
Qualify a char* with the `const' keyword.
* real.c (asctoe24, asctoe53, asctoe64, asctoe113, asctoe,
asctoeg, mtherr, ereal_atof): Likewise.
* real.h (ereal_atof): Likewise.
* sbitmap.c (dump_sbitmap_vector): Likewise.
* sbitmap.h (dump_sbitmap_vector): Likewise.
* stmt.c (nesting, n_occurrences, expand_start_case): Likewise.
* toplev.c (rest_of_compilation): Likewise.
* tree.h (function_cannot_inline_p, expand_start_case): Likewise.
From-SVN: r25614
1999-03-06 06:34:26 +01:00
|
|
|
|
const char *string;
|
1995-03-30 15:59:11 +02:00
|
|
|
|
int min_len, max_len;
|
|
|
|
|
int decl_req;
|
|
|
|
|
{
|
|
|
|
|
char buf[100];
|
|
|
|
|
|
|
|
|
|
attrtab[attrtab_idx].id = id;
|
|
|
|
|
attrtab[attrtab_idx].name = get_identifier (string);
|
|
|
|
|
attrtab[attrtab_idx].min = min_len;
|
|
|
|
|
attrtab[attrtab_idx].max = max_len;
|
|
|
|
|
attrtab[attrtab_idx++].decl_req = decl_req;
|
|
|
|
|
|
|
|
|
|
sprintf (buf, "__%s__", string);
|
|
|
|
|
|
|
|
|
|
attrtab[attrtab_idx].id = id;
|
|
|
|
|
attrtab[attrtab_idx].name = get_identifier (buf);
|
|
|
|
|
attrtab[attrtab_idx].min = min_len;
|
|
|
|
|
attrtab[attrtab_idx].max = max_len;
|
|
|
|
|
attrtab[attrtab_idx++].decl_req = decl_req;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Initialize attribute table. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
init_attributes ()
|
|
|
|
|
{
|
1995-04-26 23:23:10 +02:00
|
|
|
|
add_attribute (A_PACKED, "packed", 0, 0, 0);
|
1995-04-10 14:20:09 +02:00
|
|
|
|
add_attribute (A_NOCOMMON, "nocommon", 0, 0, 1);
|
1996-05-06 20:36:48 +02:00
|
|
|
|
add_attribute (A_COMMON, "common", 0, 0, 1);
|
1995-03-30 15:59:11 +02:00
|
|
|
|
add_attribute (A_NORETURN, "noreturn", 0, 0, 1);
|
|
|
|
|
add_attribute (A_NORETURN, "volatile", 0, 0, 1);
|
1998-02-05 21:54:49 +01:00
|
|
|
|
add_attribute (A_UNUSED, "unused", 0, 0, 0);
|
1995-03-30 15:59:11 +02:00
|
|
|
|
add_attribute (A_CONST, "const", 0, 0, 1);
|
|
|
|
|
add_attribute (A_T_UNION, "transparent_union", 0, 0, 0);
|
|
|
|
|
add_attribute (A_CONSTRUCTOR, "constructor", 0, 0, 1);
|
|
|
|
|
add_attribute (A_DESTRUCTOR, "destructor", 0, 0, 1);
|
|
|
|
|
add_attribute (A_MODE, "mode", 1, 1, 1);
|
|
|
|
|
add_attribute (A_SECTION, "section", 1, 1, 1);
|
|
|
|
|
add_attribute (A_ALIGNED, "aligned", 0, 1, 0);
|
1995-03-31 14:26:28 +02:00
|
|
|
|
add_attribute (A_FORMAT, "format", 3, 3, 1);
|
1996-06-08 19:35:57 +02:00
|
|
|
|
add_attribute (A_FORMAT_ARG, "format_arg", 1, 1, 1);
|
1995-04-16 08:14:00 +02:00
|
|
|
|
add_attribute (A_WEAK, "weak", 0, 0, 1);
|
|
|
|
|
add_attribute (A_ALIAS, "alias", 1, 1, 1);
|
1998-07-30 12:38:22 +02:00
|
|
|
|
add_attribute (A_NO_INSTRUMENT_FUNCTION, "no_instrument_function", 0, 0, 1);
|
1998-10-11 04:21:54 +02:00
|
|
|
|
add_attribute (A_NO_CHECK_MEMORY_USAGE, "no_check_memory_usage", 0, 0, 1);
|
1999-11-28 21:45:34 +01:00
|
|
|
|
add_attribute (A_MALLOC, "malloc", 0, 0, 1);
|
1999-12-04 04:00:04 +01:00
|
|
|
|
add_attribute (A_NO_LIMIT_STACK, "no_stack_limit", 0, 0, 1);
|
2000-04-13 15:59:00 +02:00
|
|
|
|
add_attribute (A_PURE, "pure", 0, 0, 1);
|
1995-03-30 15:59:11 +02:00
|
|
|
|
}
|
|
|
|
|
|
1999-04-13 23:04:06 +02:00
|
|
|
|
/* Default implementation of valid_lang_attribute, below. By default, there
|
|
|
|
|
are no language-specific attributes. */
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
default_valid_lang_attribute (attr_name, attr_args, decl, type)
|
|
|
|
|
tree attr_name ATTRIBUTE_UNUSED;
|
|
|
|
|
tree attr_args ATTRIBUTE_UNUSED;
|
|
|
|
|
tree decl ATTRIBUTE_UNUSED;
|
|
|
|
|
tree type ATTRIBUTE_UNUSED;
|
|
|
|
|
{
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Return a 1 if ATTR_NAME and ATTR_ARGS denote a valid language-specific
|
|
|
|
|
attribute for either declaration DECL or type TYPE and 0 otherwise. */
|
|
|
|
|
|
2000-01-12 23:47:13 +01:00
|
|
|
|
int (*valid_lang_attribute) PARAMS ((tree, tree, tree, tree))
|
1999-04-13 23:04:06 +02:00
|
|
|
|
= default_valid_lang_attribute;
|
|
|
|
|
|
1995-02-21 23:55:41 +01:00
|
|
|
|
/* Process the attributes listed in ATTRIBUTES and PREFIX_ATTRIBUTES
|
1995-03-30 15:59:11 +02:00
|
|
|
|
and install them in NODE, which is either a DECL (including a TYPE_DECL)
|
|
|
|
|
or a TYPE. PREFIX_ATTRIBUTES can appear after the declaration specifiers
|
1996-07-04 00:07:53 +02:00
|
|
|
|
and declaration modifiers but before the declaration proper. */
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
|
|
|
|
void
|
1995-03-30 15:59:11 +02:00
|
|
|
|
decl_attributes (node, attributes, prefix_attributes)
|
|
|
|
|
tree node, attributes, prefix_attributes;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
{
|
1998-03-25 14:42:05 +01:00
|
|
|
|
tree decl = 0, type = 0;
|
|
|
|
|
int is_type = 0;
|
1995-03-30 15:59:11 +02:00
|
|
|
|
tree a;
|
|
|
|
|
|
|
|
|
|
if (attrtab_idx == 0)
|
|
|
|
|
init_attributes ();
|
|
|
|
|
|
builtin.c (get_pointer_alignment): Use DECL_P and TYPE_P macros.
* builtin.c (get_pointer_alignment): Use DECL_P and TYPE_P macros.
* c-common.c (decl_attributes,check_format_info,truthvalue_conversion,
c_get_alias_set): Likewise.
* c-decl.c (duplicate_decls): Likewise.
* c-typeck.c (default_conversion,build_unary_op): Likewise.
* calls.c (initialize_argument_information): Likewise.
* dwarf2out.c (decl_class_context,add_abstract_origin_attribute):
Likewise.
* dwarfout.c (decl_class_context,output_type): Likewise.
* expr.c (get_inner_reference): Likewise.
* fold-const.c (simple_operand_p,fold): Likewise.
* function.c (aggregate_value_p): Likewise.
* stmt.c (expand_asm_operands): Likewise.
* varasm.c (named_section): Likewise.
* call.c (check_dtor_name,build_new_method_call): Likewise.
* decl.c (push_class_binding,poplevel,pushtag,lookup_namespace_name,
make_typename_type,check_initializer,cp_finish_decl,xref_tag): Likewise.
* decl2.c (grokfield,build_expr_from_tree,build_expr_from_tree,
decl_namespace,arg_assoc_template_arg,arg_assoc,
validate_nonmember_using_decl,do_class_using_decl): Likewise.
* error.c (dump_template_argument,dump_expr,cp_file_of,cp_line_of,
args_to_string): Likewise.
* friend.c (is_friend): Likewise.
* lex.c (note_got_semicolon,note_list_got_semicolon,is_global): Likewise.
* method.c (build_overload_nested_name,build_overload_value,
build_qualified_name,build_qualified_name,hack_identifier): Likewise.
* parse.y (typename_sub,typename_sub1): Likewise.
* pt.c (push_inline_template_parms_recursive,check_template_shadow,
process_partial_specialization,convert_template_argument,
template_args_equal,add_pending_template,lookup_template_class,
for_each_template_parm_r,maybe_fold_nontype_arg,
tsubst,instantiate_template,type_unification_real,unify,
instantiate_pending_templates,set_mangled_name_for_template_decl):
Likewise.
* repo.c (repo_get_id,repo_template_used): Likewise.
* search.c (lookup_field_1): Likewise.
* tree.c (walk_tree,get_type_decl,cp_tree_equal,member_p): Likewise.
* xref.c (classname): Likewise.
From-SVN: r32698
2000-03-23 01:41:05 +01:00
|
|
|
|
if (DECL_P (node))
|
1995-03-30 15:59:11 +02:00
|
|
|
|
{
|
|
|
|
|
decl = node;
|
|
|
|
|
type = TREE_TYPE (decl);
|
|
|
|
|
is_type = TREE_CODE (node) == TYPE_DECL;
|
|
|
|
|
}
|
builtin.c (get_pointer_alignment): Use DECL_P and TYPE_P macros.
* builtin.c (get_pointer_alignment): Use DECL_P and TYPE_P macros.
* c-common.c (decl_attributes,check_format_info,truthvalue_conversion,
c_get_alias_set): Likewise.
* c-decl.c (duplicate_decls): Likewise.
* c-typeck.c (default_conversion,build_unary_op): Likewise.
* calls.c (initialize_argument_information): Likewise.
* dwarf2out.c (decl_class_context,add_abstract_origin_attribute):
Likewise.
* dwarfout.c (decl_class_context,output_type): Likewise.
* expr.c (get_inner_reference): Likewise.
* fold-const.c (simple_operand_p,fold): Likewise.
* function.c (aggregate_value_p): Likewise.
* stmt.c (expand_asm_operands): Likewise.
* varasm.c (named_section): Likewise.
* call.c (check_dtor_name,build_new_method_call): Likewise.
* decl.c (push_class_binding,poplevel,pushtag,lookup_namespace_name,
make_typename_type,check_initializer,cp_finish_decl,xref_tag): Likewise.
* decl2.c (grokfield,build_expr_from_tree,build_expr_from_tree,
decl_namespace,arg_assoc_template_arg,arg_assoc,
validate_nonmember_using_decl,do_class_using_decl): Likewise.
* error.c (dump_template_argument,dump_expr,cp_file_of,cp_line_of,
args_to_string): Likewise.
* friend.c (is_friend): Likewise.
* lex.c (note_got_semicolon,note_list_got_semicolon,is_global): Likewise.
* method.c (build_overload_nested_name,build_overload_value,
build_qualified_name,build_qualified_name,hack_identifier): Likewise.
* parse.y (typename_sub,typename_sub1): Likewise.
* pt.c (push_inline_template_parms_recursive,check_template_shadow,
process_partial_specialization,convert_template_argument,
template_args_equal,add_pending_template,lookup_template_class,
for_each_template_parm_r,maybe_fold_nontype_arg,
tsubst,instantiate_template,type_unification_real,unify,
instantiate_pending_templates,set_mangled_name_for_template_decl):
Likewise.
* repo.c (repo_get_id,repo_template_used): Likewise.
* search.c (lookup_field_1): Likewise.
* tree.c (walk_tree,get_type_decl,cp_tree_equal,member_p): Likewise.
* xref.c (classname): Likewise.
From-SVN: r32698
2000-03-23 01:41:05 +01:00
|
|
|
|
else if (TYPE_P (node))
|
1995-03-30 15:59:11 +02:00
|
|
|
|
type = node, is_type = 1;
|
1994-05-07 00:32:17 +02:00
|
|
|
|
|
1998-10-01 12:50:15 +02:00
|
|
|
|
#ifdef PRAGMA_INSERT_ATTRIBUTES
|
|
|
|
|
/* If the code in c-pragma.c wants to insert some attributes then
|
|
|
|
|
allow it to do so. Do this before allowing machine back ends to
|
|
|
|
|
insert attributes, so that they have the opportunity to override
|
|
|
|
|
anything done here. */
|
|
|
|
|
PRAGMA_INSERT_ATTRIBUTES (node, & attributes, & prefix_attributes);
|
|
|
|
|
#endif
|
2000-01-03 22:48:49 +01:00
|
|
|
|
|
1998-09-02 11:59:57 +02:00
|
|
|
|
#ifdef INSERT_ATTRIBUTES
|
|
|
|
|
INSERT_ATTRIBUTES (node, & attributes, & prefix_attributes);
|
|
|
|
|
#endif
|
2000-01-03 22:48:49 +01:00
|
|
|
|
|
1995-03-10 03:33:58 +01:00
|
|
|
|
attributes = chainon (prefix_attributes, attributes);
|
1994-02-17 23:48:50 +01:00
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
for (a = attributes; a; a = TREE_CHAIN (a))
|
1995-03-30 15:59:11 +02:00
|
|
|
|
{
|
|
|
|
|
tree name = TREE_PURPOSE (a);
|
|
|
|
|
tree args = TREE_VALUE (a);
|
|
|
|
|
int i;
|
|
|
|
|
enum attrs id;
|
1998-05-04 22:19:33 +02:00
|
|
|
|
|
1995-03-30 15:59:11 +02:00
|
|
|
|
for (i = 0; i < attrtab_idx; i++)
|
|
|
|
|
if (attrtab[i].name == name)
|
|
|
|
|
break;
|
|
|
|
|
|
1995-04-28 03:09:12 +02:00
|
|
|
|
if (i == attrtab_idx)
|
1995-03-30 15:59:11 +02:00
|
|
|
|
{
|
1999-04-13 23:04:06 +02:00
|
|
|
|
if (! valid_machine_attribute (name, args, decl, type)
|
|
|
|
|
&& ! (* valid_lang_attribute) (name, args, decl, type))
|
1995-04-28 03:09:12 +02:00
|
|
|
|
warning ("`%s' attribute directive ignored",
|
|
|
|
|
IDENTIFIER_POINTER (name));
|
1996-05-06 22:58:44 +02:00
|
|
|
|
else if (decl != 0)
|
|
|
|
|
type = TREE_TYPE (decl);
|
1995-03-30 15:59:11 +02:00
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
else if (attrtab[i].decl_req && decl == 0)
|
|
|
|
|
{
|
|
|
|
|
warning ("`%s' attribute does not apply to types",
|
|
|
|
|
IDENTIFIER_POINTER (name));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
else if (list_length (args) < attrtab[i].min
|
|
|
|
|
|| list_length (args) > attrtab[i].max)
|
|
|
|
|
{
|
|
|
|
|
error ("wrong number of arguments specified for `%s' attribute",
|
|
|
|
|
IDENTIFIER_POINTER (name));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
id = attrtab[i].id;
|
|
|
|
|
switch (id)
|
|
|
|
|
{
|
|
|
|
|
case A_PACKED:
|
1995-08-30 01:15:19 +02:00
|
|
|
|
if (is_type)
|
1995-04-26 23:23:10 +02:00
|
|
|
|
TYPE_PACKED (type) = 1;
|
|
|
|
|
else if (TREE_CODE (decl) == FIELD_DECL)
|
1995-03-30 15:59:11 +02:00
|
|
|
|
DECL_PACKED (decl) = 1;
|
|
|
|
|
/* We can't set DECL_PACKED for a VAR_DECL, because the bit is
|
|
|
|
|
used for DECL_REGISTER. It wouldn't mean anything anyway. */
|
|
|
|
|
else
|
|
|
|
|
warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
|
|
|
|
|
break;
|
|
|
|
|
|
1995-04-10 14:20:09 +02:00
|
|
|
|
case A_NOCOMMON:
|
|
|
|
|
if (TREE_CODE (decl) == VAR_DECL)
|
|
|
|
|
DECL_COMMON (decl) = 0;
|
|
|
|
|
else
|
|
|
|
|
warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
|
|
|
|
|
break;
|
|
|
|
|
|
1996-05-06 20:36:48 +02:00
|
|
|
|
case A_COMMON:
|
|
|
|
|
if (TREE_CODE (decl) == VAR_DECL)
|
|
|
|
|
DECL_COMMON (decl) = 1;
|
|
|
|
|
else
|
|
|
|
|
warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
|
|
|
|
|
break;
|
|
|
|
|
|
1995-03-30 15:59:11 +02:00
|
|
|
|
case A_NORETURN:
|
|
|
|
|
if (TREE_CODE (decl) == FUNCTION_DECL)
|
|
|
|
|
TREE_THIS_VOLATILE (decl) = 1;
|
|
|
|
|
else if (TREE_CODE (type) == POINTER_TYPE
|
|
|
|
|
&& TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
|
1998-05-04 22:19:33 +02:00
|
|
|
|
TREE_TYPE (decl) = type
|
1995-03-30 15:59:11 +02:00
|
|
|
|
= build_pointer_type
|
|
|
|
|
(build_type_variant (TREE_TYPE (type),
|
|
|
|
|
TREE_READONLY (TREE_TYPE (type)), 1));
|
|
|
|
|
else
|
|
|
|
|
warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
|
|
|
|
|
break;
|
|
|
|
|
|
1999-11-28 21:45:34 +01:00
|
|
|
|
case A_MALLOC:
|
|
|
|
|
if (TREE_CODE (decl) == FUNCTION_DECL)
|
|
|
|
|
DECL_IS_MALLOC (decl) = 1;
|
2000-04-13 15:59:00 +02:00
|
|
|
|
/* ??? TODO: Support types. */
|
1999-11-28 21:45:34 +01:00
|
|
|
|
else
|
|
|
|
|
warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
|
|
|
|
|
break;
|
|
|
|
|
|
1995-04-30 13:13:38 +02:00
|
|
|
|
case A_UNUSED:
|
1998-02-05 21:54:49 +01:00
|
|
|
|
if (is_type)
|
2000-05-05 20:16:49 +02:00
|
|
|
|
if (decl)
|
|
|
|
|
TREE_USED (decl) = 1;
|
|
|
|
|
else
|
|
|
|
|
TREE_USED (type) = 1;
|
1998-05-04 22:19:33 +02:00
|
|
|
|
else if (TREE_CODE (decl) == PARM_DECL
|
1998-02-05 21:54:49 +01:00
|
|
|
|
|| TREE_CODE (decl) == VAR_DECL
|
1999-01-04 08:48:37 +01:00
|
|
|
|
|| TREE_CODE (decl) == FUNCTION_DECL
|
|
|
|
|
|| TREE_CODE (decl) == LABEL_DECL)
|
1995-04-30 13:13:38 +02:00
|
|
|
|
TREE_USED (decl) = 1;
|
|
|
|
|
else
|
|
|
|
|
warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
|
|
|
|
|
break;
|
|
|
|
|
|
1995-03-30 15:59:11 +02:00
|
|
|
|
case A_CONST:
|
|
|
|
|
if (TREE_CODE (decl) == FUNCTION_DECL)
|
|
|
|
|
TREE_READONLY (decl) = 1;
|
|
|
|
|
else if (TREE_CODE (type) == POINTER_TYPE
|
|
|
|
|
&& TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
|
|
|
|
|
TREE_TYPE (decl) = type
|
|
|
|
|
= build_pointer_type
|
|
|
|
|
(build_type_variant (TREE_TYPE (type), 1,
|
|
|
|
|
TREE_THIS_VOLATILE (TREE_TYPE (type))));
|
|
|
|
|
else
|
|
|
|
|
warning ( "`%s' attribute ignored", IDENTIFIER_POINTER (name));
|
|
|
|
|
break;
|
|
|
|
|
|
2000-04-13 15:59:00 +02:00
|
|
|
|
case A_PURE:
|
|
|
|
|
if (TREE_CODE (decl) == FUNCTION_DECL)
|
|
|
|
|
DECL_IS_PURE (decl) = 1;
|
|
|
|
|
/* ??? TODO: Support types. */
|
|
|
|
|
else
|
|
|
|
|
warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
1995-03-30 15:59:11 +02:00
|
|
|
|
case A_T_UNION:
|
1995-08-30 01:15:19 +02:00
|
|
|
|
if (is_type
|
1995-03-30 15:59:11 +02:00
|
|
|
|
&& TREE_CODE (type) == UNION_TYPE
|
1995-08-30 01:15:19 +02:00
|
|
|
|
&& (decl == 0
|
1996-06-10 17:29:39 +02:00
|
|
|
|
|| (TYPE_FIELDS (type) != 0
|
|
|
|
|
&& TYPE_MODE (type) == DECL_MODE (TYPE_FIELDS (type)))))
|
1995-08-30 01:15:19 +02:00
|
|
|
|
TYPE_TRANSPARENT_UNION (type) = 1;
|
|
|
|
|
else if (decl != 0 && TREE_CODE (decl) == PARM_DECL
|
1995-03-30 15:59:11 +02:00
|
|
|
|
&& TREE_CODE (type) == UNION_TYPE
|
|
|
|
|
&& TYPE_MODE (type) == DECL_MODE (TYPE_FIELDS (type)))
|
1995-08-30 01:15:19 +02:00
|
|
|
|
DECL_TRANSPARENT_UNION (decl) = 1;
|
1995-03-30 15:59:11 +02:00
|
|
|
|
else
|
|
|
|
|
warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case A_CONSTRUCTOR:
|
|
|
|
|
if (TREE_CODE (decl) == FUNCTION_DECL
|
|
|
|
|
&& TREE_CODE (type) == FUNCTION_TYPE
|
|
|
|
|
&& decl_function_context (decl) == 0)
|
1995-06-27 22:42:57 +02:00
|
|
|
|
{
|
|
|
|
|
DECL_STATIC_CONSTRUCTOR (decl) = 1;
|
|
|
|
|
TREE_USED (decl) = 1;
|
|
|
|
|
}
|
1995-03-30 15:59:11 +02:00
|
|
|
|
else
|
|
|
|
|
warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case A_DESTRUCTOR:
|
|
|
|
|
if (TREE_CODE (decl) == FUNCTION_DECL
|
|
|
|
|
&& TREE_CODE (type) == FUNCTION_TYPE
|
|
|
|
|
&& decl_function_context (decl) == 0)
|
1995-06-27 22:42:57 +02:00
|
|
|
|
{
|
|
|
|
|
DECL_STATIC_DESTRUCTOR (decl) = 1;
|
|
|
|
|
TREE_USED (decl) = 1;
|
|
|
|
|
}
|
1995-03-30 15:59:11 +02:00
|
|
|
|
else
|
|
|
|
|
warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case A_MODE:
|
|
|
|
|
if (TREE_CODE (TREE_VALUE (args)) != IDENTIFIER_NODE)
|
|
|
|
|
warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
int j;
|
c-aux-info.c (data_type, [...]): Qualify a char* with the `const' keyword.
* c-aux-info.c (data_type, affix_data_type, gen_decl,
gen_formal_list_for_type, gen_formal_list_for_func_def, gen_type):
Qualify a char* with the `const' keyword.
* c-common.c (declare_hidden_char_array, add_attribute, if_elt,
declare_function_name, decl_attributes, format_char_info,
check_format_info, binary_op_error): Likewise.
* cexp.y (yyerror, error, pedwarn, warning, token): Likewise.
* gcse.c (dump_hash_table): Likewise.
* integrate.c (function_cannot_inline_p): Likewise
* optabs.c: Include insn-config.h earlier.
(init_libfuncs, init_integral_libfuncs, init_floating_libfuncs):
Qualify a char* with the `const' keyword.
* real.c (asctoe24, asctoe53, asctoe64, asctoe113, asctoe,
asctoeg, mtherr, ereal_atof): Likewise.
* real.h (ereal_atof): Likewise.
* sbitmap.c (dump_sbitmap_vector): Likewise.
* sbitmap.h (dump_sbitmap_vector): Likewise.
* stmt.c (nesting, n_occurrences, expand_start_case): Likewise.
* toplev.c (rest_of_compilation): Likewise.
* tree.h (function_cannot_inline_p, expand_start_case): Likewise.
From-SVN: r25614
1999-03-06 06:34:26 +01:00
|
|
|
|
const char *p = IDENTIFIER_POINTER (TREE_VALUE (args));
|
1995-03-30 15:59:11 +02:00
|
|
|
|
int len = strlen (p);
|
|
|
|
|
enum machine_mode mode = VOIDmode;
|
|
|
|
|
tree typefm;
|
|
|
|
|
|
|
|
|
|
if (len > 4 && p[0] == '_' && p[1] == '_'
|
|
|
|
|
&& p[len - 1] == '_' && p[len - 2] == '_')
|
|
|
|
|
{
|
1995-06-05 14:14:46 +02:00
|
|
|
|
char *newp = (char *) alloca (len - 1);
|
1995-03-30 15:59:11 +02:00
|
|
|
|
|
|
|
|
|
strcpy (newp, &p[2]);
|
|
|
|
|
newp[len - 4] = '\0';
|
|
|
|
|
p = newp;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Give this decl a type with the specified mode.
|
|
|
|
|
First check for the special modes. */
|
|
|
|
|
if (! strcmp (p, "byte"))
|
|
|
|
|
mode = byte_mode;
|
|
|
|
|
else if (!strcmp (p, "word"))
|
|
|
|
|
mode = word_mode;
|
|
|
|
|
else if (! strcmp (p, "pointer"))
|
|
|
|
|
mode = ptr_mode;
|
|
|
|
|
else
|
|
|
|
|
for (j = 0; j < NUM_MACHINE_MODES; j++)
|
|
|
|
|
if (!strcmp (p, GET_MODE_NAME (j)))
|
|
|
|
|
mode = (enum machine_mode) j;
|
|
|
|
|
|
|
|
|
|
if (mode == VOIDmode)
|
|
|
|
|
error ("unknown machine mode `%s'", p);
|
|
|
|
|
else if (0 == (typefm = type_for_mode (mode,
|
|
|
|
|
TREE_UNSIGNED (type))))
|
|
|
|
|
error ("no data type for mode `%s'", p);
|
|
|
|
|
else
|
|
|
|
|
{
|
tm.texi (INTMAX_TYPE, [...]): Define.
* tm.texi (INTMAX_TYPE, UINTMAX_TYPE): Define.
* c-common.h (enum c_tree_index): Add CTI_INTMAX_TYPE and
CTI_UINTMAX_TYPE.
(intmax_type_node, uintmax_type_node): Define.
* c-common.c (decl_attributes): If pedantic, warn if `mode'
attributes create a type wider than intmax_t.
(T_IM, T_UIM): Define properly.
* c-decl.c (INTMAX_TYPE, UINTMAX_TYPE): Define if not already
defined.
(init_decl_processing): Initialize intmax_type_node and
uintmax_type_node.
* c-lex.c (lex_number): When pedantic and warning for integer
constants that are too large, in C99 mode warn for those that have
a type wider than long long.
cp:
* decl.c (INTMAX_TYPE, UINTMAX_TYPE): Define if not already
defined.
(init_decl_processing): Initialize intmax_type_node and
uintmax_type_node.
testsuite:
* gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c90-printf-2.c, gcc.dg/c90-scanf-2.c: Define intmax_t and
uintmax_t using <limits.h> to emulate the compiler's internal
logic. No longer XFAIL %j tests.
From-SVN: r36791
2000-10-08 23:20:45 +02:00
|
|
|
|
if (TYPE_PRECISION (typefm) > (TREE_UNSIGNED (type)
|
|
|
|
|
? TYPE_PRECISION(uintmax_type_node)
|
|
|
|
|
: TYPE_PRECISION(intmax_type_node))
|
|
|
|
|
&& pedantic)
|
|
|
|
|
pedwarn ("type with more precision than %s",
|
|
|
|
|
TREE_UNSIGNED (type) ? "uintmax_t" : "intmax_t");
|
1995-03-30 15:59:11 +02:00
|
|
|
|
TREE_TYPE (decl) = type = typefm;
|
c-common.c (decl_attributes): Set DECL_SIZE_UNIT.
* c-common.c (decl_attributes): Set DECL_SIZE_UNIT.
* c-decl.c (duplicate_decls, finish_enum): Likewise.
(finish_decl): Remove -Wlarger-than code from here.
* flags.h (id_clash_len): Now int.
(larger_than_size): Now HOST_WIDE_INT.
* fold-const.c (size_int_wide): No more HIGH parm; NUMBER is signed.
Clean up checking to see if in table.
(make_bit_field_ref): Remove extra parm to bitsize_int.
* ggc-common.c (ggc_mark_tree_children): Mark DECL_SIZE_UNIT.
* print-tree.c (print_node): Print DECL_SIZE_UNIT and TYPE_SIZE_UNIT.
* stmt.c (expand_decl): Use DECL_SIZE_UNIT for stack checking size
and for computing size of decl.
* stor-layout.c (layout_decl): Set DECL_SIZE_UNIT.
Move -Wlarger-than code to here.
(layout_record): Remove extra arg to bitsize_int.
Set TYPE_BINFO_SIZE_UNIT.
(layout_union): Remove extra arg to bitsize_int.
Use proper type for size of QUAL_UNION.
(layout_type): Remove extra arg to bitsize_int.
* toplev.c (id_clash_len): Now int.
(larger_than_size): Now HOST_WIDE_INT.
(decode_W_option): Clean up id-clash and larger-than- cases.
* tree.c (get_identifier, maybe_get_identifier): Remove unneeded casts.
(expr_align, case FUNCTION_DECL): DECL_ALIGN is not defined.
* tree.h (BINFO_SIZE_UNIT, TYPE_BINFO_SIZE_UNIT, DECL_SIZE_UNIT): New.
(struct tree_decl): New field size_unit.
(size_int_wide): No HIGH operand; NUMBER is now signed.
(size_int_2): Deleted.
(size_int, bitsize_int): Don't use it and rework args.
* varasm.c (assemble_variable, output_constructor): Use DECL_SIZE_UNIT.
* ch/decl.c (layout_enum): Set DECL_SIZE_UNIT.
* ch/satisfy.c (safe_satisfy_decl): Likewise.
* cp/class.c (build_primary_vtable, layout_vtable_decl): Likewise.
(avoid_overlap, build_base_field): Likewise.
(build_base_field, build_base_fields, is_empty_class):
Test DECL_SIZE with integer_zero.
(layout_class_type): Set CLASSTYPE_SIZE_UNIT.
* cp/cp-tree.h (struct lang_type): New field size_unit.
(CLASSTYPE_SIZE_UNIT): New macro.
* cp/decl.c (init_decl_processing): Set DECL_SIZE_UNIT.
(cp_finish_decl): Delete -Wlarger-than processing.
* cp/optimize.c (remap_decl): Walk DECL_SIZE_UNIT.
* cp/pt.c (tsubst_decl): Set DECL_SIZE_UNIT.
* cp/tree.c (make_binfo): binfo vector is one entry longer.
(walk_tree): Walk DECL_SIZE_UNIT.
* f/com.c (ffecom_sym_transform): Use DECL_SIZE_UNIT.
(ffecom_transform_common_, ffecom_transform_equiv_): Likewise.
(duplicate_decls): Likewise.
(ffecom_tree_canonize_ptr_): Delete extra arg to bitsize_int.
(finish_decl): Delete -Wlarger-than processing.
* java/class.c (build_class_ref, push_super_field): Set DECL_SIZE_UNIT.
* java/constants.c (build_constants_constructor): Likewise.
From-SVN: r32068
2000-02-20 02:11:00 +01:00
|
|
|
|
DECL_SIZE (decl) = DECL_SIZE_UNIT (decl) = 0;
|
1995-03-30 15:59:11 +02:00
|
|
|
|
layout_decl (decl, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case A_SECTION:
|
1994-02-17 23:48:50 +01:00
|
|
|
|
#ifdef ASM_OUTPUT_SECTION_NAME
|
1995-03-30 15:59:11 +02:00
|
|
|
|
if ((TREE_CODE (decl) == FUNCTION_DECL
|
|
|
|
|
|| TREE_CODE (decl) == VAR_DECL)
|
|
|
|
|
&& TREE_CODE (TREE_VALUE (args)) == STRING_CST)
|
|
|
|
|
{
|
1998-05-04 22:19:33 +02:00
|
|
|
|
if (TREE_CODE (decl) == VAR_DECL
|
1996-09-23 03:06:39 +02:00
|
|
|
|
&& current_function_decl != NULL_TREE
|
|
|
|
|
&& ! TREE_STATIC (decl))
|
1995-03-30 15:59:11 +02:00
|
|
|
|
error_with_decl (decl,
|
|
|
|
|
"section attribute cannot be specified for local variables");
|
|
|
|
|
/* The decl may have already been given a section attribute from
|
|
|
|
|
a previous declaration. Ensure they match. */
|
|
|
|
|
else if (DECL_SECTION_NAME (decl) != NULL_TREE
|
|
|
|
|
&& strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
|
|
|
|
|
TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
|
|
|
|
|
error_with_decl (node,
|
|
|
|
|
"section of `%s' conflicts with previous declaration");
|
|
|
|
|
else
|
|
|
|
|
DECL_SECTION_NAME (decl) = TREE_VALUE (args);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
error_with_decl (node,
|
1994-02-17 23:48:50 +01:00
|
|
|
|
"section attribute not allowed for `%s'");
|
|
|
|
|
#else
|
1995-03-30 15:59:11 +02:00
|
|
|
|
error_with_decl (node,
|
|
|
|
|
"section attributes are not supported for this target");
|
1994-02-17 23:48:50 +01:00
|
|
|
|
#endif
|
1995-03-30 15:59:11 +02:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case A_ALIGNED:
|
1993-12-24 13:38:37 +01:00
|
|
|
|
{
|
1995-03-30 15:59:11 +02:00
|
|
|
|
tree align_expr
|
1996-01-01 22:15:08 +01:00
|
|
|
|
= (args ? TREE_VALUE (args)
|
|
|
|
|
: size_int (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
int i;
|
2000-01-03 22:48:49 +01:00
|
|
|
|
|
1995-03-30 15:59:11 +02:00
|
|
|
|
/* Strip any NOPs of any kind. */
|
|
|
|
|
while (TREE_CODE (align_expr) == NOP_EXPR
|
|
|
|
|
|| TREE_CODE (align_expr) == CONVERT_EXPR
|
|
|
|
|
|| TREE_CODE (align_expr) == NON_LVALUE_EXPR)
|
|
|
|
|
align_expr = TREE_OPERAND (align_expr, 0);
|
1998-05-04 22:19:33 +02:00
|
|
|
|
|
1995-03-30 15:59:11 +02:00
|
|
|
|
if (TREE_CODE (align_expr) != INTEGER_CST)
|
|
|
|
|
{
|
|
|
|
|
error ("requested alignment is not a constant");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
if ((i = tree_log2 (align_expr)) == -1)
|
1995-03-30 15:59:11 +02:00
|
|
|
|
error ("requested alignment is not a power of 2");
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
else if (i > HOST_BITS_PER_INT - 2)
|
|
|
|
|
error ("requested alignment is too large");
|
1995-03-30 15:59:11 +02:00
|
|
|
|
else if (is_type)
|
2000-06-14 07:30:09 +02:00
|
|
|
|
{
|
2000-08-25 01:48:25 +02:00
|
|
|
|
/* If we have a TYPE_DECL, then copy the type, so that we
|
|
|
|
|
don't accidentally modify a builtin type. See pushdecl. */
|
|
|
|
|
if (decl && TREE_TYPE (decl) != error_mark_node
|
|
|
|
|
&& DECL_ORIGINAL_TYPE (decl) == NULL_TREE)
|
2000-06-30 16:59:10 +02:00
|
|
|
|
{
|
2000-08-25 01:48:25 +02:00
|
|
|
|
tree tt = TREE_TYPE (decl);
|
|
|
|
|
DECL_ORIGINAL_TYPE (decl) = tt;
|
|
|
|
|
tt = build_type_copy (tt);
|
|
|
|
|
TYPE_NAME (tt) = decl;
|
|
|
|
|
TREE_USED (tt) = TREE_USED (decl);
|
|
|
|
|
TREE_TYPE (decl) = tt;
|
|
|
|
|
type = tt;
|
2000-06-30 16:59:10 +02:00
|
|
|
|
}
|
2000-08-25 01:48:25 +02:00
|
|
|
|
|
|
|
|
|
TYPE_ALIGN (type) = (1 << i) * BITS_PER_UNIT;
|
|
|
|
|
TYPE_USER_ALIGN (type) = 1;
|
2000-06-14 07:30:09 +02:00
|
|
|
|
}
|
1995-03-30 15:59:11 +02:00
|
|
|
|
else if (TREE_CODE (decl) != VAR_DECL
|
|
|
|
|
&& TREE_CODE (decl) != FIELD_DECL)
|
|
|
|
|
error_with_decl (decl,
|
|
|
|
|
"alignment may not be specified for `%s'");
|
|
|
|
|
else
|
2000-06-14 07:30:09 +02:00
|
|
|
|
{
|
|
|
|
|
DECL_ALIGN (decl) = (1 << i) * BITS_PER_UNIT;
|
|
|
|
|
DECL_USER_ALIGN (decl) = 1;
|
|
|
|
|
}
|
1993-12-24 13:38:37 +01:00
|
|
|
|
}
|
1995-03-30 15:59:11 +02:00
|
|
|
|
break;
|
1993-12-24 13:38:37 +01:00
|
|
|
|
|
1995-03-30 15:59:11 +02:00
|
|
|
|
case A_FORMAT:
|
1992-02-04 20:51:11 +01:00
|
|
|
|
{
|
1998-04-12 21:52:16 +02:00
|
|
|
|
tree format_type_id = TREE_VALUE (args);
|
1995-03-30 15:59:11 +02:00
|
|
|
|
tree format_num_expr = TREE_VALUE (TREE_CHAIN (args));
|
|
|
|
|
tree first_arg_num_expr
|
|
|
|
|
= TREE_VALUE (TREE_CHAIN (TREE_CHAIN (args)));
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
unsigned HOST_WIDE_INT format_num, first_arg_num;
|
1998-04-12 21:52:16 +02:00
|
|
|
|
enum format_type format_type;
|
1995-03-30 15:59:11 +02:00
|
|
|
|
tree argument;
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
unsigned int arg_num;
|
1998-05-04 22:19:33 +02:00
|
|
|
|
|
1995-03-30 15:59:11 +02:00
|
|
|
|
if (TREE_CODE (decl) != FUNCTION_DECL)
|
|
|
|
|
{
|
|
|
|
|
error_with_decl (decl,
|
|
|
|
|
"argument format specified for non-function `%s'");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2000-01-03 22:48:49 +01:00
|
|
|
|
|
1998-04-12 21:52:16 +02:00
|
|
|
|
if (TREE_CODE (format_type_id) != IDENTIFIER_NODE)
|
1996-06-08 19:35:57 +02:00
|
|
|
|
{
|
1998-04-12 21:52:16 +02:00
|
|
|
|
error ("unrecognized format specifier");
|
1996-06-08 19:35:57 +02:00
|
|
|
|
continue;
|
|
|
|
|
}
|
1995-03-30 15:59:11 +02:00
|
|
|
|
else
|
|
|
|
|
{
|
c-aux-info.c (data_type, [...]): Qualify a char* with the `const' keyword.
* c-aux-info.c (data_type, affix_data_type, gen_decl,
gen_formal_list_for_type, gen_formal_list_for_func_def, gen_type):
Qualify a char* with the `const' keyword.
* c-common.c (declare_hidden_char_array, add_attribute, if_elt,
declare_function_name, decl_attributes, format_char_info,
check_format_info, binary_op_error): Likewise.
* cexp.y (yyerror, error, pedwarn, warning, token): Likewise.
* gcse.c (dump_hash_table): Likewise.
* integrate.c (function_cannot_inline_p): Likewise
* optabs.c: Include insn-config.h earlier.
(init_libfuncs, init_integral_libfuncs, init_floating_libfuncs):
Qualify a char* with the `const' keyword.
* real.c (asctoe24, asctoe53, asctoe64, asctoe113, asctoe,
asctoeg, mtherr, ereal_atof): Likewise.
* real.h (ereal_atof): Likewise.
* sbitmap.c (dump_sbitmap_vector): Likewise.
* sbitmap.h (dump_sbitmap_vector): Likewise.
* stmt.c (nesting, n_occurrences, expand_start_case): Likewise.
* toplev.c (rest_of_compilation): Likewise.
* tree.h (function_cannot_inline_p, expand_start_case): Likewise.
From-SVN: r25614
1999-03-06 06:34:26 +01:00
|
|
|
|
const char *p = IDENTIFIER_POINTER (format_type_id);
|
2000-01-03 22:48:49 +01:00
|
|
|
|
|
1998-04-12 21:52:16 +02:00
|
|
|
|
if (!strcmp (p, "printf") || !strcmp (p, "__printf__"))
|
|
|
|
|
format_type = printf_format_type;
|
|
|
|
|
else if (!strcmp (p, "scanf") || !strcmp (p, "__scanf__"))
|
|
|
|
|
format_type = scanf_format_type;
|
|
|
|
|
else if (!strcmp (p, "strftime")
|
|
|
|
|
|| !strcmp (p, "__strftime__"))
|
|
|
|
|
format_type = strftime_format_type;
|
|
|
|
|
else
|
|
|
|
|
{
|
1999-03-11 01:58:01 +01:00
|
|
|
|
warning ("`%s' is an unrecognized format function type", p);
|
1998-04-12 21:52:16 +02:00
|
|
|
|
continue;
|
|
|
|
|
}
|
1995-03-30 15:59:11 +02:00
|
|
|
|
}
|
1993-12-24 13:38:37 +01:00
|
|
|
|
|
1995-03-30 15:59:11 +02:00
|
|
|
|
/* Strip any conversions from the string index and first arg number
|
|
|
|
|
and verify they are constants. */
|
|
|
|
|
while (TREE_CODE (format_num_expr) == NOP_EXPR
|
|
|
|
|
|| TREE_CODE (format_num_expr) == CONVERT_EXPR
|
|
|
|
|
|| TREE_CODE (format_num_expr) == NON_LVALUE_EXPR)
|
|
|
|
|
format_num_expr = TREE_OPERAND (format_num_expr, 0);
|
1993-04-06 21:30:45 +02:00
|
|
|
|
|
1995-03-30 15:59:11 +02:00
|
|
|
|
while (TREE_CODE (first_arg_num_expr) == NOP_EXPR
|
|
|
|
|
|| TREE_CODE (first_arg_num_expr) == CONVERT_EXPR
|
|
|
|
|
|| TREE_CODE (first_arg_num_expr) == NON_LVALUE_EXPR)
|
|
|
|
|
first_arg_num_expr = TREE_OPERAND (first_arg_num_expr, 0);
|
|
|
|
|
|
|
|
|
|
if (TREE_CODE (format_num_expr) != INTEGER_CST
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
|| TREE_INT_CST_HIGH (format_num_expr) != 0
|
|
|
|
|
|| TREE_CODE (first_arg_num_expr) != INTEGER_CST
|
|
|
|
|
|| TREE_INT_CST_HIGH (first_arg_num_expr) != 0)
|
1994-02-02 00:56:12 +01:00
|
|
|
|
{
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
error ("format string has invalid operand number");
|
1995-03-30 15:59:11 +02:00
|
|
|
|
continue;
|
1994-02-02 00:56:12 +01:00
|
|
|
|
}
|
1995-03-30 15:59:11 +02:00
|
|
|
|
|
|
|
|
|
format_num = TREE_INT_CST_LOW (format_num_expr);
|
|
|
|
|
first_arg_num = TREE_INT_CST_LOW (first_arg_num_expr);
|
|
|
|
|
if (first_arg_num != 0 && first_arg_num <= format_num)
|
1993-06-24 05:36:08 +02:00
|
|
|
|
{
|
1995-03-30 15:59:11 +02:00
|
|
|
|
error ("format string arg follows the args to be formatted");
|
1993-12-24 13:38:37 +01:00
|
|
|
|
continue;
|
1993-06-24 05:36:08 +02:00
|
|
|
|
}
|
1995-03-30 15:59:11 +02:00
|
|
|
|
|
|
|
|
|
/* If a parameter list is specified, verify that the format_num
|
|
|
|
|
argument is actually a string, in case the format attribute
|
|
|
|
|
is in error. */
|
|
|
|
|
argument = TYPE_ARG_TYPES (type);
|
|
|
|
|
if (argument)
|
1994-02-02 00:56:12 +01:00
|
|
|
|
{
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
for (arg_num = 1; argument != 0 && arg_num != format_num;
|
|
|
|
|
++arg_num, argument = TREE_CHAIN (argument))
|
|
|
|
|
;
|
|
|
|
|
|
1995-03-30 15:59:11 +02:00
|
|
|
|
if (! argument
|
|
|
|
|
|| TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE
|
|
|
|
|
|| (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_VALUE (argument)))
|
|
|
|
|
!= char_type_node))
|
|
|
|
|
{
|
|
|
|
|
error ("format string arg not a string type");
|
1994-02-02 00:56:12 +01:00
|
|
|
|
continue;
|
|
|
|
|
}
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
|
|
|
|
|
else if (first_arg_num != 0)
|
1995-03-30 15:59:11 +02:00
|
|
|
|
{
|
|
|
|
|
/* Verify that first_arg_num points to the last arg,
|
1996-07-04 00:07:53 +02:00
|
|
|
|
the ... */
|
1995-03-30 15:59:11 +02:00
|
|
|
|
while (argument)
|
|
|
|
|
arg_num++, argument = TREE_CHAIN (argument);
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
|
|
|
|
|
if (arg_num != first_arg_num)
|
|
|
|
|
{
|
|
|
|
|
error ("args to be formatted is not '...'");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
1995-03-30 15:59:11 +02:00
|
|
|
|
}
|
1994-02-02 00:56:12 +01:00
|
|
|
|
}
|
1994-05-07 00:32:17 +02:00
|
|
|
|
|
2000-10-12 11:28:52 +02:00
|
|
|
|
if (format_type == strftime_format_type && first_arg_num != 0)
|
|
|
|
|
{
|
|
|
|
|
error ("strftime formats cannot format arguments");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
1995-03-30 15:59:11 +02:00
|
|
|
|
record_function_format (DECL_NAME (decl),
|
|
|
|
|
DECL_ASSEMBLER_NAME (decl),
|
1998-04-12 21:52:16 +02:00
|
|
|
|
format_type, format_num, first_arg_num);
|
1995-03-30 15:59:11 +02:00
|
|
|
|
break;
|
|
|
|
|
}
|
1995-04-16 08:14:00 +02:00
|
|
|
|
|
1996-06-08 19:35:57 +02:00
|
|
|
|
case A_FORMAT_ARG:
|
|
|
|
|
{
|
|
|
|
|
tree format_num_expr = TREE_VALUE (args);
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
unsigned HOST_WIDE_INT format_num;
|
|
|
|
|
unsigned int arg_num;
|
1996-06-08 19:35:57 +02:00
|
|
|
|
tree argument;
|
1998-05-04 22:19:33 +02:00
|
|
|
|
|
1996-06-08 19:35:57 +02:00
|
|
|
|
if (TREE_CODE (decl) != FUNCTION_DECL)
|
|
|
|
|
{
|
|
|
|
|
error_with_decl (decl,
|
|
|
|
|
"argument format specified for non-function `%s'");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
1998-05-04 22:19:33 +02:00
|
|
|
|
|
1996-06-08 19:35:57 +02:00
|
|
|
|
/* Strip any conversions from the first arg number and verify it
|
|
|
|
|
is a constant. */
|
|
|
|
|
while (TREE_CODE (format_num_expr) == NOP_EXPR
|
|
|
|
|
|| TREE_CODE (format_num_expr) == CONVERT_EXPR
|
|
|
|
|
|| TREE_CODE (format_num_expr) == NON_LVALUE_EXPR)
|
|
|
|
|
format_num_expr = TREE_OPERAND (format_num_expr, 0);
|
|
|
|
|
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
if (TREE_CODE (format_num_expr) != INTEGER_CST
|
|
|
|
|
|| TREE_INT_CST_HIGH (format_num_expr) != 0)
|
1996-06-08 19:35:57 +02:00
|
|
|
|
{
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
error ("format string has invalid operand number");
|
1996-06-08 19:35:57 +02:00
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
format_num = TREE_INT_CST_LOW (format_num_expr);
|
|
|
|
|
|
|
|
|
|
/* If a parameter list is specified, verify that the format_num
|
|
|
|
|
argument is actually a string, in case the format attribute
|
|
|
|
|
is in error. */
|
|
|
|
|
argument = TYPE_ARG_TYPES (type);
|
|
|
|
|
if (argument)
|
|
|
|
|
{
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
for (arg_num = 1; argument != 0 && arg_num != format_num;
|
|
|
|
|
++arg_num, argument = TREE_CHAIN (argument))
|
|
|
|
|
;
|
|
|
|
|
|
1996-06-08 19:35:57 +02:00
|
|
|
|
if (! argument
|
|
|
|
|
|| TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE
|
|
|
|
|
|| (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_VALUE (argument)))
|
|
|
|
|
!= char_type_node))
|
|
|
|
|
{
|
|
|
|
|
error ("format string arg not a string type");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (TREE_CODE (TREE_TYPE (TREE_TYPE (decl))) != POINTER_TYPE
|
|
|
|
|
|| (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (TREE_TYPE (decl))))
|
|
|
|
|
!= char_type_node))
|
|
|
|
|
{
|
|
|
|
|
error ("function does not return string type");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record_international_format (DECL_NAME (decl),
|
|
|
|
|
DECL_ASSEMBLER_NAME (decl),
|
|
|
|
|
format_num);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
1995-04-16 08:14:00 +02:00
|
|
|
|
case A_WEAK:
|
|
|
|
|
declare_weak (decl);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case A_ALIAS:
|
|
|
|
|
if ((TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl))
|
1996-11-15 18:11:24 +01:00
|
|
|
|
|| (TREE_CODE (decl) != FUNCTION_DECL && ! DECL_EXTERNAL (decl)))
|
1995-04-16 08:14:00 +02:00
|
|
|
|
error_with_decl (decl,
|
|
|
|
|
"`%s' defined both normally and as an alias");
|
|
|
|
|
else if (decl_function_context (decl) == 0)
|
|
|
|
|
{
|
1998-08-18 14:40:52 +02:00
|
|
|
|
tree id;
|
|
|
|
|
|
|
|
|
|
id = TREE_VALUE (args);
|
|
|
|
|
if (TREE_CODE (id) != STRING_CST)
|
|
|
|
|
{
|
|
|
|
|
error ("alias arg not a string");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
id = get_identifier (TREE_STRING_POINTER (id));
|
2000-04-20 18:09:27 +02:00
|
|
|
|
/* This counts as a use of the object pointed to. */
|
|
|
|
|
TREE_USED (id) = 1;
|
1998-08-18 14:40:52 +02:00
|
|
|
|
|
1995-04-16 08:14:00 +02:00
|
|
|
|
if (TREE_CODE (decl) == FUNCTION_DECL)
|
|
|
|
|
DECL_INITIAL (decl) = error_mark_node;
|
|
|
|
|
else
|
|
|
|
|
DECL_EXTERNAL (decl) = 0;
|
|
|
|
|
assemble_alias (decl, id);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
|
|
|
|
|
break;
|
1998-07-30 12:38:22 +02:00
|
|
|
|
|
1998-10-11 04:21:54 +02:00
|
|
|
|
case A_NO_CHECK_MEMORY_USAGE:
|
|
|
|
|
if (TREE_CODE (decl) != FUNCTION_DECL)
|
|
|
|
|
{
|
|
|
|
|
error_with_decl (decl,
|
|
|
|
|
"`%s' attribute applies only to functions",
|
|
|
|
|
IDENTIFIER_POINTER (name));
|
|
|
|
|
}
|
|
|
|
|
else if (DECL_INITIAL (decl))
|
|
|
|
|
{
|
|
|
|
|
error_with_decl (decl,
|
|
|
|
|
"can't set `%s' attribute after definition",
|
|
|
|
|
IDENTIFIER_POINTER (name));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
DECL_NO_CHECK_MEMORY_USAGE (decl) = 1;
|
|
|
|
|
break;
|
|
|
|
|
|
1998-07-30 12:38:22 +02:00
|
|
|
|
case A_NO_INSTRUMENT_FUNCTION:
|
|
|
|
|
if (TREE_CODE (decl) != FUNCTION_DECL)
|
|
|
|
|
{
|
|
|
|
|
error_with_decl (decl,
|
|
|
|
|
"`%s' attribute applies only to functions",
|
|
|
|
|
IDENTIFIER_POINTER (name));
|
|
|
|
|
}
|
|
|
|
|
else if (DECL_INITIAL (decl))
|
|
|
|
|
{
|
|
|
|
|
error_with_decl (decl,
|
|
|
|
|
"can't set `%s' attribute after definition",
|
|
|
|
|
IDENTIFIER_POINTER (name));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
|
|
|
|
|
break;
|
1999-12-04 04:00:04 +01:00
|
|
|
|
|
|
|
|
|
case A_NO_LIMIT_STACK:
|
|
|
|
|
if (TREE_CODE (decl) != FUNCTION_DECL)
|
|
|
|
|
{
|
|
|
|
|
error_with_decl (decl,
|
|
|
|
|
"`%s' attribute applies only to functions",
|
|
|
|
|
IDENTIFIER_POINTER (name));
|
|
|
|
|
}
|
|
|
|
|
else if (DECL_INITIAL (decl))
|
|
|
|
|
{
|
|
|
|
|
error_with_decl (decl,
|
|
|
|
|
"can't set `%s' attribute after definition",
|
|
|
|
|
IDENTIFIER_POINTER (name));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
DECL_NO_LIMIT_STACK (decl) = 1;
|
|
|
|
|
break;
|
1995-03-30 15:59:11 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
1996-10-09 13:35:43 +02:00
|
|
|
|
|
|
|
|
|
/* Split SPECS_ATTRS, a list of declspecs and prefix attributes, into two
|
|
|
|
|
lists. SPECS_ATTRS may also be just a typespec (eg: RECORD_TYPE).
|
|
|
|
|
|
|
|
|
|
The head of the declspec list is stored in DECLSPECS.
|
|
|
|
|
The head of the attribute list is stored in PREFIX_ATTRIBUTES.
|
|
|
|
|
|
|
|
|
|
Note that attributes in SPECS_ATTRS are stored in the TREE_PURPOSE of
|
|
|
|
|
the list elements. We drop the containing TREE_LIST nodes and link the
|
|
|
|
|
resulting attributes together the way decl_attributes expects them. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
split_specs_attrs (specs_attrs, declspecs, prefix_attributes)
|
|
|
|
|
tree specs_attrs;
|
|
|
|
|
tree *declspecs, *prefix_attributes;
|
|
|
|
|
{
|
|
|
|
|
tree t, s, a, next, specs, attrs;
|
|
|
|
|
|
2000-01-18 01:01:06 +01:00
|
|
|
|
/* This can happen after an __extension__ in pedantic mode. */
|
|
|
|
|
if (specs_attrs != NULL_TREE
|
|
|
|
|
&& TREE_CODE (specs_attrs) == INTEGER_CST)
|
|
|
|
|
{
|
|
|
|
|
*declspecs = NULL_TREE;
|
|
|
|
|
*prefix_attributes = NULL_TREE;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
1996-10-09 13:35:43 +02:00
|
|
|
|
/* This can happen in c++ (eg: decl: typespec initdecls ';'). */
|
|
|
|
|
if (specs_attrs != NULL_TREE
|
|
|
|
|
&& TREE_CODE (specs_attrs) != TREE_LIST)
|
|
|
|
|
{
|
|
|
|
|
*declspecs = specs_attrs;
|
|
|
|
|
*prefix_attributes = NULL_TREE;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Remember to keep the lists in the same order, element-wise. */
|
|
|
|
|
|
|
|
|
|
specs = s = NULL_TREE;
|
|
|
|
|
attrs = a = NULL_TREE;
|
|
|
|
|
for (t = specs_attrs; t; t = next)
|
|
|
|
|
{
|
|
|
|
|
next = TREE_CHAIN (t);
|
|
|
|
|
/* Declspecs have a non-NULL TREE_VALUE. */
|
|
|
|
|
if (TREE_VALUE (t) != NULL_TREE)
|
|
|
|
|
{
|
|
|
|
|
if (specs == NULL_TREE)
|
|
|
|
|
specs = s = t;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
TREE_CHAIN (s) = t;
|
|
|
|
|
s = t;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (attrs == NULL_TREE)
|
|
|
|
|
attrs = a = TREE_PURPOSE (t);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
TREE_CHAIN (a) = TREE_PURPOSE (t);
|
|
|
|
|
a = TREE_PURPOSE (t);
|
|
|
|
|
}
|
|
|
|
|
/* More attrs can be linked here, move A to the end. */
|
|
|
|
|
while (TREE_CHAIN (a) != NULL_TREE)
|
|
|
|
|
a = TREE_CHAIN (a);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Terminate the lists. */
|
|
|
|
|
if (s != NULL_TREE)
|
|
|
|
|
TREE_CHAIN (s) = NULL_TREE;
|
|
|
|
|
if (a != NULL_TREE)
|
|
|
|
|
TREE_CHAIN (a) = NULL_TREE;
|
|
|
|
|
|
|
|
|
|
/* All done. */
|
|
|
|
|
*declspecs = specs;
|
|
|
|
|
*prefix_attributes = attrs;
|
|
|
|
|
}
|
1998-02-18 11:38:57 +01:00
|
|
|
|
|
|
|
|
|
/* Strip attributes from SPECS_ATTRS, a list of declspecs and attributes.
|
|
|
|
|
This function is used by the parser when a rule will accept attributes
|
|
|
|
|
in a particular position, but we don't want to support that just yet.
|
|
|
|
|
|
|
|
|
|
A warning is issued for every ignored attribute. */
|
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
strip_attrs (specs_attrs)
|
|
|
|
|
tree specs_attrs;
|
|
|
|
|
{
|
|
|
|
|
tree specs, attrs;
|
|
|
|
|
|
|
|
|
|
split_specs_attrs (specs_attrs, &specs, &attrs);
|
|
|
|
|
|
|
|
|
|
while (attrs)
|
|
|
|
|
{
|
|
|
|
|
warning ("`%s' attribute ignored",
|
|
|
|
|
IDENTIFIER_POINTER (TREE_PURPOSE (attrs)));
|
|
|
|
|
attrs = TREE_CHAIN (attrs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return specs;
|
|
|
|
|
}
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
1993-10-05 20:14:50 +01:00
|
|
|
|
/* Check a printf/fprintf/sprintf/scanf/fscanf/sscanf format against
|
|
|
|
|
a parameter list. */
|
|
|
|
|
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
/* The meaningfully distinct length modifiers for format checking recognised
|
|
|
|
|
by GCC. */
|
|
|
|
|
enum format_lengths
|
|
|
|
|
{
|
|
|
|
|
FMT_LEN_none,
|
|
|
|
|
FMT_LEN_hh,
|
|
|
|
|
FMT_LEN_h,
|
|
|
|
|
FMT_LEN_l,
|
|
|
|
|
FMT_LEN_ll,
|
|
|
|
|
FMT_LEN_L,
|
|
|
|
|
FMT_LEN_z,
|
|
|
|
|
FMT_LEN_t,
|
|
|
|
|
FMT_LEN_j,
|
|
|
|
|
FMT_LEN_MAX
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* The standard versions in which various format features appeared. */
|
|
|
|
|
enum format_std_version
|
|
|
|
|
{
|
|
|
|
|
STD_C89,
|
|
|
|
|
STD_C94,
|
|
|
|
|
STD_C99,
|
|
|
|
|
STD_EXT
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
/* Flags that may apply to a particular kind of format checked by GCC. */
|
|
|
|
|
enum
|
|
|
|
|
{
|
|
|
|
|
/* This format converts arguments of types determined by the
|
|
|
|
|
format string. */
|
|
|
|
|
FMT_FLAG_ARG_CONVERT = 1,
|
|
|
|
|
/* The scanf allocation 'a' kludge applies to this format kind. */
|
|
|
|
|
FMT_FLAG_SCANF_A_KLUDGE = 2,
|
|
|
|
|
/* A % during parsing a specifier is allowed to be a modified % rather
|
|
|
|
|
that indicating the format is broken and we are out-of-sync. */
|
|
|
|
|
FMT_FLAG_FANCY_PERCENT_OK = 4
|
|
|
|
|
/* Not included here: details of whether width or precision may occur
|
|
|
|
|
(controlled by width_char and precision_char); details of whether
|
|
|
|
|
'*' can be used for these (width_type and precision_type); details
|
|
|
|
|
of whether length modifiers can occur (length_char_specs); details
|
|
|
|
|
of when $ operand numbers are allowed (always, for the formats
|
|
|
|
|
supported, if arguments are converted). */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
/* Structure describing a length modifier supported in format checking, and
|
|
|
|
|
possibly a doubled version such as "hh". */
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
/* Name of the single-character length modifier. */
|
|
|
|
|
const char *name;
|
|
|
|
|
/* Index into a format_char_info.types array. */
|
|
|
|
|
enum format_lengths index;
|
|
|
|
|
/* Standard version this length appears in. */
|
|
|
|
|
enum format_std_version std;
|
|
|
|
|
/* Same, if the modifier can be repeated, or NULL if it can't. */
|
|
|
|
|
const char *double_name;
|
|
|
|
|
enum format_lengths double_index;
|
|
|
|
|
enum format_std_version double_std;
|
|
|
|
|
} format_length_info;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Structure desribing the combination of a conversion specifier
|
|
|
|
|
(or a set of specifiers which act identically) and a length modifier. */
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
/* The standard version this combination of length and type appeared in.
|
|
|
|
|
This is only relevant if greater than those for length and type
|
|
|
|
|
individually; otherwise it is ignored. */
|
|
|
|
|
enum format_std_version std;
|
|
|
|
|
/* The name to use for the type, if different from that generated internally
|
|
|
|
|
(e.g., "signed size_t"). */
|
|
|
|
|
const char *name;
|
|
|
|
|
/* The type itself. */
|
|
|
|
|
tree *type;
|
|
|
|
|
} format_type_detail;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Macros to fill out tables of these. */
|
|
|
|
|
#define BADLEN { 0, NULL, NULL }
|
|
|
|
|
#define NOLENGTHS { BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Structure desribing a format conversion specifier (or a set of specifiers
|
|
|
|
|
which act identically), and the length modifiers used with it. */
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
const char *format_chars;
|
|
|
|
|
int pointer_count;
|
|
|
|
|
enum format_std_version std;
|
|
|
|
|
/* Types accepted for each length modifier. */
|
|
|
|
|
format_type_detail types[FMT_LEN_MAX];
|
2000-09-25 19:04:45 +02:00
|
|
|
|
/* List of other modifier characters allowed with these specifiers.
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
This lists flags, and additionally "w" for width, "p" for precision,
|
2000-09-25 19:04:45 +02:00
|
|
|
|
"a" for scanf "a" allocation extension (not applicable in C99 mode),
|
|
|
|
|
"*" for scanf suppression, and "E" and "O" for those strftime
|
|
|
|
|
modifiers. */
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
const char *flag_chars;
|
2000-09-25 19:04:45 +02:00
|
|
|
|
/* List of additional flags describing these conversion specifiers.
|
|
|
|
|
"c" for generic character pointers being allowed, "2" for strftime
|
|
|
|
|
two digit year formats, "3" for strftime formats giving two digit
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
years in some locales, "4" for "2" which becomes "3" with an "E" modifier,
|
|
|
|
|
"o" if use of strftime "O" is a GNU extension beyond C99,
|
|
|
|
|
"W" if the argument is a pointer which is dereferenced and written into,
|
|
|
|
|
"i" for printf integer formats where the '0' flag is ignored with
|
|
|
|
|
precision, and "[" for the starting character of a scanf scanset. */
|
2000-09-25 19:04:45 +02:00
|
|
|
|
const char *flags2;
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
} format_char_info;
|
|
|
|
|
|
|
|
|
|
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
/* Structure describing a flag accepted by some kind of format. */
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
/* The flag character in question (0 for end of array). */
|
|
|
|
|
int flag_char;
|
|
|
|
|
/* Zero if this entry describes the flag character in general, or a
|
|
|
|
|
non-zero character that may be found in flags2 if it describes the
|
|
|
|
|
flag when used with certain formats only. If the latter, only
|
|
|
|
|
the first such entry found that applies to the current conversion
|
|
|
|
|
specifier is used; the values of `name' and `long_name' it supplies
|
|
|
|
|
will be used, if non-NULL and the standard version is higher than
|
|
|
|
|
the unpredicated one, for any pedantic warning. For example, 'o'
|
|
|
|
|
for strftime formats (meaning 'O' is an extension over C99). */
|
|
|
|
|
int predicate;
|
|
|
|
|
/* The name to use for this flag in diagnostic messages. For example,
|
|
|
|
|
N_("`0' flag"), N_("field width"). */
|
|
|
|
|
const char *name;
|
|
|
|
|
/* Long name for this flag in diagnostic messages; currently only used for
|
|
|
|
|
"ISO C does not support ...". For example, N_("the `I' printf flag"). */
|
|
|
|
|
const char *long_name;
|
|
|
|
|
/* The standard version in which it appeared. */
|
|
|
|
|
enum format_std_version std;
|
|
|
|
|
} format_flag_spec;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Structure describing a combination of flags that is bad for some kind
|
|
|
|
|
of format. */
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
/* The first flag character in question (0 for end of array). */
|
|
|
|
|
int flag_char1;
|
|
|
|
|
/* The second flag character. */
|
|
|
|
|
int flag_char2;
|
|
|
|
|
/* Non-zero if the message should say that the first flag is ignored with
|
|
|
|
|
the second, zero if the combination should simply be objected to. */
|
|
|
|
|
int ignored;
|
|
|
|
|
/* Zero if this entry applies whenever this flag combination occurs,
|
|
|
|
|
a non-zero character from flags2 if it only applies in some
|
|
|
|
|
circumstances (e.g. 'i' for printf formats ignoring 0 with precision). */
|
|
|
|
|
int predicate;
|
|
|
|
|
} format_flag_pair;
|
|
|
|
|
|
|
|
|
|
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
/* Structure describing a particular kind of format processed by GCC. */
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
/* The name of this kind of format, for use in diagnostics. */
|
|
|
|
|
const char *name;
|
|
|
|
|
/* Specifications of the length modifiers accepted; possibly NULL. */
|
|
|
|
|
const format_length_info *length_char_specs;
|
|
|
|
|
/* Details of the conversion specification characters accepted. */
|
|
|
|
|
const format_char_info *conversion_specs;
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
/* String listing the flag characters that are accepted. */
|
|
|
|
|
const char *flag_chars;
|
|
|
|
|
/* String listing modifier characters (strftime) accepted. May be NULL. */
|
|
|
|
|
const char *modifier_chars;
|
|
|
|
|
/* Details of the flag characters, including pseudo-flags. */
|
|
|
|
|
const format_flag_spec *flag_specs;
|
|
|
|
|
/* Details of bad combinations of flags. */
|
|
|
|
|
const format_flag_pair *bad_flag_pairs;
|
|
|
|
|
/* Flags applicable to this kind of format. */
|
|
|
|
|
int flags;
|
|
|
|
|
/* Flag character to treat a width as, or 0 if width not used. */
|
|
|
|
|
int width_char;
|
|
|
|
|
/* Flag character to treat a precision as, or 0 if precision not used. */
|
|
|
|
|
int precision_char;
|
|
|
|
|
/* If a flag character has the effect of suppressing the conversion of
|
|
|
|
|
an argument ('*' in scanf), that flag character, otherwise 0. */
|
|
|
|
|
int suppression_char;
|
|
|
|
|
/* Flag character to treat a length modifier as (ignored if length
|
|
|
|
|
modifiers not used). Need not be placed in flag_chars for conversion
|
|
|
|
|
specifiers, but is used to check for bad combinations such as length
|
|
|
|
|
modifier with assignment suppression in scanf. */
|
|
|
|
|
int length_code_char;
|
|
|
|
|
/* Pointer to type of argument expected if '*' is used for a width,
|
|
|
|
|
or NULL if '*' not used for widths. */
|
|
|
|
|
tree *width_type;
|
|
|
|
|
/* Pointer to type of argument expected if '*' is used for a precision,
|
|
|
|
|
or NULL if '*' not used for precisions. */
|
|
|
|
|
tree *precision_type;
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
} format_kind_info;
|
|
|
|
|
|
|
|
|
|
|
2000-09-15 23:16:31 +02:00
|
|
|
|
/* Structure describing details of a type expected in format checking,
|
|
|
|
|
and the type to check against it. */
|
|
|
|
|
typedef struct format_wanted_type
|
|
|
|
|
{
|
|
|
|
|
/* The type wanted. */
|
|
|
|
|
tree wanted_type;
|
|
|
|
|
/* The name of this type to use in diagnostics. */
|
|
|
|
|
const char *wanted_type_name;
|
|
|
|
|
/* The level of indirection through pointers at which this type occurs. */
|
|
|
|
|
int pointer_count;
|
|
|
|
|
/* Whether, when pointer_count is 1, to allow any character type when
|
|
|
|
|
pedantic, rather than just the character or void type specified. */
|
|
|
|
|
int char_lenient_flag;
|
|
|
|
|
/* Whether the argument, dereferenced once, is written into and so the
|
|
|
|
|
argument must not be a pointer to a const-qualified type. */
|
|
|
|
|
int writing_in_flag;
|
|
|
|
|
/* If warnings should be of the form "field precision is not type int",
|
|
|
|
|
the name to use (in this case "field precision"), otherwise NULL,
|
|
|
|
|
for "%s format, %s arg" type messages. If (in an extension), this
|
|
|
|
|
is a pointer type, wanted_type_name should be set to include the
|
|
|
|
|
terminating '*' characters of the type name to give a correct
|
|
|
|
|
message. */
|
|
|
|
|
const char *name;
|
|
|
|
|
/* The actual parameter to check against the wanted type. */
|
|
|
|
|
tree param;
|
|
|
|
|
/* The argument number of that parameter. */
|
|
|
|
|
int arg_num;
|
|
|
|
|
/* The next type to check for this format conversion, or NULL if none. */
|
|
|
|
|
struct format_wanted_type *next;
|
|
|
|
|
} format_wanted_type;
|
|
|
|
|
|
|
|
|
|
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
static const format_length_info printf_length_specs[] =
|
|
|
|
|
{
|
|
|
|
|
{ "h", FMT_LEN_h, STD_C89, "hh", FMT_LEN_hh, STD_C99 },
|
|
|
|
|
{ "l", FMT_LEN_l, STD_C89, "ll", FMT_LEN_ll, STD_C99 },
|
|
|
|
|
{ "q", FMT_LEN_ll, STD_EXT, NULL, 0, 0 },
|
|
|
|
|
{ "L", FMT_LEN_L, STD_C89, NULL, 0, 0 },
|
|
|
|
|
{ "z", FMT_LEN_z, STD_C99, NULL, 0, 0 },
|
|
|
|
|
{ "Z", FMT_LEN_z, STD_EXT, NULL, 0, 0 },
|
|
|
|
|
{ "t", FMT_LEN_t, STD_C99, NULL, 0, 0 },
|
|
|
|
|
{ "j", FMT_LEN_j, STD_C99, NULL, 0, 0 },
|
|
|
|
|
{ NULL, 0, 0, NULL, 0, 0 }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* This differs from printf_length_specs only in that "Z" is not accepted. */
|
|
|
|
|
static const format_length_info scanf_length_specs[] =
|
|
|
|
|
{
|
|
|
|
|
{ "h", FMT_LEN_h, STD_C89, "hh", FMT_LEN_hh, STD_C99 },
|
|
|
|
|
{ "l", FMT_LEN_l, STD_C89, "ll", FMT_LEN_ll, STD_C99 },
|
|
|
|
|
{ "q", FMT_LEN_ll, STD_EXT, NULL, 0, 0 },
|
|
|
|
|
{ "L", FMT_LEN_L, STD_C89, NULL, 0, 0 },
|
|
|
|
|
{ "z", FMT_LEN_z, STD_C99, NULL, 0, 0 },
|
|
|
|
|
{ "t", FMT_LEN_t, STD_C99, NULL, 0, 0 },
|
|
|
|
|
{ "j", FMT_LEN_j, STD_C99, NULL, 0, 0 },
|
|
|
|
|
{ NULL, 0, 0, NULL, 0, 0 }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
static const format_flag_spec printf_flag_specs[] =
|
|
|
|
|
{
|
|
|
|
|
{ ' ', 0, N_("` ' flag"), N_("the ` ' printf flag"), STD_C89 },
|
|
|
|
|
{ '+', 0, N_("`+' flag"), N_("the `+' printf flag"), STD_C89 },
|
|
|
|
|
{ '#', 0, N_("`#' flag"), N_("the `#' printf flag"), STD_C89 },
|
|
|
|
|
{ '0', 0, N_("`0' flag"), N_("the `0' printf flag"), STD_C89 },
|
|
|
|
|
{ '-', 0, N_("`-' flag"), N_("the `-' printf flag"), STD_C89 },
|
|
|
|
|
{ '\'', 0, N_("`'' flag"), N_("the `'' printf flag"), STD_EXT },
|
|
|
|
|
{ 'I', 0, N_("`I' flag"), N_("the `I' printf flag"), STD_EXT },
|
|
|
|
|
{ 'w', 0, N_("field width"), N_("field width in printf format"), STD_C89 },
|
|
|
|
|
{ 'p', 0, N_("precision"), N_("precision in printf format"), STD_C89 },
|
|
|
|
|
{ 'L', 0, N_("length modifier"), N_("length modifier in printf format"), STD_C89 },
|
|
|
|
|
{ 0, 0, NULL, NULL, 0 }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static const format_flag_pair printf_flag_pairs[] =
|
|
|
|
|
{
|
|
|
|
|
{ ' ', '+', 1, 0 },
|
|
|
|
|
{ '0', '-', 1, 0 },
|
|
|
|
|
{ '0', 'p', 1, 'i' },
|
|
|
|
|
{ 0, 0, 0, 0 }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static const format_flag_spec scanf_flag_specs[] =
|
|
|
|
|
{
|
2000-10-12 09:29:01 +02:00
|
|
|
|
{ '*', 0, N_("assignment suppression"), N_("assignment suppression"), STD_C89 },
|
|
|
|
|
{ 'a', 0, N_("`a' flag"), N_("the `a' scanf flag"), STD_EXT },
|
|
|
|
|
{ 'w', 0, N_("field width"), N_("field width in scanf format"), STD_C89 },
|
|
|
|
|
{ 'L', 0, N_("length modifier"), N_("length modifier in scanf format"), STD_C89 },
|
|
|
|
|
{ '\'', 0, N_("`'' flag"), N_("the `'' scanf flag"), STD_EXT },
|
|
|
|
|
{ 'I', 0, N_("`I' flag"), N_("the `I' scanf flag"), STD_EXT },
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
{ 0, 0, NULL, NULL, 0 }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static const format_flag_pair scanf_flag_pairs[] =
|
|
|
|
|
{
|
|
|
|
|
{ '*', 'L', 0, 0 },
|
|
|
|
|
{ 0, 0, 0, 0 }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static const format_flag_spec strftime_flag_specs[] =
|
|
|
|
|
{
|
|
|
|
|
{ '_', 0, N_("`_' flag"), N_("the `_' strftime flag"), STD_EXT },
|
|
|
|
|
{ '-', 0, N_("`-' flag"), N_("the `-' strftime flag"), STD_EXT },
|
|
|
|
|
{ '0', 0, N_("`0' flag"), N_("the `0' strftime flag"), STD_EXT },
|
|
|
|
|
{ '^', 0, N_("`^' flag"), N_("the `^' strftime flag"), STD_EXT },
|
|
|
|
|
{ '#', 0, N_("`#' flag"), N_("the `#' strftime flag"), STD_EXT },
|
|
|
|
|
{ 'w', 0, N_("field width"), N_("field width in strftime format"), STD_EXT },
|
|
|
|
|
{ 'E', 0, N_("`E' modifier"), N_("the `E' strftime modifier"), STD_C99 },
|
|
|
|
|
{ 'O', 0, N_("`O' modifier"), N_("the `O' strftime modifier"), STD_C99 },
|
|
|
|
|
{ 'O', 'o', NULL, N_("the `O' modifier"), STD_EXT },
|
|
|
|
|
{ 0, 0, NULL, NULL, 0 }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static const format_flag_pair strftime_flag_pairs[] =
|
|
|
|
|
{
|
|
|
|
|
{ 'E', 'O', 0, 0 },
|
2000-10-12 09:29:01 +02:00
|
|
|
|
{ '_', '-', 0, 0 },
|
|
|
|
|
{ '_', '0', 0, 0 },
|
|
|
|
|
{ '-', '0', 0, 0 },
|
|
|
|
|
{ '^', '#', 0, 0 },
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
{ 0, 0, 0, 0 }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
1993-10-05 20:14:50 +01:00
|
|
|
|
#define T_I &integer_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T89_I { STD_C89, NULL, T_I }
|
|
|
|
|
#define T99_I { STD_C99, NULL, T_I }
|
1993-10-05 20:14:50 +01:00
|
|
|
|
#define T_L &long_integer_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T89_L { STD_C89, NULL, T_L }
|
1994-09-19 14:46:40 +02:00
|
|
|
|
#define T_LL &long_long_integer_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T99_LL { STD_C99, NULL, T_LL }
|
|
|
|
|
#define TEX_LL { STD_EXT, NULL, T_LL }
|
1993-10-05 20:14:50 +01:00
|
|
|
|
#define T_S &short_integer_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T89_S { STD_C89, NULL, T_S }
|
1993-10-05 20:14:50 +01:00
|
|
|
|
#define T_UI &unsigned_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T89_UI { STD_C89, NULL, T_UI }
|
|
|
|
|
#define T99_UI { STD_C99, NULL, T_UI }
|
1993-10-05 20:14:50 +01:00
|
|
|
|
#define T_UL &long_unsigned_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T89_UL { STD_C89, NULL, T_UL }
|
1994-09-19 14:46:40 +02:00
|
|
|
|
#define T_ULL &long_long_unsigned_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T99_ULL { STD_C99, NULL, T_ULL }
|
|
|
|
|
#define TEX_ULL { STD_EXT, NULL, T_ULL }
|
1993-10-05 20:14:50 +01:00
|
|
|
|
#define T_US &short_unsigned_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T89_US { STD_C89, NULL, T_US }
|
1993-10-05 20:14:50 +01:00
|
|
|
|
#define T_F &float_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T89_F { STD_C89, NULL, T_F }
|
|
|
|
|
#define T99_F { STD_C99, NULL, T_F }
|
1993-10-05 20:14:50 +01:00
|
|
|
|
#define T_D &double_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T89_D { STD_C89, NULL, T_D }
|
|
|
|
|
#define T99_D { STD_C99, NULL, T_D }
|
1993-10-05 20:14:50 +01:00
|
|
|
|
#define T_LD &long_double_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T89_LD { STD_C89, NULL, T_LD }
|
|
|
|
|
#define T99_LD { STD_C99, NULL, T_LD }
|
1993-10-05 20:14:50 +01:00
|
|
|
|
#define T_C &char_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T89_C { STD_C89, NULL, T_C }
|
c-common.h (enum c_tree_index): Add CTI_SIGNED_SIZE_TYPE and CTI_UNSIGNED_PTRDIFF_TYPE.
* c-common.h (enum c_tree_index): Add CTI_SIGNED_SIZE_TYPE and
CTI_UNSIGNED_PTRDIFF_TYPE.
(signed_size_type_node): Define.
(unsigned_ptrdiff_type_node): Define.
* c-decl.c (init_decl_processing): Create the
signed_size_type_node and unsigned_ptrdiff_type_node types.
* c-common.c (T_SC): Define.
(T_SST): Define.
(T_UPD): Define.
(print_char_table): Use T_SST for %zd, %zi, %zn. Use T_UPD for
%to, %tu, %tx, %tX. Allow %hhn (T_SC). Add "c" to the flags for
%s and %p.
(scan_char_table): Use T_SC for %hhd, %hhi, %hhn. Use T_SST for
%zd, %zi, %zn. Use T_UPD for %to, %tu, %tx, %tX. Add "c" to the
flags for %c, %s and %[.
(check_format_info): Only allow leniency for signedness of targets
of character pointers (when pedantic) for formats flagged with
"c", so for strings but not for %hh formats. When pedantic, don't
allow character pointers to substitute for void pointers if a
second level of indirection is present.
testsuite:
* gcc.dg/c99-printf-1.c: New test.
From-SVN: r35530
2000-08-06 20:12:49 +02:00
|
|
|
|
#define T_SC &signed_char_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T99_SC { STD_C99, NULL, T_SC }
|
1998-05-04 22:19:33 +02:00
|
|
|
|
#define T_UC &unsigned_char_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T99_UC { STD_C99, NULL, T_UC }
|
1993-10-05 20:14:50 +01:00
|
|
|
|
#define T_V &void_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T89_V { STD_C89, NULL, T_V }
|
1993-10-05 20:14:50 +01:00
|
|
|
|
#define T_W &wchar_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T94_W { STD_C94, "wchar_t", T_W }
|
|
|
|
|
#define TEX_W { STD_EXT, "wchar_t", T_W }
|
2000-08-04 18:00:48 +02:00
|
|
|
|
#define T_WI &wint_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T94_WI { STD_C94, "wint_t", T_WI }
|
|
|
|
|
#define TEX_WI { STD_EXT, "wint_t", T_WI }
|
|
|
|
|
#define T_ST &c_size_type_node
|
|
|
|
|
#define T99_ST { STD_C99, "size_t", T_ST }
|
c-common.h (enum c_tree_index): Add CTI_SIGNED_SIZE_TYPE and CTI_UNSIGNED_PTRDIFF_TYPE.
* c-common.h (enum c_tree_index): Add CTI_SIGNED_SIZE_TYPE and
CTI_UNSIGNED_PTRDIFF_TYPE.
(signed_size_type_node): Define.
(unsigned_ptrdiff_type_node): Define.
* c-decl.c (init_decl_processing): Create the
signed_size_type_node and unsigned_ptrdiff_type_node types.
* c-common.c (T_SC): Define.
(T_SST): Define.
(T_UPD): Define.
(print_char_table): Use T_SST for %zd, %zi, %zn. Use T_UPD for
%to, %tu, %tx, %tX. Allow %hhn (T_SC). Add "c" to the flags for
%s and %p.
(scan_char_table): Use T_SC for %hhd, %hhi, %hhn. Use T_SST for
%zd, %zi, %zn. Use T_UPD for %to, %tu, %tx, %tX. Add "c" to the
flags for %c, %s and %[.
(check_format_info): Only allow leniency for signedness of targets
of character pointers (when pedantic) for formats flagged with
"c", so for strings but not for %hh formats. When pedantic, don't
allow character pointers to substitute for void pointers if a
second level of indirection is present.
testsuite:
* gcc.dg/c99-printf-1.c: New test.
From-SVN: r35530
2000-08-06 20:12:49 +02:00
|
|
|
|
#define T_SST &signed_size_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T99_SST { STD_C99, "signed size_t", T_SST }
|
2000-08-04 18:10:14 +02:00
|
|
|
|
#define T_PD &ptrdiff_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T99_PD { STD_C99, "ptrdiff_t", T_PD }
|
c-common.h (enum c_tree_index): Add CTI_SIGNED_SIZE_TYPE and CTI_UNSIGNED_PTRDIFF_TYPE.
* c-common.h (enum c_tree_index): Add CTI_SIGNED_SIZE_TYPE and
CTI_UNSIGNED_PTRDIFF_TYPE.
(signed_size_type_node): Define.
(unsigned_ptrdiff_type_node): Define.
* c-decl.c (init_decl_processing): Create the
signed_size_type_node and unsigned_ptrdiff_type_node types.
* c-common.c (T_SC): Define.
(T_SST): Define.
(T_UPD): Define.
(print_char_table): Use T_SST for %zd, %zi, %zn. Use T_UPD for
%to, %tu, %tx, %tX. Allow %hhn (T_SC). Add "c" to the flags for
%s and %p.
(scan_char_table): Use T_SC for %hhd, %hhi, %hhn. Use T_SST for
%zd, %zi, %zn. Use T_UPD for %to, %tu, %tx, %tX. Add "c" to the
flags for %c, %s and %[.
(check_format_info): Only allow leniency for signedness of targets
of character pointers (when pedantic) for formats flagged with
"c", so for strings but not for %hh formats. When pedantic, don't
allow character pointers to substitute for void pointers if a
second level of indirection is present.
testsuite:
* gcc.dg/c99-printf-1.c: New test.
From-SVN: r35530
2000-08-06 20:12:49 +02:00
|
|
|
|
#define T_UPD &unsigned_ptrdiff_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T99_UPD { STD_C99, "unsigned ptrdiff_t", T_UPD }
|
tm.texi (INTMAX_TYPE, [...]): Define.
* tm.texi (INTMAX_TYPE, UINTMAX_TYPE): Define.
* c-common.h (enum c_tree_index): Add CTI_INTMAX_TYPE and
CTI_UINTMAX_TYPE.
(intmax_type_node, uintmax_type_node): Define.
* c-common.c (decl_attributes): If pedantic, warn if `mode'
attributes create a type wider than intmax_t.
(T_IM, T_UIM): Define properly.
* c-decl.c (INTMAX_TYPE, UINTMAX_TYPE): Define if not already
defined.
(init_decl_processing): Initialize intmax_type_node and
uintmax_type_node.
* c-lex.c (lex_number): When pedantic and warning for integer
constants that are too large, in C99 mode warn for those that have
a type wider than long long.
cp:
* decl.c (INTMAX_TYPE, UINTMAX_TYPE): Define if not already
defined.
(init_decl_processing): Initialize intmax_type_node and
uintmax_type_node.
testsuite:
* gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c90-printf-2.c, gcc.dg/c90-scanf-2.c: Define intmax_t and
uintmax_t using <limits.h> to emulate the compiler's internal
logic. No longer XFAIL %j tests.
From-SVN: r36791
2000-10-08 23:20:45 +02:00
|
|
|
|
#define T_IM &intmax_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T99_IM { STD_C99, "intmax_t", T_IM }
|
tm.texi (INTMAX_TYPE, [...]): Define.
* tm.texi (INTMAX_TYPE, UINTMAX_TYPE): Define.
* c-common.h (enum c_tree_index): Add CTI_INTMAX_TYPE and
CTI_UINTMAX_TYPE.
(intmax_type_node, uintmax_type_node): Define.
* c-common.c (decl_attributes): If pedantic, warn if `mode'
attributes create a type wider than intmax_t.
(T_IM, T_UIM): Define properly.
* c-decl.c (INTMAX_TYPE, UINTMAX_TYPE): Define if not already
defined.
(init_decl_processing): Initialize intmax_type_node and
uintmax_type_node.
* c-lex.c (lex_number): When pedantic and warning for integer
constants that are too large, in C99 mode warn for those that have
a type wider than long long.
cp:
* decl.c (INTMAX_TYPE, UINTMAX_TYPE): Define if not already
defined.
(init_decl_processing): Initialize intmax_type_node and
uintmax_type_node.
testsuite:
* gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c90-printf-2.c, gcc.dg/c90-scanf-2.c: Define intmax_t and
uintmax_t using <limits.h> to emulate the compiler's internal
logic. No longer XFAIL %j tests.
From-SVN: r36791
2000-10-08 23:20:45 +02:00
|
|
|
|
#define T_UIM &uintmax_type_node
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
#define T99_UIM { STD_C99, "uintmax_t", T_UIM }
|
1993-10-05 20:14:50 +01:00
|
|
|
|
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
static const format_char_info print_char_table[] =
|
|
|
|
|
{
|
|
|
|
|
/* C89 conversion specifiers. */
|
2000-10-12 09:26:20 +02:00
|
|
|
|
{ "di", 0, STD_C89, { T89_I, T99_SC, T89_S, T89_L, T99_LL, TEX_LL, T99_SST, T99_PD, T99_IM }, "-wp0 +'I", "i" },
|
|
|
|
|
{ "oxX", 0, STD_C89, { T89_UI, T99_UC, T89_US, T89_UL, T99_ULL, TEX_ULL, T99_ST, T99_UPD, T99_UIM }, "-wp0#", "i" },
|
|
|
|
|
{ "u", 0, STD_C89, { T89_UI, T99_UC, T89_US, T89_UL, T99_ULL, TEX_ULL, T99_ST, T99_UPD, T99_UIM }, "-wp0'I", "i" },
|
2000-09-25 19:04:45 +02:00
|
|
|
|
{ "fgG", 0, STD_C89, { T89_D, BADLEN, BADLEN, T99_D, BADLEN, T89_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#'", "" },
|
|
|
|
|
{ "eE", 0, STD_C89, { T89_D, BADLEN, BADLEN, T99_D, BADLEN, T89_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#", "" },
|
|
|
|
|
{ "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, T94_WI, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-w", "" },
|
|
|
|
|
{ "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp", "c" },
|
|
|
|
|
{ "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-w", "c" },
|
|
|
|
|
{ "n", 1, STD_C89, { T89_I, T99_SC, T89_S, T89_L, T99_LL, BADLEN, T99_SST, T99_PD, T99_IM }, "", "W" },
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
/* C99 conversion specifiers. */
|
2000-09-25 19:04:45 +02:00
|
|
|
|
{ "F", 0, STD_C99, { T99_D, BADLEN, BADLEN, T99_D, BADLEN, T99_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#'", "" },
|
|
|
|
|
{ "aA", 0, STD_C99, { T99_D, BADLEN, BADLEN, T99_D, BADLEN, T99_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#", "" },
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
/* X/Open conversion specifiers. */
|
2000-09-25 19:04:45 +02:00
|
|
|
|
{ "C", 0, STD_EXT, { TEX_WI, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-w", "" },
|
|
|
|
|
{ "S", 1, STD_EXT, { TEX_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp", "" },
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
/* GNU conversion specifiers. */
|
2000-09-25 19:04:45 +02:00
|
|
|
|
{ "m", 0, STD_EXT, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp", "" },
|
|
|
|
|
{ NULL, 0, 0, NOLENGTHS, NULL, NULL }
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
};
|
1993-10-05 20:14:50 +01:00
|
|
|
|
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
static const format_char_info scan_char_table[] =
|
|
|
|
|
{
|
|
|
|
|
/* C89 conversion specifiers. */
|
2000-10-12 09:29:01 +02:00
|
|
|
|
{ "di", 1, STD_C89, { T89_I, T99_SC, T89_S, T89_L, T99_LL, TEX_LL, T99_SST, T99_PD, T99_IM }, "*w'I", "W" },
|
|
|
|
|
{ "u", 1, STD_C89, { T89_UI, T99_UC, T89_US, T89_UL, T99_ULL, TEX_ULL, T99_ST, T99_UPD, T99_UIM }, "*w'I", "W" },
|
|
|
|
|
{ "oxX", 1, STD_C89, { T89_UI, T99_UC, T89_US, T89_UL, T99_ULL, TEX_ULL, T99_ST, T99_UPD, T99_UIM }, "*w", "W" },
|
|
|
|
|
{ "efgEG", 1, STD_C89, { T89_F, BADLEN, BADLEN, T89_D, BADLEN, T89_LD, BADLEN, BADLEN, BADLEN }, "*w'", "W" },
|
|
|
|
|
{ "c", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*w", "cW" },
|
|
|
|
|
{ "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*aw", "cW" },
|
|
|
|
|
{ "[", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*aw", "cW[" },
|
|
|
|
|
{ "p", 2, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*w", "W" },
|
|
|
|
|
{ "n", 1, STD_C89, { T89_I, T99_SC, T89_S, T89_L, T99_LL, BADLEN, T99_SST, T99_PD, T99_IM }, "", "W" },
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
/* C99 conversion specifiers. */
|
2000-10-12 09:29:01 +02:00
|
|
|
|
{ "FaA", 1, STD_C99, { T99_F, BADLEN, BADLEN, T99_D, BADLEN, T99_LD, BADLEN, BADLEN, BADLEN }, "*w'", "W" },
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
/* X/Open conversion specifiers. */
|
2000-10-12 09:29:01 +02:00
|
|
|
|
{ "C", 1, STD_EXT, { TEX_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*w", "W" },
|
|
|
|
|
{ "S", 1, STD_EXT, { TEX_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*aw", "W" },
|
2000-09-25 19:04:45 +02:00
|
|
|
|
{ NULL, 0, 0, NOLENGTHS, NULL, NULL }
|
1993-10-05 20:14:50 +01:00
|
|
|
|
};
|
|
|
|
|
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
static format_char_info time_char_table[] =
|
|
|
|
|
{
|
|
|
|
|
/* C89 conversion specifiers. */
|
2000-09-25 19:04:45 +02:00
|
|
|
|
{ "ABZab", 0, STD_C89, NOLENGTHS, "^#", "" },
|
|
|
|
|
{ "cx", 0, STD_C89, NOLENGTHS, "E", "3" },
|
|
|
|
|
{ "HIMSUWdmw", 0, STD_C89, NOLENGTHS, "-_0Ow", "" },
|
|
|
|
|
{ "j", 0, STD_C89, NOLENGTHS, "-_0Ow", "o" },
|
|
|
|
|
{ "p", 0, STD_C89, NOLENGTHS, "#", "" },
|
|
|
|
|
{ "X", 0, STD_C89, NOLENGTHS, "E", "" },
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
{ "y", 0, STD_C89, NOLENGTHS, "EO-_0w", "4" },
|
2000-09-25 19:04:45 +02:00
|
|
|
|
{ "Y", 0, STD_C89, NOLENGTHS, "-_0EOw", "o" },
|
|
|
|
|
{ "%", 0, STD_C89, NOLENGTHS, "", "" },
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
/* C99 conversion specifiers. */
|
2000-09-25 19:04:45 +02:00
|
|
|
|
{ "C", 0, STD_C99, NOLENGTHS, "-_0EOw", "o" },
|
|
|
|
|
{ "D", 0, STD_C99, NOLENGTHS, "", "2" },
|
|
|
|
|
{ "eVu", 0, STD_C99, NOLENGTHS, "-_0Ow", "" },
|
|
|
|
|
{ "FRTnrt", 0, STD_C99, NOLENGTHS, "", "" },
|
|
|
|
|
{ "g", 0, STD_C99, NOLENGTHS, "O-_0w", "2o" },
|
|
|
|
|
{ "G", 0, STD_C99, NOLENGTHS, "-_0Ow", "o" },
|
|
|
|
|
{ "h", 0, STD_C99, NOLENGTHS, "^#", "" },
|
|
|
|
|
{ "z", 0, STD_C99, NOLENGTHS, "O", "o" },
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
/* GNU conversion specifiers. */
|
2000-09-25 19:04:45 +02:00
|
|
|
|
{ "kls", 0, STD_EXT, NOLENGTHS, "-_0Ow", "" },
|
|
|
|
|
{ "P", 0, STD_EXT, NOLENGTHS, "", "" },
|
|
|
|
|
{ NULL, 0, 0, NOLENGTHS, NULL, NULL }
|
1993-10-05 20:14:50 +01:00
|
|
|
|
};
|
|
|
|
|
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
|
|
|
|
|
/* This must be in the same order as enum format_type. */
|
|
|
|
|
static const format_kind_info format_types[] =
|
|
|
|
|
{
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
{ "printf", printf_length_specs, print_char_table, " +#0-'I", NULL,
|
|
|
|
|
printf_flag_specs, printf_flag_pairs,
|
|
|
|
|
FMT_FLAG_ARG_CONVERT, 'w', 'p', 0, 'L',
|
|
|
|
|
&integer_type_node, &integer_type_node
|
|
|
|
|
},
|
2000-10-12 09:29:01 +02:00
|
|
|
|
{ "scanf", scanf_length_specs, scan_char_table, "*'I", NULL,
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
scanf_flag_specs, scanf_flag_pairs,
|
|
|
|
|
FMT_FLAG_ARG_CONVERT|FMT_FLAG_SCANF_A_KLUDGE, 'w', 0, '*', 'L',
|
|
|
|
|
NULL, NULL
|
|
|
|
|
},
|
|
|
|
|
{ "strftime", NULL, time_char_table, "_-0^#", "EO",
|
|
|
|
|
strftime_flag_specs, strftime_flag_pairs,
|
|
|
|
|
FMT_FLAG_FANCY_PERCENT_OK, 'w', 0, 0, 0,
|
|
|
|
|
NULL, NULL
|
|
|
|
|
}
|
1998-04-12 21:52:16 +02:00
|
|
|
|
};
|
|
|
|
|
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
|
1996-06-08 19:35:57 +02:00
|
|
|
|
typedef struct function_format_info
|
|
|
|
|
{
|
1993-10-05 20:14:50 +01:00
|
|
|
|
struct function_format_info *next; /* next structure on the list */
|
|
|
|
|
tree name; /* identifier such as "printf" */
|
|
|
|
|
tree assembler_name; /* optional mangled identifier (for C++) */
|
1998-04-12 21:52:16 +02:00
|
|
|
|
enum format_type format_type; /* type of format (printf, scanf, etc.) */
|
1993-10-05 20:14:50 +01:00
|
|
|
|
int format_num; /* number of format argument */
|
|
|
|
|
int first_arg_num; /* number of first arg (zero for varargs) */
|
|
|
|
|
} function_format_info;
|
|
|
|
|
|
|
|
|
|
static function_format_info *function_format_list = NULL;
|
|
|
|
|
|
1996-06-08 19:35:57 +02:00
|
|
|
|
typedef struct international_format_info
|
|
|
|
|
{
|
|
|
|
|
struct international_format_info *next; /* next structure on the list */
|
|
|
|
|
tree name; /* identifier such as "gettext" */
|
|
|
|
|
tree assembler_name; /* optional mangled identifier (for C++) */
|
|
|
|
|
int format_num; /* number of format argument */
|
|
|
|
|
} international_format_info;
|
|
|
|
|
|
|
|
|
|
static international_format_info *international_format_list = NULL;
|
|
|
|
|
|
2000-09-19 05:26:11 +02:00
|
|
|
|
static void check_format_info PARAMS ((int *, function_format_info *, tree));
|
|
|
|
|
static void status_warning PARAMS ((int *, const char *, ...))
|
|
|
|
|
ATTRIBUTE_PRINTF_2;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
static void init_dollar_format_checking PARAMS ((int, tree));
|
2000-09-19 05:26:11 +02:00
|
|
|
|
static int maybe_read_dollar_number PARAMS ((int *, const char **, int,
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
tree, tree *));
|
2000-09-19 05:26:11 +02:00
|
|
|
|
static void finish_dollar_format_checking PARAMS ((int *));
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
static const format_flag_spec *get_flag_spec PARAMS ((const format_flag_spec *,
|
|
|
|
|
int, const char *));
|
|
|
|
|
|
2000-09-19 05:26:11 +02:00
|
|
|
|
static void check_format_types PARAMS ((int *, format_wanted_type *));
|
2000-10-06 16:59:56 +02:00
|
|
|
|
static int is_valid_printf_arglist PARAMS ((tree));
|
|
|
|
|
static rtx c_expand_builtin (tree, rtx, enum machine_mode, enum expand_modifier);
|
|
|
|
|
static rtx c_expand_builtin_printf PARAMS ((tree, rtx, enum machine_mode,
|
|
|
|
|
enum expand_modifier, int));
|
2000-09-15 23:16:31 +02:00
|
|
|
|
|
1993-10-05 20:14:50 +01:00
|
|
|
|
/* Initialize the table of functions to perform format checking on.
|
2000-08-21 16:30:38 +02:00
|
|
|
|
The ISO C functions are always checked (whether <stdio.h> is
|
1993-10-05 20:14:50 +01:00
|
|
|
|
included or not), since it is common to call printf without
|
|
|
|
|
including <stdio.h>. There shouldn't be a problem with this,
|
2000-08-21 16:30:38 +02:00
|
|
|
|
since ISO C reserves these function names whether you include the
|
|
|
|
|
header file or not. In any case, the checking is harmless. With
|
|
|
|
|
-ffreestanding, these default attributes are disabled, and must be
|
|
|
|
|
specified manually if desired.
|
1996-06-08 19:35:57 +02:00
|
|
|
|
|
|
|
|
|
Also initialize the name of function that modify the format string for
|
|
|
|
|
internationalization purposes. */
|
1993-10-05 20:14:50 +01:00
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
init_function_format_info ()
|
|
|
|
|
{
|
2000-08-21 16:30:38 +02:00
|
|
|
|
if (flag_hosted)
|
|
|
|
|
{
|
|
|
|
|
/* Functions from ISO/IEC 9899:1990. */
|
|
|
|
|
record_function_format (get_identifier ("printf"), NULL_TREE,
|
|
|
|
|
printf_format_type, 1, 2);
|
2000-09-19 20:19:44 +02:00
|
|
|
|
record_function_format (get_identifier ("__builtin_printf"), NULL_TREE,
|
|
|
|
|
printf_format_type, 1, 2);
|
2000-08-21 16:30:38 +02:00
|
|
|
|
record_function_format (get_identifier ("fprintf"), NULL_TREE,
|
|
|
|
|
printf_format_type, 2, 3);
|
|
|
|
|
record_function_format (get_identifier ("sprintf"), NULL_TREE,
|
|
|
|
|
printf_format_type, 2, 3);
|
|
|
|
|
record_function_format (get_identifier ("scanf"), NULL_TREE,
|
|
|
|
|
scanf_format_type, 1, 2);
|
|
|
|
|
record_function_format (get_identifier ("fscanf"), NULL_TREE,
|
|
|
|
|
scanf_format_type, 2, 3);
|
|
|
|
|
record_function_format (get_identifier ("sscanf"), NULL_TREE,
|
|
|
|
|
scanf_format_type, 2, 3);
|
|
|
|
|
record_function_format (get_identifier ("vprintf"), NULL_TREE,
|
|
|
|
|
printf_format_type, 1, 0);
|
|
|
|
|
record_function_format (get_identifier ("vfprintf"), NULL_TREE,
|
|
|
|
|
printf_format_type, 2, 0);
|
|
|
|
|
record_function_format (get_identifier ("vsprintf"), NULL_TREE,
|
|
|
|
|
printf_format_type, 2, 0);
|
|
|
|
|
record_function_format (get_identifier ("strftime"), NULL_TREE,
|
|
|
|
|
strftime_format_type, 3, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (flag_hosted && flag_isoc99)
|
2000-07-31 16:00:34 +02:00
|
|
|
|
{
|
|
|
|
|
/* ISO C99 adds the snprintf and vscanf family functions. */
|
|
|
|
|
record_function_format (get_identifier ("snprintf"), NULL_TREE,
|
|
|
|
|
printf_format_type, 3, 4);
|
|
|
|
|
record_function_format (get_identifier ("vsnprintf"), NULL_TREE,
|
|
|
|
|
printf_format_type, 3, 0);
|
|
|
|
|
record_function_format (get_identifier ("vscanf"), NULL_TREE,
|
|
|
|
|
scanf_format_type, 1, 0);
|
|
|
|
|
record_function_format (get_identifier ("vfscanf"), NULL_TREE,
|
|
|
|
|
scanf_format_type, 2, 0);
|
|
|
|
|
record_function_format (get_identifier ("vsscanf"), NULL_TREE,
|
|
|
|
|
scanf_format_type, 2, 0);
|
|
|
|
|
}
|
|
|
|
|
|
2000-08-21 16:30:38 +02:00
|
|
|
|
if (flag_hosted && flag_noniso_default_format_attributes)
|
|
|
|
|
{
|
|
|
|
|
/* Uniforum/GNU gettext functions, not in ISO C. */
|
|
|
|
|
record_international_format (get_identifier ("gettext"), NULL_TREE, 1);
|
|
|
|
|
record_international_format (get_identifier ("dgettext"), NULL_TREE, 2);
|
|
|
|
|
record_international_format (get_identifier ("dcgettext"), NULL_TREE, 2);
|
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Record information for argument format checking. FUNCTION_IDENT is
|
|
|
|
|
the identifier node for the name of the function to check (its decl
|
1998-04-12 21:52:16 +02:00
|
|
|
|
need not exist yet).
|
|
|
|
|
FORMAT_TYPE specifies the type of format checking. FORMAT_NUM is the number
|
1993-10-05 20:14:50 +01:00
|
|
|
|
of the argument which is the format control string (starting from 1).
|
|
|
|
|
FIRST_ARG_NUM is the number of the first actual argument to check
|
1996-06-08 19:35:57 +02:00
|
|
|
|
against the format string, or zero if no checking is not be done
|
1993-10-05 20:14:50 +01:00
|
|
|
|
(e.g. for varargs such as vfprintf). */
|
|
|
|
|
|
1998-04-12 21:52:16 +02:00
|
|
|
|
static void
|
|
|
|
|
record_function_format (name, assembler_name, format_type,
|
1993-10-05 20:14:50 +01:00
|
|
|
|
format_num, first_arg_num)
|
|
|
|
|
tree name;
|
|
|
|
|
tree assembler_name;
|
1998-04-12 21:52:16 +02:00
|
|
|
|
enum format_type format_type;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
int format_num;
|
|
|
|
|
int first_arg_num;
|
|
|
|
|
{
|
|
|
|
|
function_format_info *info;
|
|
|
|
|
|
|
|
|
|
/* Re-use existing structure if it's there. */
|
|
|
|
|
|
|
|
|
|
for (info = function_format_list; info; info = info->next)
|
|
|
|
|
{
|
|
|
|
|
if (info->name == name && info->assembler_name == assembler_name)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (! info)
|
|
|
|
|
{
|
|
|
|
|
info = (function_format_info *) xmalloc (sizeof (function_format_info));
|
|
|
|
|
info->next = function_format_list;
|
|
|
|
|
function_format_list = info;
|
|
|
|
|
|
|
|
|
|
info->name = name;
|
|
|
|
|
info->assembler_name = assembler_name;
|
|
|
|
|
}
|
|
|
|
|
|
1998-04-12 21:52:16 +02:00
|
|
|
|
info->format_type = format_type;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
info->format_num = format_num;
|
|
|
|
|
info->first_arg_num = first_arg_num;
|
|
|
|
|
}
|
|
|
|
|
|
1996-06-08 19:35:57 +02:00
|
|
|
|
/* Record information for the names of function that modify the format
|
|
|
|
|
argument to format functions. FUNCTION_IDENT is the identifier node for
|
|
|
|
|
the name of the function (its decl need not exist yet) and FORMAT_NUM is
|
|
|
|
|
the number of the argument which is the format control string (starting
|
|
|
|
|
from 1). */
|
|
|
|
|
|
1996-07-04 00:21:37 +02:00
|
|
|
|
static void
|
1996-06-08 19:35:57 +02:00
|
|
|
|
record_international_format (name, assembler_name, format_num)
|
|
|
|
|
tree name;
|
|
|
|
|
tree assembler_name;
|
|
|
|
|
int format_num;
|
|
|
|
|
{
|
|
|
|
|
international_format_info *info;
|
|
|
|
|
|
|
|
|
|
/* Re-use existing structure if it's there. */
|
|
|
|
|
|
|
|
|
|
for (info = international_format_list; info; info = info->next)
|
|
|
|
|
{
|
|
|
|
|
if (info->name == name && info->assembler_name == assembler_name)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (! info)
|
|
|
|
|
{
|
|
|
|
|
info
|
|
|
|
|
= (international_format_info *)
|
|
|
|
|
xmalloc (sizeof (international_format_info));
|
|
|
|
|
info->next = international_format_list;
|
|
|
|
|
international_format_list = info;
|
|
|
|
|
|
|
|
|
|
info->name = name;
|
|
|
|
|
info->assembler_name = assembler_name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
info->format_num = format_num;
|
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
|
|
|
|
|
/* Check the argument list of a call to printf, scanf, etc.
|
|
|
|
|
NAME is the function identifier.
|
|
|
|
|
ASSEMBLER_NAME is the function's assembler identifier.
|
|
|
|
|
(Either NAME or ASSEMBLER_NAME, but not both, may be NULL_TREE.)
|
|
|
|
|
PARAMS is the list of argument values. */
|
|
|
|
|
|
|
|
|
|
void
|
2000-09-19 05:26:11 +02:00
|
|
|
|
check_function_format (status, name, assembler_name, params)
|
|
|
|
|
int *status;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
tree name;
|
|
|
|
|
tree assembler_name;
|
|
|
|
|
tree params;
|
|
|
|
|
{
|
|
|
|
|
function_format_info *info;
|
|
|
|
|
|
|
|
|
|
/* See if this function is a format function. */
|
|
|
|
|
for (info = function_format_list; info; info = info->next)
|
|
|
|
|
{
|
1993-10-08 15:40:59 +01:00
|
|
|
|
if (info->assembler_name
|
1993-10-05 20:14:50 +01:00
|
|
|
|
? (info->assembler_name == assembler_name)
|
|
|
|
|
: (info->name == name))
|
|
|
|
|
{
|
|
|
|
|
/* Yup; check it. */
|
2000-09-19 05:26:11 +02:00
|
|
|
|
check_format_info (status, info, params);
|
1993-10-05 20:14:50 +01:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2000-09-19 05:26:11 +02:00
|
|
|
|
/* This function replaces `warning' inside the printf format checking
|
|
|
|
|
functions. If the `status' parameter is non-NULL, then it is
|
|
|
|
|
dereferenced and set to 1 whenever a warning is caught. Otherwise
|
|
|
|
|
it warns as usual by replicating the innards of the warning
|
|
|
|
|
function from diagnostic.c. */
|
|
|
|
|
static void
|
|
|
|
|
status_warning VPARAMS ((int *status, const char *msgid, ...))
|
|
|
|
|
{
|
|
|
|
|
#ifndef ANSI_PROTOTYPES
|
|
|
|
|
int *status;
|
|
|
|
|
const char *msgid;
|
|
|
|
|
#endif
|
|
|
|
|
va_list ap;
|
|
|
|
|
diagnostic_context dc;
|
|
|
|
|
|
|
|
|
|
if (status)
|
|
|
|
|
*status = 1;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
VA_START (ap, msgid);
|
|
|
|
|
|
|
|
|
|
#ifndef ANSI_PROTOTYPES
|
|
|
|
|
status = va_arg (ap, int *);
|
|
|
|
|
msgid = va_arg (ap, const char *);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* This duplicates the warning function behavior. */
|
|
|
|
|
set_diagnostic_context
|
|
|
|
|
(&dc, msgid, &ap, input_filename, lineno, /* warn = */ 1);
|
|
|
|
|
report_diagnostic (&dc);
|
|
|
|
|
|
|
|
|
|
va_end (ap);
|
|
|
|
|
}
|
|
|
|
|
}
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
|
|
|
|
|
/* Variables used by the checking of $ operand number formats. */
|
|
|
|
|
static char *dollar_arguments_used = NULL;
|
|
|
|
|
static int dollar_arguments_alloc = 0;
|
|
|
|
|
static int dollar_arguments_count;
|
|
|
|
|
static int dollar_first_arg_num;
|
|
|
|
|
static int dollar_max_arg_used;
|
|
|
|
|
static int dollar_format_warned;
|
|
|
|
|
|
|
|
|
|
/* Initialize the checking for a format string that may contain $
|
|
|
|
|
parameter number specifications; we will need to keep track of whether
|
|
|
|
|
each parameter has been used. FIRST_ARG_NUM is the number of the first
|
|
|
|
|
argument that is a parameter to the format, or 0 for a vprintf-style
|
|
|
|
|
function; PARAMS is the list of arguments starting at this argument. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
init_dollar_format_checking (first_arg_num, params)
|
|
|
|
|
int first_arg_num;
|
|
|
|
|
tree params;
|
|
|
|
|
{
|
|
|
|
|
dollar_first_arg_num = first_arg_num;
|
|
|
|
|
dollar_arguments_count = 0;
|
|
|
|
|
dollar_max_arg_used = 0;
|
|
|
|
|
dollar_format_warned = 0;
|
|
|
|
|
if (first_arg_num > 0)
|
|
|
|
|
{
|
|
|
|
|
while (params)
|
|
|
|
|
{
|
|
|
|
|
dollar_arguments_count++;
|
|
|
|
|
params = TREE_CHAIN (params);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (dollar_arguments_alloc < dollar_arguments_count)
|
|
|
|
|
{
|
|
|
|
|
if (dollar_arguments_used)
|
|
|
|
|
free (dollar_arguments_used);
|
|
|
|
|
dollar_arguments_alloc = dollar_arguments_count;
|
|
|
|
|
dollar_arguments_used = xmalloc (dollar_arguments_alloc);
|
|
|
|
|
}
|
|
|
|
|
if (dollar_arguments_alloc)
|
|
|
|
|
memset (dollar_arguments_used, 0, dollar_arguments_alloc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Look for a decimal number followed by a $ in *FORMAT. If DOLLAR_NEEDED
|
|
|
|
|
is set, it is an error if one is not found; otherwise, it is OK. If
|
|
|
|
|
such a number is found, check whether it is within range and mark that
|
|
|
|
|
numbered operand as being used for later checking. Returns the operand
|
|
|
|
|
number if found and within range, zero if no such number was found and
|
|
|
|
|
this is OK, or -1 on error. PARAMS points to the first operand of the
|
|
|
|
|
format; PARAM_PTR is made to point to the parameter referred to. If
|
|
|
|
|
a $ format is found, *FORMAT is updated to point just after it. */
|
|
|
|
|
|
|
|
|
|
static int
|
2000-09-19 05:26:11 +02:00
|
|
|
|
maybe_read_dollar_number (status, format, dollar_needed, params, param_ptr)
|
|
|
|
|
int *status;
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
const char **format;
|
|
|
|
|
int dollar_needed;
|
|
|
|
|
tree params;
|
|
|
|
|
tree *param_ptr;
|
|
|
|
|
{
|
|
|
|
|
int argnum;
|
|
|
|
|
int overflow_flag;
|
|
|
|
|
const char *fcp = *format;
|
|
|
|
|
if (*fcp < '0' || *fcp > '9')
|
|
|
|
|
{
|
|
|
|
|
if (dollar_needed)
|
|
|
|
|
{
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "missing $ operand number in format");
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
argnum = 0;
|
|
|
|
|
overflow_flag = 0;
|
|
|
|
|
while (*fcp >= '0' && *fcp <= '9')
|
|
|
|
|
{
|
|
|
|
|
int nargnum;
|
|
|
|
|
nargnum = 10 * argnum + (*fcp - '0');
|
|
|
|
|
if (nargnum < 0 || nargnum / 10 != argnum)
|
|
|
|
|
overflow_flag = 1;
|
|
|
|
|
argnum = nargnum;
|
|
|
|
|
fcp++;
|
|
|
|
|
}
|
|
|
|
|
if (*fcp != '$')
|
|
|
|
|
{
|
|
|
|
|
if (dollar_needed)
|
|
|
|
|
{
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "missing $ operand number in format");
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
*format = fcp + 1;
|
|
|
|
|
if (pedantic && !dollar_format_warned)
|
|
|
|
|
{
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "ISO C does not support %%n$ operand number formats");
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
dollar_format_warned = 1;
|
|
|
|
|
}
|
|
|
|
|
if (overflow_flag || argnum == 0
|
|
|
|
|
|| (dollar_first_arg_num && argnum > dollar_arguments_count))
|
|
|
|
|
{
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "operand number out of range in format");
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
if (argnum > dollar_max_arg_used)
|
|
|
|
|
dollar_max_arg_used = argnum;
|
|
|
|
|
/* For vprintf-style functions we may need to allocate more memory to
|
|
|
|
|
track which arguments are used. */
|
|
|
|
|
while (dollar_arguments_alloc < dollar_max_arg_used)
|
|
|
|
|
{
|
|
|
|
|
int nalloc;
|
|
|
|
|
nalloc = 2 * dollar_arguments_alloc + 16;
|
|
|
|
|
dollar_arguments_used = xrealloc (dollar_arguments_used, nalloc);
|
|
|
|
|
memset (dollar_arguments_used + dollar_arguments_alloc, 0,
|
|
|
|
|
nalloc - dollar_arguments_alloc);
|
|
|
|
|
dollar_arguments_alloc = nalloc;
|
|
|
|
|
}
|
|
|
|
|
dollar_arguments_used[argnum - 1] = 1;
|
|
|
|
|
if (dollar_first_arg_num)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
*param_ptr = params;
|
|
|
|
|
for (i = 1; i < argnum && *param_ptr != 0; i++)
|
|
|
|
|
*param_ptr = TREE_CHAIN (*param_ptr);
|
|
|
|
|
|
|
|
|
|
if (*param_ptr == 0)
|
|
|
|
|
{
|
|
|
|
|
/* This case shouldn't be caught here. */
|
|
|
|
|
abort ();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
*param_ptr = 0;
|
|
|
|
|
return argnum;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Finish the checking for a format string that used $ operand number formats
|
|
|
|
|
instead of non-$ formats. We check for unused operands before used ones
|
|
|
|
|
(a serious error, since the implementation of the format function
|
|
|
|
|
can't know what types to pass to va_arg to find the later arguments).
|
|
|
|
|
and for unused operands at the end of the format (if we know how many
|
|
|
|
|
arguments the format had, so not for vprintf). If there were operand
|
|
|
|
|
numbers out of range on a non-vprintf-style format, we won't have reached
|
|
|
|
|
here. */
|
|
|
|
|
|
|
|
|
|
static void
|
2000-09-19 05:26:11 +02:00
|
|
|
|
finish_dollar_format_checking (status)
|
|
|
|
|
int *status;
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < dollar_max_arg_used; i++)
|
|
|
|
|
{
|
|
|
|
|
if (!dollar_arguments_used[i])
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "format argument %d unused before used argument %d in $-style format",
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
i + 1, dollar_max_arg_used);
|
|
|
|
|
}
|
|
|
|
|
if (dollar_first_arg_num && dollar_max_arg_used < dollar_arguments_count)
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "unused arguments in $-style format");
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
/* Retrieve the specification for a format flag. SPEC contains the
|
|
|
|
|
specifications for format flags for the applicable kind of format.
|
|
|
|
|
FLAG is the flag in question. If PREDICATES is NULL, the basic
|
|
|
|
|
spec for that flag must be retrieved and this function aborts if
|
|
|
|
|
it cannot be found. If PREDICATES is not NULL, it is a string listing
|
|
|
|
|
possible predicates for the spec entry; if an entry predicated on any
|
|
|
|
|
of these is found, it is returned, otherwise NULL is returned. */
|
|
|
|
|
|
|
|
|
|
static const format_flag_spec *
|
|
|
|
|
get_flag_spec (spec, flag, predicates)
|
|
|
|
|
const format_flag_spec *spec;
|
|
|
|
|
int flag;
|
|
|
|
|
const char *predicates;
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; spec[i].flag_char != 0; i++)
|
|
|
|
|
{
|
|
|
|
|
if (spec[i].flag_char != flag)
|
|
|
|
|
continue;
|
|
|
|
|
if (predicates != NULL)
|
|
|
|
|
{
|
|
|
|
|
if (spec[i].predicate != 0
|
|
|
|
|
&& index (predicates, spec[i].predicate) != 0)
|
|
|
|
|
return &spec[i];
|
|
|
|
|
}
|
|
|
|
|
else if (spec[i].predicate == 0)
|
|
|
|
|
return &spec[i];
|
|
|
|
|
}
|
|
|
|
|
if (predicates == NULL)
|
|
|
|
|
abort ();
|
|
|
|
|
else
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
1993-10-05 20:14:50 +01:00
|
|
|
|
/* Check the argument list of a call to printf, scanf, etc.
|
|
|
|
|
INFO points to the function_format_info structure.
|
|
|
|
|
PARAMS is the list of argument values. */
|
|
|
|
|
|
|
|
|
|
static void
|
2000-09-19 05:26:11 +02:00
|
|
|
|
check_format_info (status, info, params)
|
|
|
|
|
int *status;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
function_format_info *info;
|
|
|
|
|
tree params;
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
int arg_num;
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
int suppressed;
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
const char *length_chars = NULL;
|
|
|
|
|
enum format_lengths length_chars_val = FMT_LEN_none;
|
|
|
|
|
enum format_std_version length_chars_std = STD_C89;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
int format_char;
|
|
|
|
|
int format_length;
|
|
|
|
|
tree format_tree;
|
|
|
|
|
tree cur_param;
|
|
|
|
|
tree wanted_type;
|
2000-09-18 18:34:35 +02:00
|
|
|
|
int main_arg_num;
|
|
|
|
|
tree main_arg_params;
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
enum format_std_version wanted_type_std;
|
|
|
|
|
const char *wanted_type_name;
|
2000-09-15 23:16:31 +02:00
|
|
|
|
format_wanted_type width_wanted_type;
|
|
|
|
|
format_wanted_type precision_wanted_type;
|
|
|
|
|
format_wanted_type main_wanted_type;
|
|
|
|
|
format_wanted_type *first_wanted_type;
|
|
|
|
|
format_wanted_type *last_wanted_type;
|
1993-10-10 13:56:49 +01:00
|
|
|
|
tree first_fillin_param;
|
c-aux-info.c (data_type, [...]): Qualify a char* with the `const' keyword.
* c-aux-info.c (data_type, affix_data_type, gen_decl,
gen_formal_list_for_type, gen_formal_list_for_func_def, gen_type):
Qualify a char* with the `const' keyword.
* c-common.c (declare_hidden_char_array, add_attribute, if_elt,
declare_function_name, decl_attributes, format_char_info,
check_format_info, binary_op_error): Likewise.
* cexp.y (yyerror, error, pedwarn, warning, token): Likewise.
* gcse.c (dump_hash_table): Likewise.
* integrate.c (function_cannot_inline_p): Likewise
* optabs.c: Include insn-config.h earlier.
(init_libfuncs, init_integral_libfuncs, init_floating_libfuncs):
Qualify a char* with the `const' keyword.
* real.c (asctoe24, asctoe53, asctoe64, asctoe113, asctoe,
asctoeg, mtherr, ereal_atof): Likewise.
* real.h (ereal_atof): Likewise.
* sbitmap.c (dump_sbitmap_vector): Likewise.
* sbitmap.h (dump_sbitmap_vector): Likewise.
* stmt.c (nesting, n_occurrences, expand_start_case): Likewise.
* toplev.c (rest_of_compilation): Likewise.
* tree.h (function_cannot_inline_p, expand_start_case): Likewise.
From-SVN: r25614
1999-03-06 06:34:26 +01:00
|
|
|
|
const char *format_chars;
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
const format_kind_info *fki = NULL;
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
const format_flag_spec *flag_specs = NULL;
|
|
|
|
|
const format_flag_pair *bad_flag_pairs = NULL;
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
const format_length_info *fli = NULL;
|
|
|
|
|
const format_char_info *fci = NULL;
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
char flag_chars[256];
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
/* -1 if no conversions taking an operand have been found; 0 if one has
|
|
|
|
|
and it didn't use $; 1 if $ formats are in use. */
|
|
|
|
|
int has_operand_number = -1;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
|
|
|
|
|
/* Skip to format argument. If the argument isn't available, there's
|
|
|
|
|
no work for us to do; prototype checking will catch the problem. */
|
|
|
|
|
for (arg_num = 1; ; ++arg_num)
|
|
|
|
|
{
|
|
|
|
|
if (params == 0)
|
|
|
|
|
return;
|
|
|
|
|
if (arg_num == info->format_num)
|
|
|
|
|
break;
|
|
|
|
|
params = TREE_CHAIN (params);
|
|
|
|
|
}
|
|
|
|
|
format_tree = TREE_VALUE (params);
|
|
|
|
|
params = TREE_CHAIN (params);
|
|
|
|
|
if (format_tree == 0)
|
|
|
|
|
return;
|
1996-06-08 19:35:57 +02:00
|
|
|
|
|
1993-10-05 20:14:50 +01:00
|
|
|
|
/* We can only check the format if it's a string constant. */
|
|
|
|
|
while (TREE_CODE (format_tree) == NOP_EXPR)
|
|
|
|
|
format_tree = TREE_OPERAND (format_tree, 0); /* strip coercion */
|
1996-06-08 19:35:57 +02:00
|
|
|
|
|
|
|
|
|
if (TREE_CODE (format_tree) == CALL_EXPR
|
|
|
|
|
&& TREE_CODE (TREE_OPERAND (format_tree, 0)) == ADDR_EXPR
|
|
|
|
|
&& (TREE_CODE (TREE_OPERAND (TREE_OPERAND (format_tree, 0), 0))
|
|
|
|
|
== FUNCTION_DECL))
|
|
|
|
|
{
|
|
|
|
|
tree function = TREE_OPERAND (TREE_OPERAND (format_tree, 0), 0);
|
|
|
|
|
|
|
|
|
|
/* See if this is a call to a known internationalization function
|
|
|
|
|
that modifies the format arg. */
|
|
|
|
|
international_format_info *info;
|
|
|
|
|
|
|
|
|
|
for (info = international_format_list; info; info = info->next)
|
|
|
|
|
if (info->assembler_name
|
|
|
|
|
? (info->assembler_name == DECL_ASSEMBLER_NAME (function))
|
|
|
|
|
: (info->name == DECL_NAME (function)))
|
|
|
|
|
{
|
|
|
|
|
tree inner_args;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for (inner_args = TREE_OPERAND (format_tree, 1), i = 1;
|
|
|
|
|
inner_args != 0;
|
|
|
|
|
inner_args = TREE_CHAIN (inner_args), i++)
|
|
|
|
|
if (i == info->format_num)
|
|
|
|
|
{
|
|
|
|
|
format_tree = TREE_VALUE (inner_args);
|
|
|
|
|
|
|
|
|
|
while (TREE_CODE (format_tree) == NOP_EXPR)
|
|
|
|
|
format_tree = TREE_OPERAND (format_tree, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1995-10-20 00:18:59 +01:00
|
|
|
|
if (integer_zerop (format_tree))
|
1993-10-05 20:14:50 +01:00
|
|
|
|
{
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "null format string");
|
1993-10-05 20:14:50 +01:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (TREE_CODE (format_tree) != ADDR_EXPR)
|
1999-10-10 07:17:41 +02:00
|
|
|
|
{
|
|
|
|
|
/* The user may get multiple warnings if the supplied argument
|
|
|
|
|
isn't even a string pointer. */
|
1999-10-28 12:53:12 +02:00
|
|
|
|
/* Functions taking a va_list normally pass a non-literal format
|
|
|
|
|
string. These functions typically are declared with
|
|
|
|
|
first_arg_num == 0, so avoid warning in those cases. */
|
2000-01-31 04:31:26 +01:00
|
|
|
|
if (info->first_arg_num != 0 && warn_format > 1)
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "format not a string literal, argument types not checked");
|
1999-10-10 07:17:41 +02:00
|
|
|
|
return;
|
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
format_tree = TREE_OPERAND (format_tree, 0);
|
|
|
|
|
if (TREE_CODE (format_tree) != STRING_CST)
|
1999-10-10 07:17:41 +02:00
|
|
|
|
{
|
|
|
|
|
/* The user may get multiple warnings if the supplied argument
|
|
|
|
|
isn't even a string pointer. */
|
1999-10-28 12:53:12 +02:00
|
|
|
|
/* Functions taking a va_list normally pass a non-literal format
|
|
|
|
|
string. These functions typically are declared with
|
|
|
|
|
first_arg_num == 0, so avoid warning in those cases. */
|
2000-01-31 04:31:26 +01:00
|
|
|
|
if (info->first_arg_num != 0 && warn_format > 1)
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "format not a string literal, argument types not checked");
|
1999-10-10 07:17:41 +02:00
|
|
|
|
return;
|
|
|
|
|
}
|
2000-09-24 11:52:53 +02:00
|
|
|
|
if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (format_tree))) != char_type_node)
|
|
|
|
|
{
|
|
|
|
|
status_warning (status, "format is a wide character string");
|
|
|
|
|
return;
|
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
format_chars = TREE_STRING_POINTER (format_tree);
|
|
|
|
|
format_length = TREE_STRING_LENGTH (format_tree);
|
|
|
|
|
if (format_length <= 1)
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "zero-length format string");
|
1993-10-05 20:14:50 +01:00
|
|
|
|
if (format_chars[--format_length] != 0)
|
|
|
|
|
{
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "unterminated format string");
|
1993-10-05 20:14:50 +01:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
/* Skip to first argument to check. */
|
|
|
|
|
while (arg_num + 1 < info->first_arg_num)
|
|
|
|
|
{
|
|
|
|
|
if (params == 0)
|
|
|
|
|
return;
|
|
|
|
|
params = TREE_CHAIN (params);
|
|
|
|
|
++arg_num;
|
|
|
|
|
}
|
1993-10-10 13:56:49 +01:00
|
|
|
|
|
|
|
|
|
first_fillin_param = params;
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
init_dollar_format_checking (info->first_arg_num, first_fillin_param);
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
fki = &format_types[info->format_type];
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
flag_specs = fki->flag_specs;
|
|
|
|
|
bad_flag_pairs = fki->bad_flag_pairs;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
while (1)
|
|
|
|
|
{
|
1993-12-22 13:11:59 +01:00
|
|
|
|
int aflag;
|
2000-09-15 23:16:31 +02:00
|
|
|
|
first_wanted_type = NULL;
|
|
|
|
|
last_wanted_type = NULL;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
if (*format_chars == 0)
|
|
|
|
|
{
|
|
|
|
|
if (format_chars - TREE_STRING_POINTER (format_tree) != format_length)
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "embedded `\\0' in format");
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
if (info->first_arg_num != 0 && params != 0
|
|
|
|
|
&& has_operand_number <= 0)
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "too many arguments for format");
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
if (has_operand_number > 0)
|
2000-09-19 05:26:11 +02:00
|
|
|
|
finish_dollar_format_checking (status);
|
1993-10-05 20:14:50 +01:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (*format_chars++ != '%')
|
|
|
|
|
continue;
|
|
|
|
|
if (*format_chars == 0)
|
|
|
|
|
{
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "spurious trailing `%%' in format");
|
1993-10-05 20:14:50 +01:00
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (*format_chars == '%')
|
|
|
|
|
{
|
|
|
|
|
++format_chars;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
flag_chars[0] = 0;
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
suppressed = FALSE;
|
2000-09-18 18:34:35 +02:00
|
|
|
|
main_arg_num = 0;
|
|
|
|
|
main_arg_params = 0;
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
|
|
|
|
|
if ((fki->flags & FMT_FLAG_ARG_CONVERT) && has_operand_number != 0)
|
1993-10-05 20:14:50 +01:00
|
|
|
|
{
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
/* Possibly read a $ operand number at the start of the format.
|
|
|
|
|
If one was previously used, one is required here. If one
|
|
|
|
|
is not used here, we can't immediately conclude this is a
|
|
|
|
|
format without them, since it could be printf %m or scanf %*. */
|
|
|
|
|
int opnum;
|
|
|
|
|
opnum = maybe_read_dollar_number (status, &format_chars, 0,
|
|
|
|
|
first_fillin_param,
|
|
|
|
|
&main_arg_params);
|
|
|
|
|
if (opnum == -1)
|
|
|
|
|
return;
|
|
|
|
|
else if (opnum > 0)
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
{
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
has_operand_number = 1;
|
|
|
|
|
main_arg_num = opnum + info->first_arg_num - 1;
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
|
|
|
|
|
/* Read any format flags, but do not yet validate them beyond removing
|
|
|
|
|
duplicates, since in general validation depends on the rest of
|
|
|
|
|
the format. */
|
|
|
|
|
while (*format_chars != 0 && index (fki->flag_chars, *format_chars) != 0)
|
|
|
|
|
{
|
|
|
|
|
if (index (flag_chars, *format_chars) != 0)
|
1998-04-12 21:52:16 +02:00
|
|
|
|
{
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
const format_flag_spec *s = get_flag_spec (flag_specs,
|
|
|
|
|
*format_chars, NULL);
|
|
|
|
|
status_warning (status, "repeated %s in format", _(s->name));
|
1998-04-12 21:52:16 +02:00
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
else
|
1998-04-12 21:52:16 +02:00
|
|
|
|
{
|
|
|
|
|
i = strlen (flag_chars);
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
flag_chars[i++] = *format_chars;
|
1998-04-12 21:52:16 +02:00
|
|
|
|
flag_chars[i] = 0;
|
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
++format_chars;
|
1998-04-12 21:52:16 +02:00
|
|
|
|
}
|
1993-10-10 13:56:49 +01:00
|
|
|
|
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
/* Read any format width, possibly * or *m$. */
|
|
|
|
|
if (fki->width_char != 0)
|
|
|
|
|
{
|
|
|
|
|
if (fki->width_type != NULL && *format_chars == '*')
|
1993-10-05 20:14:50 +01:00
|
|
|
|
{
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
i = strlen (flag_chars);
|
|
|
|
|
flag_chars[i++] = fki->width_char;
|
|
|
|
|
flag_chars[i] = 0;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
/* "...a field width...may be indicated by an asterisk.
|
|
|
|
|
In this case, an int argument supplies the field width..." */
|
|
|
|
|
++format_chars;
|
|
|
|
|
if (params == 0)
|
|
|
|
|
{
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "too few arguments for format");
|
1993-10-05 20:14:50 +01:00
|
|
|
|
return;
|
|
|
|
|
}
|
2000-09-18 18:34:35 +02:00
|
|
|
|
if (has_operand_number != 0)
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
{
|
|
|
|
|
int opnum;
|
2000-09-19 05:26:11 +02:00
|
|
|
|
opnum = maybe_read_dollar_number (status, &format_chars,
|
2000-09-18 18:34:35 +02:00
|
|
|
|
has_operand_number == 1,
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
first_fillin_param,
|
|
|
|
|
¶ms);
|
2000-09-18 18:34:35 +02:00
|
|
|
|
if (opnum == -1)
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
return;
|
2000-09-18 18:34:35 +02:00
|
|
|
|
else if (opnum > 0)
|
|
|
|
|
{
|
|
|
|
|
has_operand_number = 1;
|
|
|
|
|
arg_num = opnum + info->first_arg_num - 1;
|
|
|
|
|
}
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
else
|
2000-09-18 18:34:35 +02:00
|
|
|
|
has_operand_number = 0;
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
if (info->first_arg_num != 0)
|
|
|
|
|
{
|
|
|
|
|
cur_param = TREE_VALUE (params);
|
c-common.c (init_dollar_format_checking, [...]): New functions.
* c-common.c (init_dollar_format_checking,
maybe_read_dollar_number, finish_dollar_format_checking): New
functions.
(dollar_arguments_used, dollar_arguments_count,
dollar_first_arg_num, dollar_max_arg_used, dollar_format_warned):
New variables.
(check_format_info): Support $ formats for scanf and printf width
and precision. Always increment format_chars to advance past the
'*' of precision, not just when the format parameters are
available to check.
testsuite:
* gcc.dg/c90-printf-3.c, gcc.dg/c90-scanf-2.c,
gcc.dg/c90-scanf-3.c, gcc.dg/c90-scanf-4.c,
gcc.dg/c90-strftime-1.c, gcc.dg/c99-printf-3.c,
gcc.dg/c99-scanf-1.c, gcc.dg/c99-scanf-2.c, gcc.dg/c99-scanf-3.c,
gcc.dg/format-xopen-1.c: New tests.
From-SVN: r35856
2000-08-21 21:38:35 +02:00
|
|
|
|
if (has_operand_number <= 0)
|
|
|
|
|
{
|
|
|
|
|
params = TREE_CHAIN (params);
|
|
|
|
|
++arg_num;
|
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
width_wanted_type.wanted_type = *fki->width_type;
|
2000-09-15 23:16:31 +02:00
|
|
|
|
width_wanted_type.wanted_type_name = NULL;
|
|
|
|
|
width_wanted_type.pointer_count = 0;
|
|
|
|
|
width_wanted_type.char_lenient_flag = 0;
|
|
|
|
|
width_wanted_type.writing_in_flag = 0;
|
|
|
|
|
width_wanted_type.name = _("field width");
|
|
|
|
|
width_wanted_type.param = cur_param;
|
|
|
|
|
width_wanted_type.arg_num = arg_num;
|
|
|
|
|
width_wanted_type.next = NULL;
|
|
|
|
|
if (last_wanted_type != 0)
|
|
|
|
|
last_wanted_type->next = &width_wanted_type;
|
|
|
|
|
if (first_wanted_type == 0)
|
|
|
|
|
first_wanted_type = &width_wanted_type;
|
|
|
|
|
last_wanted_type = &width_wanted_type;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
/* Possibly read a numeric width. If the width is zero,
|
|
|
|
|
we complain; for scanf this is bad according to the
|
|
|
|
|
standard, and for printf and strftime it cannot occur
|
|
|
|
|
because 0 is a flag. */
|
|
|
|
|
int non_zero_width_char = FALSE;
|
|
|
|
|
int found_width = FALSE;
|
1998-05-06 14:56:58 +02:00
|
|
|
|
while (ISDIGIT (*format_chars))
|
1993-10-05 20:14:50 +01:00
|
|
|
|
{
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
found_width = TRUE;
|
|
|
|
|
if (*format_chars != '0')
|
|
|
|
|
non_zero_width_char = TRUE;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
++format_chars;
|
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
if (found_width && !non_zero_width_char)
|
|
|
|
|
status_warning (status, "zero width in scanf format");
|
|
|
|
|
if (found_width)
|
|
|
|
|
{
|
|
|
|
|
i = strlen (flag_chars);
|
|
|
|
|
flag_chars[i++] = fki->width_char;
|
|
|
|
|
flag_chars[i] = 0;
|
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Read any format precision, possibly * or *m$. */
|
|
|
|
|
if (fki->precision_char != 0 && *format_chars == '.')
|
|
|
|
|
{
|
|
|
|
|
++format_chars;
|
|
|
|
|
i = strlen (flag_chars);
|
|
|
|
|
flag_chars[i++] = fki->precision_char;
|
|
|
|
|
flag_chars[i] = 0;
|
|
|
|
|
if (fki->precision_type != NULL && *format_chars == '*')
|
1993-10-05 20:14:50 +01:00
|
|
|
|
{
|
|
|
|
|
/* "...a...precision...may be indicated by an asterisk.
|
|
|
|
|
In this case, an int argument supplies the...precision." */
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
++format_chars;
|
|
|
|
|
if (has_operand_number != 0)
|
1993-10-05 20:14:50 +01:00
|
|
|
|
{
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
int opnum;
|
|
|
|
|
opnum = maybe_read_dollar_number (status, &format_chars,
|
|
|
|
|
has_operand_number == 1,
|
|
|
|
|
first_fillin_param,
|
|
|
|
|
¶ms);
|
|
|
|
|
if (opnum == -1)
|
|
|
|
|
return;
|
|
|
|
|
else if (opnum > 0)
|
1993-10-05 20:14:50 +01:00
|
|
|
|
{
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
has_operand_number = 1;
|
|
|
|
|
arg_num = opnum + info->first_arg_num - 1;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
else
|
|
|
|
|
has_operand_number = 0;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
if (info->first_arg_num != 0)
|
1993-10-05 20:14:50 +01:00
|
|
|
|
{
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
if (params == 0)
|
|
|
|
|
{
|
|
|
|
|
status_warning (status, "too few arguments for format");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
cur_param = TREE_VALUE (params);
|
|
|
|
|
if (has_operand_number <= 0)
|
|
|
|
|
{
|
|
|
|
|
params = TREE_CHAIN (params);
|
|
|
|
|
++arg_num;
|
|
|
|
|
}
|
|
|
|
|
precision_wanted_type.wanted_type = *fki->precision_type;
|
|
|
|
|
precision_wanted_type.wanted_type_name = NULL;
|
|
|
|
|
precision_wanted_type.pointer_count = 0;
|
|
|
|
|
precision_wanted_type.char_lenient_flag = 0;
|
|
|
|
|
precision_wanted_type.writing_in_flag = 0;
|
|
|
|
|
precision_wanted_type.name = _("field precision");
|
|
|
|
|
precision_wanted_type.param = cur_param;
|
|
|
|
|
precision_wanted_type.arg_num = arg_num;
|
|
|
|
|
precision_wanted_type.next = NULL;
|
|
|
|
|
if (last_wanted_type != 0)
|
|
|
|
|
last_wanted_type->next = &precision_wanted_type;
|
|
|
|
|
if (first_wanted_type == 0)
|
|
|
|
|
first_wanted_type = &precision_wanted_type;
|
|
|
|
|
last_wanted_type = &precision_wanted_type;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
while (ISDIGIT (*format_chars))
|
|
|
|
|
++format_chars;
|
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
1998-04-12 21:52:16 +02:00
|
|
|
|
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
/* Read any length modifier, if this kind of format has them. */
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
fli = fki->length_char_specs;
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
length_chars = NULL;
|
|
|
|
|
length_chars_val = FMT_LEN_none;
|
|
|
|
|
length_chars_std = STD_C89;
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
if (fli)
|
1993-12-22 13:11:59 +01:00
|
|
|
|
{
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
while (fli->name != 0 && fli->name[0] != *format_chars)
|
|
|
|
|
fli++;
|
|
|
|
|
if (fli->name != 0)
|
1998-04-12 21:52:16 +02:00
|
|
|
|
{
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
format_chars++;
|
|
|
|
|
if (fli->double_name != 0 && fli->name[0] == *format_chars)
|
c-common.c (combine_strings, [...]): Refer to ISO C or ISO C89 instead of ANSI C.
* c-common.c (combine_strings, check_format_info): Refer to ISO C
or ISO C89 instead of ANSI C.
* c-decl.c (grokdeclarator, xref_tag, finish_struct,
build_enumerator, do_case): Likewise.
* c-lex.c (parse_float, yylex): Likewise.
* c-parse.in: Likewise.
* c-typeck.c (common_type, build_array_ref, build_binary_op,
build_unary_op, pedantic_lvalue_warning, build_conditional_expr,
build_c_cast, convert_for_assignment, set_init_index,
set_init_label, c_expand_start_case): Likewise.
* toplev.c (documented_lang_options, display_help): Likewise.
From-SVN: r35576
2000-08-09 01:19:11 +02:00
|
|
|
|
{
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
format_chars++;
|
|
|
|
|
length_chars = fli->double_name;
|
|
|
|
|
length_chars_val = fli->double_index;
|
|
|
|
|
length_chars_std = fli->double_std;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
length_chars = fli->name;
|
|
|
|
|
length_chars_val = fli->index;
|
|
|
|
|
length_chars_std = fli->std;
|
c-common.c (combine_strings, [...]): Refer to ISO C or ISO C89 instead of ANSI C.
* c-common.c (combine_strings, check_format_info): Refer to ISO C
or ISO C89 instead of ANSI C.
* c-decl.c (grokdeclarator, xref_tag, finish_struct,
build_enumerator, do_case): Likewise.
* c-lex.c (parse_float, yylex): Likewise.
* c-parse.in: Likewise.
* c-typeck.c (common_type, build_array_ref, build_binary_op,
build_unary_op, pedantic_lvalue_warning, build_conditional_expr,
build_c_cast, convert_for_assignment, set_init_index,
set_init_label, c_expand_start_case): Likewise.
* toplev.c (documented_lang_options, display_help): Likewise.
From-SVN: r35576
2000-08-09 01:19:11 +02:00
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
i = strlen (flag_chars);
|
|
|
|
|
flag_chars[i++] = fki->length_code_char;
|
|
|
|
|
flag_chars[i] = 0;
|
1998-04-12 21:52:16 +02:00
|
|
|
|
}
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
if (pedantic)
|
1998-06-03 04:13:21 +02:00
|
|
|
|
{
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
/* Warn if the length modifier is non-standard. */
|
|
|
|
|
if (length_chars_std == STD_EXT)
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "ISO C does not support the `%s' %s length modifier",
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
length_chars, fki->name);
|
|
|
|
|
else if ((length_chars_std == STD_C99 && !flag_isoc99)
|
|
|
|
|
|| (length_chars_std == STD_C94 && !flag_isoc94))
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "ISO C89 does not support the `%s' %s length modifier",
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
length_chars, fki->name);
|
1998-06-03 04:13:21 +02:00
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Read any modifier (strftime E/O). */
|
|
|
|
|
if (fki->modifier_chars != NULL)
|
|
|
|
|
{
|
|
|
|
|
while (*format_chars != 0
|
|
|
|
|
&& index (fki->modifier_chars, *format_chars) != 0)
|
|
|
|
|
{
|
|
|
|
|
if (index (flag_chars, *format_chars) != 0)
|
|
|
|
|
{
|
|
|
|
|
const format_flag_spec *s = get_flag_spec (flag_specs,
|
|
|
|
|
*format_chars, NULL);
|
|
|
|
|
status_warning (status, "repeated %s in format", _(s->name));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
i = strlen (flag_chars);
|
|
|
|
|
flag_chars[i++] = *format_chars;
|
|
|
|
|
flag_chars[i] = 0;
|
|
|
|
|
}
|
|
|
|
|
++format_chars;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Handle the scanf allocation kludge. */
|
|
|
|
|
if (fki->flags & FMT_FLAG_SCANF_A_KLUDGE)
|
|
|
|
|
{
|
|
|
|
|
if (*format_chars == 'a' && !flag_isoc99)
|
1998-04-12 21:52:16 +02:00
|
|
|
|
{
|
|
|
|
|
if (format_chars[1] == 's' || format_chars[1] == 'S'
|
|
|
|
|
|| format_chars[1] == '[')
|
|
|
|
|
{
|
|
|
|
|
/* `a' is used as a flag. */
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
i = strlen (flag_chars);
|
|
|
|
|
flag_chars[i++] = 'a';
|
|
|
|
|
flag_chars[i] = 0;
|
1998-04-12 21:52:16 +02:00
|
|
|
|
format_chars++;
|
|
|
|
|
}
|
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
|
1993-10-05 20:14:50 +01:00
|
|
|
|
format_char = *format_chars;
|
1998-04-12 21:52:16 +02:00
|
|
|
|
if (format_char == 0
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
|| (!(fki->flags & FMT_FLAG_FANCY_PERCENT_OK) && format_char == '%'))
|
1993-10-05 20:14:50 +01:00
|
|
|
|
{
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "conversion lacks type at end of format");
|
1993-10-05 20:14:50 +01:00
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
format_chars++;
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
fci = fki->conversion_specs;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
while (fci->format_chars != 0
|
|
|
|
|
&& index (fci->format_chars, format_char) == 0)
|
|
|
|
|
++fci;
|
|
|
|
|
if (fci->format_chars == 0)
|
|
|
|
|
{
|
Linas Vepstas <linas@linas.org>
* c-common.c: Use ISGRAPH, ISLOWER, toupper.
* c-lex.c, cccp.c, cexp.c, cexp.y, cppexp.c, dwarf2out.c, genattr.c,
genattrtab.c, genemit.c, genextract.c, genpeep.c, tree.c: Likewise.
* system.h (IN_CTYPE_DOMAIN): Define to 1 if HOST_EBCDIC.
* defaults.h (TARGET_ESC): Add default.
From-SVN: r29192
1999-09-08 08:51:23 +02:00
|
|
|
|
if (ISGRAPH(format_char))
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "unknown conversion type character `%c' in format",
|
1993-10-05 20:14:50 +01:00
|
|
|
|
format_char);
|
|
|
|
|
else
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "unknown conversion type character 0x%x in format",
|
1993-10-05 20:14:50 +01:00
|
|
|
|
format_char);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
1998-04-12 21:52:16 +02:00
|
|
|
|
if (pedantic)
|
1993-10-05 20:14:50 +01:00
|
|
|
|
{
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
if (fci->std == STD_EXT)
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "ISO C does not support the `%%%c' %s format",
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
format_char, fki->name);
|
|
|
|
|
else if ((fci->std == STD_C99 && !flag_isoc99)
|
|
|
|
|
|| (fci->std == STD_C94 && !flag_isoc94))
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "ISO C89 does not support the `%%%c' %s format",
|
c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
* c-common.h (enum c_tree_index): Add CTI_C_SIZE_TYPE.
(c_size_type_node): Define.
* c-decl.c (init_decl_processing): Initialize c_size_type_node.
* c-common.c (enum format_lengths, enum format_std_version,
format_length_info, format_type_detail, BADLEN, NOLENGTHS,
format_kind_info, printf_length_specs, scanf_length_specs, T89_I,
T99_I, T89_L, T99_LL, TEX_LL, T89_S, T89_UI, T99_UI, T89_UL,
T99_ULL, TEX_ULL, T89_US, T89_F, T99_F, T89_D, T99_D, T89_LD,
T99_LD, T89_C, T99_SC, T99_UC, T89_V, T94_W, TEX_W, T94_WI,
TEX_WI, T99_ST, T99_SST, T99_PD, T99_UPD, T99_IM, T99_UIM,
format_types): Define.
(format_char_info, print_char_table, scan_char_table,
time_char_table): Rearrange for new organization of information
about format length modifiers and standard versions.
(T_ST): Redefine to use c_size_type_node.
(check_format_info): Obtain information about length modifiers and
standard versions from tables. Adjust warning message wordings.
Use the name from the user's program for `ll' and `hh' length
modifiers in warning messages. Use more informative names for
wanted types where available (for wchar_t, wint_t, size_t, signed
size_t, ptrdiff_t, unsigned ptrdiff_t, intmax_t and uintmax_t).
testsuite:
* gcc.dg/format-diag-1.c: New test.
From-SVN: r36106
2000-09-02 00:09:55 +02:00
|
|
|
|
format_char, fki->name);
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
|
|
|
|
|
/* Validate the individual flags used, removing any that are invalid. */
|
|
|
|
|
{
|
|
|
|
|
int d = 0;
|
|
|
|
|
for (i = 0; flag_chars[i] != 0; i++)
|
|
|
|
|
{
|
|
|
|
|
const format_flag_spec *s = get_flag_spec (flag_specs,
|
|
|
|
|
flag_chars[i], NULL);
|
|
|
|
|
flag_chars[i - d] = flag_chars[i];
|
|
|
|
|
if (flag_chars[i] == fki->length_code_char)
|
|
|
|
|
continue;
|
|
|
|
|
if (index (fci->flag_chars, flag_chars[i]) == 0)
|
|
|
|
|
{
|
|
|
|
|
status_warning (status, "%s used with `%%%c' %s format",
|
|
|
|
|
_(s->name), format_char, fki->name);
|
|
|
|
|
d++;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (pedantic)
|
|
|
|
|
{
|
|
|
|
|
const format_flag_spec *t;
|
|
|
|
|
if (s->std == STD_EXT)
|
|
|
|
|
status_warning (status, "ISO C does not support %s",
|
|
|
|
|
_(s->long_name));
|
|
|
|
|
else if ((s->std == STD_C99 && !flag_isoc99)
|
|
|
|
|
|| (s->std == STD_C94 && !flag_isoc94))
|
|
|
|
|
status_warning (status, "ISO C89 does not support %s",
|
|
|
|
|
_(s->long_name));
|
|
|
|
|
t = get_flag_spec (flag_specs, flag_chars[i], fci->flags2);
|
|
|
|
|
if (t != NULL && t->std > s->std)
|
|
|
|
|
{
|
|
|
|
|
const char *long_name = (t->long_name != NULL
|
|
|
|
|
? t->long_name
|
|
|
|
|
: s->long_name);
|
|
|
|
|
if (t->std == STD_EXT)
|
|
|
|
|
status_warning (status, "ISO C does not support %s with the `%%%c' %s format",
|
|
|
|
|
_(long_name), format_char, fki->name);
|
|
|
|
|
else if ((t->std == STD_C99 && !flag_isoc99)
|
|
|
|
|
|| (t->std == STD_C94 && !flag_isoc94))
|
|
|
|
|
status_warning (status, "ISO C89 does not support %s with the `%%%c' %s format",
|
|
|
|
|
_(long_name), format_char, fki->name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
flag_chars[i - d] = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
aflag = 0;
|
|
|
|
|
if ((fki->flags & FMT_FLAG_SCANF_A_KLUDGE)
|
|
|
|
|
&& index (flag_chars, 'a') != 0)
|
|
|
|
|
aflag = 1;
|
|
|
|
|
|
|
|
|
|
if (fki->suppression_char
|
|
|
|
|
&& index (flag_chars, fki->suppression_char) != 0)
|
|
|
|
|
suppressed = 1;
|
|
|
|
|
|
|
|
|
|
/* Validate the pairs of flags used. */
|
|
|
|
|
for (i = 0; bad_flag_pairs[i].flag_char1 != 0; i++)
|
1993-12-22 13:11:59 +01:00
|
|
|
|
{
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
const format_flag_spec *s, *t;
|
|
|
|
|
if (index (flag_chars, bad_flag_pairs[i].flag_char1) == 0)
|
|
|
|
|
continue;
|
|
|
|
|
if (index (flag_chars, bad_flag_pairs[i].flag_char2) == 0)
|
|
|
|
|
continue;
|
|
|
|
|
if (bad_flag_pairs[i].predicate != 0
|
|
|
|
|
&& index (fci->flags2, bad_flag_pairs[i].predicate) == 0)
|
|
|
|
|
continue;
|
|
|
|
|
s = get_flag_spec (flag_specs, bad_flag_pairs[i].flag_char1, NULL);
|
|
|
|
|
t = get_flag_spec (flag_specs, bad_flag_pairs[i].flag_char2, NULL);
|
|
|
|
|
if (bad_flag_pairs[i].ignored)
|
|
|
|
|
{
|
|
|
|
|
if (bad_flag_pairs[i].predicate != 0)
|
|
|
|
|
status_warning (status, "%s ignored with %s and `%%%c' %s format",
|
|
|
|
|
_(s->name), _(t->name), format_char,
|
|
|
|
|
fki->name);
|
|
|
|
|
else
|
|
|
|
|
status_warning (status, "%s ignored with %s in %s format",
|
|
|
|
|
_(s->name), _(t->name), fki->name);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (bad_flag_pairs[i].predicate != 0)
|
|
|
|
|
status_warning (status, "use of %s and %s together with `%%%c' %s format",
|
|
|
|
|
_(s->name), _(t->name), format_char,
|
|
|
|
|
fki->name);
|
|
|
|
|
else
|
|
|
|
|
status_warning (status, "use of %s and %s together in %s format",
|
|
|
|
|
_(s->name), _(t->name), fki->name);
|
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
|
|
|
|
|
/* Give Y2K warnings. */
|
|
|
|
|
{
|
|
|
|
|
int y2k_level = 0;
|
|
|
|
|
if (index (fci->flags2, '4') != 0)
|
|
|
|
|
if (index (flag_chars, 'E') != 0)
|
|
|
|
|
y2k_level = 3;
|
|
|
|
|
else
|
|
|
|
|
y2k_level = 2;
|
|
|
|
|
else if (index (fci->flags2, '3') != 0)
|
|
|
|
|
y2k_level = 3;
|
|
|
|
|
else if (index (fci->flags2, '2') != 0)
|
|
|
|
|
y2k_level = 2;
|
|
|
|
|
if (y2k_level == 3)
|
|
|
|
|
status_warning (status, "`%%%c' yields only last 2 digits of year in some locales",
|
|
|
|
|
format_char);
|
|
|
|
|
else if (y2k_level == 2)
|
|
|
|
|
status_warning (status, "`%%%c' yields only last 2 digits of year", format_char);
|
|
|
|
|
}
|
|
|
|
|
|
2000-09-25 19:04:45 +02:00
|
|
|
|
if (index (fci->flags2, '[') != 0)
|
1993-10-05 20:14:50 +01:00
|
|
|
|
{
|
|
|
|
|
/* Skip over scan set, in case it happens to have '%' in it. */
|
|
|
|
|
if (*format_chars == '^')
|
|
|
|
|
++format_chars;
|
|
|
|
|
/* Find closing bracket; if one is hit immediately, then
|
|
|
|
|
it's part of the scan set rather than a terminator. */
|
|
|
|
|
if (*format_chars == ']')
|
|
|
|
|
++format_chars;
|
|
|
|
|
while (*format_chars && *format_chars != ']')
|
|
|
|
|
++format_chars;
|
|
|
|
|
if (*format_chars != ']')
|
1998-04-12 21:52:16 +02:00
|
|
|
|
/* The end of the format string was reached. */
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "no closing `]' for `%%[' format");
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
|
2000-10-12 11:28:52 +02:00
|
|
|
|
wanted_type = 0;
|
|
|
|
|
wanted_type_name = 0;
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
if (fki->flags & FMT_FLAG_ARG_CONVERT)
|
2000-09-15 23:16:31 +02:00
|
|
|
|
{
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
wanted_type = (fci->types[length_chars_val].type
|
|
|
|
|
? *fci->types[length_chars_val].type : 0);
|
|
|
|
|
wanted_type_name = fci->types[length_chars_val].name;
|
|
|
|
|
wanted_type_std = fci->types[length_chars_val].std;
|
|
|
|
|
if (wanted_type == 0)
|
|
|
|
|
{
|
|
|
|
|
status_warning (status, "use of `%s' length modifier with `%c' type character",
|
|
|
|
|
length_chars, format_char);
|
|
|
|
|
/* Heuristic: skip one argument when an invalid length/type
|
|
|
|
|
combination is encountered. */
|
|
|
|
|
arg_num++;
|
|
|
|
|
if (params == 0)
|
|
|
|
|
{
|
|
|
|
|
status_warning (status, "too few arguments for format");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
params = TREE_CHAIN (params);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
else if (pedantic
|
|
|
|
|
/* Warn if non-standard, provided it is more non-standard
|
|
|
|
|
than the length and type characters that may already
|
|
|
|
|
have been warned for. */
|
|
|
|
|
&& wanted_type_std > length_chars_std
|
|
|
|
|
&& wanted_type_std > fci->std)
|
2000-09-15 23:16:31 +02:00
|
|
|
|
{
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
if (wanted_type_std == STD_EXT)
|
|
|
|
|
status_warning (status, "ISO C does not support the `%%%s%c' %s format",
|
|
|
|
|
length_chars, format_char, fki->name);
|
|
|
|
|
else if ((wanted_type_std == STD_C99 && !flag_isoc99)
|
|
|
|
|
|| (wanted_type_std == STD_C94 && !flag_isoc94))
|
|
|
|
|
status_warning (status, "ISO C89 does not support the `%%%s%c' %s format",
|
|
|
|
|
length_chars, format_char, fki->name);
|
2000-09-15 23:16:31 +02:00
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Finally. . .check type of argument against desired type! */
|
|
|
|
|
if (info->first_arg_num == 0)
|
|
|
|
|
continue;
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
if ((fci->pointer_count == 0 && wanted_type == void_type_node)
|
|
|
|
|
|| suppressed)
|
1993-10-05 20:14:50 +01:00
|
|
|
|
{
|
2000-09-18 18:34:35 +02:00
|
|
|
|
if (main_arg_num != 0)
|
c-common.c (FMT_FLAG_ARG_CONVERT, [...]): Define.
* c-common.c (FMT_FLAG_ARG_CONVERT, FMT_FLAG_SCANF_A_KLUDGE,
FMT_FLAG_FANCY_PERCENT_OK): Define.
(format_char_info): Add flag "4" to comment.
(format_flag_spec, format_flag_pair): New structures.
(format_kind_info): Add additional fields to control format
checking.
(printf_flag_specs, printf_flag_pairs, scanf_flag_specs,
scanf_flag_pairs, strftime_flag_specs, strftime_flag_pairs): New
arrays.
(time_char_table): Use "4" flag to handle %Ey.
(format_types): Add entries for new fields.
(get_flag_spec): New function.
(check_format_info): Increase size of flag_chars[] to 256.
Control format checking using the new fields of a format_kind_info
and the new tables; remove all conditionals on printf_format_type,
scanf_format_type or strftime_format_type. Handle all details of
bad combinations of flags (including width, precision and strftime
modifiers) through data rather than ad hoc code. Handle all
details of standard versions in which flags appeared through
data. Use the "4" flag.
testsuite:
* gcc.dg/c90-printf-1.c, gcc.dg/c90-scanf-1.c,
gcc.dg/c99-printf-1.c, gcc.dg/c99-scanf-1.c,
gcc.dg/c99-strftime-1.c, gcc.dg/format-ext-3.c: Adjust error
regexps and details of expected handling of some bad formats.
* gcc.dg/format-xopen-1.c: Add test for $ format with assignment
suppression.
From-SVN: r36790
2000-10-08 23:12:33 +02:00
|
|
|
|
{
|
|
|
|
|
if (suppressed)
|
|
|
|
|
status_warning (status, "operand number specified with suppressed assignment");
|
|
|
|
|
else
|
|
|
|
|
status_warning (status, "operand number specified for format taking no argument");
|
|
|
|
|
}
|
2000-09-18 18:34:35 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (main_arg_num != 0)
|
2000-09-15 23:16:31 +02:00
|
|
|
|
{
|
2000-09-18 18:34:35 +02:00
|
|
|
|
arg_num = main_arg_num;
|
|
|
|
|
params = main_arg_params;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
++arg_num;
|
|
|
|
|
if (has_operand_number > 0)
|
|
|
|
|
{
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "missing $ operand number in format");
|
2000-09-18 18:34:35 +02:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
has_operand_number = 0;
|
|
|
|
|
if (params == 0)
|
|
|
|
|
{
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "too few arguments for format");
|
2000-09-18 18:34:35 +02:00
|
|
|
|
return;
|
|
|
|
|
}
|
2000-09-15 23:16:31 +02:00
|
|
|
|
}
|
|
|
|
|
cur_param = TREE_VALUE (params);
|
|
|
|
|
params = TREE_CHAIN (params);
|
|
|
|
|
main_wanted_type.wanted_type = wanted_type;
|
|
|
|
|
main_wanted_type.wanted_type_name = wanted_type_name;
|
|
|
|
|
main_wanted_type.pointer_count = fci->pointer_count + aflag;
|
|
|
|
|
main_wanted_type.char_lenient_flag = 0;
|
2000-09-25 19:04:45 +02:00
|
|
|
|
if (index (fci->flags2, 'c') != 0)
|
2000-09-15 23:16:31 +02:00
|
|
|
|
main_wanted_type.char_lenient_flag = 1;
|
|
|
|
|
main_wanted_type.writing_in_flag = 0;
|
2000-09-25 19:04:45 +02:00
|
|
|
|
if (index (fci->flags2, 'W') != 0)
|
2000-09-15 23:16:31 +02:00
|
|
|
|
main_wanted_type.writing_in_flag = 1;
|
|
|
|
|
main_wanted_type.name = NULL;
|
|
|
|
|
main_wanted_type.param = cur_param;
|
|
|
|
|
main_wanted_type.arg_num = arg_num;
|
|
|
|
|
main_wanted_type.next = NULL;
|
|
|
|
|
if (last_wanted_type != 0)
|
|
|
|
|
last_wanted_type->next = &main_wanted_type;
|
|
|
|
|
if (first_wanted_type == 0)
|
|
|
|
|
first_wanted_type = &main_wanted_type;
|
|
|
|
|
last_wanted_type = &main_wanted_type;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
2000-09-15 23:16:31 +02:00
|
|
|
|
|
|
|
|
|
if (first_wanted_type != 0)
|
2000-09-19 05:26:11 +02:00
|
|
|
|
check_format_types (status, first_wanted_type);
|
2000-09-15 23:16:31 +02:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Check the argument types from a single format conversion (possibly
|
|
|
|
|
including width and precision arguments). */
|
|
|
|
|
static void
|
2000-09-19 05:26:11 +02:00
|
|
|
|
check_format_types (status, types)
|
|
|
|
|
int *status;
|
2000-09-15 23:16:31 +02:00
|
|
|
|
format_wanted_type *types;
|
|
|
|
|
{
|
|
|
|
|
for (; types != 0; types = types->next)
|
|
|
|
|
{
|
|
|
|
|
tree cur_param;
|
|
|
|
|
tree cur_type;
|
2000-09-18 18:27:16 +02:00
|
|
|
|
tree orig_cur_type;
|
2000-09-15 23:16:31 +02:00
|
|
|
|
tree wanted_type;
|
2000-10-12 09:26:20 +02:00
|
|
|
|
tree promoted_type;
|
2000-09-15 23:16:31 +02:00
|
|
|
|
int arg_num;
|
|
|
|
|
int i;
|
|
|
|
|
int char_type_flag;
|
|
|
|
|
cur_param = types->param;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
cur_type = TREE_TYPE (cur_param);
|
2000-09-18 18:27:16 +02:00
|
|
|
|
if (TREE_CODE (cur_type) == ERROR_MARK)
|
|
|
|
|
continue;
|
2000-09-15 23:16:31 +02:00
|
|
|
|
char_type_flag = 0;
|
|
|
|
|
wanted_type = types->wanted_type;
|
|
|
|
|
arg_num = types->arg_num;
|
1993-10-05 20:14:50 +01:00
|
|
|
|
|
2000-09-18 18:27:16 +02:00
|
|
|
|
/* The following should not occur here. */
|
|
|
|
|
if (wanted_type == 0)
|
|
|
|
|
abort ();
|
|
|
|
|
if (wanted_type == void_type_node && types->pointer_count == 0)
|
|
|
|
|
abort ();
|
|
|
|
|
|
2000-10-12 09:26:20 +02:00
|
|
|
|
if (types->pointer_count == 0)
|
|
|
|
|
{
|
|
|
|
|
promoted_type = simple_type_promotes_to (wanted_type);
|
|
|
|
|
if (promoted_type != NULL_TREE)
|
|
|
|
|
wanted_type = promoted_type;
|
|
|
|
|
}
|
|
|
|
|
|
1998-02-05 21:54:49 +01:00
|
|
|
|
STRIP_NOPS (cur_param);
|
|
|
|
|
|
1993-10-05 20:14:50 +01:00
|
|
|
|
/* Check the types of any additional pointer arguments
|
|
|
|
|
that precede the "real" argument. */
|
2000-09-15 23:16:31 +02:00
|
|
|
|
for (i = 0; i < types->pointer_count; ++i)
|
1993-10-05 20:14:50 +01:00
|
|
|
|
{
|
|
|
|
|
if (TREE_CODE (cur_type) == POINTER_TYPE)
|
|
|
|
|
{
|
|
|
|
|
cur_type = TREE_TYPE (cur_type);
|
2000-09-18 18:27:16 +02:00
|
|
|
|
if (TREE_CODE (cur_type) == ERROR_MARK)
|
|
|
|
|
break;
|
1998-02-05 21:54:49 +01:00
|
|
|
|
|
1998-05-06 01:18:02 +02:00
|
|
|
|
if (cur_param != 0 && TREE_CODE (cur_param) == ADDR_EXPR)
|
1998-02-05 21:54:49 +01:00
|
|
|
|
cur_param = TREE_OPERAND (cur_param, 0);
|
|
|
|
|
else
|
|
|
|
|
cur_param = 0;
|
|
|
|
|
|
2000-08-21 16:22:44 +02:00
|
|
|
|
/* See if this is an attempt to write into a const type with
|
|
|
|
|
scanf or with printf "%n". Note: the writing in happens
|
|
|
|
|
at the first indirection only, if for example
|
|
|
|
|
void * const * is passed to scanf %p; passing
|
|
|
|
|
const void ** is simply passing an incompatible type. */
|
2000-09-15 23:16:31 +02:00
|
|
|
|
if (types->writing_in_flag
|
2000-08-21 16:22:44 +02:00
|
|
|
|
&& i == 0
|
|
|
|
|
&& (TYPE_READONLY (cur_type)
|
|
|
|
|
|| (cur_param != 0
|
|
|
|
|
&& (TREE_CODE_CLASS (TREE_CODE (cur_param)) == 'c'
|
|
|
|
|
|| (DECL_P (cur_param)
|
|
|
|
|
&& TREE_READONLY (cur_param))))))
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "writing into constant object (arg %d)", arg_num);
|
2000-08-21 16:22:44 +02:00
|
|
|
|
|
|
|
|
|
/* If there are extra type qualifiers beyond the first
|
|
|
|
|
indirection, then this makes the types technically
|
|
|
|
|
incompatible. */
|
|
|
|
|
if (i > 0
|
|
|
|
|
&& pedantic
|
|
|
|
|
&& (TYPE_READONLY (cur_type)
|
|
|
|
|
|| TYPE_VOLATILE (cur_type)
|
|
|
|
|
|| TYPE_RESTRICT (cur_type)))
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "extra type qualifiers in format argument (arg %d)",
|
2000-08-21 16:22:44 +02:00
|
|
|
|
arg_num);
|
|
|
|
|
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
2000-09-18 18:27:16 +02:00
|
|
|
|
else
|
c-common.c (check_format_info): Don't call a variadic function with a non-literal format string.
* c-common.c (check_format_info): Don't call a variadic function
with a non-literal format string.
* c-decl.c (grokdeclarator, start_struct, finish_struct): Likewise.
* c-typeck.c (build_component_ref, build_unary_op, lvalue_or_else,
pedantic_lvalue_warning, error_init, pedwarn_init, warning_init):
Likewise.
* cccp.c (check_macro_name, do_xifdef, vwarning_with_line):
Likewise.
* collect2.c (collect_wait): Likewise.
* dbxout.c (dbxout_type): Likewise.
* gcc.c (do_spec_1): Likewise.
* genemit.c (gen_insn, gen_expand): Likewise.
* genrecog.c (write_switch, write_subroutine): Likewise.
* mips-tfile.c (catch_signal, botch): Likewise.
* print-rtl.c (print_rtx): Likewise.
* toplev.c (default_print_error_function, report_error_function,
_fatal_insn): Likewise.
From-SVN: r30666
1999-11-25 17:58:32 +01:00
|
|
|
|
{
|
2000-09-15 23:16:31 +02:00
|
|
|
|
if (types->pointer_count == 1)
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "format argument is not a pointer (arg %d)", arg_num);
|
c-common.c (check_format_info): Don't call a variadic function with a non-literal format string.
* c-common.c (check_format_info): Don't call a variadic function
with a non-literal format string.
* c-decl.c (grokdeclarator, start_struct, finish_struct): Likewise.
* c-typeck.c (build_component_ref, build_unary_op, lvalue_or_else,
pedantic_lvalue_warning, error_init, pedwarn_init, warning_init):
Likewise.
* cccp.c (check_macro_name, do_xifdef, vwarning_with_line):
Likewise.
* collect2.c (collect_wait): Likewise.
* dbxout.c (dbxout_type): Likewise.
* gcc.c (do_spec_1): Likewise.
* genemit.c (gen_insn, gen_expand): Likewise.
* genrecog.c (write_switch, write_subroutine): Likewise.
* mips-tfile.c (catch_signal, botch): Likewise.
* print-rtl.c (print_rtx): Likewise.
* toplev.c (default_print_error_function, report_error_function,
_fatal_insn): Likewise.
From-SVN: r30666
1999-11-25 17:58:32 +01:00
|
|
|
|
else
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "format argument is not a pointer to a pointer (arg %d)", arg_num);
|
2000-09-18 18:27:16 +02:00
|
|
|
|
break;
|
c-common.c (check_format_info): Don't call a variadic function with a non-literal format string.
* c-common.c (check_format_info): Don't call a variadic function
with a non-literal format string.
* c-decl.c (grokdeclarator, start_struct, finish_struct): Likewise.
* c-typeck.c (build_component_ref, build_unary_op, lvalue_or_else,
pedantic_lvalue_warning, error_init, pedwarn_init, warning_init):
Likewise.
* cccp.c (check_macro_name, do_xifdef, vwarning_with_line):
Likewise.
* collect2.c (collect_wait): Likewise.
* dbxout.c (dbxout_type): Likewise.
* gcc.c (do_spec_1): Likewise.
* genemit.c (gen_insn, gen_expand): Likewise.
* genrecog.c (write_switch, write_subroutine): Likewise.
* mips-tfile.c (catch_signal, botch): Likewise.
* print-rtl.c (print_rtx): Likewise.
* toplev.c (default_print_error_function, report_error_function,
_fatal_insn): Likewise.
From-SVN: r30666
1999-11-25 17:58:32 +01:00
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
|
|
|
|
|
2000-09-18 18:27:16 +02:00
|
|
|
|
if (i < types->pointer_count)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
orig_cur_type = cur_type;
|
|
|
|
|
cur_type = TYPE_MAIN_VARIANT (cur_type);
|
|
|
|
|
|
c-common.h (enum c_tree_index): Add CTI_SIGNED_SIZE_TYPE and CTI_UNSIGNED_PTRDIFF_TYPE.
* c-common.h (enum c_tree_index): Add CTI_SIGNED_SIZE_TYPE and
CTI_UNSIGNED_PTRDIFF_TYPE.
(signed_size_type_node): Define.
(unsigned_ptrdiff_type_node): Define.
* c-decl.c (init_decl_processing): Create the
signed_size_type_node and unsigned_ptrdiff_type_node types.
* c-common.c (T_SC): Define.
(T_SST): Define.
(T_UPD): Define.
(print_char_table): Use T_SST for %zd, %zi, %zn. Use T_UPD for
%to, %tu, %tx, %tX. Allow %hhn (T_SC). Add "c" to the flags for
%s and %p.
(scan_char_table): Use T_SC for %hhd, %hhi, %hhn. Use T_SST for
%zd, %zi, %zn. Use T_UPD for %to, %tu, %tx, %tX. Add "c" to the
flags for %c, %s and %[.
(check_format_info): Only allow leniency for signedness of targets
of character pointers (when pedantic) for formats flagged with
"c", so for strings but not for %hh formats. When pedantic, don't
allow character pointers to substitute for void pointers if a
second level of indirection is present.
testsuite:
* gcc.dg/c99-printf-1.c: New test.
From-SVN: r35530
2000-08-06 20:12:49 +02:00
|
|
|
|
/* Check whether the argument type is a character type. This leniency
|
|
|
|
|
only applies to certain formats, flagged with 'c'.
|
|
|
|
|
*/
|
2000-09-18 18:27:16 +02:00
|
|
|
|
if (types->char_lenient_flag)
|
|
|
|
|
char_type_flag = (cur_type == char_type_node
|
|
|
|
|
|| cur_type == signed_char_type_node
|
|
|
|
|
|| cur_type == unsigned_char_type_node);
|
2000-08-04 18:10:14 +02:00
|
|
|
|
|
1993-10-05 20:14:50 +01:00
|
|
|
|
/* Check the type of the "real" argument, if there's a type we want. */
|
2000-09-18 18:27:16 +02:00
|
|
|
|
if (wanted_type == cur_type)
|
|
|
|
|
continue;
|
|
|
|
|
/* If we want `void *', allow any pointer type.
|
|
|
|
|
(Anything else would already have got a warning.)
|
|
|
|
|
With -pedantic, only allow pointers to void and to character
|
|
|
|
|
types. */
|
|
|
|
|
if (wanted_type == void_type_node
|
|
|
|
|
&& (!pedantic || (i == 1 && char_type_flag)))
|
|
|
|
|
continue;
|
|
|
|
|
/* Don't warn about differences merely in signedness, unless
|
|
|
|
|
-pedantic. With -pedantic, warn if the type is a pointer
|
|
|
|
|
target and not a character type, and for character types at
|
|
|
|
|
a second level of indirection. */
|
|
|
|
|
if (TREE_CODE (wanted_type) == INTEGER_TYPE
|
|
|
|
|
&& TREE_CODE (cur_type) == INTEGER_TYPE
|
|
|
|
|
&& (! pedantic || i == 0 || (i == 1 && char_type_flag))
|
|
|
|
|
&& (TREE_UNSIGNED (wanted_type)
|
|
|
|
|
? wanted_type == unsigned_type (cur_type)
|
|
|
|
|
: wanted_type == signed_type (cur_type)))
|
|
|
|
|
continue;
|
|
|
|
|
/* Likewise, "signed char", "unsigned char" and "char" are
|
|
|
|
|
equivalent but the above test won't consider them equivalent. */
|
|
|
|
|
if (wanted_type == char_type_node
|
|
|
|
|
&& (! pedantic || i < 2)
|
|
|
|
|
&& char_type_flag)
|
|
|
|
|
continue;
|
|
|
|
|
/* Now we have a type mismatch. */
|
|
|
|
|
{
|
|
|
|
|
register const char *this;
|
|
|
|
|
register const char *that;
|
|
|
|
|
|
|
|
|
|
this = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (wanted_type)));
|
|
|
|
|
that = 0;
|
|
|
|
|
if (TYPE_NAME (orig_cur_type) != 0
|
|
|
|
|
&& TREE_CODE (orig_cur_type) != INTEGER_TYPE
|
|
|
|
|
&& !(TREE_CODE (orig_cur_type) == POINTER_TYPE
|
|
|
|
|
&& TREE_CODE (TREE_TYPE (orig_cur_type)) == INTEGER_TYPE))
|
|
|
|
|
{
|
|
|
|
|
if (TREE_CODE (TYPE_NAME (orig_cur_type)) == TYPE_DECL
|
|
|
|
|
&& DECL_NAME (TYPE_NAME (orig_cur_type)) != 0)
|
|
|
|
|
that = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (orig_cur_type)));
|
|
|
|
|
else
|
|
|
|
|
that = IDENTIFIER_POINTER (TYPE_NAME (orig_cur_type));
|
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
|
2000-09-18 18:27:16 +02:00
|
|
|
|
/* A nameless type can't possibly match what the format wants.
|
|
|
|
|
So there will be a warning for it.
|
|
|
|
|
Make up a string to describe vaguely what it is. */
|
|
|
|
|
if (that == 0)
|
|
|
|
|
{
|
|
|
|
|
if (TREE_CODE (orig_cur_type) == POINTER_TYPE)
|
|
|
|
|
that = "pointer";
|
|
|
|
|
else
|
|
|
|
|
that = "different type";
|
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
|
2000-09-18 18:27:16 +02:00
|
|
|
|
/* Make the warning better in case of mismatch of int vs long. */
|
|
|
|
|
if (TREE_CODE (orig_cur_type) == INTEGER_TYPE
|
|
|
|
|
&& TREE_CODE (wanted_type) == INTEGER_TYPE
|
|
|
|
|
&& TYPE_PRECISION (orig_cur_type) == TYPE_PRECISION (wanted_type)
|
|
|
|
|
&& TYPE_NAME (orig_cur_type) != 0
|
|
|
|
|
&& TREE_CODE (TYPE_NAME (orig_cur_type)) == TYPE_DECL)
|
|
|
|
|
that = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (orig_cur_type)));
|
1993-11-03 21:09:12 +01:00
|
|
|
|
|
2000-09-18 18:27:16 +02:00
|
|
|
|
if (strcmp (this, that) != 0)
|
|
|
|
|
{
|
|
|
|
|
/* There may be a better name for the format, e.g. size_t,
|
|
|
|
|
but we should allow for programs with a perverse typedef
|
|
|
|
|
making size_t something other than what the compiler
|
|
|
|
|
thinks. */
|
|
|
|
|
if (types->wanted_type_name != 0
|
|
|
|
|
&& strcmp (types->wanted_type_name, that) != 0)
|
|
|
|
|
this = types->wanted_type_name;
|
|
|
|
|
if (types->name != 0)
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "%s is not type %s (arg %d)", types->name, this,
|
2000-09-18 18:27:16 +02:00
|
|
|
|
arg_num);
|
|
|
|
|
else
|
2000-09-19 05:26:11 +02:00
|
|
|
|
status_warning (status, "%s format, %s arg (arg %d)", this, that, arg_num);
|
2000-09-18 18:27:16 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
1993-10-05 20:14:50 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1993-02-02 05:40:43 +01:00
|
|
|
|
/* Print a warning if a constant expression had overflow in folding.
|
|
|
|
|
Invoke this function on every expression that the language
|
|
|
|
|
requires to be a constant expression.
|
|
|
|
|
Note the ANSI C standard says it is erroneous for a
|
|
|
|
|
constant expression to overflow. */
|
1992-09-08 01:42:39 +02:00
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
constant_expression_warning (value)
|
|
|
|
|
tree value;
|
|
|
|
|
{
|
1994-03-13 14:31:27 +01:00
|
|
|
|
if ((TREE_CODE (value) == INTEGER_CST || TREE_CODE (value) == REAL_CST
|
|
|
|
|
|| TREE_CODE (value) == COMPLEX_CST)
|
|
|
|
|
&& TREE_CONSTANT_OVERFLOW (value) && pedantic)
|
|
|
|
|
pedwarn ("overflow in constant expression");
|
1993-02-02 05:40:43 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Print a warning if an expression had overflow in folding.
|
|
|
|
|
Invoke this function on every expression that
|
|
|
|
|
(1) appears in the source code, and
|
|
|
|
|
(2) might be a constant expression that overflowed, and
|
|
|
|
|
(3) is not already checked by convert_and_check;
|
|
|
|
|
however, do not invoke this function on operands of explicit casts. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
overflow_warning (value)
|
|
|
|
|
tree value;
|
|
|
|
|
{
|
1994-03-13 14:31:27 +01:00
|
|
|
|
if ((TREE_CODE (value) == INTEGER_CST
|
|
|
|
|
|| (TREE_CODE (value) == COMPLEX_CST
|
|
|
|
|
&& TREE_CODE (TREE_REALPART (value)) == INTEGER_CST))
|
|
|
|
|
&& TREE_OVERFLOW (value))
|
1993-02-02 05:40:43 +01:00
|
|
|
|
{
|
1993-07-02 03:26:01 +02:00
|
|
|
|
TREE_OVERFLOW (value) = 0;
|
1996-12-07 23:51:24 +01:00
|
|
|
|
if (skip_evaluation == 0)
|
|
|
|
|
warning ("integer overflow in expression");
|
1993-02-02 05:40:43 +01:00
|
|
|
|
}
|
1994-03-13 14:31:27 +01:00
|
|
|
|
else if ((TREE_CODE (value) == REAL_CST
|
|
|
|
|
|| (TREE_CODE (value) == COMPLEX_CST
|
|
|
|
|
&& TREE_CODE (TREE_REALPART (value)) == REAL_CST))
|
|
|
|
|
&& TREE_OVERFLOW (value))
|
|
|
|
|
{
|
|
|
|
|
TREE_OVERFLOW (value) = 0;
|
1996-12-07 23:51:24 +01:00
|
|
|
|
if (skip_evaluation == 0)
|
|
|
|
|
warning ("floating point overflow in expression");
|
1994-03-13 14:31:27 +01:00
|
|
|
|
}
|
1993-02-02 05:40:43 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Print a warning if a large constant is truncated to unsigned,
|
|
|
|
|
or if -Wconversion is used and a constant < 0 is converted to unsigned.
|
|
|
|
|
Invoke this function on every expression that might be implicitly
|
|
|
|
|
converted to an unsigned type. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
unsigned_conversion_warning (result, operand)
|
|
|
|
|
tree result, operand;
|
|
|
|
|
{
|
|
|
|
|
if (TREE_CODE (operand) == INTEGER_CST
|
|
|
|
|
&& TREE_CODE (TREE_TYPE (result)) == INTEGER_TYPE
|
|
|
|
|
&& TREE_UNSIGNED (TREE_TYPE (result))
|
1996-12-07 23:51:24 +01:00
|
|
|
|
&& skip_evaluation == 0
|
1993-02-02 05:40:43 +01:00
|
|
|
|
&& !int_fits_type_p (operand, TREE_TYPE (result)))
|
|
|
|
|
{
|
|
|
|
|
if (!int_fits_type_p (operand, signed_type (TREE_TYPE (result))))
|
|
|
|
|
/* This detects cases like converting -129 or 256 to unsigned char. */
|
1993-07-12 23:10:27 +02:00
|
|
|
|
warning ("large integer implicitly truncated to unsigned type");
|
1993-02-02 05:40:43 +01:00
|
|
|
|
else if (warn_conversion)
|
1993-07-12 23:10:27 +02:00
|
|
|
|
warning ("negative integer implicitly converted to unsigned type");
|
1993-02-02 05:40:43 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Convert EXPR to TYPE, warning about conversion problems with constants.
|
|
|
|
|
Invoke this function on every expression that is converted implicitly,
|
|
|
|
|
i.e. because of language rules and not because of an explicit cast. */
|
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
convert_and_check (type, expr)
|
|
|
|
|
tree type, expr;
|
|
|
|
|
{
|
|
|
|
|
tree t = convert (type, expr);
|
|
|
|
|
if (TREE_CODE (t) == INTEGER_CST)
|
|
|
|
|
{
|
1993-07-02 03:26:01 +02:00
|
|
|
|
if (TREE_OVERFLOW (t))
|
1993-02-02 05:40:43 +01:00
|
|
|
|
{
|
1993-07-02 03:26:01 +02:00
|
|
|
|
TREE_OVERFLOW (t) = 0;
|
|
|
|
|
|
1995-05-12 00:48:51 +02:00
|
|
|
|
/* Do not diagnose overflow in a constant expression merely
|
|
|
|
|
because a conversion overflowed. */
|
|
|
|
|
TREE_CONSTANT_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (expr);
|
|
|
|
|
|
1993-07-02 03:26:01 +02:00
|
|
|
|
/* No warning for converting 0x80000000 to int. */
|
|
|
|
|
if (!(TREE_UNSIGNED (type) < TREE_UNSIGNED (TREE_TYPE (expr))
|
|
|
|
|
&& TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE
|
|
|
|
|
&& TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (expr))))
|
1993-10-30 09:34:05 +01:00
|
|
|
|
/* If EXPR fits in the unsigned version of TYPE,
|
|
|
|
|
don't warn unless pedantic. */
|
1996-12-07 23:51:24 +01:00
|
|
|
|
if ((pedantic
|
|
|
|
|
|| TREE_UNSIGNED (type)
|
|
|
|
|
|| ! int_fits_type_p (expr, unsigned_type (type)))
|
|
|
|
|
&& skip_evaluation == 0)
|
1998-04-12 21:52:16 +02:00
|
|
|
|
warning ("overflow in implicit constant conversion");
|
1993-02-02 05:40:43 +01:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
unsigned_conversion_warning (t, expr);
|
|
|
|
|
}
|
|
|
|
|
return t;
|
1992-09-08 01:42:39 +02:00
|
|
|
|
}
|
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
void
|
|
|
|
|
c_expand_expr_stmt (expr)
|
|
|
|
|
tree expr;
|
|
|
|
|
{
|
|
|
|
|
/* Do default conversion if safe and possibly important,
|
|
|
|
|
in case within ({...}). */
|
|
|
|
|
if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE && lvalue_p (expr))
|
|
|
|
|
|| TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)
|
|
|
|
|
expr = default_conversion (expr);
|
|
|
|
|
|
|
|
|
|
if (TREE_TYPE (expr) != error_mark_node
|
2000-03-21 20:33:42 +01:00
|
|
|
|
&& !COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (expr))
|
1992-02-04 20:51:11 +01:00
|
|
|
|
&& TREE_CODE (TREE_TYPE (expr)) != ARRAY_TYPE)
|
|
|
|
|
error ("expression statement has incomplete type");
|
|
|
|
|
|
2000-09-17 09:38:23 +02:00
|
|
|
|
last_expr_type = TREE_TYPE (expr);
|
|
|
|
|
add_stmt (build_stmt (EXPR_STMT, expr));
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Validate the expression after `case' and apply default promotions. */
|
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
check_case_value (value)
|
|
|
|
|
tree value;
|
|
|
|
|
{
|
|
|
|
|
if (value == NULL_TREE)
|
|
|
|
|
return value;
|
|
|
|
|
|
|
|
|
|
/* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
|
1992-07-10 03:50:20 +02:00
|
|
|
|
STRIP_TYPE_NOPS (value);
|
2000-09-10 23:34:41 +02:00
|
|
|
|
/* In C++, the following is allowed:
|
|
|
|
|
|
|
|
|
|
const int i = 3;
|
|
|
|
|
switch (...) { case i: ... }
|
|
|
|
|
|
|
|
|
|
So, we try to reduce the VALUE to a constant that way. */
|
|
|
|
|
if (c_language == clk_cplusplus)
|
|
|
|
|
{
|
|
|
|
|
value = decl_constant_value (value);
|
|
|
|
|
STRIP_TYPE_NOPS (value);
|
|
|
|
|
value = fold (value);
|
|
|
|
|
}
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
|
|
|
|
if (TREE_CODE (value) != INTEGER_CST
|
|
|
|
|
&& value != error_mark_node)
|
|
|
|
|
{
|
|
|
|
|
error ("case label does not reduce to an integer constant");
|
|
|
|
|
value = error_mark_node;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
/* Promote char or short to int. */
|
|
|
|
|
value = default_conversion (value);
|
|
|
|
|
|
1992-09-07 08:07:30 +02:00
|
|
|
|
constant_expression_warning (value);
|
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Return an integer type with BITS bits of precision,
|
|
|
|
|
that is unsigned if UNSIGNEDP is nonzero, otherwise signed. */
|
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
type_for_size (bits, unsignedp)
|
|
|
|
|
unsigned bits;
|
|
|
|
|
int unsignedp;
|
|
|
|
|
{
|
1995-01-31 01:40:42 +01:00
|
|
|
|
if (bits == TYPE_PRECISION (integer_type_node))
|
|
|
|
|
return unsignedp ? unsigned_type_node : integer_type_node;
|
|
|
|
|
|
1992-07-03 08:41:07 +02:00
|
|
|
|
if (bits == TYPE_PRECISION (signed_char_type_node))
|
1992-02-04 20:51:11 +01:00
|
|
|
|
return unsignedp ? unsigned_char_type_node : signed_char_type_node;
|
|
|
|
|
|
1992-07-03 08:41:07 +02:00
|
|
|
|
if (bits == TYPE_PRECISION (short_integer_type_node))
|
1992-02-04 20:51:11 +01:00
|
|
|
|
return unsignedp ? short_unsigned_type_node : short_integer_type_node;
|
|
|
|
|
|
1992-07-03 08:41:07 +02:00
|
|
|
|
if (bits == TYPE_PRECISION (long_integer_type_node))
|
1992-02-04 20:51:11 +01:00
|
|
|
|
return unsignedp ? long_unsigned_type_node : long_integer_type_node;
|
|
|
|
|
|
1992-07-03 08:41:07 +02:00
|
|
|
|
if (bits == TYPE_PRECISION (long_long_integer_type_node))
|
1992-02-04 20:51:11 +01:00
|
|
|
|
return (unsignedp ? long_long_unsigned_type_node
|
|
|
|
|
: long_long_integer_type_node);
|
|
|
|
|
|
1999-07-02 12:30:01 +02:00
|
|
|
|
if (bits == TYPE_PRECISION (widest_integer_literal_type_node))
|
|
|
|
|
return (unsignedp ? widest_unsigned_literal_type_node
|
|
|
|
|
: widest_integer_literal_type_node);
|
|
|
|
|
|
1992-07-03 08:41:07 +02:00
|
|
|
|
if (bits <= TYPE_PRECISION (intQI_type_node))
|
|
|
|
|
return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
|
|
|
|
|
|
|
|
|
|
if (bits <= TYPE_PRECISION (intHI_type_node))
|
|
|
|
|
return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
|
|
|
|
|
|
|
|
|
|
if (bits <= TYPE_PRECISION (intSI_type_node))
|
|
|
|
|
return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
|
|
|
|
|
|
|
|
|
|
if (bits <= TYPE_PRECISION (intDI_type_node))
|
|
|
|
|
return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
|
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Return a data type that has machine mode MODE.
|
|
|
|
|
If the mode is an integer,
|
|
|
|
|
then UNSIGNEDP selects between signed and unsigned types. */
|
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
type_for_mode (mode, unsignedp)
|
|
|
|
|
enum machine_mode mode;
|
|
|
|
|
int unsignedp;
|
|
|
|
|
{
|
1995-01-31 01:40:42 +01:00
|
|
|
|
if (mode == TYPE_MODE (integer_type_node))
|
|
|
|
|
return unsignedp ? unsigned_type_node : integer_type_node;
|
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
if (mode == TYPE_MODE (signed_char_type_node))
|
|
|
|
|
return unsignedp ? unsigned_char_type_node : signed_char_type_node;
|
|
|
|
|
|
|
|
|
|
if (mode == TYPE_MODE (short_integer_type_node))
|
|
|
|
|
return unsignedp ? short_unsigned_type_node : short_integer_type_node;
|
|
|
|
|
|
|
|
|
|
if (mode == TYPE_MODE (long_integer_type_node))
|
|
|
|
|
return unsignedp ? long_unsigned_type_node : long_integer_type_node;
|
|
|
|
|
|
|
|
|
|
if (mode == TYPE_MODE (long_long_integer_type_node))
|
|
|
|
|
return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
|
|
|
|
|
|
1999-07-02 12:30:01 +02:00
|
|
|
|
if (mode == TYPE_MODE (widest_integer_literal_type_node))
|
2000-01-03 22:48:49 +01:00
|
|
|
|
return unsignedp ? widest_unsigned_literal_type_node
|
1999-07-02 12:30:01 +02:00
|
|
|
|
: widest_integer_literal_type_node;
|
|
|
|
|
|
1992-07-03 08:41:07 +02:00
|
|
|
|
if (mode == TYPE_MODE (intQI_type_node))
|
|
|
|
|
return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
|
|
|
|
|
|
|
|
|
|
if (mode == TYPE_MODE (intHI_type_node))
|
|
|
|
|
return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
|
|
|
|
|
|
|
|
|
|
if (mode == TYPE_MODE (intSI_type_node))
|
|
|
|
|
return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
|
|
|
|
|
|
|
|
|
|
if (mode == TYPE_MODE (intDI_type_node))
|
|
|
|
|
return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
|
|
|
|
|
|
1998-10-08 06:37:30 +02:00
|
|
|
|
#if HOST_BITS_PER_WIDE_INT >= 64
|
1998-04-21 15:25:56 +02:00
|
|
|
|
if (mode == TYPE_MODE (intTI_type_node))
|
|
|
|
|
return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
|
1998-10-08 06:37:30 +02:00
|
|
|
|
#endif
|
1998-04-21 15:25:56 +02:00
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
if (mode == TYPE_MODE (float_type_node))
|
|
|
|
|
return float_type_node;
|
|
|
|
|
|
|
|
|
|
if (mode == TYPE_MODE (double_type_node))
|
|
|
|
|
return double_type_node;
|
|
|
|
|
|
|
|
|
|
if (mode == TYPE_MODE (long_double_type_node))
|
|
|
|
|
return long_double_type_node;
|
|
|
|
|
|
|
|
|
|
if (mode == TYPE_MODE (build_pointer_type (char_type_node)))
|
|
|
|
|
return build_pointer_type (char_type_node);
|
|
|
|
|
|
|
|
|
|
if (mode == TYPE_MODE (build_pointer_type (integer_type_node)))
|
|
|
|
|
return build_pointer_type (integer_type_node);
|
|
|
|
|
|
2000-06-25 19:27:28 +02:00
|
|
|
|
#ifdef VECTOR_MODE_SUPPORTED_P
|
|
|
|
|
if (mode == TYPE_MODE (V4SF_type_node) && VECTOR_MODE_SUPPORTED_P (mode))
|
|
|
|
|
return V4SF_type_node;
|
|
|
|
|
if (mode == TYPE_MODE (V4SI_type_node) && VECTOR_MODE_SUPPORTED_P (mode))
|
|
|
|
|
return V4SI_type_node;
|
|
|
|
|
if (mode == TYPE_MODE (V2SI_type_node) && VECTOR_MODE_SUPPORTED_P (mode))
|
|
|
|
|
return V2SI_type_node;
|
|
|
|
|
if (mode == TYPE_MODE (V4HI_type_node) && VECTOR_MODE_SUPPORTED_P (mode))
|
|
|
|
|
return V4HI_type_node;
|
|
|
|
|
if (mode == TYPE_MODE (V8QI_type_node) && VECTOR_MODE_SUPPORTED_P (mode))
|
|
|
|
|
return V8QI_type_node;
|
|
|
|
|
#endif
|
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
1999-07-06 14:34:50 +02:00
|
|
|
|
|
|
|
|
|
/* Return an unsigned type the same as TYPE in other respects. */
|
|
|
|
|
tree
|
|
|
|
|
unsigned_type (type)
|
|
|
|
|
tree type;
|
|
|
|
|
{
|
|
|
|
|
tree type1 = TYPE_MAIN_VARIANT (type);
|
|
|
|
|
if (type1 == signed_char_type_node || type1 == char_type_node)
|
|
|
|
|
return unsigned_char_type_node;
|
|
|
|
|
if (type1 == integer_type_node)
|
|
|
|
|
return unsigned_type_node;
|
|
|
|
|
if (type1 == short_integer_type_node)
|
|
|
|
|
return short_unsigned_type_node;
|
|
|
|
|
if (type1 == long_integer_type_node)
|
|
|
|
|
return long_unsigned_type_node;
|
|
|
|
|
if (type1 == long_long_integer_type_node)
|
|
|
|
|
return long_long_unsigned_type_node;
|
|
|
|
|
if (type1 == widest_integer_literal_type_node)
|
|
|
|
|
return widest_unsigned_literal_type_node;
|
|
|
|
|
#if HOST_BITS_PER_WIDE_INT >= 64
|
|
|
|
|
if (type1 == intTI_type_node)
|
|
|
|
|
return unsigned_intTI_type_node;
|
|
|
|
|
#endif
|
|
|
|
|
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 signed_or_unsigned_type (1, type);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Return a signed type the same as TYPE in other respects. */
|
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
signed_type (type)
|
|
|
|
|
tree type;
|
|
|
|
|
{
|
|
|
|
|
tree type1 = TYPE_MAIN_VARIANT (type);
|
|
|
|
|
if (type1 == unsigned_char_type_node || type1 == char_type_node)
|
|
|
|
|
return signed_char_type_node;
|
|
|
|
|
if (type1 == unsigned_type_node)
|
|
|
|
|
return integer_type_node;
|
|
|
|
|
if (type1 == short_unsigned_type_node)
|
|
|
|
|
return short_integer_type_node;
|
|
|
|
|
if (type1 == long_unsigned_type_node)
|
|
|
|
|
return long_integer_type_node;
|
|
|
|
|
if (type1 == long_long_unsigned_type_node)
|
|
|
|
|
return long_long_integer_type_node;
|
|
|
|
|
if (type1 == widest_unsigned_literal_type_node)
|
|
|
|
|
return widest_integer_literal_type_node;
|
|
|
|
|
#if HOST_BITS_PER_WIDE_INT >= 64
|
|
|
|
|
if (type1 == unsigned_intTI_type_node)
|
|
|
|
|
return intTI_type_node;
|
|
|
|
|
#endif
|
|
|
|
|
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 signed_or_unsigned_type (0, type);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Return a type the same as TYPE except unsigned or
|
|
|
|
|
signed according to UNSIGNEDP. */
|
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
signed_or_unsigned_type (unsignedp, type)
|
|
|
|
|
int unsignedp;
|
|
|
|
|
tree type;
|
|
|
|
|
{
|
|
|
|
|
if (! INTEGRAL_TYPE_P (type)
|
|
|
|
|
|| TREE_UNSIGNED (type) == unsignedp)
|
|
|
|
|
return type;
|
|
|
|
|
|
|
|
|
|
if (TYPE_PRECISION (type) == TYPE_PRECISION (signed_char_type_node))
|
|
|
|
|
return unsignedp ? unsigned_char_type_node : signed_char_type_node;
|
2000-01-03 22:48:49 +01:00
|
|
|
|
if (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
|
1999-07-06 14:34:50 +02:00
|
|
|
|
return unsignedp ? unsigned_type_node : integer_type_node;
|
2000-01-03 22:48:49 +01:00
|
|
|
|
if (TYPE_PRECISION (type) == TYPE_PRECISION (short_integer_type_node))
|
1999-07-06 14:34:50 +02:00
|
|
|
|
return unsignedp ? short_unsigned_type_node : short_integer_type_node;
|
2000-01-03 22:48:49 +01:00
|
|
|
|
if (TYPE_PRECISION (type) == TYPE_PRECISION (long_integer_type_node))
|
1999-07-06 14:34:50 +02:00
|
|
|
|
return unsignedp ? long_unsigned_type_node : long_integer_type_node;
|
2000-01-03 22:48:49 +01:00
|
|
|
|
if (TYPE_PRECISION (type) == TYPE_PRECISION (long_long_integer_type_node))
|
1999-07-06 14:34:50 +02:00
|
|
|
|
return (unsignedp ? long_long_unsigned_type_node
|
|
|
|
|
: long_long_integer_type_node);
|
2000-01-03 22:48:49 +01:00
|
|
|
|
if (TYPE_PRECISION (type) == TYPE_PRECISION (widest_integer_literal_type_node))
|
1999-07-06 14:34:50 +02:00
|
|
|
|
return (unsignedp ? widest_unsigned_literal_type_node
|
|
|
|
|
: widest_integer_literal_type_node);
|
|
|
|
|
return type;
|
|
|
|
|
}
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
1994-09-03 01:40:51 +02:00
|
|
|
|
/* Return the minimum number of bits needed to represent VALUE in a
|
|
|
|
|
signed or unsigned type, UNSIGNEDP says which. */
|
|
|
|
|
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
unsigned int
|
1994-09-03 01:40:51 +02:00
|
|
|
|
min_precision (value, unsignedp)
|
|
|
|
|
tree value;
|
|
|
|
|
int unsignedp;
|
|
|
|
|
{
|
|
|
|
|
int log;
|
|
|
|
|
|
|
|
|
|
/* If the value is negative, compute its negative minus 1. The latter
|
|
|
|
|
adjustment is because the absolute value of the largest negative value
|
|
|
|
|
is one larger than the largest positive value. This is equivalent to
|
|
|
|
|
a bit-wise negation, so use that operation instead. */
|
|
|
|
|
|
|
|
|
|
if (tree_int_cst_sgn (value) < 0)
|
|
|
|
|
value = fold (build1 (BIT_NOT_EXPR, TREE_TYPE (value), value));
|
|
|
|
|
|
|
|
|
|
/* Return the number of bits needed, taking into account the fact
|
|
|
|
|
that we need one more bit for a signed than unsigned type. */
|
|
|
|
|
|
|
|
|
|
if (integer_zerop (value))
|
|
|
|
|
log = 0;
|
|
|
|
|
else
|
tree.h (INT_CST_LT, [...]): Remove unneeded casts.
* tree.h (INT_CST_LT, INT_CST_LT_UNSIGNED): Remove unneeded casts.
(struct tree_int_cst): int_cst_low is now unsigned HOST_WIDE_INT.
(attribute_hash_list, type_hash_canon): hashcode is now unsigned.
(type_hash_lookup, type_hash_add, type_hash_list): Likewise.
(min_precision): Result is unsignd.
(add_double, neg_double, mul_double): Low word is unsigned.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double): Likewise.
(tree_floor_log2, compare_tree_int): New functions.
(preserve_rtl_expr_temps): New declaration.
* c-common.c (declare_hidden_char_array): Use compare_tree_int.
(decl_attributes): Use tree_log2 to find alignment.
Check for TREE_INT_CST_HIGH for format args.
(min_precision): Now unsigned.
Use tree_floor_log2.
(truthvalue_conversion): Delete long-disabled code.
* c-decl.c (finish_struct): Clean up tests on field width.
(finish_function): Use compare_tree_int.
* c-pragma.c (handle_pragma_token): Use tree_log2 for alignment.
* c-typeck.c (comptypes): Use tree_int_cst_equal.
(default_conversion, digest_init): Use compare_tree_int.
(build_binary_op): Use integer_all_onesp and compare_tree_int.
Fix type errors in forming masks.
* calls.c (initialize_argument_information): Use compare_tree_int.
* dbxout.c (dbxout_type): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* except.c (expand_eh_region_start_tree): Use compare_tree_int.
* expr.c (is_zeros_p, case INTEGER_CST): Use integer_zerop.
(store_field): Use compare_tree_int.
(expand_expr, case CONSTRUCTOR): Use TYPE_SIZE_UNIT.
(expand_expr, case ARRAY_REF): Use compare_tree_int.
(do_jump, case BIT_AND_EXPR): Use tree_floor_log2.
(do_store_flag): Use compare_tree_int.
* fold-const.c (encode, decode): Low part is always unsigned.
(force_fit_type, add_double, neg_double, mul_double): Likewise.
(lshift_double, rshift_double, lrotate_double): Likewise.
(rrotate_double, div_and_round_double, int_const_binop): Likewise.
(fold_convert): Use compare_tree_int.
(operand_equal_p, case INTEGER_CST): Use tree_int_cst_equal.
(invert_truthvalue, case INTEGER_CST): Likewise.
(fold): Use compare_tree_int; add casts for unsigned TREE_INT_CST_LOW.
* mkdeps.c (deps_dummy_targets): Make I unsigned.
* rtl.h (add_double, neg_double, mul_double): Low words are unsigned.
(lshift_double, rshift_double, lrotate_double, rrotate_double):
Likewise.
* stmt.c (expand_decl): Use compare_tree_int and mode_for_size_tree.
(expand_end_case): Use compare_tree_int.
(estimate_case_costs): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* stor-layout.c (mode_for_size_tree): Use compare_tree_int.
(layout_decl): Likewise.
(layout_record, layout_union): Make sizes unsigned.
(layout_type, case VOID_TYPE): TYPE_SIZE must be bitsizetype.
(layout_type, case QUAL_UNION_TYPE): Use compare_tree_int.
* tree.c (struct type_hash): hashcode is unsigned.
(build_type_attribute_variant, type_hash_list): Likewise.
(type_hash_lookup, type_hash_add, type_hash_canon): Likewise.
(attribute_hash_list, build_array_type, build_method_type): Likewise.
(build_complex_type): Likewise.
(real_value_from_int_cst): Remove unneeded casts.
(integer_all_onesp): Add casts.
(tree_floor_log2, compare_tree_int): New functions.
(build_index_type): Use tree_int_cst_sgn.
* varasm.c (assemble_variable): Use compare_tree_int.
* ch/actions.c (chill_convert_for_assignment): INDEX is unsigned
HOST_WIDE_INT.
* ch/ch-tree.h (DECL_NESTING_LEVEL): Use TREE_INT_CST_HIGH
since unsigned.
* ch/except.c (chill_handle_on_labels): ALTERNATIVE is unsigned.
Use compare_tree_int.
(expand_goto_except_cleanup): Likewise.
* cp/class.c (dfs_modify_vtables): I is now unsigned.
(check_bitfield_decl): Use tree_int_cst_sgn and compare_tree_int.
(build_base_field): Add casts of TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/error.c (dump_expr): Cast TREE_INT_CST_HIGH to unsigned.
* cp/init.c (build_vec_init): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
* cp/method.c (build_overload_int): Cast TREE_INT_CST_HIGH to unsigned.
* cp/typeck.c (build_binary_op, case TRUNC_DIV_EXPR):
Call integer_all_onesp.
* cp/typeck2.c (process_init_constructor): Use compare_tree_int.
* f/com.c (ffecom_f2c_set_lio_code_): Use compare_tree_int.
(ffecom_sym_transform_, ffecom_transform_common_): Likewise.
(ffecom_transform_equiv_): Likewise.
* java/decl.c (emit_init_test_initialization): Mark KEY as unused.
* java/expr.c (build_newarray): Cast TREE_INT_CST_LOW to HOST_WIDE_INT.
(build_anewarray): Likewise.
* java/parse.y (patch_newarray): Likewise.
* java/parse.c: Regenerated.
From-SVN: r32383
2000-03-07 12:41:32 +01:00
|
|
|
|
log = tree_floor_log2 (value);
|
1994-09-03 01:40:51 +02:00
|
|
|
|
|
|
|
|
|
return log + 1 + ! unsignedp;
|
|
|
|
|
}
|
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
/* Print an error message for invalid operands to arith operation CODE.
|
|
|
|
|
NOP_EXPR is used as a special case (see truthvalue_conversion). */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
binary_op_error (code)
|
|
|
|
|
enum tree_code code;
|
|
|
|
|
{
|
c-aux-info.c (data_type, [...]): Qualify a char* with the `const' keyword.
* c-aux-info.c (data_type, affix_data_type, gen_decl,
gen_formal_list_for_type, gen_formal_list_for_func_def, gen_type):
Qualify a char* with the `const' keyword.
* c-common.c (declare_hidden_char_array, add_attribute, if_elt,
declare_function_name, decl_attributes, format_char_info,
check_format_info, binary_op_error): Likewise.
* cexp.y (yyerror, error, pedwarn, warning, token): Likewise.
* gcse.c (dump_hash_table): Likewise.
* integrate.c (function_cannot_inline_p): Likewise
* optabs.c: Include insn-config.h earlier.
(init_libfuncs, init_integral_libfuncs, init_floating_libfuncs):
Qualify a char* with the `const' keyword.
* real.c (asctoe24, asctoe53, asctoe64, asctoe113, asctoe,
asctoeg, mtherr, ereal_atof): Likewise.
* real.h (ereal_atof): Likewise.
* sbitmap.c (dump_sbitmap_vector): Likewise.
* sbitmap.h (dump_sbitmap_vector): Likewise.
* stmt.c (nesting, n_occurrences, expand_start_case): Likewise.
* toplev.c (rest_of_compilation): Likewise.
* tree.h (function_cannot_inline_p, expand_start_case): Likewise.
From-SVN: r25614
1999-03-06 06:34:26 +01:00
|
|
|
|
register const char *opname;
|
1994-02-27 16:42:51 +01:00
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
switch (code)
|
|
|
|
|
{
|
|
|
|
|
case NOP_EXPR:
|
|
|
|
|
error ("invalid truth-value expression");
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
case PLUS_EXPR:
|
|
|
|
|
opname = "+"; break;
|
|
|
|
|
case MINUS_EXPR:
|
|
|
|
|
opname = "-"; break;
|
|
|
|
|
case MULT_EXPR:
|
|
|
|
|
opname = "*"; break;
|
|
|
|
|
case MAX_EXPR:
|
|
|
|
|
opname = "max"; break;
|
|
|
|
|
case MIN_EXPR:
|
|
|
|
|
opname = "min"; break;
|
|
|
|
|
case EQ_EXPR:
|
|
|
|
|
opname = "=="; break;
|
|
|
|
|
case NE_EXPR:
|
|
|
|
|
opname = "!="; break;
|
|
|
|
|
case LE_EXPR:
|
|
|
|
|
opname = "<="; break;
|
|
|
|
|
case GE_EXPR:
|
|
|
|
|
opname = ">="; break;
|
|
|
|
|
case LT_EXPR:
|
|
|
|
|
opname = "<"; break;
|
|
|
|
|
case GT_EXPR:
|
|
|
|
|
opname = ">"; break;
|
|
|
|
|
case LSHIFT_EXPR:
|
|
|
|
|
opname = "<<"; break;
|
|
|
|
|
case RSHIFT_EXPR:
|
|
|
|
|
opname = ">>"; break;
|
|
|
|
|
case TRUNC_MOD_EXPR:
|
1992-04-04 21:11:28 +02:00
|
|
|
|
case FLOOR_MOD_EXPR:
|
1992-02-04 20:51:11 +01:00
|
|
|
|
opname = "%"; break;
|
|
|
|
|
case TRUNC_DIV_EXPR:
|
1992-04-04 21:11:28 +02:00
|
|
|
|
case FLOOR_DIV_EXPR:
|
1992-02-04 20:51:11 +01:00
|
|
|
|
opname = "/"; break;
|
|
|
|
|
case BIT_AND_EXPR:
|
|
|
|
|
opname = "&"; break;
|
|
|
|
|
case BIT_IOR_EXPR:
|
|
|
|
|
opname = "|"; break;
|
|
|
|
|
case TRUTH_ANDIF_EXPR:
|
|
|
|
|
opname = "&&"; break;
|
|
|
|
|
case TRUTH_ORIF_EXPR:
|
|
|
|
|
opname = "||"; break;
|
|
|
|
|
case BIT_XOR_EXPR:
|
|
|
|
|
opname = "^"; break;
|
1992-04-04 21:11:28 +02:00
|
|
|
|
case LROTATE_EXPR:
|
|
|
|
|
case RROTATE_EXPR:
|
|
|
|
|
opname = "rotate"; break;
|
1998-02-05 21:54:49 +01:00
|
|
|
|
default:
|
|
|
|
|
opname = "unknown"; break;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
|
|
|
|
error ("invalid operands to binary %s", opname);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Subroutine of build_binary_op, used for comparison operations.
|
|
|
|
|
See if the operands have both been converted from subword integer types
|
|
|
|
|
and, if so, perhaps change them both back to their original type.
|
1993-10-31 21:19:31 +01:00
|
|
|
|
This function is also responsible for converting the two operands
|
|
|
|
|
to the proper common type for comparison.
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
|
|
|
|
The arguments of this function are all pointers to local variables
|
|
|
|
|
of build_binary_op: OP0_PTR is &OP0, OP1_PTR is &OP1,
|
|
|
|
|
RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE.
|
|
|
|
|
|
|
|
|
|
If this function returns nonzero, it means that the comparison has
|
|
|
|
|
a constant value. What this function returns is an expression for
|
|
|
|
|
that value. */
|
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
shorten_compare (op0_ptr, op1_ptr, restype_ptr, rescode_ptr)
|
|
|
|
|
tree *op0_ptr, *op1_ptr;
|
|
|
|
|
tree *restype_ptr;
|
|
|
|
|
enum tree_code *rescode_ptr;
|
|
|
|
|
{
|
|
|
|
|
register tree type;
|
|
|
|
|
tree op0 = *op0_ptr;
|
|
|
|
|
tree op1 = *op1_ptr;
|
|
|
|
|
int unsignedp0, unsignedp1;
|
|
|
|
|
int real1, real2;
|
|
|
|
|
tree primop0, primop1;
|
|
|
|
|
enum tree_code code = *rescode_ptr;
|
|
|
|
|
|
|
|
|
|
/* Throw away any conversions to wider types
|
|
|
|
|
already present in the operands. */
|
|
|
|
|
|
|
|
|
|
primop0 = get_narrower (op0, &unsignedp0);
|
|
|
|
|
primop1 = get_narrower (op1, &unsignedp1);
|
|
|
|
|
|
|
|
|
|
/* Handle the case that OP0 does not *contain* a conversion
|
|
|
|
|
but it *requires* conversion to FINAL_TYPE. */
|
|
|
|
|
|
|
|
|
|
if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr)
|
|
|
|
|
unsignedp0 = TREE_UNSIGNED (TREE_TYPE (op0));
|
|
|
|
|
if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr)
|
|
|
|
|
unsignedp1 = TREE_UNSIGNED (TREE_TYPE (op1));
|
|
|
|
|
|
|
|
|
|
/* If one of the operands must be floated, we cannot optimize. */
|
|
|
|
|
real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE;
|
|
|
|
|
real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE;
|
|
|
|
|
|
|
|
|
|
/* If first arg is constant, swap the args (changing operation
|
1994-08-25 23:43:46 +02:00
|
|
|
|
so value is preserved), for canonicalization. Don't do this if
|
|
|
|
|
the second arg is 0. */
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
1994-08-25 23:43:46 +02:00
|
|
|
|
if (TREE_CONSTANT (primop0)
|
|
|
|
|
&& ! integer_zerop (primop1) && ! real_zerop (primop1))
|
1992-02-04 20:51:11 +01:00
|
|
|
|
{
|
|
|
|
|
register tree tem = primop0;
|
|
|
|
|
register int temi = unsignedp0;
|
|
|
|
|
primop0 = primop1;
|
|
|
|
|
primop1 = tem;
|
|
|
|
|
tem = op0;
|
|
|
|
|
op0 = op1;
|
|
|
|
|
op1 = tem;
|
|
|
|
|
*op0_ptr = op0;
|
|
|
|
|
*op1_ptr = op1;
|
|
|
|
|
unsignedp0 = unsignedp1;
|
|
|
|
|
unsignedp1 = temi;
|
|
|
|
|
temi = real1;
|
|
|
|
|
real1 = real2;
|
|
|
|
|
real2 = temi;
|
|
|
|
|
|
|
|
|
|
switch (code)
|
|
|
|
|
{
|
|
|
|
|
case LT_EXPR:
|
|
|
|
|
code = GT_EXPR;
|
|
|
|
|
break;
|
|
|
|
|
case GT_EXPR:
|
|
|
|
|
code = LT_EXPR;
|
|
|
|
|
break;
|
|
|
|
|
case LE_EXPR:
|
|
|
|
|
code = GE_EXPR;
|
|
|
|
|
break;
|
|
|
|
|
case GE_EXPR:
|
|
|
|
|
code = LE_EXPR;
|
|
|
|
|
break;
|
1998-02-05 21:54:49 +01:00
|
|
|
|
default:
|
|
|
|
|
break;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
|
|
|
|
*rescode_ptr = code;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If comparing an integer against a constant more bits wide,
|
|
|
|
|
maybe we can deduce a value of 1 or 0 independent of the data.
|
|
|
|
|
Or else truncate the constant now
|
|
|
|
|
rather than extend the variable at run time.
|
|
|
|
|
|
|
|
|
|
This is only interesting if the constant is the wider arg.
|
|
|
|
|
Also, it is not safe if the constant is unsigned and the
|
|
|
|
|
variable arg is signed, since in this case the variable
|
|
|
|
|
would be sign-extended and then regarded as unsigned.
|
|
|
|
|
Our technique fails in this case because the lowest/highest
|
|
|
|
|
possible unsigned results don't follow naturally from the
|
|
|
|
|
lowest/highest possible values of the variable operand.
|
|
|
|
|
For just EQ_EXPR and NE_EXPR there is another technique that
|
|
|
|
|
could be used: see if the constant can be faithfully represented
|
|
|
|
|
in the other operand's type, by truncating it and reextending it
|
|
|
|
|
and see if that preserves the constant's value. */
|
|
|
|
|
|
|
|
|
|
if (!real1 && !real2
|
|
|
|
|
&& TREE_CODE (primop1) == INTEGER_CST
|
|
|
|
|
&& TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr))
|
|
|
|
|
{
|
|
|
|
|
int min_gt, max_gt, min_lt, max_lt;
|
|
|
|
|
tree maxval, minval;
|
|
|
|
|
/* 1 if comparison is nominally unsigned. */
|
|
|
|
|
int unsignedp = TREE_UNSIGNED (*restype_ptr);
|
|
|
|
|
tree val;
|
|
|
|
|
|
|
|
|
|
type = signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0));
|
1999-02-16 01:41:58 +01:00
|
|
|
|
|
|
|
|
|
/* If TYPE is an enumeration, then we need to get its min/max
|
|
|
|
|
values from it's underlying integral type, not the enumerated
|
|
|
|
|
type itself. */
|
|
|
|
|
if (TREE_CODE (type) == ENUMERAL_TYPE)
|
|
|
|
|
type = type_for_size (TYPE_PRECISION (type), unsignedp0);
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
|
|
|
|
maxval = TYPE_MAX_VALUE (type);
|
|
|
|
|
minval = TYPE_MIN_VALUE (type);
|
|
|
|
|
|
|
|
|
|
if (unsignedp && !unsignedp0)
|
|
|
|
|
*restype_ptr = signed_type (*restype_ptr);
|
|
|
|
|
|
|
|
|
|
if (TREE_TYPE (primop1) != *restype_ptr)
|
|
|
|
|
primop1 = convert (*restype_ptr, primop1);
|
|
|
|
|
if (type != *restype_ptr)
|
|
|
|
|
{
|
|
|
|
|
minval = convert (*restype_ptr, minval);
|
|
|
|
|
maxval = convert (*restype_ptr, maxval);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (unsignedp && unsignedp0)
|
|
|
|
|
{
|
|
|
|
|
min_gt = INT_CST_LT_UNSIGNED (primop1, minval);
|
|
|
|
|
max_gt = INT_CST_LT_UNSIGNED (primop1, maxval);
|
|
|
|
|
min_lt = INT_CST_LT_UNSIGNED (minval, primop1);
|
|
|
|
|
max_lt = INT_CST_LT_UNSIGNED (maxval, primop1);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
min_gt = INT_CST_LT (primop1, minval);
|
|
|
|
|
max_gt = INT_CST_LT (primop1, maxval);
|
|
|
|
|
min_lt = INT_CST_LT (minval, primop1);
|
|
|
|
|
max_lt = INT_CST_LT (maxval, primop1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val = 0;
|
|
|
|
|
/* This used to be a switch, but Genix compiler can't handle that. */
|
|
|
|
|
if (code == NE_EXPR)
|
|
|
|
|
{
|
|
|
|
|
if (max_lt || min_gt)
|
1995-01-17 22:43:40 +01:00
|
|
|
|
val = boolean_true_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
|
|
|
|
else if (code == EQ_EXPR)
|
|
|
|
|
{
|
|
|
|
|
if (max_lt || min_gt)
|
1995-01-17 22:43:40 +01:00
|
|
|
|
val = boolean_false_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
|
|
|
|
else if (code == LT_EXPR)
|
|
|
|
|
{
|
|
|
|
|
if (max_lt)
|
1995-01-17 22:43:40 +01:00
|
|
|
|
val = boolean_true_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
if (!min_lt)
|
1995-01-17 22:43:40 +01:00
|
|
|
|
val = boolean_false_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
|
|
|
|
else if (code == GT_EXPR)
|
|
|
|
|
{
|
|
|
|
|
if (min_gt)
|
1995-01-17 22:43:40 +01:00
|
|
|
|
val = boolean_true_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
if (!max_gt)
|
1995-01-17 22:43:40 +01:00
|
|
|
|
val = boolean_false_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
|
|
|
|
else if (code == LE_EXPR)
|
|
|
|
|
{
|
|
|
|
|
if (!max_gt)
|
1995-01-17 22:43:40 +01:00
|
|
|
|
val = boolean_true_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
if (min_gt)
|
1995-01-17 22:43:40 +01:00
|
|
|
|
val = boolean_false_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
|
|
|
|
else if (code == GE_EXPR)
|
|
|
|
|
{
|
|
|
|
|
if (!min_lt)
|
1995-01-17 22:43:40 +01:00
|
|
|
|
val = boolean_true_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
if (max_lt)
|
1995-01-17 22:43:40 +01:00
|
|
|
|
val = boolean_false_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If primop0 was sign-extended and unsigned comparison specd,
|
|
|
|
|
we did a signed comparison above using the signed type bounds.
|
|
|
|
|
But the comparison we output must be unsigned.
|
|
|
|
|
|
|
|
|
|
Also, for inequalities, VAL is no good; but if the signed
|
|
|
|
|
comparison had *any* fixed result, it follows that the
|
|
|
|
|
unsigned comparison just tests the sign in reverse
|
|
|
|
|
(positive values are LE, negative ones GE).
|
|
|
|
|
So we can generate an unsigned comparison
|
|
|
|
|
against an extreme value of the signed type. */
|
|
|
|
|
|
|
|
|
|
if (unsignedp && !unsignedp0)
|
|
|
|
|
{
|
|
|
|
|
if (val != 0)
|
|
|
|
|
switch (code)
|
|
|
|
|
{
|
|
|
|
|
case LT_EXPR:
|
|
|
|
|
case GE_EXPR:
|
|
|
|
|
primop1 = TYPE_MIN_VALUE (type);
|
|
|
|
|
val = 0;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case LE_EXPR:
|
|
|
|
|
case GT_EXPR:
|
|
|
|
|
primop1 = TYPE_MAX_VALUE (type);
|
|
|
|
|
val = 0;
|
|
|
|
|
break;
|
1998-02-05 21:54:49 +01:00
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
|
|
|
|
type = unsigned_type (type);
|
|
|
|
|
}
|
|
|
|
|
|
1993-11-25 00:14:43 +01:00
|
|
|
|
if (!max_gt && !unsignedp0 && TREE_CODE (primop0) != INTEGER_CST)
|
1992-02-04 20:51:11 +01:00
|
|
|
|
{
|
|
|
|
|
/* This is the case of (char)x >?< 0x80, which people used to use
|
|
|
|
|
expecting old C compilers to change the 0x80 into -0x80. */
|
1995-01-17 22:43:40 +01:00
|
|
|
|
if (val == boolean_false_node)
|
1998-11-19 20:40:56 +01:00
|
|
|
|
warning ("comparison is always false due to limited range of data type");
|
1995-01-17 22:43:40 +01:00
|
|
|
|
if (val == boolean_true_node)
|
1998-11-19 20:40:56 +01:00
|
|
|
|
warning ("comparison is always true due to limited range of data type");
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
|
|
|
|
|
1993-11-25 00:14:43 +01:00
|
|
|
|
if (!min_lt && unsignedp0 && TREE_CODE (primop0) != INTEGER_CST)
|
1992-02-04 20:51:11 +01:00
|
|
|
|
{
|
1992-05-08 23:25:25 +02:00
|
|
|
|
/* This is the case of (unsigned char)x >?< -1 or < 0. */
|
1995-01-17 22:43:40 +01:00
|
|
|
|
if (val == boolean_false_node)
|
1998-11-19 20:40:56 +01:00
|
|
|
|
warning ("comparison is always false due to limited range of data type");
|
1995-01-17 22:43:40 +01:00
|
|
|
|
if (val == boolean_true_node)
|
1998-11-19 20:40:56 +01:00
|
|
|
|
warning ("comparison is always true due to limited range of data type");
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (val != 0)
|
|
|
|
|
{
|
|
|
|
|
/* Don't forget to evaluate PRIMOP0 if it has side effects. */
|
|
|
|
|
if (TREE_SIDE_EFFECTS (primop0))
|
|
|
|
|
return build (COMPOUND_EXPR, TREE_TYPE (val), primop0, val);
|
|
|
|
|
return val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Value is not predetermined, but do the comparison
|
|
|
|
|
in the type of the operand that is not constant.
|
|
|
|
|
TYPE is already properly set. */
|
|
|
|
|
}
|
|
|
|
|
else if (real1 && real2
|
1993-03-04 20:36:42 +01:00
|
|
|
|
&& (TYPE_PRECISION (TREE_TYPE (primop0))
|
|
|
|
|
== TYPE_PRECISION (TREE_TYPE (primop1))))
|
1992-02-04 20:51:11 +01:00
|
|
|
|
type = TREE_TYPE (primop0);
|
|
|
|
|
|
|
|
|
|
/* If args' natural types are both narrower than nominal type
|
|
|
|
|
and both extend in the same manner, compare them
|
|
|
|
|
in the type of the wider arg.
|
|
|
|
|
Otherwise must actually extend both to the nominal
|
|
|
|
|
common type lest different ways of extending
|
|
|
|
|
alter the result.
|
|
|
|
|
(eg, (short)-1 == (unsigned short)-1 should be 0.) */
|
|
|
|
|
|
|
|
|
|
else if (unsignedp0 == unsignedp1 && real1 == real2
|
|
|
|
|
&& TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)
|
|
|
|
|
&& TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr))
|
|
|
|
|
{
|
|
|
|
|
type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1));
|
|
|
|
|
type = signed_or_unsigned_type (unsignedp0
|
|
|
|
|
|| TREE_UNSIGNED (*restype_ptr),
|
|
|
|
|
type);
|
|
|
|
|
/* Make sure shorter operand is extended the right way
|
|
|
|
|
to match the longer operand. */
|
|
|
|
|
primop0 = convert (signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0)),
|
|
|
|
|
primop0);
|
|
|
|
|
primop1 = convert (signed_or_unsigned_type (unsignedp1, TREE_TYPE (primop1)),
|
|
|
|
|
primop1);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* Here we must do the comparison on the nominal type
|
|
|
|
|
using the args exactly as we received them. */
|
|
|
|
|
type = *restype_ptr;
|
|
|
|
|
primop0 = op0;
|
|
|
|
|
primop1 = op1;
|
|
|
|
|
|
|
|
|
|
if (!real1 && !real2 && integer_zerop (primop1)
|
1994-03-18 00:39:11 +01:00
|
|
|
|
&& TREE_UNSIGNED (*restype_ptr))
|
1992-02-04 20:51:11 +01:00
|
|
|
|
{
|
|
|
|
|
tree value = 0;
|
|
|
|
|
switch (code)
|
|
|
|
|
{
|
|
|
|
|
case GE_EXPR:
|
1994-08-25 23:43:46 +02:00
|
|
|
|
/* All unsigned values are >= 0, so we warn if extra warnings
|
|
|
|
|
are requested. However, if OP0 is a constant that is
|
|
|
|
|
>= 0, the signedness of the comparison isn't an issue,
|
|
|
|
|
so suppress the warning. */
|
2000-07-17 10:33:55 +02:00
|
|
|
|
if (extra_warnings && !in_system_header
|
1994-08-25 23:43:46 +02:00
|
|
|
|
&& ! (TREE_CODE (primop0) == INTEGER_CST
|
|
|
|
|
&& ! TREE_OVERFLOW (convert (signed_type (type),
|
|
|
|
|
primop0))))
|
1998-11-19 20:40:56 +01:00
|
|
|
|
warning ("comparison of unsigned expression >= 0 is always true");
|
1995-01-17 22:43:40 +01:00
|
|
|
|
value = boolean_true_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case LT_EXPR:
|
2000-07-17 10:33:55 +02:00
|
|
|
|
if (extra_warnings && !in_system_header
|
1994-08-25 23:43:46 +02:00
|
|
|
|
&& ! (TREE_CODE (primop0) == INTEGER_CST
|
|
|
|
|
&& ! TREE_OVERFLOW (convert (signed_type (type),
|
|
|
|
|
primop0))))
|
1998-11-19 20:40:56 +01:00
|
|
|
|
warning ("comparison of unsigned expression < 0 is always false");
|
1995-01-17 22:43:40 +01:00
|
|
|
|
value = boolean_false_node;
|
1998-02-05 21:54:49 +01:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (value != 0)
|
|
|
|
|
{
|
|
|
|
|
/* Don't forget to evaluate PRIMOP0 if it has side effects. */
|
|
|
|
|
if (TREE_SIDE_EFFECTS (primop0))
|
|
|
|
|
return build (COMPOUND_EXPR, TREE_TYPE (value),
|
|
|
|
|
primop0, value);
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*op0_ptr = convert (type, primop0);
|
|
|
|
|
*op1_ptr = convert (type, primop1);
|
|
|
|
|
|
1995-01-17 22:43:40 +01:00
|
|
|
|
*restype_ptr = boolean_type_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
|
|
|
|
|
or validate its data type for an `if' or `while' statement or ?..: exp.
|
|
|
|
|
|
|
|
|
|
This preparation consists of taking the ordinary
|
|
|
|
|
representation of an expression expr and producing a valid tree
|
|
|
|
|
boolean expression describing whether expr is nonzero. We could
|
1995-01-17 22:43:40 +01:00
|
|
|
|
simply always do build_binary_op (NE_EXPR, expr, boolean_false_node, 1),
|
1992-02-04 20:51:11 +01:00
|
|
|
|
but we optimize comparisons, &&, ||, and !.
|
|
|
|
|
|
1995-01-17 22:43:40 +01:00
|
|
|
|
The resulting type should always be `boolean_type_node'. */
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
truthvalue_conversion (expr)
|
|
|
|
|
tree expr;
|
|
|
|
|
{
|
1993-05-01 06:09:06 +02:00
|
|
|
|
if (TREE_CODE (expr) == ERROR_MARK)
|
|
|
|
|
return expr;
|
|
|
|
|
|
1993-05-06 17:58:59 +02:00
|
|
|
|
#if 0 /* This appears to be wrong for C++. */
|
1993-05-01 06:09:06 +02:00
|
|
|
|
/* These really should return error_mark_node after 2.4 is stable.
|
|
|
|
|
But not all callers handle ERROR_MARK properly. */
|
|
|
|
|
switch (TREE_CODE (TREE_TYPE (expr)))
|
|
|
|
|
{
|
|
|
|
|
case RECORD_TYPE:
|
|
|
|
|
error ("struct type value used where scalar is required");
|
1995-01-17 22:43:40 +01:00
|
|
|
|
return boolean_false_node;
|
1993-05-01 06:09:06 +02:00
|
|
|
|
|
|
|
|
|
case UNION_TYPE:
|
|
|
|
|
error ("union type value used where scalar is required");
|
1995-01-17 22:43:40 +01:00
|
|
|
|
return boolean_false_node;
|
1993-05-01 06:09:06 +02:00
|
|
|
|
|
|
|
|
|
case ARRAY_TYPE:
|
|
|
|
|
error ("array type value used where scalar is required");
|
1995-01-17 22:43:40 +01:00
|
|
|
|
return boolean_false_node;
|
1993-05-01 06:09:06 +02:00
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
1993-05-06 17:58:59 +02:00
|
|
|
|
#endif /* 0 */
|
1993-05-01 06:09:06 +02:00
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
switch (TREE_CODE (expr))
|
|
|
|
|
{
|
|
|
|
|
case EQ_EXPR:
|
|
|
|
|
case NE_EXPR: case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
|
|
|
|
|
case TRUTH_ANDIF_EXPR:
|
|
|
|
|
case TRUTH_ORIF_EXPR:
|
|
|
|
|
case TRUTH_AND_EXPR:
|
|
|
|
|
case TRUTH_OR_EXPR:
|
1992-12-30 12:01:57 +01:00
|
|
|
|
case TRUTH_XOR_EXPR:
|
1995-05-24 21:41:29 +02:00
|
|
|
|
case TRUTH_NOT_EXPR:
|
1995-01-17 22:43:40 +01:00
|
|
|
|
TREE_TYPE (expr) = boolean_type_node;
|
|
|
|
|
return expr;
|
1994-03-14 03:16:59 +01:00
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
case ERROR_MARK:
|
|
|
|
|
return expr;
|
|
|
|
|
|
|
|
|
|
case INTEGER_CST:
|
1995-01-17 22:43:40 +01:00
|
|
|
|
return integer_zerop (expr) ? boolean_false_node : boolean_true_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
|
|
|
|
case REAL_CST:
|
1995-01-17 22:43:40 +01:00
|
|
|
|
return real_zerop (expr) ? boolean_false_node : boolean_true_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
|
|
|
|
case ADDR_EXPR:
|
1996-05-06 21:41:35 +02:00
|
|
|
|
/* If we are taking the address of a external decl, it might be zero
|
|
|
|
|
if it is weak, so we cannot optimize. */
|
builtin.c (get_pointer_alignment): Use DECL_P and TYPE_P macros.
* builtin.c (get_pointer_alignment): Use DECL_P and TYPE_P macros.
* c-common.c (decl_attributes,check_format_info,truthvalue_conversion,
c_get_alias_set): Likewise.
* c-decl.c (duplicate_decls): Likewise.
* c-typeck.c (default_conversion,build_unary_op): Likewise.
* calls.c (initialize_argument_information): Likewise.
* dwarf2out.c (decl_class_context,add_abstract_origin_attribute):
Likewise.
* dwarfout.c (decl_class_context,output_type): Likewise.
* expr.c (get_inner_reference): Likewise.
* fold-const.c (simple_operand_p,fold): Likewise.
* function.c (aggregate_value_p): Likewise.
* stmt.c (expand_asm_operands): Likewise.
* varasm.c (named_section): Likewise.
* call.c (check_dtor_name,build_new_method_call): Likewise.
* decl.c (push_class_binding,poplevel,pushtag,lookup_namespace_name,
make_typename_type,check_initializer,cp_finish_decl,xref_tag): Likewise.
* decl2.c (grokfield,build_expr_from_tree,build_expr_from_tree,
decl_namespace,arg_assoc_template_arg,arg_assoc,
validate_nonmember_using_decl,do_class_using_decl): Likewise.
* error.c (dump_template_argument,dump_expr,cp_file_of,cp_line_of,
args_to_string): Likewise.
* friend.c (is_friend): Likewise.
* lex.c (note_got_semicolon,note_list_got_semicolon,is_global): Likewise.
* method.c (build_overload_nested_name,build_overload_value,
build_qualified_name,build_qualified_name,hack_identifier): Likewise.
* parse.y (typename_sub,typename_sub1): Likewise.
* pt.c (push_inline_template_parms_recursive,check_template_shadow,
process_partial_specialization,convert_template_argument,
template_args_equal,add_pending_template,lookup_template_class,
for_each_template_parm_r,maybe_fold_nontype_arg,
tsubst,instantiate_template,type_unification_real,unify,
instantiate_pending_templates,set_mangled_name_for_template_decl):
Likewise.
* repo.c (repo_get_id,repo_template_used): Likewise.
* search.c (lookup_field_1): Likewise.
* tree.c (walk_tree,get_type_decl,cp_tree_equal,member_p): Likewise.
* xref.c (classname): Likewise.
From-SVN: r32698
2000-03-23 01:41:05 +01:00
|
|
|
|
if (DECL_P (TREE_OPERAND (expr, 0))
|
1996-05-06 21:41:35 +02:00
|
|
|
|
&& DECL_EXTERNAL (TREE_OPERAND (expr, 0)))
|
|
|
|
|
break;
|
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0)))
|
1995-01-17 22:43:40 +01:00
|
|
|
|
return build (COMPOUND_EXPR, boolean_type_node,
|
|
|
|
|
TREE_OPERAND (expr, 0), boolean_true_node);
|
1992-02-04 20:51:11 +01:00
|
|
|
|
else
|
1995-01-17 22:43:40 +01:00
|
|
|
|
return boolean_true_node;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
1993-03-04 20:36:42 +01:00
|
|
|
|
case COMPLEX_EXPR:
|
1993-03-04 21:34:56 +01:00
|
|
|
|
return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))
|
1993-09-04 17:16:10 +02:00
|
|
|
|
? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
|
1993-03-04 21:34:56 +01:00
|
|
|
|
truthvalue_conversion (TREE_OPERAND (expr, 0)),
|
|
|
|
|
truthvalue_conversion (TREE_OPERAND (expr, 1)),
|
1993-03-04 20:36:42 +01:00
|
|
|
|
0);
|
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
case NEGATE_EXPR:
|
|
|
|
|
case ABS_EXPR:
|
|
|
|
|
case FLOAT_EXPR:
|
|
|
|
|
case FFS_EXPR:
|
|
|
|
|
/* These don't change whether an object is non-zero or zero. */
|
|
|
|
|
return truthvalue_conversion (TREE_OPERAND (expr, 0));
|
|
|
|
|
|
|
|
|
|
case LROTATE_EXPR:
|
|
|
|
|
case RROTATE_EXPR:
|
|
|
|
|
/* These don't change whether an object is zero or non-zero, but
|
|
|
|
|
we can't ignore them if their second arg has side-effects. */
|
|
|
|
|
if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
|
1995-01-17 22:43:40 +01:00
|
|
|
|
return build (COMPOUND_EXPR, boolean_type_node, TREE_OPERAND (expr, 1),
|
1992-02-04 20:51:11 +01:00
|
|
|
|
truthvalue_conversion (TREE_OPERAND (expr, 0)));
|
|
|
|
|
else
|
|
|
|
|
return truthvalue_conversion (TREE_OPERAND (expr, 0));
|
1998-05-04 22:19:33 +02:00
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
case COND_EXPR:
|
|
|
|
|
/* Distribute the conversion into the arms of a COND_EXPR. */
|
1995-01-17 22:43:40 +01:00
|
|
|
|
return fold (build (COND_EXPR, boolean_type_node, TREE_OPERAND (expr, 0),
|
1992-02-04 20:51:11 +01:00
|
|
|
|
truthvalue_conversion (TREE_OPERAND (expr, 1)),
|
|
|
|
|
truthvalue_conversion (TREE_OPERAND (expr, 2))));
|
|
|
|
|
|
|
|
|
|
case CONVERT_EXPR:
|
|
|
|
|
/* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE,
|
|
|
|
|
since that affects how `default_conversion' will behave. */
|
|
|
|
|
if (TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE
|
|
|
|
|
|| TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == REFERENCE_TYPE)
|
|
|
|
|
break;
|
1996-07-04 00:07:53 +02:00
|
|
|
|
/* fall through... */
|
1992-02-04 20:51:11 +01:00
|
|
|
|
case NOP_EXPR:
|
|
|
|
|
/* If this is widening the argument, we can ignore it. */
|
|
|
|
|
if (TYPE_PRECISION (TREE_TYPE (expr))
|
|
|
|
|
>= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0))))
|
|
|
|
|
return truthvalue_conversion (TREE_OPERAND (expr, 0));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MINUS_EXPR:
|
1993-05-04 01:33:42 +02:00
|
|
|
|
/* With IEEE arithmetic, x - x may not equal 0, so we can't optimize
|
|
|
|
|
this case. */
|
|
|
|
|
if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
|
|
|
|
|
&& TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE)
|
|
|
|
|
break;
|
1996-07-04 00:07:53 +02:00
|
|
|
|
/* fall through... */
|
1993-05-04 01:33:42 +02:00
|
|
|
|
case BIT_XOR_EXPR:
|
1993-05-06 17:58:59 +02:00
|
|
|
|
/* This and MINUS_EXPR can be changed into a comparison of the
|
1993-05-04 01:33:42 +02:00
|
|
|
|
two objects. */
|
1992-02-04 20:51:11 +01:00
|
|
|
|
if (TREE_TYPE (TREE_OPERAND (expr, 0))
|
|
|
|
|
== TREE_TYPE (TREE_OPERAND (expr, 1)))
|
|
|
|
|
return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
|
|
|
|
|
TREE_OPERAND (expr, 1), 1);
|
|
|
|
|
return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
|
|
|
|
|
fold (build1 (NOP_EXPR,
|
|
|
|
|
TREE_TYPE (TREE_OPERAND (expr, 0)),
|
|
|
|
|
TREE_OPERAND (expr, 1))), 1);
|
1992-08-15 01:45:09 +02:00
|
|
|
|
|
1994-05-13 22:30:24 +02:00
|
|
|
|
case BIT_AND_EXPR:
|
1995-05-31 13:31:46 +02:00
|
|
|
|
if (integer_onep (TREE_OPERAND (expr, 1))
|
|
|
|
|
&& TREE_TYPE (expr) != boolean_type_node)
|
|
|
|
|
/* Using convert here would cause infinite recursion. */
|
|
|
|
|
return build1 (NOP_EXPR, boolean_type_node, expr);
|
|
|
|
|
break;
|
1994-05-13 22:30:24 +02:00
|
|
|
|
|
1992-08-15 01:45:09 +02:00
|
|
|
|
case MODIFY_EXPR:
|
|
|
|
|
if (warn_parentheses && C_EXP_ORIGINAL_CODE (expr) == MODIFY_EXPR)
|
|
|
|
|
warning ("suggest parentheses around assignment used as truth value");
|
|
|
|
|
break;
|
1998-05-04 22:19:33 +02:00
|
|
|
|
|
1998-02-05 21:54:49 +01:00
|
|
|
|
default:
|
|
|
|
|
break;
|
1992-02-04 20:51:11 +01:00
|
|
|
|
}
|
|
|
|
|
|
1993-03-04 21:34:56 +01:00
|
|
|
|
if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
|
1998-06-19 03:46:50 +02:00
|
|
|
|
{
|
|
|
|
|
tree tem = save_expr (expr);
|
|
|
|
|
return (build_binary_op
|
|
|
|
|
((TREE_SIDE_EFFECTS (expr)
|
|
|
|
|
? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
|
|
|
|
|
truthvalue_conversion (build_unary_op (REALPART_EXPR, tem, 0)),
|
|
|
|
|
truthvalue_conversion (build_unary_op (IMAGPART_EXPR, tem, 0)),
|
|
|
|
|
0));
|
|
|
|
|
}
|
1993-03-04 21:34:56 +01:00
|
|
|
|
|
1992-02-04 20:51:11 +01:00
|
|
|
|
return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
|
|
|
|
|
}
|
|
|
|
|
|
Integrated preprocessor.
top level:
* Makefile.in: Remove all references to c-parse.gperf,
c-gperf.h, and c-parse.h. Remove -d from yacc command line
generating c-parse.c. Update dependencies.
* c-parse.gperf, c-gperf.h: Delete.
* c-common.c: Don't define parse_options, cpp_token, yy_cur,
yy_lim, or yy_get_token. Don't define get_directive_line if
USE_CPPLIB.
* c-common.h: Add multiple include guard. Define RID values
for every keyword in C, C++, and Objective C. Put all the
modifiers first.
(struct c_fileinfo, get_fileinfo, dump_time_statistics): New.
* c-decl.c (c_decode_option): Handle -lang-objc here.
(print_lang_identifier): Handle C_IS_RESERVED_WORD case.
(grokdeclarator): Adjust for new RID scheme.
(extract_interface_info): New stub.
* c-lang.c: Don't declare yy_cur or parse_options.
(lang_init_options): Call cpp_init. Don't call
cpp_options_init.
(lang_init): Don't call check_newline if USE_CPPLIB.
* c-lex.c: Don't include c-parse.h. Do include timevar.h.
Elide lots of unnecessary code if USE_CPPLIB. Delete code
rendered unnecessary by new architecture. Move routines not
shared with C++ to c-parse.in. Maintain a local idea of the
line number. Handle C++ as well as C.
[USE_CPPLIB]: Declare and register callbacks for #ident and
for entering/leaving files.
(init_c_lex, c_lex): Are now the entry points to this file.
(check_newline): Break out directive handling to
process_directive.
(read_ucs, is_extended_char, utf8_extend_token): Moved here
from C++ front end.
(readescape, parse_float): Overhaul.
(lex_number, lex_string, lex_charconst): Break out of c_lex
(n'ee yylex).
(get_fileinfo, update_header_times, dump_one_header,
dump_time_statistics): New and/or moved here from C++.
Support per-file data needed by C++ and per-header timing
statistics (C++ only, at the moment).
* c-lex.h: Update prototypes. Add multiple include guard.
* c-tree.h (struct lang_identifier): Add rid_code field.
(C_IS_RESERVED_WORD, C_RID_CODE): New.
* c-parse.in: Include c-pragma.h. Remove unnecesary calls to
reinit_parse_for_function and/or position_after_white_space.
(save_filename, save_lineno): Look ahead before saving.
(label -> identifier ':'): Save file and line before shifting ':'.
(reservedwords): No need to call get_identifier.
(init_parse, finish_parse, yyerror, yylex, yyprint,
make_pointer_declarator): Are now here for C/ObjC.
(rid_to_yy): Conversion table from RID constants to Yacc codes.
* c-pragma.c: Rewrite parsing logic to fit with cpplib's
#pragma registry. Provide dummy implementation of that
interface if !USE_CPPLIB.
* c-pragma.h: Update to match.
* flags.h: Add multiple include guard.
(flag_detailed_statistics): Moved here from C++.
* toplev.c: Define flag_detailed_statistics.
* gcc.c (C specs): Use %(trad_capable_cpp) for -E|-M|-MM case
#if USE_CPPLIB.
* timevar.def (TV_CPP, TV_LEX): New.
* timevar.h: Add multiple include guard.
* objc/lang-specs.h: Use %(trad_capable_cpp) for -E|-M|-MM case
#if USE_CPPLIB.
* objc/objc-act.c: Don't mention yy_cur or parse_options.
Initialize cpplib properly. Force lineno to 0 after first
call to check_newline. Don't handle -lang-objc here.
Move forget_protocol_qualifiers and remember_protocol_qualifiers here.
cp:
* Make-lang.in, Makefile.in: Remove all references to input.c,
gxx.gperf, and hash.h. Add ../c-lex.o to C_OBJS.
* gxx.gperf, hash.h, input.c: Delete.
* lang-specs.h: Pass -lang-c++ to cc1plus so cpplib is
initialized properly.
* class.c (fixup_pending_inline): Take a tree, not a
struct pending_inline *. All callers changed.
(init_class_processing): Set RID_PUBLIC, RID_PRIVATE,
RID_PROTECTED entries in ridpointers[] array here.
* decl.c (duplicate_decls): Do not refer to struct
pending_inline.
(record_builtin_type, init_decl_processing): Use RID_MAX not
CP_RID_MAX.
(grokdeclarator): Use C_IS_RESERVED_WORD.
* decl2.c (lang_decode_option): Ignore -lang-c++ for sake of
cpplib.
(grok_x_components): Do not inspect pending_inlines chain.
* cp-tree.h (struct lang_identifier): Add rid_code entry.
(C_IS_RESERVED_WORD, C_RID_CODE, C_RID_YYCODE): New.
(flag_no_gnu_keywords, flag_operator_names, rid_to_yy): Declare.
(DEFARG_LENGTH, struct pending_inline, TIME_IDENTIFIER_TIME,
TIME_IDENTIFIER_FILEINFO): Kill.
Update prototypes.
* lex.h: Expunge cp_rid. Rewrite RIDBIT macros to use just a
single 32-bit word.
* parse.y: Call do_pending_inlines unconditionally.
reinit_parse_for_method is now snarf_method. fn.defpen is no
longer necessary. Remove unnecessary <itype> annotation on
SCOPE. Do not refer to end_of_file or struct pending_inline.
* semantics.c (begin_inline_definitions): Call
do_pending_inlines unconditionally.
* lex.c: Remove all code now shared with C front end.
Initialize cpplib properly if USE_CPPLIB. Put reserved words
into the get_identifier table. Rewrite pragma handling to
work with the registry. Move code to save tokens for later
processing to spew.c.
* spew.c: Rewrite everything in terms of token streams instead
of text. Move routines here from lex.c / input.c as
appropriate. GC-mark trees hanging off the pending inlines
chain.
testsuite:
* g++.old-deja/g++.benjamin/13478.C: Put meaningful tags on
ERROR markers.
* g++.old-deja/g++.brendan/crash8.C: Move ERROR marker up one line.
* gcc.dg/c99-array-nonobj-1.c: Don't expect func[] cases to fail.
* gcc.dg/wtr-label-1.c: Don't use unconstrained .* in error regexps.
* gcc.dg/wtr-suffix-1.c: Correct error regexps.
* gcc.dg/cpp/unc1.c, gcc.dg/cpp/unc2.c, gcc.dg/cpp/unc3.c:
Preprocess only.
* gcc.dg/cpp/unc4.c: Adjust line number in dg-error line.
* gcc.dg/noncompile/const-ll-1.c: Generalize error regexp.
From-SVN: r36216
2000-09-07 02:37:14 +02:00
|
|
|
|
#if !USE_CPPLIB
|
1992-02-04 20:51:11 +01:00
|
|
|
|
/* Read the rest of a #-directive from input stream FINPUT.
|
|
|
|
|
In normal use, the directive name and the white space after it
|
|
|
|
|
have already been read, so they won't be included in the result.
|
|
|
|
|
We allow for the fact that the directive line may contain
|
|
|
|
|
a newline embedded within a character or string literal which forms
|
|
|
|
|
a part of the directive.
|
|
|
|
|
|
|
|
|
|
The value is a string in a reusable buffer. It remains valid
|
1996-01-15 23:25:24 +01:00
|
|
|
|
only until the next time this function is called.
|
|
|
|
|
|
|
|
|
|
The terminating character ('\n' or EOF) is left in FINPUT for the
|
|
|
|
|
caller to re-read. */
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
|
|
|
|
char *
|
|
|
|
|
get_directive_line (finput)
|
|
|
|
|
register FILE *finput;
|
|
|
|
|
{
|
|
|
|
|
static char *directive_buffer = NULL;
|
|
|
|
|
static unsigned buffer_length = 0;
|
|
|
|
|
register char *p;
|
|
|
|
|
register char *buffer_limit;
|
|
|
|
|
register int looking_for = 0;
|
|
|
|
|
register int char_escaped = 0;
|
|
|
|
|
|
|
|
|
|
if (buffer_length == 0)
|
|
|
|
|
{
|
|
|
|
|
directive_buffer = (char *)xmalloc (128);
|
|
|
|
|
buffer_length = 128;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buffer_limit = &directive_buffer[buffer_length];
|
|
|
|
|
|
|
|
|
|
for (p = directive_buffer; ; )
|
|
|
|
|
{
|
|
|
|
|
int c;
|
|
|
|
|
|
|
|
|
|
/* Make buffer bigger if it is full. */
|
|
|
|
|
if (p >= buffer_limit)
|
|
|
|
|
{
|
|
|
|
|
register unsigned bytes_used = (p - directive_buffer);
|
|
|
|
|
|
|
|
|
|
buffer_length *= 2;
|
|
|
|
|
directive_buffer
|
|
|
|
|
= (char *)xrealloc (directive_buffer, buffer_length);
|
|
|
|
|
p = &directive_buffer[bytes_used];
|
|
|
|
|
buffer_limit = &directive_buffer[buffer_length];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
c = getc (finput);
|
|
|
|
|
|
|
|
|
|
/* Discard initial whitespace. */
|
|
|
|
|
if ((c == ' ' || c == '\t') && p == directive_buffer)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* Detect the end of the directive. */
|
1996-01-15 23:25:24 +01:00
|
|
|
|
if (looking_for == 0
|
|
|
|
|
&& (c == '\n' || c == EOF))
|
1992-02-04 20:51:11 +01:00
|
|
|
|
{
|
|
|
|
|
ungetc (c, finput);
|
|
|
|
|
c = '\0';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*p++ = c;
|
|
|
|
|
|
|
|
|
|
if (c == 0)
|
|
|
|
|
return directive_buffer;
|
|
|
|
|
|
|
|
|
|
/* Handle string and character constant syntax. */
|
|
|
|
|
if (looking_for)
|
|
|
|
|
{
|
|
|
|
|
if (looking_for == c && !char_escaped)
|
|
|
|
|
looking_for = 0; /* Found terminator... stop looking. */
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if (c == '\'' || c == '"')
|
|
|
|
|
looking_for = c; /* Don't stop buffering until we see another
|
1998-05-06 23:09:07 +02:00
|
|
|
|
one of these (or an EOF). */
|
1992-02-04 20:51:11 +01:00
|
|
|
|
|
|
|
|
|
/* Handle backslash. */
|
|
|
|
|
char_escaped = (c == '\\' && ! char_escaped);
|
|
|
|
|
}
|
|
|
|
|
}
|
Integrated preprocessor.
top level:
* Makefile.in: Remove all references to c-parse.gperf,
c-gperf.h, and c-parse.h. Remove -d from yacc command line
generating c-parse.c. Update dependencies.
* c-parse.gperf, c-gperf.h: Delete.
* c-common.c: Don't define parse_options, cpp_token, yy_cur,
yy_lim, or yy_get_token. Don't define get_directive_line if
USE_CPPLIB.
* c-common.h: Add multiple include guard. Define RID values
for every keyword in C, C++, and Objective C. Put all the
modifiers first.
(struct c_fileinfo, get_fileinfo, dump_time_statistics): New.
* c-decl.c (c_decode_option): Handle -lang-objc here.
(print_lang_identifier): Handle C_IS_RESERVED_WORD case.
(grokdeclarator): Adjust for new RID scheme.
(extract_interface_info): New stub.
* c-lang.c: Don't declare yy_cur or parse_options.
(lang_init_options): Call cpp_init. Don't call
cpp_options_init.
(lang_init): Don't call check_newline if USE_CPPLIB.
* c-lex.c: Don't include c-parse.h. Do include timevar.h.
Elide lots of unnecessary code if USE_CPPLIB. Delete code
rendered unnecessary by new architecture. Move routines not
shared with C++ to c-parse.in. Maintain a local idea of the
line number. Handle C++ as well as C.
[USE_CPPLIB]: Declare and register callbacks for #ident and
for entering/leaving files.
(init_c_lex, c_lex): Are now the entry points to this file.
(check_newline): Break out directive handling to
process_directive.
(read_ucs, is_extended_char, utf8_extend_token): Moved here
from C++ front end.
(readescape, parse_float): Overhaul.
(lex_number, lex_string, lex_charconst): Break out of c_lex
(n'ee yylex).
(get_fileinfo, update_header_times, dump_one_header,
dump_time_statistics): New and/or moved here from C++.
Support per-file data needed by C++ and per-header timing
statistics (C++ only, at the moment).
* c-lex.h: Update prototypes. Add multiple include guard.
* c-tree.h (struct lang_identifier): Add rid_code field.
(C_IS_RESERVED_WORD, C_RID_CODE): New.
* c-parse.in: Include c-pragma.h. Remove unnecesary calls to
reinit_parse_for_function and/or position_after_white_space.
(save_filename, save_lineno): Look ahead before saving.
(label -> identifier ':'): Save file and line before shifting ':'.
(reservedwords): No need to call get_identifier.
(init_parse, finish_parse, yyerror, yylex, yyprint,
make_pointer_declarator): Are now here for C/ObjC.
(rid_to_yy): Conversion table from RID constants to Yacc codes.
* c-pragma.c: Rewrite parsing logic to fit with cpplib's
#pragma registry. Provide dummy implementation of that
interface if !USE_CPPLIB.
* c-pragma.h: Update to match.
* flags.h: Add multiple include guard.
(flag_detailed_statistics): Moved here from C++.
* toplev.c: Define flag_detailed_statistics.
* gcc.c (C specs): Use %(trad_capable_cpp) for -E|-M|-MM case
#if USE_CPPLIB.
* timevar.def (TV_CPP, TV_LEX): New.
* timevar.h: Add multiple include guard.
* objc/lang-specs.h: Use %(trad_capable_cpp) for -E|-M|-MM case
#if USE_CPPLIB.
* objc/objc-act.c: Don't mention yy_cur or parse_options.
Initialize cpplib properly. Force lineno to 0 after first
call to check_newline. Don't handle -lang-objc here.
Move forget_protocol_qualifiers and remember_protocol_qualifiers here.
cp:
* Make-lang.in, Makefile.in: Remove all references to input.c,
gxx.gperf, and hash.h. Add ../c-lex.o to C_OBJS.
* gxx.gperf, hash.h, input.c: Delete.
* lang-specs.h: Pass -lang-c++ to cc1plus so cpplib is
initialized properly.
* class.c (fixup_pending_inline): Take a tree, not a
struct pending_inline *. All callers changed.
(init_class_processing): Set RID_PUBLIC, RID_PRIVATE,
RID_PROTECTED entries in ridpointers[] array here.
* decl.c (duplicate_decls): Do not refer to struct
pending_inline.
(record_builtin_type, init_decl_processing): Use RID_MAX not
CP_RID_MAX.
(grokdeclarator): Use C_IS_RESERVED_WORD.
* decl2.c (lang_decode_option): Ignore -lang-c++ for sake of
cpplib.
(grok_x_components): Do not inspect pending_inlines chain.
* cp-tree.h (struct lang_identifier): Add rid_code entry.
(C_IS_RESERVED_WORD, C_RID_CODE, C_RID_YYCODE): New.
(flag_no_gnu_keywords, flag_operator_names, rid_to_yy): Declare.
(DEFARG_LENGTH, struct pending_inline, TIME_IDENTIFIER_TIME,
TIME_IDENTIFIER_FILEINFO): Kill.
Update prototypes.
* lex.h: Expunge cp_rid. Rewrite RIDBIT macros to use just a
single 32-bit word.
* parse.y: Call do_pending_inlines unconditionally.
reinit_parse_for_method is now snarf_method. fn.defpen is no
longer necessary. Remove unnecessary <itype> annotation on
SCOPE. Do not refer to end_of_file or struct pending_inline.
* semantics.c (begin_inline_definitions): Call
do_pending_inlines unconditionally.
* lex.c: Remove all code now shared with C front end.
Initialize cpplib properly if USE_CPPLIB. Put reserved words
into the get_identifier table. Rewrite pragma handling to
work with the registry. Move code to save tokens for later
processing to spew.c.
* spew.c: Rewrite everything in terms of token streams instead
of text. Move routines here from lex.c / input.c as
appropriate. GC-mark trees hanging off the pending inlines
chain.
testsuite:
* g++.old-deja/g++.benjamin/13478.C: Put meaningful tags on
ERROR markers.
* g++.old-deja/g++.brendan/crash8.C: Move ERROR marker up one line.
* gcc.dg/c99-array-nonobj-1.c: Don't expect func[] cases to fail.
* gcc.dg/wtr-label-1.c: Don't use unconstrained .* in error regexps.
* gcc.dg/wtr-suffix-1.c: Correct error regexps.
* gcc.dg/cpp/unc1.c, gcc.dg/cpp/unc2.c, gcc.dg/cpp/unc3.c:
Preprocess only.
* gcc.dg/cpp/unc4.c: Adjust line number in dg-error line.
* gcc.dg/noncompile/const-ll-1.c: Generalize error regexp.
From-SVN: r36216
2000-09-07 02:37:14 +02:00
|
|
|
|
#endif /* USE_CPPLIB */
|
1993-01-30 07:06:09 +01:00
|
|
|
|
|
|
|
|
|
/* Make a variant type in the proper way for C/C++, propagating qualifiers
|
|
|
|
|
down to the element type of an array. */
|
|
|
|
|
|
|
|
|
|
tree
|
invoke.texi: Document -flang-isoc9x.
* invoke.texi: Document -flang-isoc9x.
* Makefile.in (OBJS): Add splay-tree.o.
(c-common.o): Depend on rtl.h.
(splay-tree.o): List dependencies and provide build rule.
* rtl.h (record_alias_subset): New function.
* alias.c: Include splay-tree.h.
(alias_set_entry): New type.
(CHECK_ALIAS_SETS_FOR_CONSISTENCY): Remove.
(DIFFERENT_ALIAS_SETS_P): Use mem_in_disjoint_alias_sets_p.
(mems_in_disjoin_alias_sets_p): New function.
(alias_set_compare): Likewise.
(insert_subset_children): Likewise.
(get_alias_set_entry): Likewise.
* tree.h (TYPE_RESTRICT): New macro.
(TYPE_UNQUALIFIED): New manifest constant.
(TYPE_QUAL_CONST): Likewise
(TYPE_QUAL_VOLATILE): Likewise.
(TYPE_QUAL_RESTRICT): Likewise.
(tree_type): Add restrict_flag. Reduce count of free bits.
(DECL_POINTER_ALIAS_SET): New macro.
(DECL_POINTER_ALIAS_SET_KNOWN_P): Likewise.
(tree_decl): Add pointer_alias_set.
(build_qualified_type): New function.
(build_type_variant): Define in terms of build_qualified_type.
* tree.c (set_type_quals): New function.
(make_node): Initializae DECL_POINTER_ALIAS_SET.
(build_type_attribute_variant): Use build_qualified_type and
set_type_quals.
(build_type_variant): Rename, and modify, to become...
(build_qualified_type): New function.
(build_complex_type): Use set_type_quals.
* c-tree.h (C_TYPE_OBJECT_P): New macro.
(C_TYPE_FUNCTION_P): Likewise.
(C_TYPE_INCOMPLETE_P): Likewise.
(C_TYPE_OBJECT_OR_INCOMPLETE_P): Likewise.
(c_apply_type_quals_to_decl): New function.
(c_build_qualified_type): New function.
(c_build_type_variant): Define in terms of c_build_qualified_type.
(flag_isoc9x): Declare.
* c-typeck.c (qualify_type): Use c_build_qualified_type.
(common_type): Change to use TYPE_QUALS.
(comptypes): Likewise.
(convert_for_assignment): Likewise.
* c-aux-info.c (gen_type): Likewise. Deal with `restrict'.
* c-decl.c (flag_isoc9x): Define.
(c_decode_option): Handle -flang-isoc9x.
(grokdeclarator): Update to handle restrict. Use TYPE_QUALS,
c_build_qualified_type, etc. Use c_apply_type_quals_to_decl.
* c-lex.c (init_lex): Deal with restrict.
(init_lex): Don't treat restrict as a reserved word in
-traditional mode, or without -flang-isoc9x.
* c-lex.h (rid): Add RID_RESTRICT.
* c-parse.gperf (restrict, __restrict, __restrict__): Make
equivalent to RID_RESTRICT.
* c-parse.in (TYPE_QUAL): Update comment.
* c-common.c: Include rtl.h.
(c_find_base_decl): New function.
(c_build_type_variant): Rename, and modify, to become ...
(c_build_qualified_type): New function.
(c_apply_type_quals_to_decl): Likewise.
(c_get_alias_set): For INDIRECT_REFs, check to see if we can find
a particular alias set for the reference.
* toplev.c (documented_lang_options): Add -flang-isoc9x.
From-SVN: r23212
1998-10-21 11:53:40 +02:00
|
|
|
|
c_build_qualified_type (type, type_quals)
|
1993-01-30 07:06:09 +01:00
|
|
|
|
tree type;
|
invoke.texi: Document -flang-isoc9x.
* invoke.texi: Document -flang-isoc9x.
* Makefile.in (OBJS): Add splay-tree.o.
(c-common.o): Depend on rtl.h.
(splay-tree.o): List dependencies and provide build rule.
* rtl.h (record_alias_subset): New function.
* alias.c: Include splay-tree.h.
(alias_set_entry): New type.
(CHECK_ALIAS_SETS_FOR_CONSISTENCY): Remove.
(DIFFERENT_ALIAS_SETS_P): Use mem_in_disjoint_alias_sets_p.
(mems_in_disjoin_alias_sets_p): New function.
(alias_set_compare): Likewise.
(insert_subset_children): Likewise.
(get_alias_set_entry): Likewise.
* tree.h (TYPE_RESTRICT): New macro.
(TYPE_UNQUALIFIED): New manifest constant.
(TYPE_QUAL_CONST): Likewise
(TYPE_QUAL_VOLATILE): Likewise.
(TYPE_QUAL_RESTRICT): Likewise.
(tree_type): Add restrict_flag. Reduce count of free bits.
(DECL_POINTER_ALIAS_SET): New macro.
(DECL_POINTER_ALIAS_SET_KNOWN_P): Likewise.
(tree_decl): Add pointer_alias_set.
(build_qualified_type): New function.
(build_type_variant): Define in terms of build_qualified_type.
* tree.c (set_type_quals): New function.
(make_node): Initializae DECL_POINTER_ALIAS_SET.
(build_type_attribute_variant): Use build_qualified_type and
set_type_quals.
(build_type_variant): Rename, and modify, to become...
(build_qualified_type): New function.
(build_complex_type): Use set_type_quals.
* c-tree.h (C_TYPE_OBJECT_P): New macro.
(C_TYPE_FUNCTION_P): Likewise.
(C_TYPE_INCOMPLETE_P): Likewise.
(C_TYPE_OBJECT_OR_INCOMPLETE_P): Likewise.
(c_apply_type_quals_to_decl): New function.
(c_build_qualified_type): New function.
(c_build_type_variant): Define in terms of c_build_qualified_type.
(flag_isoc9x): Declare.
* c-typeck.c (qualify_type): Use c_build_qualified_type.
(common_type): Change to use TYPE_QUALS.
(comptypes): Likewise.
(convert_for_assignment): Likewise.
* c-aux-info.c (gen_type): Likewise. Deal with `restrict'.
* c-decl.c (flag_isoc9x): Define.
(c_decode_option): Handle -flang-isoc9x.
(grokdeclarator): Update to handle restrict. Use TYPE_QUALS,
c_build_qualified_type, etc. Use c_apply_type_quals_to_decl.
* c-lex.c (init_lex): Deal with restrict.
(init_lex): Don't treat restrict as a reserved word in
-traditional mode, or without -flang-isoc9x.
* c-lex.h (rid): Add RID_RESTRICT.
* c-parse.gperf (restrict, __restrict, __restrict__): Make
equivalent to RID_RESTRICT.
* c-parse.in (TYPE_QUAL): Update comment.
* c-common.c: Include rtl.h.
(c_find_base_decl): New function.
(c_build_type_variant): Rename, and modify, to become ...
(c_build_qualified_type): New function.
(c_apply_type_quals_to_decl): Likewise.
(c_get_alias_set): For INDIRECT_REFs, check to see if we can find
a particular alias set for the reference.
* toplev.c (documented_lang_options): Add -flang-isoc9x.
From-SVN: r23212
1998-10-21 11:53:40 +02:00
|
|
|
|
int type_quals;
|
1993-01-30 07:06:09 +01:00
|
|
|
|
{
|
invoke.texi: Document -flang-isoc9x.
* invoke.texi: Document -flang-isoc9x.
* Makefile.in (OBJS): Add splay-tree.o.
(c-common.o): Depend on rtl.h.
(splay-tree.o): List dependencies and provide build rule.
* rtl.h (record_alias_subset): New function.
* alias.c: Include splay-tree.h.
(alias_set_entry): New type.
(CHECK_ALIAS_SETS_FOR_CONSISTENCY): Remove.
(DIFFERENT_ALIAS_SETS_P): Use mem_in_disjoint_alias_sets_p.
(mems_in_disjoin_alias_sets_p): New function.
(alias_set_compare): Likewise.
(insert_subset_children): Likewise.
(get_alias_set_entry): Likewise.
* tree.h (TYPE_RESTRICT): New macro.
(TYPE_UNQUALIFIED): New manifest constant.
(TYPE_QUAL_CONST): Likewise
(TYPE_QUAL_VOLATILE): Likewise.
(TYPE_QUAL_RESTRICT): Likewise.
(tree_type): Add restrict_flag. Reduce count of free bits.
(DECL_POINTER_ALIAS_SET): New macro.
(DECL_POINTER_ALIAS_SET_KNOWN_P): Likewise.
(tree_decl): Add pointer_alias_set.
(build_qualified_type): New function.
(build_type_variant): Define in terms of build_qualified_type.
* tree.c (set_type_quals): New function.
(make_node): Initializae DECL_POINTER_ALIAS_SET.
(build_type_attribute_variant): Use build_qualified_type and
set_type_quals.
(build_type_variant): Rename, and modify, to become...
(build_qualified_type): New function.
(build_complex_type): Use set_type_quals.
* c-tree.h (C_TYPE_OBJECT_P): New macro.
(C_TYPE_FUNCTION_P): Likewise.
(C_TYPE_INCOMPLETE_P): Likewise.
(C_TYPE_OBJECT_OR_INCOMPLETE_P): Likewise.
(c_apply_type_quals_to_decl): New function.
(c_build_qualified_type): New function.
(c_build_type_variant): Define in terms of c_build_qualified_type.
(flag_isoc9x): Declare.
* c-typeck.c (qualify_type): Use c_build_qualified_type.
(common_type): Change to use TYPE_QUALS.
(comptypes): Likewise.
(convert_for_assignment): Likewise.
* c-aux-info.c (gen_type): Likewise. Deal with `restrict'.
* c-decl.c (flag_isoc9x): Define.
(c_decode_option): Handle -flang-isoc9x.
(grokdeclarator): Update to handle restrict. Use TYPE_QUALS,
c_build_qualified_type, etc. Use c_apply_type_quals_to_decl.
* c-lex.c (init_lex): Deal with restrict.
(init_lex): Don't treat restrict as a reserved word in
-traditional mode, or without -flang-isoc9x.
* c-lex.h (rid): Add RID_RESTRICT.
* c-parse.gperf (restrict, __restrict, __restrict__): Make
equivalent to RID_RESTRICT.
* c-parse.in (TYPE_QUAL): Update comment.
* c-common.c: Include rtl.h.
(c_find_base_decl): New function.
(c_build_type_variant): Rename, and modify, to become ...
(c_build_qualified_type): New function.
(c_apply_type_quals_to_decl): Likewise.
(c_get_alias_set): For INDIRECT_REFs, check to see if we can find
a particular alias set for the reference.
* toplev.c (documented_lang_options): Add -flang-isoc9x.
From-SVN: r23212
1998-10-21 11:53:40 +02:00
|
|
|
|
/* A restrict-qualified pointer type must be a pointer to object or
|
|
|
|
|
incomplete type. Note that the use of POINTER_TYPE_P also allows
|
|
|
|
|
REFERENCE_TYPEs, which is appropriate for C++. Unfortunately,
|
|
|
|
|
the C++ front-end also use POINTER_TYPE for pointer-to-member
|
|
|
|
|
values, so even though it should be illegal to use `restrict'
|
|
|
|
|
with such an entity we don't flag that here. Thus, special case
|
|
|
|
|
code for that case is required in the C++ front-end. */
|
|
|
|
|
if ((type_quals & TYPE_QUAL_RESTRICT)
|
|
|
|
|
&& (!POINTER_TYPE_P (type)
|
|
|
|
|
|| !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type))))
|
|
|
|
|
{
|
|
|
|
|
error ("invalid use of `restrict'");
|
|
|
|
|
type_quals &= ~TYPE_QUAL_RESTRICT;
|
|
|
|
|
}
|
|
|
|
|
|
1993-01-30 07:06:09 +01:00
|
|
|
|
if (TREE_CODE (type) == ARRAY_TYPE)
|
invoke.texi: Document -flang-isoc9x.
* invoke.texi: Document -flang-isoc9x.
* Makefile.in (OBJS): Add splay-tree.o.
(c-common.o): Depend on rtl.h.
(splay-tree.o): List dependencies and provide build rule.
* rtl.h (record_alias_subset): New function.
* alias.c: Include splay-tree.h.
(alias_set_entry): New type.
(CHECK_ALIAS_SETS_FOR_CONSISTENCY): Remove.
(DIFFERENT_ALIAS_SETS_P): Use mem_in_disjoint_alias_sets_p.
(mems_in_disjoin_alias_sets_p): New function.
(alias_set_compare): Likewise.
(insert_subset_children): Likewise.
(get_alias_set_entry): Likewise.
* tree.h (TYPE_RESTRICT): New macro.
(TYPE_UNQUALIFIED): New manifest constant.
(TYPE_QUAL_CONST): Likewise
(TYPE_QUAL_VOLATILE): Likewise.
(TYPE_QUAL_RESTRICT): Likewise.
(tree_type): Add restrict_flag. Reduce count of free bits.
(DECL_POINTER_ALIAS_SET): New macro.
(DECL_POINTER_ALIAS_SET_KNOWN_P): Likewise.
(tree_decl): Add pointer_alias_set.
(build_qualified_type): New function.
(build_type_variant): Define in terms of build_qualified_type.
* tree.c (set_type_quals): New function.
(make_node): Initializae DECL_POINTER_ALIAS_SET.
(build_type_attribute_variant): Use build_qualified_type and
set_type_quals.
(build_type_variant): Rename, and modify, to become...
(build_qualified_type): New function.
(build_complex_type): Use set_type_quals.
* c-tree.h (C_TYPE_OBJECT_P): New macro.
(C_TYPE_FUNCTION_P): Likewise.
(C_TYPE_INCOMPLETE_P): Likewise.
(C_TYPE_OBJECT_OR_INCOMPLETE_P): Likewise.
(c_apply_type_quals_to_decl): New function.
(c_build_qualified_type): New function.
(c_build_type_variant): Define in terms of c_build_qualified_type.
(flag_isoc9x): Declare.
* c-typeck.c (qualify_type): Use c_build_qualified_type.
(common_type): Change to use TYPE_QUALS.
(comptypes): Likewise.
(convert_for_assignment): Likewise.
* c-aux-info.c (gen_type): Likewise. Deal with `restrict'.
* c-decl.c (flag_isoc9x): Define.
(c_decode_option): Handle -flang-isoc9x.
(grokdeclarator): Update to handle restrict. Use TYPE_QUALS,
c_build_qualified_type, etc. Use c_apply_type_quals_to_decl.
* c-lex.c (init_lex): Deal with restrict.
(init_lex): Don't treat restrict as a reserved word in
-traditional mode, or without -flang-isoc9x.
* c-lex.h (rid): Add RID_RESTRICT.
* c-parse.gperf (restrict, __restrict, __restrict__): Make
equivalent to RID_RESTRICT.
* c-parse.in (TYPE_QUAL): Update comment.
* c-common.c: Include rtl.h.
(c_find_base_decl): New function.
(c_build_type_variant): Rename, and modify, to become ...
(c_build_qualified_type): New function.
(c_apply_type_quals_to_decl): Likewise.
(c_get_alias_set): For INDIRECT_REFs, check to see if we can find
a particular alias set for the reference.
* toplev.c (documented_lang_options): Add -flang-isoc9x.
From-SVN: r23212
1998-10-21 11:53:40 +02:00
|
|
|
|
return build_array_type (c_build_qualified_type (TREE_TYPE (type),
|
|
|
|
|
type_quals),
|
1997-06-10 00:37:37 +02:00
|
|
|
|
TYPE_DOMAIN (type));
|
invoke.texi: Document -flang-isoc9x.
* invoke.texi: Document -flang-isoc9x.
* Makefile.in (OBJS): Add splay-tree.o.
(c-common.o): Depend on rtl.h.
(splay-tree.o): List dependencies and provide build rule.
* rtl.h (record_alias_subset): New function.
* alias.c: Include splay-tree.h.
(alias_set_entry): New type.
(CHECK_ALIAS_SETS_FOR_CONSISTENCY): Remove.
(DIFFERENT_ALIAS_SETS_P): Use mem_in_disjoint_alias_sets_p.
(mems_in_disjoin_alias_sets_p): New function.
(alias_set_compare): Likewise.
(insert_subset_children): Likewise.
(get_alias_set_entry): Likewise.
* tree.h (TYPE_RESTRICT): New macro.
(TYPE_UNQUALIFIED): New manifest constant.
(TYPE_QUAL_CONST): Likewise
(TYPE_QUAL_VOLATILE): Likewise.
(TYPE_QUAL_RESTRICT): Likewise.
(tree_type): Add restrict_flag. Reduce count of free bits.
(DECL_POINTER_ALIAS_SET): New macro.
(DECL_POINTER_ALIAS_SET_KNOWN_P): Likewise.
(tree_decl): Add pointer_alias_set.
(build_qualified_type): New function.
(build_type_variant): Define in terms of build_qualified_type.
* tree.c (set_type_quals): New function.
(make_node): Initializae DECL_POINTER_ALIAS_SET.
(build_type_attribute_variant): Use build_qualified_type and
set_type_quals.
(build_type_variant): Rename, and modify, to become...
(build_qualified_type): New function.
(build_complex_type): Use set_type_quals.
* c-tree.h (C_TYPE_OBJECT_P): New macro.
(C_TYPE_FUNCTION_P): Likewise.
(C_TYPE_INCOMPLETE_P): Likewise.
(C_TYPE_OBJECT_OR_INCOMPLETE_P): Likewise.
(c_apply_type_quals_to_decl): New function.
(c_build_qualified_type): New function.
(c_build_type_variant): Define in terms of c_build_qualified_type.
(flag_isoc9x): Declare.
* c-typeck.c (qualify_type): Use c_build_qualified_type.
(common_type): Change to use TYPE_QUALS.
(comptypes): Likewise.
(convert_for_assignment): Likewise.
* c-aux-info.c (gen_type): Likewise. Deal with `restrict'.
* c-decl.c (flag_isoc9x): Define.
(c_decode_option): Handle -flang-isoc9x.
(grokdeclarator): Update to handle restrict. Use TYPE_QUALS,
c_build_qualified_type, etc. Use c_apply_type_quals_to_decl.
* c-lex.c (init_lex): Deal with restrict.
(init_lex): Don't treat restrict as a reserved word in
-traditional mode, or without -flang-isoc9x.
* c-lex.h (rid): Add RID_RESTRICT.
* c-parse.gperf (restrict, __restrict, __restrict__): Make
equivalent to RID_RESTRICT.
* c-parse.in (TYPE_QUAL): Update comment.
* c-common.c: Include rtl.h.
(c_find_base_decl): New function.
(c_build_type_variant): Rename, and modify, to become ...
(c_build_qualified_type): New function.
(c_apply_type_quals_to_decl): Likewise.
(c_get_alias_set): For INDIRECT_REFs, check to see if we can find
a particular alias set for the reference.
* toplev.c (documented_lang_options): Add -flang-isoc9x.
From-SVN: r23212
1998-10-21 11:53:40 +02:00
|
|
|
|
return build_qualified_type (type, type_quals);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Apply the TYPE_QUALS to the new DECL. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
c_apply_type_quals_to_decl (type_quals, decl)
|
|
|
|
|
int type_quals;
|
|
|
|
|
tree decl;
|
|
|
|
|
{
|
2000-04-28 04:04:00 +02:00
|
|
|
|
if ((type_quals & TYPE_QUAL_CONST)
|
|
|
|
|
|| (TREE_TYPE (decl)
|
|
|
|
|
&& TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE))
|
invoke.texi: Document -flang-isoc9x.
* invoke.texi: Document -flang-isoc9x.
* Makefile.in (OBJS): Add splay-tree.o.
(c-common.o): Depend on rtl.h.
(splay-tree.o): List dependencies and provide build rule.
* rtl.h (record_alias_subset): New function.
* alias.c: Include splay-tree.h.
(alias_set_entry): New type.
(CHECK_ALIAS_SETS_FOR_CONSISTENCY): Remove.
(DIFFERENT_ALIAS_SETS_P): Use mem_in_disjoint_alias_sets_p.
(mems_in_disjoin_alias_sets_p): New function.
(alias_set_compare): Likewise.
(insert_subset_children): Likewise.
(get_alias_set_entry): Likewise.
* tree.h (TYPE_RESTRICT): New macro.
(TYPE_UNQUALIFIED): New manifest constant.
(TYPE_QUAL_CONST): Likewise
(TYPE_QUAL_VOLATILE): Likewise.
(TYPE_QUAL_RESTRICT): Likewise.
(tree_type): Add restrict_flag. Reduce count of free bits.
(DECL_POINTER_ALIAS_SET): New macro.
(DECL_POINTER_ALIAS_SET_KNOWN_P): Likewise.
(tree_decl): Add pointer_alias_set.
(build_qualified_type): New function.
(build_type_variant): Define in terms of build_qualified_type.
* tree.c (set_type_quals): New function.
(make_node): Initializae DECL_POINTER_ALIAS_SET.
(build_type_attribute_variant): Use build_qualified_type and
set_type_quals.
(build_type_variant): Rename, and modify, to become...
(build_qualified_type): New function.
(build_complex_type): Use set_type_quals.
* c-tree.h (C_TYPE_OBJECT_P): New macro.
(C_TYPE_FUNCTION_P): Likewise.
(C_TYPE_INCOMPLETE_P): Likewise.
(C_TYPE_OBJECT_OR_INCOMPLETE_P): Likewise.
(c_apply_type_quals_to_decl): New function.
(c_build_qualified_type): New function.
(c_build_type_variant): Define in terms of c_build_qualified_type.
(flag_isoc9x): Declare.
* c-typeck.c (qualify_type): Use c_build_qualified_type.
(common_type): Change to use TYPE_QUALS.
(comptypes): Likewise.
(convert_for_assignment): Likewise.
* c-aux-info.c (gen_type): Likewise. Deal with `restrict'.
* c-decl.c (flag_isoc9x): Define.
(c_decode_option): Handle -flang-isoc9x.
(grokdeclarator): Update to handle restrict. Use TYPE_QUALS,
c_build_qualified_type, etc. Use c_apply_type_quals_to_decl.
* c-lex.c (init_lex): Deal with restrict.
(init_lex): Don't treat restrict as a reserved word in
-traditional mode, or without -flang-isoc9x.
* c-lex.h (rid): Add RID_RESTRICT.
* c-parse.gperf (restrict, __restrict, __restrict__): Make
equivalent to RID_RESTRICT.
* c-parse.in (TYPE_QUAL): Update comment.
* c-common.c: Include rtl.h.
(c_find_base_decl): New function.
(c_build_type_variant): Rename, and modify, to become ...
(c_build_qualified_type): New function.
(c_apply_type_quals_to_decl): Likewise.
(c_get_alias_set): For INDIRECT_REFs, check to see if we can find
a particular alias set for the reference.
* toplev.c (documented_lang_options): Add -flang-isoc9x.
From-SVN: r23212
1998-10-21 11:53:40 +02:00
|
|
|
|
TREE_READONLY (decl) = 1;
|
|
|
|
|
if (type_quals & TYPE_QUAL_VOLATILE)
|
|
|
|
|
{
|
|
|
|
|
TREE_SIDE_EFFECTS (decl) = 1;
|
|
|
|
|
TREE_THIS_VOLATILE (decl) = 1;
|
|
|
|
|
}
|
1998-10-21 11:59:32 +02:00
|
|
|
|
if (type_quals & TYPE_QUAL_RESTRICT)
|
invoke.texi: Document -flang-isoc9x.
* invoke.texi: Document -flang-isoc9x.
* Makefile.in (OBJS): Add splay-tree.o.
(c-common.o): Depend on rtl.h.
(splay-tree.o): List dependencies and provide build rule.
* rtl.h (record_alias_subset): New function.
* alias.c: Include splay-tree.h.
(alias_set_entry): New type.
(CHECK_ALIAS_SETS_FOR_CONSISTENCY): Remove.
(DIFFERENT_ALIAS_SETS_P): Use mem_in_disjoint_alias_sets_p.
(mems_in_disjoin_alias_sets_p): New function.
(alias_set_compare): Likewise.
(insert_subset_children): Likewise.
(get_alias_set_entry): Likewise.
* tree.h (TYPE_RESTRICT): New macro.
(TYPE_UNQUALIFIED): New manifest constant.
(TYPE_QUAL_CONST): Likewise
(TYPE_QUAL_VOLATILE): Likewise.
(TYPE_QUAL_RESTRICT): Likewise.
(tree_type): Add restrict_flag. Reduce count of free bits.
(DECL_POINTER_ALIAS_SET): New macro.
(DECL_POINTER_ALIAS_SET_KNOWN_P): Likewise.
(tree_decl): Add pointer_alias_set.
(build_qualified_type): New function.
(build_type_variant): Define in terms of build_qualified_type.
* tree.c (set_type_quals): New function.
(make_node): Initializae DECL_POINTER_ALIAS_SET.
(build_type_attribute_variant): Use build_qualified_type and
set_type_quals.
(build_type_variant): Rename, and modify, to become...
(build_qualified_type): New function.
(build_complex_type): Use set_type_quals.
* c-tree.h (C_TYPE_OBJECT_P): New macro.
(C_TYPE_FUNCTION_P): Likewise.
(C_TYPE_INCOMPLETE_P): Likewise.
(C_TYPE_OBJECT_OR_INCOMPLETE_P): Likewise.
(c_apply_type_quals_to_decl): New function.
(c_build_qualified_type): New function.
(c_build_type_variant): Define in terms of c_build_qualified_type.
(flag_isoc9x): Declare.
* c-typeck.c (qualify_type): Use c_build_qualified_type.
(common_type): Change to use TYPE_QUALS.
(comptypes): Likewise.
(convert_for_assignment): Likewise.
* c-aux-info.c (gen_type): Likewise. Deal with `restrict'.
* c-decl.c (flag_isoc9x): Define.
(c_decode_option): Handle -flang-isoc9x.
(grokdeclarator): Update to handle restrict. Use TYPE_QUALS,
c_build_qualified_type, etc. Use c_apply_type_quals_to_decl.
* c-lex.c (init_lex): Deal with restrict.
(init_lex): Don't treat restrict as a reserved word in
-traditional mode, or without -flang-isoc9x.
* c-lex.h (rid): Add RID_RESTRICT.
* c-parse.gperf (restrict, __restrict, __restrict__): Make
equivalent to RID_RESTRICT.
* c-parse.in (TYPE_QUAL): Update comment.
* c-common.c: Include rtl.h.
(c_find_base_decl): New function.
(c_build_type_variant): Rename, and modify, to become ...
(c_build_qualified_type): New function.
(c_apply_type_quals_to_decl): Likewise.
(c_get_alias_set): For INDIRECT_REFs, check to see if we can find
a particular alias set for the reference.
* toplev.c (documented_lang_options): Add -flang-isoc9x.
From-SVN: r23212
1998-10-21 11:53:40 +02:00
|
|
|
|
{
|
1998-10-21 11:59:32 +02:00
|
|
|
|
if (!TREE_TYPE (decl)
|
|
|
|
|
|| !POINTER_TYPE_P (TREE_TYPE (decl))
|
|
|
|
|
|| !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (TREE_TYPE (decl))))
|
|
|
|
|
error ("invalid use of `restrict'");
|
|
|
|
|
else if (flag_strict_aliasing)
|
invoke.texi: Document -flang-isoc9x.
* invoke.texi: Document -flang-isoc9x.
* Makefile.in (OBJS): Add splay-tree.o.
(c-common.o): Depend on rtl.h.
(splay-tree.o): List dependencies and provide build rule.
* rtl.h (record_alias_subset): New function.
* alias.c: Include splay-tree.h.
(alias_set_entry): New type.
(CHECK_ALIAS_SETS_FOR_CONSISTENCY): Remove.
(DIFFERENT_ALIAS_SETS_P): Use mem_in_disjoint_alias_sets_p.
(mems_in_disjoin_alias_sets_p): New function.
(alias_set_compare): Likewise.
(insert_subset_children): Likewise.
(get_alias_set_entry): Likewise.
* tree.h (TYPE_RESTRICT): New macro.
(TYPE_UNQUALIFIED): New manifest constant.
(TYPE_QUAL_CONST): Likewise
(TYPE_QUAL_VOLATILE): Likewise.
(TYPE_QUAL_RESTRICT): Likewise.
(tree_type): Add restrict_flag. Reduce count of free bits.
(DECL_POINTER_ALIAS_SET): New macro.
(DECL_POINTER_ALIAS_SET_KNOWN_P): Likewise.
(tree_decl): Add pointer_alias_set.
(build_qualified_type): New function.
(build_type_variant): Define in terms of build_qualified_type.
* tree.c (set_type_quals): New function.
(make_node): Initializae DECL_POINTER_ALIAS_SET.
(build_type_attribute_variant): Use build_qualified_type and
set_type_quals.
(build_type_variant): Rename, and modify, to become...
(build_qualified_type): New function.
(build_complex_type): Use set_type_quals.
* c-tree.h (C_TYPE_OBJECT_P): New macro.
(C_TYPE_FUNCTION_P): Likewise.
(C_TYPE_INCOMPLETE_P): Likewise.
(C_TYPE_OBJECT_OR_INCOMPLETE_P): Likewise.
(c_apply_type_quals_to_decl): New function.
(c_build_qualified_type): New function.
(c_build_type_variant): Define in terms of c_build_qualified_type.
(flag_isoc9x): Declare.
* c-typeck.c (qualify_type): Use c_build_qualified_type.
(common_type): Change to use TYPE_QUALS.
(comptypes): Likewise.
(convert_for_assignment): Likewise.
* c-aux-info.c (gen_type): Likewise. Deal with `restrict'.
* c-decl.c (flag_isoc9x): Define.
(c_decode_option): Handle -flang-isoc9x.
(grokdeclarator): Update to handle restrict. Use TYPE_QUALS,
c_build_qualified_type, etc. Use c_apply_type_quals_to_decl.
* c-lex.c (init_lex): Deal with restrict.
(init_lex): Don't treat restrict as a reserved word in
-traditional mode, or without -flang-isoc9x.
* c-lex.h (rid): Add RID_RESTRICT.
* c-parse.gperf (restrict, __restrict, __restrict__): Make
equivalent to RID_RESTRICT.
* c-parse.in (TYPE_QUAL): Update comment.
* c-common.c: Include rtl.h.
(c_find_base_decl): New function.
(c_build_type_variant): Rename, and modify, to become ...
(c_build_qualified_type): New function.
(c_apply_type_quals_to_decl): Likewise.
(c_get_alias_set): For INDIRECT_REFs, check to see if we can find
a particular alias set for the reference.
* toplev.c (documented_lang_options): Add -flang-isoc9x.
From-SVN: r23212
1998-10-21 11:53:40 +02:00
|
|
|
|
{
|
1998-10-21 11:59:32 +02:00
|
|
|
|
/* No two restricted pointers can point at the same thing.
|
|
|
|
|
However, a restricted pointer can point at the same thing
|
|
|
|
|
as an unrestricted pointer, if that unrestricted pointer
|
|
|
|
|
is based on the restricted pointer. So, we make the
|
|
|
|
|
alias set for the restricted pointer a subset of the
|
|
|
|
|
alias set for the type pointed to by the type of the
|
|
|
|
|
decl. */
|
|
|
|
|
|
Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* alias.c (struct alias_entry): alias_set is HOST_WIDE_INT.
(REG_BASE_VALUE): Remove unneeded cast to unsigned.
(get_alias_set_entry): ALIAS_SET arg is HOST_WIDE_INT.
(find_base_decl): New function, from c_find_base_decl in c-common.c.
(new_alias_set): Moved from tree.c; return is HOST_WIDE_INT.
(get_alias_set): Likewise.
Major rework to do more things and allow language-specific code
to just handle special-cases.
(record_alias_subset): Args are HOST_WIDE_INT.
(record_component_alias): Local vars are HOST_WIDE_INT.
Don't handle COMPLEX_EXPR.
(get_varargs_alias_set): Moved from builtins.c.
(get_frame_alias_set): New function.
* builtins.c (expand_builtin_return_address): Use frame alias set.
(expand_builtin_setjmp, expand_builtin_longjmp): Use alias set
for setjmp buffer.
(get_memory_rtx): Rework to use set_mem_attributes.
(get_varargs_alias_set): Deleted from here.
* c-common.c (c_apply_type_quals_to_decl): Alias sets now HOST_WIDE_INT.
(c_find_base_decl): Deleted from here.
(c_get_alias_set): Remove many cases and rework to just handle
C-specific cases.
* c-common.h (c_get_alias_set): Returns HOST_WIDE_INT.
* c-decl.c (rtl.h, expr.h): Now included.
(init_decl_processing): Call record_component_aliases on array types.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for all fields that are not bitfields.
* c-typeck.c (common_type): Call record_component_aliases for array.
* caller-save.c (setup_save_areas): Rework register loop for unsigned.
Set all save areas to the frame alias set.
* calls.c (initialie_argument_information): Call set_mem_attributes.
(compute_argument_addresses, expand_call): Likewise.
* explow.c (set_mem_attributes): New function.
(stabilize): Use MEM_COPY_ATTRIBUTES and force_reg.
* expr.c (struct move_by_pieces): Remove {to,from}_{struct,readonly}.
LEN and OFFSET now HOST_WIDE_INT.
(clear_by_pieces): Similar changes.
(move_by_pieces): LEN now HOST_WIDE_INT; don't set deleted fields.
(move_by_pieces_ninsns): Now returns unsigned HOST_WIDE_INT.
(move_by_pieces_1): Don't use deleted fields, use MEM_COPY_ATTRIBUTES.
(clear_by_pieces_1): Likewise.
(emit_push_insn): Call set_mem_attributes.
(expand_expr, case INDIRECT_REF): Likewise.
(expand_expr, case VAR_DECL): Call change_address.
* expr.h (ADD_PARM_SIZE, SUB_PARM_SIZE): Use host_integerp and
tree_low_cst.
(get_varargs_alias_set, get_frame_alias_set): New decls.
(record_base_value, record_alias_subset, lang_get_alias_set): Likewise.
(new_alias_set, set_mem_attributes): Likewse.
* function.c (struct temp_slot): ALIAS_SET is HOST_WIDE_INT.
(assign_stack_temp_for_type): Likewise.
Can split slot even if alias set since can copy.
Set MEM_ALIAS_SET and MEM_SET_IN_STRUCT_P.
(assign_temp): Use host_integerp and tree_low_cst.
(put_var_into_stack): Properly handle SAVE_EXPR.
(put_addressof_into_stack): Likewise.
(assign_parms): Call set_mem_attributes.
Delete #if 0 code.
(fix_lexical_address): Put reference to chain into frame alias set.
(expand_function_start): Call set_mem_attributes.
* integrate.c (expand_inline_function): Likewise.
* recog.c (adj_offsettable_operand): Use MEM_COPY_ATTRIBUTES.
* regmove.c (try_apply_stack_adjustment): Likewise.
* reload.c (push_reload, make_memloc): Likewise.
* reload1.c (alter_reg): Make alias sets for spilled pseudos.
* rtl.def (MEM): Update comment.
* rtl.h (MEM_ALIAS_SET): Now uses XCWINT.
(move_by_pieces): Change length to HOST_WIDE_INT.
(record_base_value, record_alias_subset): Delete from here.
* stmt.c (expand_decl): Call set_mem_attributes.
* stor-layout.c (finish_record_layout): Call record_component_aliases.i
* toplev.c (compile_file): Call init_alias_once earlier.
* tree.c (lang_get_alias_set, get_alias_set, new_alias_set): Deleted
from here: now in alias.c.
* tree.h (struct tree_type): alias_set is HOST_WIDE_INT.
(struct tree_decl): Likewise.
(get_alias_set, new_alias_set, lang_get_alias_set): Deleted from here.
* varasm.c (make_function_rtl, make_decl_rtl): Call set_mem_attributes.
(output_constant_def, force_const_mem): Likewise.
* cp/Makefile.in (decl.o): Include ../expr.h.
* cp/decl.c (expr.h): Include.
(init_decl_processing): Call record_component_aliases for arrays.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for fields that aren't bitfields.
* cp/tree.c (build_cplus_array_type_1): Call record_component_aliases.
From-SVN: r34305
2000-05-31 20:37:31 +02:00
|
|
|
|
HOST_WIDE_INT pointed_to_alias_set
|
1998-10-21 11:59:32 +02:00
|
|
|
|
= get_alias_set (TREE_TYPE (TREE_TYPE (decl)));
|
2000-01-03 22:48:49 +01:00
|
|
|
|
|
Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* alias.c (struct alias_entry): alias_set is HOST_WIDE_INT.
(REG_BASE_VALUE): Remove unneeded cast to unsigned.
(get_alias_set_entry): ALIAS_SET arg is HOST_WIDE_INT.
(find_base_decl): New function, from c_find_base_decl in c-common.c.
(new_alias_set): Moved from tree.c; return is HOST_WIDE_INT.
(get_alias_set): Likewise.
Major rework to do more things and allow language-specific code
to just handle special-cases.
(record_alias_subset): Args are HOST_WIDE_INT.
(record_component_alias): Local vars are HOST_WIDE_INT.
Don't handle COMPLEX_EXPR.
(get_varargs_alias_set): Moved from builtins.c.
(get_frame_alias_set): New function.
* builtins.c (expand_builtin_return_address): Use frame alias set.
(expand_builtin_setjmp, expand_builtin_longjmp): Use alias set
for setjmp buffer.
(get_memory_rtx): Rework to use set_mem_attributes.
(get_varargs_alias_set): Deleted from here.
* c-common.c (c_apply_type_quals_to_decl): Alias sets now HOST_WIDE_INT.
(c_find_base_decl): Deleted from here.
(c_get_alias_set): Remove many cases and rework to just handle
C-specific cases.
* c-common.h (c_get_alias_set): Returns HOST_WIDE_INT.
* c-decl.c (rtl.h, expr.h): Now included.
(init_decl_processing): Call record_component_aliases on array types.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for all fields that are not bitfields.
* c-typeck.c (common_type): Call record_component_aliases for array.
* caller-save.c (setup_save_areas): Rework register loop for unsigned.
Set all save areas to the frame alias set.
* calls.c (initialie_argument_information): Call set_mem_attributes.
(compute_argument_addresses, expand_call): Likewise.
* explow.c (set_mem_attributes): New function.
(stabilize): Use MEM_COPY_ATTRIBUTES and force_reg.
* expr.c (struct move_by_pieces): Remove {to,from}_{struct,readonly}.
LEN and OFFSET now HOST_WIDE_INT.
(clear_by_pieces): Similar changes.
(move_by_pieces): LEN now HOST_WIDE_INT; don't set deleted fields.
(move_by_pieces_ninsns): Now returns unsigned HOST_WIDE_INT.
(move_by_pieces_1): Don't use deleted fields, use MEM_COPY_ATTRIBUTES.
(clear_by_pieces_1): Likewise.
(emit_push_insn): Call set_mem_attributes.
(expand_expr, case INDIRECT_REF): Likewise.
(expand_expr, case VAR_DECL): Call change_address.
* expr.h (ADD_PARM_SIZE, SUB_PARM_SIZE): Use host_integerp and
tree_low_cst.
(get_varargs_alias_set, get_frame_alias_set): New decls.
(record_base_value, record_alias_subset, lang_get_alias_set): Likewise.
(new_alias_set, set_mem_attributes): Likewse.
* function.c (struct temp_slot): ALIAS_SET is HOST_WIDE_INT.
(assign_stack_temp_for_type): Likewise.
Can split slot even if alias set since can copy.
Set MEM_ALIAS_SET and MEM_SET_IN_STRUCT_P.
(assign_temp): Use host_integerp and tree_low_cst.
(put_var_into_stack): Properly handle SAVE_EXPR.
(put_addressof_into_stack): Likewise.
(assign_parms): Call set_mem_attributes.
Delete #if 0 code.
(fix_lexical_address): Put reference to chain into frame alias set.
(expand_function_start): Call set_mem_attributes.
* integrate.c (expand_inline_function): Likewise.
* recog.c (adj_offsettable_operand): Use MEM_COPY_ATTRIBUTES.
* regmove.c (try_apply_stack_adjustment): Likewise.
* reload.c (push_reload, make_memloc): Likewise.
* reload1.c (alter_reg): Make alias sets for spilled pseudos.
* rtl.def (MEM): Update comment.
* rtl.h (MEM_ALIAS_SET): Now uses XCWINT.
(move_by_pieces): Change length to HOST_WIDE_INT.
(record_base_value, record_alias_subset): Delete from here.
* stmt.c (expand_decl): Call set_mem_attributes.
* stor-layout.c (finish_record_layout): Call record_component_aliases.i
* toplev.c (compile_file): Call init_alias_once earlier.
* tree.c (lang_get_alias_set, get_alias_set, new_alias_set): Deleted
from here: now in alias.c.
* tree.h (struct tree_type): alias_set is HOST_WIDE_INT.
(struct tree_decl): Likewise.
(get_alias_set, new_alias_set, lang_get_alias_set): Deleted from here.
* varasm.c (make_function_rtl, make_decl_rtl): Call set_mem_attributes.
(output_constant_def, force_const_mem): Likewise.
* cp/Makefile.in (decl.o): Include ../expr.h.
* cp/decl.c (expr.h): Include.
(init_decl_processing): Call record_component_aliases for arrays.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for fields that aren't bitfields.
* cp/tree.c (build_cplus_array_type_1): Call record_component_aliases.
From-SVN: r34305
2000-05-31 20:37:31 +02:00
|
|
|
|
if (pointed_to_alias_set == 0)
|
1998-10-21 11:59:32 +02:00
|
|
|
|
/* It's not legal to make a subset of alias set zero. */
|
|
|
|
|
;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
DECL_POINTER_ALIAS_SET (decl) = new_alias_set ();
|
|
|
|
|
record_alias_subset (pointed_to_alias_set,
|
|
|
|
|
DECL_POINTER_ALIAS_SET (decl));
|
|
|
|
|
}
|
invoke.texi: Document -flang-isoc9x.
* invoke.texi: Document -flang-isoc9x.
* Makefile.in (OBJS): Add splay-tree.o.
(c-common.o): Depend on rtl.h.
(splay-tree.o): List dependencies and provide build rule.
* rtl.h (record_alias_subset): New function.
* alias.c: Include splay-tree.h.
(alias_set_entry): New type.
(CHECK_ALIAS_SETS_FOR_CONSISTENCY): Remove.
(DIFFERENT_ALIAS_SETS_P): Use mem_in_disjoint_alias_sets_p.
(mems_in_disjoin_alias_sets_p): New function.
(alias_set_compare): Likewise.
(insert_subset_children): Likewise.
(get_alias_set_entry): Likewise.
* tree.h (TYPE_RESTRICT): New macro.
(TYPE_UNQUALIFIED): New manifest constant.
(TYPE_QUAL_CONST): Likewise
(TYPE_QUAL_VOLATILE): Likewise.
(TYPE_QUAL_RESTRICT): Likewise.
(tree_type): Add restrict_flag. Reduce count of free bits.
(DECL_POINTER_ALIAS_SET): New macro.
(DECL_POINTER_ALIAS_SET_KNOWN_P): Likewise.
(tree_decl): Add pointer_alias_set.
(build_qualified_type): New function.
(build_type_variant): Define in terms of build_qualified_type.
* tree.c (set_type_quals): New function.
(make_node): Initializae DECL_POINTER_ALIAS_SET.
(build_type_attribute_variant): Use build_qualified_type and
set_type_quals.
(build_type_variant): Rename, and modify, to become...
(build_qualified_type): New function.
(build_complex_type): Use set_type_quals.
* c-tree.h (C_TYPE_OBJECT_P): New macro.
(C_TYPE_FUNCTION_P): Likewise.
(C_TYPE_INCOMPLETE_P): Likewise.
(C_TYPE_OBJECT_OR_INCOMPLETE_P): Likewise.
(c_apply_type_quals_to_decl): New function.
(c_build_qualified_type): New function.
(c_build_type_variant): Define in terms of c_build_qualified_type.
(flag_isoc9x): Declare.
* c-typeck.c (qualify_type): Use c_build_qualified_type.
(common_type): Change to use TYPE_QUALS.
(comptypes): Likewise.
(convert_for_assignment): Likewise.
* c-aux-info.c (gen_type): Likewise. Deal with `restrict'.
* c-decl.c (flag_isoc9x): Define.
(c_decode_option): Handle -flang-isoc9x.
(grokdeclarator): Update to handle restrict. Use TYPE_QUALS,
c_build_qualified_type, etc. Use c_apply_type_quals_to_decl.
* c-lex.c (init_lex): Deal with restrict.
(init_lex): Don't treat restrict as a reserved word in
-traditional mode, or without -flang-isoc9x.
* c-lex.h (rid): Add RID_RESTRICT.
* c-parse.gperf (restrict, __restrict, __restrict__): Make
equivalent to RID_RESTRICT.
* c-parse.in (TYPE_QUAL): Update comment.
* c-common.c: Include rtl.h.
(c_find_base_decl): New function.
(c_build_type_variant): Rename, and modify, to become ...
(c_build_qualified_type): New function.
(c_apply_type_quals_to_decl): Likewise.
(c_get_alias_set): For INDIRECT_REFs, check to see if we can find
a particular alias set for the reference.
* toplev.c (documented_lang_options): Add -flang-isoc9x.
From-SVN: r23212
1998-10-21 11:53:40 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1998-06-25 17:14:41 +02:00
|
|
|
|
|
|
|
|
|
/* Return the typed-based alias set for T, which may be an expression
|
Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* alias.c (struct alias_entry): alias_set is HOST_WIDE_INT.
(REG_BASE_VALUE): Remove unneeded cast to unsigned.
(get_alias_set_entry): ALIAS_SET arg is HOST_WIDE_INT.
(find_base_decl): New function, from c_find_base_decl in c-common.c.
(new_alias_set): Moved from tree.c; return is HOST_WIDE_INT.
(get_alias_set): Likewise.
Major rework to do more things and allow language-specific code
to just handle special-cases.
(record_alias_subset): Args are HOST_WIDE_INT.
(record_component_alias): Local vars are HOST_WIDE_INT.
Don't handle COMPLEX_EXPR.
(get_varargs_alias_set): Moved from builtins.c.
(get_frame_alias_set): New function.
* builtins.c (expand_builtin_return_address): Use frame alias set.
(expand_builtin_setjmp, expand_builtin_longjmp): Use alias set
for setjmp buffer.
(get_memory_rtx): Rework to use set_mem_attributes.
(get_varargs_alias_set): Deleted from here.
* c-common.c (c_apply_type_quals_to_decl): Alias sets now HOST_WIDE_INT.
(c_find_base_decl): Deleted from here.
(c_get_alias_set): Remove many cases and rework to just handle
C-specific cases.
* c-common.h (c_get_alias_set): Returns HOST_WIDE_INT.
* c-decl.c (rtl.h, expr.h): Now included.
(init_decl_processing): Call record_component_aliases on array types.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for all fields that are not bitfields.
* c-typeck.c (common_type): Call record_component_aliases for array.
* caller-save.c (setup_save_areas): Rework register loop for unsigned.
Set all save areas to the frame alias set.
* calls.c (initialie_argument_information): Call set_mem_attributes.
(compute_argument_addresses, expand_call): Likewise.
* explow.c (set_mem_attributes): New function.
(stabilize): Use MEM_COPY_ATTRIBUTES and force_reg.
* expr.c (struct move_by_pieces): Remove {to,from}_{struct,readonly}.
LEN and OFFSET now HOST_WIDE_INT.
(clear_by_pieces): Similar changes.
(move_by_pieces): LEN now HOST_WIDE_INT; don't set deleted fields.
(move_by_pieces_ninsns): Now returns unsigned HOST_WIDE_INT.
(move_by_pieces_1): Don't use deleted fields, use MEM_COPY_ATTRIBUTES.
(clear_by_pieces_1): Likewise.
(emit_push_insn): Call set_mem_attributes.
(expand_expr, case INDIRECT_REF): Likewise.
(expand_expr, case VAR_DECL): Call change_address.
* expr.h (ADD_PARM_SIZE, SUB_PARM_SIZE): Use host_integerp and
tree_low_cst.
(get_varargs_alias_set, get_frame_alias_set): New decls.
(record_base_value, record_alias_subset, lang_get_alias_set): Likewise.
(new_alias_set, set_mem_attributes): Likewse.
* function.c (struct temp_slot): ALIAS_SET is HOST_WIDE_INT.
(assign_stack_temp_for_type): Likewise.
Can split slot even if alias set since can copy.
Set MEM_ALIAS_SET and MEM_SET_IN_STRUCT_P.
(assign_temp): Use host_integerp and tree_low_cst.
(put_var_into_stack): Properly handle SAVE_EXPR.
(put_addressof_into_stack): Likewise.
(assign_parms): Call set_mem_attributes.
Delete #if 0 code.
(fix_lexical_address): Put reference to chain into frame alias set.
(expand_function_start): Call set_mem_attributes.
* integrate.c (expand_inline_function): Likewise.
* recog.c (adj_offsettable_operand): Use MEM_COPY_ATTRIBUTES.
* regmove.c (try_apply_stack_adjustment): Likewise.
* reload.c (push_reload, make_memloc): Likewise.
* reload1.c (alter_reg): Make alias sets for spilled pseudos.
* rtl.def (MEM): Update comment.
* rtl.h (MEM_ALIAS_SET): Now uses XCWINT.
(move_by_pieces): Change length to HOST_WIDE_INT.
(record_base_value, record_alias_subset): Delete from here.
* stmt.c (expand_decl): Call set_mem_attributes.
* stor-layout.c (finish_record_layout): Call record_component_aliases.i
* toplev.c (compile_file): Call init_alias_once earlier.
* tree.c (lang_get_alias_set, get_alias_set, new_alias_set): Deleted
from here: now in alias.c.
* tree.h (struct tree_type): alias_set is HOST_WIDE_INT.
(struct tree_decl): Likewise.
(get_alias_set, new_alias_set, lang_get_alias_set): Deleted from here.
* varasm.c (make_function_rtl, make_decl_rtl): Call set_mem_attributes.
(output_constant_def, force_const_mem): Likewise.
* cp/Makefile.in (decl.o): Include ../expr.h.
* cp/decl.c (expr.h): Include.
(init_decl_processing): Call record_component_aliases for arrays.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for fields that aren't bitfields.
* cp/tree.c (build_cplus_array_type_1): Call record_component_aliases.
From-SVN: r34305
2000-05-31 20:37:31 +02:00
|
|
|
|
or a type. Return -1 if we don't do anything special. */
|
1998-06-25 17:14:41 +02:00
|
|
|
|
|
Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* alias.c (struct alias_entry): alias_set is HOST_WIDE_INT.
(REG_BASE_VALUE): Remove unneeded cast to unsigned.
(get_alias_set_entry): ALIAS_SET arg is HOST_WIDE_INT.
(find_base_decl): New function, from c_find_base_decl in c-common.c.
(new_alias_set): Moved from tree.c; return is HOST_WIDE_INT.
(get_alias_set): Likewise.
Major rework to do more things and allow language-specific code
to just handle special-cases.
(record_alias_subset): Args are HOST_WIDE_INT.
(record_component_alias): Local vars are HOST_WIDE_INT.
Don't handle COMPLEX_EXPR.
(get_varargs_alias_set): Moved from builtins.c.
(get_frame_alias_set): New function.
* builtins.c (expand_builtin_return_address): Use frame alias set.
(expand_builtin_setjmp, expand_builtin_longjmp): Use alias set
for setjmp buffer.
(get_memory_rtx): Rework to use set_mem_attributes.
(get_varargs_alias_set): Deleted from here.
* c-common.c (c_apply_type_quals_to_decl): Alias sets now HOST_WIDE_INT.
(c_find_base_decl): Deleted from here.
(c_get_alias_set): Remove many cases and rework to just handle
C-specific cases.
* c-common.h (c_get_alias_set): Returns HOST_WIDE_INT.
* c-decl.c (rtl.h, expr.h): Now included.
(init_decl_processing): Call record_component_aliases on array types.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for all fields that are not bitfields.
* c-typeck.c (common_type): Call record_component_aliases for array.
* caller-save.c (setup_save_areas): Rework register loop for unsigned.
Set all save areas to the frame alias set.
* calls.c (initialie_argument_information): Call set_mem_attributes.
(compute_argument_addresses, expand_call): Likewise.
* explow.c (set_mem_attributes): New function.
(stabilize): Use MEM_COPY_ATTRIBUTES and force_reg.
* expr.c (struct move_by_pieces): Remove {to,from}_{struct,readonly}.
LEN and OFFSET now HOST_WIDE_INT.
(clear_by_pieces): Similar changes.
(move_by_pieces): LEN now HOST_WIDE_INT; don't set deleted fields.
(move_by_pieces_ninsns): Now returns unsigned HOST_WIDE_INT.
(move_by_pieces_1): Don't use deleted fields, use MEM_COPY_ATTRIBUTES.
(clear_by_pieces_1): Likewise.
(emit_push_insn): Call set_mem_attributes.
(expand_expr, case INDIRECT_REF): Likewise.
(expand_expr, case VAR_DECL): Call change_address.
* expr.h (ADD_PARM_SIZE, SUB_PARM_SIZE): Use host_integerp and
tree_low_cst.
(get_varargs_alias_set, get_frame_alias_set): New decls.
(record_base_value, record_alias_subset, lang_get_alias_set): Likewise.
(new_alias_set, set_mem_attributes): Likewse.
* function.c (struct temp_slot): ALIAS_SET is HOST_WIDE_INT.
(assign_stack_temp_for_type): Likewise.
Can split slot even if alias set since can copy.
Set MEM_ALIAS_SET and MEM_SET_IN_STRUCT_P.
(assign_temp): Use host_integerp and tree_low_cst.
(put_var_into_stack): Properly handle SAVE_EXPR.
(put_addressof_into_stack): Likewise.
(assign_parms): Call set_mem_attributes.
Delete #if 0 code.
(fix_lexical_address): Put reference to chain into frame alias set.
(expand_function_start): Call set_mem_attributes.
* integrate.c (expand_inline_function): Likewise.
* recog.c (adj_offsettable_operand): Use MEM_COPY_ATTRIBUTES.
* regmove.c (try_apply_stack_adjustment): Likewise.
* reload.c (push_reload, make_memloc): Likewise.
* reload1.c (alter_reg): Make alias sets for spilled pseudos.
* rtl.def (MEM): Update comment.
* rtl.h (MEM_ALIAS_SET): Now uses XCWINT.
(move_by_pieces): Change length to HOST_WIDE_INT.
(record_base_value, record_alias_subset): Delete from here.
* stmt.c (expand_decl): Call set_mem_attributes.
* stor-layout.c (finish_record_layout): Call record_component_aliases.i
* toplev.c (compile_file): Call init_alias_once earlier.
* tree.c (lang_get_alias_set, get_alias_set, new_alias_set): Deleted
from here: now in alias.c.
* tree.h (struct tree_type): alias_set is HOST_WIDE_INT.
(struct tree_decl): Likewise.
(get_alias_set, new_alias_set, lang_get_alias_set): Deleted from here.
* varasm.c (make_function_rtl, make_decl_rtl): Call set_mem_attributes.
(output_constant_def, force_const_mem): Likewise.
* cp/Makefile.in (decl.o): Include ../expr.h.
* cp/decl.c (expr.h): Include.
(init_decl_processing): Call record_component_aliases for arrays.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for fields that aren't bitfields.
* cp/tree.c (build_cplus_array_type_1): Call record_component_aliases.
From-SVN: r34305
2000-05-31 20:37:31 +02:00
|
|
|
|
HOST_WIDE_INT
|
2000-06-03 02:33:00 +02:00
|
|
|
|
lang_get_alias_set (t)
|
1998-06-25 17:14:41 +02:00
|
|
|
|
tree t;
|
|
|
|
|
{
|
1998-10-31 21:44:46 +01:00
|
|
|
|
tree u;
|
1998-06-25 17:14:41 +02:00
|
|
|
|
|
1998-10-31 21:44:46 +01:00
|
|
|
|
/* Permit type-punning when accessing a union, provided the access
|
|
|
|
|
is directly through the union. For example, this code does not
|
|
|
|
|
permit taking the address of a union member and then storing
|
|
|
|
|
through it. Even the type-punning allowed here is a GCC
|
|
|
|
|
extension, albeit a common and useful one; the C standard says
|
|
|
|
|
that such accesses have implementation-defined behavior. */
|
|
|
|
|
for (u = t;
|
|
|
|
|
TREE_CODE (u) == COMPONENT_REF || TREE_CODE (u) == ARRAY_REF;
|
|
|
|
|
u = TREE_OPERAND (u, 0))
|
|
|
|
|
if (TREE_CODE (u) == COMPONENT_REF
|
|
|
|
|
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE)
|
|
|
|
|
return 0;
|
1998-09-28 09:44:12 +02:00
|
|
|
|
|
Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* alias.c (struct alias_entry): alias_set is HOST_WIDE_INT.
(REG_BASE_VALUE): Remove unneeded cast to unsigned.
(get_alias_set_entry): ALIAS_SET arg is HOST_WIDE_INT.
(find_base_decl): New function, from c_find_base_decl in c-common.c.
(new_alias_set): Moved from tree.c; return is HOST_WIDE_INT.
(get_alias_set): Likewise.
Major rework to do more things and allow language-specific code
to just handle special-cases.
(record_alias_subset): Args are HOST_WIDE_INT.
(record_component_alias): Local vars are HOST_WIDE_INT.
Don't handle COMPLEX_EXPR.
(get_varargs_alias_set): Moved from builtins.c.
(get_frame_alias_set): New function.
* builtins.c (expand_builtin_return_address): Use frame alias set.
(expand_builtin_setjmp, expand_builtin_longjmp): Use alias set
for setjmp buffer.
(get_memory_rtx): Rework to use set_mem_attributes.
(get_varargs_alias_set): Deleted from here.
* c-common.c (c_apply_type_quals_to_decl): Alias sets now HOST_WIDE_INT.
(c_find_base_decl): Deleted from here.
(c_get_alias_set): Remove many cases and rework to just handle
C-specific cases.
* c-common.h (c_get_alias_set): Returns HOST_WIDE_INT.
* c-decl.c (rtl.h, expr.h): Now included.
(init_decl_processing): Call record_component_aliases on array types.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for all fields that are not bitfields.
* c-typeck.c (common_type): Call record_component_aliases for array.
* caller-save.c (setup_save_areas): Rework register loop for unsigned.
Set all save areas to the frame alias set.
* calls.c (initialie_argument_information): Call set_mem_attributes.
(compute_argument_addresses, expand_call): Likewise.
* explow.c (set_mem_attributes): New function.
(stabilize): Use MEM_COPY_ATTRIBUTES and force_reg.
* expr.c (struct move_by_pieces): Remove {to,from}_{struct,readonly}.
LEN and OFFSET now HOST_WIDE_INT.
(clear_by_pieces): Similar changes.
(move_by_pieces): LEN now HOST_WIDE_INT; don't set deleted fields.
(move_by_pieces_ninsns): Now returns unsigned HOST_WIDE_INT.
(move_by_pieces_1): Don't use deleted fields, use MEM_COPY_ATTRIBUTES.
(clear_by_pieces_1): Likewise.
(emit_push_insn): Call set_mem_attributes.
(expand_expr, case INDIRECT_REF): Likewise.
(expand_expr, case VAR_DECL): Call change_address.
* expr.h (ADD_PARM_SIZE, SUB_PARM_SIZE): Use host_integerp and
tree_low_cst.
(get_varargs_alias_set, get_frame_alias_set): New decls.
(record_base_value, record_alias_subset, lang_get_alias_set): Likewise.
(new_alias_set, set_mem_attributes): Likewse.
* function.c (struct temp_slot): ALIAS_SET is HOST_WIDE_INT.
(assign_stack_temp_for_type): Likewise.
Can split slot even if alias set since can copy.
Set MEM_ALIAS_SET and MEM_SET_IN_STRUCT_P.
(assign_temp): Use host_integerp and tree_low_cst.
(put_var_into_stack): Properly handle SAVE_EXPR.
(put_addressof_into_stack): Likewise.
(assign_parms): Call set_mem_attributes.
Delete #if 0 code.
(fix_lexical_address): Put reference to chain into frame alias set.
(expand_function_start): Call set_mem_attributes.
* integrate.c (expand_inline_function): Likewise.
* recog.c (adj_offsettable_operand): Use MEM_COPY_ATTRIBUTES.
* regmove.c (try_apply_stack_adjustment): Likewise.
* reload.c (push_reload, make_memloc): Likewise.
* reload1.c (alter_reg): Make alias sets for spilled pseudos.
* rtl.def (MEM): Update comment.
* rtl.h (MEM_ALIAS_SET): Now uses XCWINT.
(move_by_pieces): Change length to HOST_WIDE_INT.
(record_base_value, record_alias_subset): Delete from here.
* stmt.c (expand_decl): Call set_mem_attributes.
* stor-layout.c (finish_record_layout): Call record_component_aliases.i
* toplev.c (compile_file): Call init_alias_once earlier.
* tree.c (lang_get_alias_set, get_alias_set, new_alias_set): Deleted
from here: now in alias.c.
* tree.h (struct tree_type): alias_set is HOST_WIDE_INT.
(struct tree_decl): Likewise.
(get_alias_set, new_alias_set, lang_get_alias_set): Deleted from here.
* varasm.c (make_function_rtl, make_decl_rtl): Call set_mem_attributes.
(output_constant_def, force_const_mem): Likewise.
* cp/Makefile.in (decl.o): Include ../expr.h.
* cp/decl.c (expr.h): Include.
(init_decl_processing): Call record_component_aliases for arrays.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for fields that aren't bitfields.
* cp/tree.c (build_cplus_array_type_1): Call record_component_aliases.
From-SVN: r34305
2000-05-31 20:37:31 +02:00
|
|
|
|
/* If this is a char *, the ANSI C standard says it can alias
|
2000-06-01 18:18:18 +02:00
|
|
|
|
anything. Note that all references need do this. */
|
|
|
|
|
if (TREE_CODE_CLASS (TREE_CODE (t)) == 'r'
|
|
|
|
|
&& TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
|
|
|
|
|
&& TYPE_PRECISION (TREE_TYPE (t)) == TYPE_PRECISION (char_type_node))
|
Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* alias.c (struct alias_entry): alias_set is HOST_WIDE_INT.
(REG_BASE_VALUE): Remove unneeded cast to unsigned.
(get_alias_set_entry): ALIAS_SET arg is HOST_WIDE_INT.
(find_base_decl): New function, from c_find_base_decl in c-common.c.
(new_alias_set): Moved from tree.c; return is HOST_WIDE_INT.
(get_alias_set): Likewise.
Major rework to do more things and allow language-specific code
to just handle special-cases.
(record_alias_subset): Args are HOST_WIDE_INT.
(record_component_alias): Local vars are HOST_WIDE_INT.
Don't handle COMPLEX_EXPR.
(get_varargs_alias_set): Moved from builtins.c.
(get_frame_alias_set): New function.
* builtins.c (expand_builtin_return_address): Use frame alias set.
(expand_builtin_setjmp, expand_builtin_longjmp): Use alias set
for setjmp buffer.
(get_memory_rtx): Rework to use set_mem_attributes.
(get_varargs_alias_set): Deleted from here.
* c-common.c (c_apply_type_quals_to_decl): Alias sets now HOST_WIDE_INT.
(c_find_base_decl): Deleted from here.
(c_get_alias_set): Remove many cases and rework to just handle
C-specific cases.
* c-common.h (c_get_alias_set): Returns HOST_WIDE_INT.
* c-decl.c (rtl.h, expr.h): Now included.
(init_decl_processing): Call record_component_aliases on array types.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for all fields that are not bitfields.
* c-typeck.c (common_type): Call record_component_aliases for array.
* caller-save.c (setup_save_areas): Rework register loop for unsigned.
Set all save areas to the frame alias set.
* calls.c (initialie_argument_information): Call set_mem_attributes.
(compute_argument_addresses, expand_call): Likewise.
* explow.c (set_mem_attributes): New function.
(stabilize): Use MEM_COPY_ATTRIBUTES and force_reg.
* expr.c (struct move_by_pieces): Remove {to,from}_{struct,readonly}.
LEN and OFFSET now HOST_WIDE_INT.
(clear_by_pieces): Similar changes.
(move_by_pieces): LEN now HOST_WIDE_INT; don't set deleted fields.
(move_by_pieces_ninsns): Now returns unsigned HOST_WIDE_INT.
(move_by_pieces_1): Don't use deleted fields, use MEM_COPY_ATTRIBUTES.
(clear_by_pieces_1): Likewise.
(emit_push_insn): Call set_mem_attributes.
(expand_expr, case INDIRECT_REF): Likewise.
(expand_expr, case VAR_DECL): Call change_address.
* expr.h (ADD_PARM_SIZE, SUB_PARM_SIZE): Use host_integerp and
tree_low_cst.
(get_varargs_alias_set, get_frame_alias_set): New decls.
(record_base_value, record_alias_subset, lang_get_alias_set): Likewise.
(new_alias_set, set_mem_attributes): Likewse.
* function.c (struct temp_slot): ALIAS_SET is HOST_WIDE_INT.
(assign_stack_temp_for_type): Likewise.
Can split slot even if alias set since can copy.
Set MEM_ALIAS_SET and MEM_SET_IN_STRUCT_P.
(assign_temp): Use host_integerp and tree_low_cst.
(put_var_into_stack): Properly handle SAVE_EXPR.
(put_addressof_into_stack): Likewise.
(assign_parms): Call set_mem_attributes.
Delete #if 0 code.
(fix_lexical_address): Put reference to chain into frame alias set.
(expand_function_start): Call set_mem_attributes.
* integrate.c (expand_inline_function): Likewise.
* recog.c (adj_offsettable_operand): Use MEM_COPY_ATTRIBUTES.
* regmove.c (try_apply_stack_adjustment): Likewise.
* reload.c (push_reload, make_memloc): Likewise.
* reload1.c (alter_reg): Make alias sets for spilled pseudos.
* rtl.def (MEM): Update comment.
* rtl.h (MEM_ALIAS_SET): Now uses XCWINT.
(move_by_pieces): Change length to HOST_WIDE_INT.
(record_base_value, record_alias_subset): Delete from here.
* stmt.c (expand_decl): Call set_mem_attributes.
* stor-layout.c (finish_record_layout): Call record_component_aliases.i
* toplev.c (compile_file): Call init_alias_once earlier.
* tree.c (lang_get_alias_set, get_alias_set, new_alias_set): Deleted
from here: now in alias.c.
* tree.h (struct tree_type): alias_set is HOST_WIDE_INT.
(struct tree_decl): Likewise.
(get_alias_set, new_alias_set, lang_get_alias_set): Deleted from here.
* varasm.c (make_function_rtl, make_decl_rtl): Call set_mem_attributes.
(output_constant_def, force_const_mem): Likewise.
* cp/Makefile.in (decl.o): Include ../expr.h.
* cp/decl.c (expr.h): Include.
(init_decl_processing): Call record_component_aliases for arrays.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for fields that aren't bitfields.
* cp/tree.c (build_cplus_array_type_1): Call record_component_aliases.
From-SVN: r34305
2000-05-31 20:37:31 +02:00
|
|
|
|
return 0;
|
invoke.texi: Document -flang-isoc9x.
* invoke.texi: Document -flang-isoc9x.
* Makefile.in (OBJS): Add splay-tree.o.
(c-common.o): Depend on rtl.h.
(splay-tree.o): List dependencies and provide build rule.
* rtl.h (record_alias_subset): New function.
* alias.c: Include splay-tree.h.
(alias_set_entry): New type.
(CHECK_ALIAS_SETS_FOR_CONSISTENCY): Remove.
(DIFFERENT_ALIAS_SETS_P): Use mem_in_disjoint_alias_sets_p.
(mems_in_disjoin_alias_sets_p): New function.
(alias_set_compare): Likewise.
(insert_subset_children): Likewise.
(get_alias_set_entry): Likewise.
* tree.h (TYPE_RESTRICT): New macro.
(TYPE_UNQUALIFIED): New manifest constant.
(TYPE_QUAL_CONST): Likewise
(TYPE_QUAL_VOLATILE): Likewise.
(TYPE_QUAL_RESTRICT): Likewise.
(tree_type): Add restrict_flag. Reduce count of free bits.
(DECL_POINTER_ALIAS_SET): New macro.
(DECL_POINTER_ALIAS_SET_KNOWN_P): Likewise.
(tree_decl): Add pointer_alias_set.
(build_qualified_type): New function.
(build_type_variant): Define in terms of build_qualified_type.
* tree.c (set_type_quals): New function.
(make_node): Initializae DECL_POINTER_ALIAS_SET.
(build_type_attribute_variant): Use build_qualified_type and
set_type_quals.
(build_type_variant): Rename, and modify, to become...
(build_qualified_type): New function.
(build_complex_type): Use set_type_quals.
* c-tree.h (C_TYPE_OBJECT_P): New macro.
(C_TYPE_FUNCTION_P): Likewise.
(C_TYPE_INCOMPLETE_P): Likewise.
(C_TYPE_OBJECT_OR_INCOMPLETE_P): Likewise.
(c_apply_type_quals_to_decl): New function.
(c_build_qualified_type): New function.
(c_build_type_variant): Define in terms of c_build_qualified_type.
(flag_isoc9x): Declare.
* c-typeck.c (qualify_type): Use c_build_qualified_type.
(common_type): Change to use TYPE_QUALS.
(comptypes): Likewise.
(convert_for_assignment): Likewise.
* c-aux-info.c (gen_type): Likewise. Deal with `restrict'.
* c-decl.c (flag_isoc9x): Define.
(c_decode_option): Handle -flang-isoc9x.
(grokdeclarator): Update to handle restrict. Use TYPE_QUALS,
c_build_qualified_type, etc. Use c_apply_type_quals_to_decl.
* c-lex.c (init_lex): Deal with restrict.
(init_lex): Don't treat restrict as a reserved word in
-traditional mode, or without -flang-isoc9x.
* c-lex.h (rid): Add RID_RESTRICT.
* c-parse.gperf (restrict, __restrict, __restrict__): Make
equivalent to RID_RESTRICT.
* c-parse.in (TYPE_QUAL): Update comment.
* c-common.c: Include rtl.h.
(c_find_base_decl): New function.
(c_build_type_variant): Rename, and modify, to become ...
(c_build_qualified_type): New function.
(c_apply_type_quals_to_decl): Likewise.
(c_get_alias_set): For INDIRECT_REFs, check to see if we can find
a particular alias set for the reference.
* toplev.c (documented_lang_options): Add -flang-isoc9x.
From-SVN: r23212
1998-10-21 11:53:40 +02:00
|
|
|
|
|
Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* alias.c (struct alias_entry): alias_set is HOST_WIDE_INT.
(REG_BASE_VALUE): Remove unneeded cast to unsigned.
(get_alias_set_entry): ALIAS_SET arg is HOST_WIDE_INT.
(find_base_decl): New function, from c_find_base_decl in c-common.c.
(new_alias_set): Moved from tree.c; return is HOST_WIDE_INT.
(get_alias_set): Likewise.
Major rework to do more things and allow language-specific code
to just handle special-cases.
(record_alias_subset): Args are HOST_WIDE_INT.
(record_component_alias): Local vars are HOST_WIDE_INT.
Don't handle COMPLEX_EXPR.
(get_varargs_alias_set): Moved from builtins.c.
(get_frame_alias_set): New function.
* builtins.c (expand_builtin_return_address): Use frame alias set.
(expand_builtin_setjmp, expand_builtin_longjmp): Use alias set
for setjmp buffer.
(get_memory_rtx): Rework to use set_mem_attributes.
(get_varargs_alias_set): Deleted from here.
* c-common.c (c_apply_type_quals_to_decl): Alias sets now HOST_WIDE_INT.
(c_find_base_decl): Deleted from here.
(c_get_alias_set): Remove many cases and rework to just handle
C-specific cases.
* c-common.h (c_get_alias_set): Returns HOST_WIDE_INT.
* c-decl.c (rtl.h, expr.h): Now included.
(init_decl_processing): Call record_component_aliases on array types.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for all fields that are not bitfields.
* c-typeck.c (common_type): Call record_component_aliases for array.
* caller-save.c (setup_save_areas): Rework register loop for unsigned.
Set all save areas to the frame alias set.
* calls.c (initialie_argument_information): Call set_mem_attributes.
(compute_argument_addresses, expand_call): Likewise.
* explow.c (set_mem_attributes): New function.
(stabilize): Use MEM_COPY_ATTRIBUTES and force_reg.
* expr.c (struct move_by_pieces): Remove {to,from}_{struct,readonly}.
LEN and OFFSET now HOST_WIDE_INT.
(clear_by_pieces): Similar changes.
(move_by_pieces): LEN now HOST_WIDE_INT; don't set deleted fields.
(move_by_pieces_ninsns): Now returns unsigned HOST_WIDE_INT.
(move_by_pieces_1): Don't use deleted fields, use MEM_COPY_ATTRIBUTES.
(clear_by_pieces_1): Likewise.
(emit_push_insn): Call set_mem_attributes.
(expand_expr, case INDIRECT_REF): Likewise.
(expand_expr, case VAR_DECL): Call change_address.
* expr.h (ADD_PARM_SIZE, SUB_PARM_SIZE): Use host_integerp and
tree_low_cst.
(get_varargs_alias_set, get_frame_alias_set): New decls.
(record_base_value, record_alias_subset, lang_get_alias_set): Likewise.
(new_alias_set, set_mem_attributes): Likewse.
* function.c (struct temp_slot): ALIAS_SET is HOST_WIDE_INT.
(assign_stack_temp_for_type): Likewise.
Can split slot even if alias set since can copy.
Set MEM_ALIAS_SET and MEM_SET_IN_STRUCT_P.
(assign_temp): Use host_integerp and tree_low_cst.
(put_var_into_stack): Properly handle SAVE_EXPR.
(put_addressof_into_stack): Likewise.
(assign_parms): Call set_mem_attributes.
Delete #if 0 code.
(fix_lexical_address): Put reference to chain into frame alias set.
(expand_function_start): Call set_mem_attributes.
* integrate.c (expand_inline_function): Likewise.
* recog.c (adj_offsettable_operand): Use MEM_COPY_ATTRIBUTES.
* regmove.c (try_apply_stack_adjustment): Likewise.
* reload.c (push_reload, make_memloc): Likewise.
* reload1.c (alter_reg): Make alias sets for spilled pseudos.
* rtl.def (MEM): Update comment.
* rtl.h (MEM_ALIAS_SET): Now uses XCWINT.
(move_by_pieces): Change length to HOST_WIDE_INT.
(record_base_value, record_alias_subset): Delete from here.
* stmt.c (expand_decl): Call set_mem_attributes.
* stor-layout.c (finish_record_layout): Call record_component_aliases.i
* toplev.c (compile_file): Call init_alias_once earlier.
* tree.c (lang_get_alias_set, get_alias_set, new_alias_set): Deleted
from here: now in alias.c.
* tree.h (struct tree_type): alias_set is HOST_WIDE_INT.
(struct tree_decl): Likewise.
(get_alias_set, new_alias_set, lang_get_alias_set): Deleted from here.
* varasm.c (make_function_rtl, make_decl_rtl): Call set_mem_attributes.
(output_constant_def, force_const_mem): Likewise.
* cp/Makefile.in (decl.o): Include ../expr.h.
* cp/decl.c (expr.h): Include.
(init_decl_processing): Call record_component_aliases for arrays.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for fields that aren't bitfields.
* cp/tree.c (build_cplus_array_type_1): Call record_component_aliases.
From-SVN: r34305
2000-05-31 20:37:31 +02:00
|
|
|
|
/* That's all the expressions we handle specially. */
|
|
|
|
|
if (! TYPE_P (t))
|
|
|
|
|
return -1;
|
1998-06-25 17:14:41 +02:00
|
|
|
|
|
2000-06-01 18:18:18 +02:00
|
|
|
|
/* The C standard specifically allows aliasing between signed and
|
|
|
|
|
unsigned variants of the same type. We treat the signed
|
|
|
|
|
variant as canonical. */
|
|
|
|
|
if (TREE_CODE (t) == INTEGER_TYPE && TREE_UNSIGNED (t))
|
2000-06-02 14:50:08 +02:00
|
|
|
|
{
|
|
|
|
|
tree t1 = signed_type (t);
|
2000-06-01 18:18:18 +02:00
|
|
|
|
|
2000-06-02 14:50:08 +02:00
|
|
|
|
/* t1 == t can happen for boolean nodes which are always unsigned. */
|
|
|
|
|
if (t1 != t)
|
|
|
|
|
return get_alias_set (t1);
|
|
|
|
|
}
|
Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* alias.c (struct alias_entry): alias_set is HOST_WIDE_INT.
(REG_BASE_VALUE): Remove unneeded cast to unsigned.
(get_alias_set_entry): ALIAS_SET arg is HOST_WIDE_INT.
(find_base_decl): New function, from c_find_base_decl in c-common.c.
(new_alias_set): Moved from tree.c; return is HOST_WIDE_INT.
(get_alias_set): Likewise.
Major rework to do more things and allow language-specific code
to just handle special-cases.
(record_alias_subset): Args are HOST_WIDE_INT.
(record_component_alias): Local vars are HOST_WIDE_INT.
Don't handle COMPLEX_EXPR.
(get_varargs_alias_set): Moved from builtins.c.
(get_frame_alias_set): New function.
* builtins.c (expand_builtin_return_address): Use frame alias set.
(expand_builtin_setjmp, expand_builtin_longjmp): Use alias set
for setjmp buffer.
(get_memory_rtx): Rework to use set_mem_attributes.
(get_varargs_alias_set): Deleted from here.
* c-common.c (c_apply_type_quals_to_decl): Alias sets now HOST_WIDE_INT.
(c_find_base_decl): Deleted from here.
(c_get_alias_set): Remove many cases and rework to just handle
C-specific cases.
* c-common.h (c_get_alias_set): Returns HOST_WIDE_INT.
* c-decl.c (rtl.h, expr.h): Now included.
(init_decl_processing): Call record_component_aliases on array types.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for all fields that are not bitfields.
* c-typeck.c (common_type): Call record_component_aliases for array.
* caller-save.c (setup_save_areas): Rework register loop for unsigned.
Set all save areas to the frame alias set.
* calls.c (initialie_argument_information): Call set_mem_attributes.
(compute_argument_addresses, expand_call): Likewise.
* explow.c (set_mem_attributes): New function.
(stabilize): Use MEM_COPY_ATTRIBUTES and force_reg.
* expr.c (struct move_by_pieces): Remove {to,from}_{struct,readonly}.
LEN and OFFSET now HOST_WIDE_INT.
(clear_by_pieces): Similar changes.
(move_by_pieces): LEN now HOST_WIDE_INT; don't set deleted fields.
(move_by_pieces_ninsns): Now returns unsigned HOST_WIDE_INT.
(move_by_pieces_1): Don't use deleted fields, use MEM_COPY_ATTRIBUTES.
(clear_by_pieces_1): Likewise.
(emit_push_insn): Call set_mem_attributes.
(expand_expr, case INDIRECT_REF): Likewise.
(expand_expr, case VAR_DECL): Call change_address.
* expr.h (ADD_PARM_SIZE, SUB_PARM_SIZE): Use host_integerp and
tree_low_cst.
(get_varargs_alias_set, get_frame_alias_set): New decls.
(record_base_value, record_alias_subset, lang_get_alias_set): Likewise.
(new_alias_set, set_mem_attributes): Likewse.
* function.c (struct temp_slot): ALIAS_SET is HOST_WIDE_INT.
(assign_stack_temp_for_type): Likewise.
Can split slot even if alias set since can copy.
Set MEM_ALIAS_SET and MEM_SET_IN_STRUCT_P.
(assign_temp): Use host_integerp and tree_low_cst.
(put_var_into_stack): Properly handle SAVE_EXPR.
(put_addressof_into_stack): Likewise.
(assign_parms): Call set_mem_attributes.
Delete #if 0 code.
(fix_lexical_address): Put reference to chain into frame alias set.
(expand_function_start): Call set_mem_attributes.
* integrate.c (expand_inline_function): Likewise.
* recog.c (adj_offsettable_operand): Use MEM_COPY_ATTRIBUTES.
* regmove.c (try_apply_stack_adjustment): Likewise.
* reload.c (push_reload, make_memloc): Likewise.
* reload1.c (alter_reg): Make alias sets for spilled pseudos.
* rtl.def (MEM): Update comment.
* rtl.h (MEM_ALIAS_SET): Now uses XCWINT.
(move_by_pieces): Change length to HOST_WIDE_INT.
(record_base_value, record_alias_subset): Delete from here.
* stmt.c (expand_decl): Call set_mem_attributes.
* stor-layout.c (finish_record_layout): Call record_component_aliases.i
* toplev.c (compile_file): Call init_alias_once earlier.
* tree.c (lang_get_alias_set, get_alias_set, new_alias_set): Deleted
from here: now in alias.c.
* tree.h (struct tree_type): alias_set is HOST_WIDE_INT.
(struct tree_decl): Likewise.
(get_alias_set, new_alias_set, lang_get_alias_set): Deleted from here.
* varasm.c (make_function_rtl, make_decl_rtl): Call set_mem_attributes.
(output_constant_def, force_const_mem): Likewise.
* cp/Makefile.in (decl.o): Include ../expr.h.
* cp/decl.c (expr.h): Include.
(init_decl_processing): Call record_component_aliases for arrays.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for fields that aren't bitfields.
* cp/tree.c (build_cplus_array_type_1): Call record_component_aliases.
From-SVN: r34305
2000-05-31 20:37:31 +02:00
|
|
|
|
else if (POINTER_TYPE_P (t))
|
1999-08-19 23:39:04 +02:00
|
|
|
|
{
|
Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* alias.c (struct alias_entry): alias_set is HOST_WIDE_INT.
(REG_BASE_VALUE): Remove unneeded cast to unsigned.
(get_alias_set_entry): ALIAS_SET arg is HOST_WIDE_INT.
(find_base_decl): New function, from c_find_base_decl in c-common.c.
(new_alias_set): Moved from tree.c; return is HOST_WIDE_INT.
(get_alias_set): Likewise.
Major rework to do more things and allow language-specific code
to just handle special-cases.
(record_alias_subset): Args are HOST_WIDE_INT.
(record_component_alias): Local vars are HOST_WIDE_INT.
Don't handle COMPLEX_EXPR.
(get_varargs_alias_set): Moved from builtins.c.
(get_frame_alias_set): New function.
* builtins.c (expand_builtin_return_address): Use frame alias set.
(expand_builtin_setjmp, expand_builtin_longjmp): Use alias set
for setjmp buffer.
(get_memory_rtx): Rework to use set_mem_attributes.
(get_varargs_alias_set): Deleted from here.
* c-common.c (c_apply_type_quals_to_decl): Alias sets now HOST_WIDE_INT.
(c_find_base_decl): Deleted from here.
(c_get_alias_set): Remove many cases and rework to just handle
C-specific cases.
* c-common.h (c_get_alias_set): Returns HOST_WIDE_INT.
* c-decl.c (rtl.h, expr.h): Now included.
(init_decl_processing): Call record_component_aliases on array types.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for all fields that are not bitfields.
* c-typeck.c (common_type): Call record_component_aliases for array.
* caller-save.c (setup_save_areas): Rework register loop for unsigned.
Set all save areas to the frame alias set.
* calls.c (initialie_argument_information): Call set_mem_attributes.
(compute_argument_addresses, expand_call): Likewise.
* explow.c (set_mem_attributes): New function.
(stabilize): Use MEM_COPY_ATTRIBUTES and force_reg.
* expr.c (struct move_by_pieces): Remove {to,from}_{struct,readonly}.
LEN and OFFSET now HOST_WIDE_INT.
(clear_by_pieces): Similar changes.
(move_by_pieces): LEN now HOST_WIDE_INT; don't set deleted fields.
(move_by_pieces_ninsns): Now returns unsigned HOST_WIDE_INT.
(move_by_pieces_1): Don't use deleted fields, use MEM_COPY_ATTRIBUTES.
(clear_by_pieces_1): Likewise.
(emit_push_insn): Call set_mem_attributes.
(expand_expr, case INDIRECT_REF): Likewise.
(expand_expr, case VAR_DECL): Call change_address.
* expr.h (ADD_PARM_SIZE, SUB_PARM_SIZE): Use host_integerp and
tree_low_cst.
(get_varargs_alias_set, get_frame_alias_set): New decls.
(record_base_value, record_alias_subset, lang_get_alias_set): Likewise.
(new_alias_set, set_mem_attributes): Likewse.
* function.c (struct temp_slot): ALIAS_SET is HOST_WIDE_INT.
(assign_stack_temp_for_type): Likewise.
Can split slot even if alias set since can copy.
Set MEM_ALIAS_SET and MEM_SET_IN_STRUCT_P.
(assign_temp): Use host_integerp and tree_low_cst.
(put_var_into_stack): Properly handle SAVE_EXPR.
(put_addressof_into_stack): Likewise.
(assign_parms): Call set_mem_attributes.
Delete #if 0 code.
(fix_lexical_address): Put reference to chain into frame alias set.
(expand_function_start): Call set_mem_attributes.
* integrate.c (expand_inline_function): Likewise.
* recog.c (adj_offsettable_operand): Use MEM_COPY_ATTRIBUTES.
* regmove.c (try_apply_stack_adjustment): Likewise.
* reload.c (push_reload, make_memloc): Likewise.
* reload1.c (alter_reg): Make alias sets for spilled pseudos.
* rtl.def (MEM): Update comment.
* rtl.h (MEM_ALIAS_SET): Now uses XCWINT.
(move_by_pieces): Change length to HOST_WIDE_INT.
(record_base_value, record_alias_subset): Delete from here.
* stmt.c (expand_decl): Call set_mem_attributes.
* stor-layout.c (finish_record_layout): Call record_component_aliases.i
* toplev.c (compile_file): Call init_alias_once earlier.
* tree.c (lang_get_alias_set, get_alias_set, new_alias_set): Deleted
from here: now in alias.c.
* tree.h (struct tree_type): alias_set is HOST_WIDE_INT.
(struct tree_decl): Likewise.
(get_alias_set, new_alias_set, lang_get_alias_set): Deleted from here.
* varasm.c (make_function_rtl, make_decl_rtl): Call set_mem_attributes.
(output_constant_def, force_const_mem): Likewise.
* cp/Makefile.in (decl.o): Include ../expr.h.
* cp/decl.c (expr.h): Include.
(init_decl_processing): Call record_component_aliases for arrays.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for fields that aren't bitfields.
* cp/tree.c (build_cplus_array_type_1): Call record_component_aliases.
From-SVN: r34305
2000-05-31 20:37:31 +02:00
|
|
|
|
tree t1;
|
1999-08-19 23:39:04 +02:00
|
|
|
|
|
|
|
|
|
/* Unfortunately, there is no canonical form of a pointer type.
|
|
|
|
|
In particular, if we have `typedef int I', then `int *', and
|
|
|
|
|
`I *' are different types. So, we have to pick a canonical
|
|
|
|
|
representative. We do this below.
|
2000-01-03 22:48:49 +01:00
|
|
|
|
|
1999-08-20 23:57:38 +02:00
|
|
|
|
Technically, this approach is actually more conservative that
|
|
|
|
|
it needs to be. In particular, `const int *' and `int *'
|
|
|
|
|
chould be in different alias sets, according to the C and C++
|
|
|
|
|
standard, since their types are not the same, and so,
|
|
|
|
|
technically, an `int **' and `const int **' cannot point at
|
|
|
|
|
the same thing.
|
|
|
|
|
|
|
|
|
|
But, the standard is wrong. In particular, this code is
|
|
|
|
|
legal C++:
|
|
|
|
|
|
|
|
|
|
int *ip;
|
|
|
|
|
int **ipp = &ip;
|
|
|
|
|
const int* const* cipp = &ip;
|
|
|
|
|
|
|
|
|
|
And, it doesn't make sense for that to be legal unless you
|
|
|
|
|
can dereference IPP and CIPP. So, we ignore cv-qualifiers on
|
|
|
|
|
the pointed-to types. This issue has been reported to the
|
|
|
|
|
C++ committee. */
|
Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* alias.c (struct alias_entry): alias_set is HOST_WIDE_INT.
(REG_BASE_VALUE): Remove unneeded cast to unsigned.
(get_alias_set_entry): ALIAS_SET arg is HOST_WIDE_INT.
(find_base_decl): New function, from c_find_base_decl in c-common.c.
(new_alias_set): Moved from tree.c; return is HOST_WIDE_INT.
(get_alias_set): Likewise.
Major rework to do more things and allow language-specific code
to just handle special-cases.
(record_alias_subset): Args are HOST_WIDE_INT.
(record_component_alias): Local vars are HOST_WIDE_INT.
Don't handle COMPLEX_EXPR.
(get_varargs_alias_set): Moved from builtins.c.
(get_frame_alias_set): New function.
* builtins.c (expand_builtin_return_address): Use frame alias set.
(expand_builtin_setjmp, expand_builtin_longjmp): Use alias set
for setjmp buffer.
(get_memory_rtx): Rework to use set_mem_attributes.
(get_varargs_alias_set): Deleted from here.
* c-common.c (c_apply_type_quals_to_decl): Alias sets now HOST_WIDE_INT.
(c_find_base_decl): Deleted from here.
(c_get_alias_set): Remove many cases and rework to just handle
C-specific cases.
* c-common.h (c_get_alias_set): Returns HOST_WIDE_INT.
* c-decl.c (rtl.h, expr.h): Now included.
(init_decl_processing): Call record_component_aliases on array types.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for all fields that are not bitfields.
* c-typeck.c (common_type): Call record_component_aliases for array.
* caller-save.c (setup_save_areas): Rework register loop for unsigned.
Set all save areas to the frame alias set.
* calls.c (initialie_argument_information): Call set_mem_attributes.
(compute_argument_addresses, expand_call): Likewise.
* explow.c (set_mem_attributes): New function.
(stabilize): Use MEM_COPY_ATTRIBUTES and force_reg.
* expr.c (struct move_by_pieces): Remove {to,from}_{struct,readonly}.
LEN and OFFSET now HOST_WIDE_INT.
(clear_by_pieces): Similar changes.
(move_by_pieces): LEN now HOST_WIDE_INT; don't set deleted fields.
(move_by_pieces_ninsns): Now returns unsigned HOST_WIDE_INT.
(move_by_pieces_1): Don't use deleted fields, use MEM_COPY_ATTRIBUTES.
(clear_by_pieces_1): Likewise.
(emit_push_insn): Call set_mem_attributes.
(expand_expr, case INDIRECT_REF): Likewise.
(expand_expr, case VAR_DECL): Call change_address.
* expr.h (ADD_PARM_SIZE, SUB_PARM_SIZE): Use host_integerp and
tree_low_cst.
(get_varargs_alias_set, get_frame_alias_set): New decls.
(record_base_value, record_alias_subset, lang_get_alias_set): Likewise.
(new_alias_set, set_mem_attributes): Likewse.
* function.c (struct temp_slot): ALIAS_SET is HOST_WIDE_INT.
(assign_stack_temp_for_type): Likewise.
Can split slot even if alias set since can copy.
Set MEM_ALIAS_SET and MEM_SET_IN_STRUCT_P.
(assign_temp): Use host_integerp and tree_low_cst.
(put_var_into_stack): Properly handle SAVE_EXPR.
(put_addressof_into_stack): Likewise.
(assign_parms): Call set_mem_attributes.
Delete #if 0 code.
(fix_lexical_address): Put reference to chain into frame alias set.
(expand_function_start): Call set_mem_attributes.
* integrate.c (expand_inline_function): Likewise.
* recog.c (adj_offsettable_operand): Use MEM_COPY_ATTRIBUTES.
* regmove.c (try_apply_stack_adjustment): Likewise.
* reload.c (push_reload, make_memloc): Likewise.
* reload1.c (alter_reg): Make alias sets for spilled pseudos.
* rtl.def (MEM): Update comment.
* rtl.h (MEM_ALIAS_SET): Now uses XCWINT.
(move_by_pieces): Change length to HOST_WIDE_INT.
(record_base_value, record_alias_subset): Delete from here.
* stmt.c (expand_decl): Call set_mem_attributes.
* stor-layout.c (finish_record_layout): Call record_component_aliases.i
* toplev.c (compile_file): Call init_alias_once earlier.
* tree.c (lang_get_alias_set, get_alias_set, new_alias_set): Deleted
from here: now in alias.c.
* tree.h (struct tree_type): alias_set is HOST_WIDE_INT.
(struct tree_decl): Likewise.
(get_alias_set, new_alias_set, lang_get_alias_set): Deleted from here.
* varasm.c (make_function_rtl, make_decl_rtl): Call set_mem_attributes.
(output_constant_def, force_const_mem): Likewise.
* cp/Makefile.in (decl.o): Include ../expr.h.
* cp/decl.c (expr.h): Include.
(init_decl_processing): Call record_component_aliases for arrays.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for fields that aren't bitfields.
* cp/tree.c (build_cplus_array_type_1): Call record_component_aliases.
From-SVN: r34305
2000-05-31 20:37:31 +02:00
|
|
|
|
t1 = TYPE_MAIN_VARIANT (TREE_TYPE (t));
|
|
|
|
|
t1 = ((TREE_CODE (t) == POINTER_TYPE)
|
|
|
|
|
? build_pointer_type (t1) : build_reference_type (t1));
|
|
|
|
|
if (t1 != t)
|
|
|
|
|
return get_alias_set (t1);
|
1999-08-19 23:39:04 +02:00
|
|
|
|
}
|
2000-06-06 23:54:54 +02:00
|
|
|
|
/* It's not yet safe to use alias sets for classes in C++ because
|
|
|
|
|
the TYPE_FIELDs list for a class doesn't mention base classes. */
|
2000-06-12 21:14:08 +02:00
|
|
|
|
else if (c_language == clk_cplusplus && AGGREGATE_TYPE_P (t))
|
2000-06-06 23:54:54 +02:00
|
|
|
|
return 0;
|
1998-09-28 09:44:12 +02:00
|
|
|
|
|
Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* alias.c (struct alias_entry): alias_set is HOST_WIDE_INT.
(REG_BASE_VALUE): Remove unneeded cast to unsigned.
(get_alias_set_entry): ALIAS_SET arg is HOST_WIDE_INT.
(find_base_decl): New function, from c_find_base_decl in c-common.c.
(new_alias_set): Moved from tree.c; return is HOST_WIDE_INT.
(get_alias_set): Likewise.
Major rework to do more things and allow language-specific code
to just handle special-cases.
(record_alias_subset): Args are HOST_WIDE_INT.
(record_component_alias): Local vars are HOST_WIDE_INT.
Don't handle COMPLEX_EXPR.
(get_varargs_alias_set): Moved from builtins.c.
(get_frame_alias_set): New function.
* builtins.c (expand_builtin_return_address): Use frame alias set.
(expand_builtin_setjmp, expand_builtin_longjmp): Use alias set
for setjmp buffer.
(get_memory_rtx): Rework to use set_mem_attributes.
(get_varargs_alias_set): Deleted from here.
* c-common.c (c_apply_type_quals_to_decl): Alias sets now HOST_WIDE_INT.
(c_find_base_decl): Deleted from here.
(c_get_alias_set): Remove many cases and rework to just handle
C-specific cases.
* c-common.h (c_get_alias_set): Returns HOST_WIDE_INT.
* c-decl.c (rtl.h, expr.h): Now included.
(init_decl_processing): Call record_component_aliases on array types.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for all fields that are not bitfields.
* c-typeck.c (common_type): Call record_component_aliases for array.
* caller-save.c (setup_save_areas): Rework register loop for unsigned.
Set all save areas to the frame alias set.
* calls.c (initialie_argument_information): Call set_mem_attributes.
(compute_argument_addresses, expand_call): Likewise.
* explow.c (set_mem_attributes): New function.
(stabilize): Use MEM_COPY_ATTRIBUTES and force_reg.
* expr.c (struct move_by_pieces): Remove {to,from}_{struct,readonly}.
LEN and OFFSET now HOST_WIDE_INT.
(clear_by_pieces): Similar changes.
(move_by_pieces): LEN now HOST_WIDE_INT; don't set deleted fields.
(move_by_pieces_ninsns): Now returns unsigned HOST_WIDE_INT.
(move_by_pieces_1): Don't use deleted fields, use MEM_COPY_ATTRIBUTES.
(clear_by_pieces_1): Likewise.
(emit_push_insn): Call set_mem_attributes.
(expand_expr, case INDIRECT_REF): Likewise.
(expand_expr, case VAR_DECL): Call change_address.
* expr.h (ADD_PARM_SIZE, SUB_PARM_SIZE): Use host_integerp and
tree_low_cst.
(get_varargs_alias_set, get_frame_alias_set): New decls.
(record_base_value, record_alias_subset, lang_get_alias_set): Likewise.
(new_alias_set, set_mem_attributes): Likewse.
* function.c (struct temp_slot): ALIAS_SET is HOST_WIDE_INT.
(assign_stack_temp_for_type): Likewise.
Can split slot even if alias set since can copy.
Set MEM_ALIAS_SET and MEM_SET_IN_STRUCT_P.
(assign_temp): Use host_integerp and tree_low_cst.
(put_var_into_stack): Properly handle SAVE_EXPR.
(put_addressof_into_stack): Likewise.
(assign_parms): Call set_mem_attributes.
Delete #if 0 code.
(fix_lexical_address): Put reference to chain into frame alias set.
(expand_function_start): Call set_mem_attributes.
* integrate.c (expand_inline_function): Likewise.
* recog.c (adj_offsettable_operand): Use MEM_COPY_ATTRIBUTES.
* regmove.c (try_apply_stack_adjustment): Likewise.
* reload.c (push_reload, make_memloc): Likewise.
* reload1.c (alter_reg): Make alias sets for spilled pseudos.
* rtl.def (MEM): Update comment.
* rtl.h (MEM_ALIAS_SET): Now uses XCWINT.
(move_by_pieces): Change length to HOST_WIDE_INT.
(record_base_value, record_alias_subset): Delete from here.
* stmt.c (expand_decl): Call set_mem_attributes.
* stor-layout.c (finish_record_layout): Call record_component_aliases.i
* toplev.c (compile_file): Call init_alias_once earlier.
* tree.c (lang_get_alias_set, get_alias_set, new_alias_set): Deleted
from here: now in alias.c.
* tree.h (struct tree_type): alias_set is HOST_WIDE_INT.
(struct tree_decl): Likewise.
(get_alias_set, new_alias_set, lang_get_alias_set): Deleted from here.
* varasm.c (make_function_rtl, make_decl_rtl): Call set_mem_attributes.
(output_constant_def, force_const_mem): Likewise.
* cp/Makefile.in (decl.o): Include ../expr.h.
* cp/decl.c (expr.h): Include.
(init_decl_processing): Call record_component_aliases for arrays.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for fields that aren't bitfields.
* cp/tree.c (build_cplus_array_type_1): Call record_component_aliases.
From-SVN: r34305
2000-05-31 20:37:31 +02:00
|
|
|
|
return -1;
|
1998-06-25 17:14:41 +02:00
|
|
|
|
}
|
1999-07-20 12:41:10 +02:00
|
|
|
|
|
|
|
|
|
/* Build tree nodes and builtin functions common to both C and C++ language
|
2000-01-03 22:48:49 +01:00
|
|
|
|
frontends.
|
1999-07-20 12:41:10 +02:00
|
|
|
|
CPLUS_MODE is nonzero if we are called from the C++ frontend, we generate
|
2000-01-03 22:48:49 +01:00
|
|
|
|
some stricter prototypes in that case.
|
1999-07-20 12:41:10 +02:00
|
|
|
|
NO_BUILTINS and NO_NONANSI_BUILTINS contain the respective values of
|
|
|
|
|
the language frontend flags flag_no_builtin and
|
|
|
|
|
flag_no_nonansi_builtin. */
|
Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* Makefile.in (c-decl.o): Depend on rtl.h and expr.h.
* alias.c (struct alias_entry): alias_set is HOST_WIDE_INT.
(REG_BASE_VALUE): Remove unneeded cast to unsigned.
(get_alias_set_entry): ALIAS_SET arg is HOST_WIDE_INT.
(find_base_decl): New function, from c_find_base_decl in c-common.c.
(new_alias_set): Moved from tree.c; return is HOST_WIDE_INT.
(get_alias_set): Likewise.
Major rework to do more things and allow language-specific code
to just handle special-cases.
(record_alias_subset): Args are HOST_WIDE_INT.
(record_component_alias): Local vars are HOST_WIDE_INT.
Don't handle COMPLEX_EXPR.
(get_varargs_alias_set): Moved from builtins.c.
(get_frame_alias_set): New function.
* builtins.c (expand_builtin_return_address): Use frame alias set.
(expand_builtin_setjmp, expand_builtin_longjmp): Use alias set
for setjmp buffer.
(get_memory_rtx): Rework to use set_mem_attributes.
(get_varargs_alias_set): Deleted from here.
* c-common.c (c_apply_type_quals_to_decl): Alias sets now HOST_WIDE_INT.
(c_find_base_decl): Deleted from here.
(c_get_alias_set): Remove many cases and rework to just handle
C-specific cases.
* c-common.h (c_get_alias_set): Returns HOST_WIDE_INT.
* c-decl.c (rtl.h, expr.h): Now included.
(init_decl_processing): Call record_component_aliases on array types.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for all fields that are not bitfields.
* c-typeck.c (common_type): Call record_component_aliases for array.
* caller-save.c (setup_save_areas): Rework register loop for unsigned.
Set all save areas to the frame alias set.
* calls.c (initialie_argument_information): Call set_mem_attributes.
(compute_argument_addresses, expand_call): Likewise.
* explow.c (set_mem_attributes): New function.
(stabilize): Use MEM_COPY_ATTRIBUTES and force_reg.
* expr.c (struct move_by_pieces): Remove {to,from}_{struct,readonly}.
LEN and OFFSET now HOST_WIDE_INT.
(clear_by_pieces): Similar changes.
(move_by_pieces): LEN now HOST_WIDE_INT; don't set deleted fields.
(move_by_pieces_ninsns): Now returns unsigned HOST_WIDE_INT.
(move_by_pieces_1): Don't use deleted fields, use MEM_COPY_ATTRIBUTES.
(clear_by_pieces_1): Likewise.
(emit_push_insn): Call set_mem_attributes.
(expand_expr, case INDIRECT_REF): Likewise.
(expand_expr, case VAR_DECL): Call change_address.
* expr.h (ADD_PARM_SIZE, SUB_PARM_SIZE): Use host_integerp and
tree_low_cst.
(get_varargs_alias_set, get_frame_alias_set): New decls.
(record_base_value, record_alias_subset, lang_get_alias_set): Likewise.
(new_alias_set, set_mem_attributes): Likewse.
* function.c (struct temp_slot): ALIAS_SET is HOST_WIDE_INT.
(assign_stack_temp_for_type): Likewise.
Can split slot even if alias set since can copy.
Set MEM_ALIAS_SET and MEM_SET_IN_STRUCT_P.
(assign_temp): Use host_integerp and tree_low_cst.
(put_var_into_stack): Properly handle SAVE_EXPR.
(put_addressof_into_stack): Likewise.
(assign_parms): Call set_mem_attributes.
Delete #if 0 code.
(fix_lexical_address): Put reference to chain into frame alias set.
(expand_function_start): Call set_mem_attributes.
* integrate.c (expand_inline_function): Likewise.
* recog.c (adj_offsettable_operand): Use MEM_COPY_ATTRIBUTES.
* regmove.c (try_apply_stack_adjustment): Likewise.
* reload.c (push_reload, make_memloc): Likewise.
* reload1.c (alter_reg): Make alias sets for spilled pseudos.
* rtl.def (MEM): Update comment.
* rtl.h (MEM_ALIAS_SET): Now uses XCWINT.
(move_by_pieces): Change length to HOST_WIDE_INT.
(record_base_value, record_alias_subset): Delete from here.
* stmt.c (expand_decl): Call set_mem_attributes.
* stor-layout.c (finish_record_layout): Call record_component_aliases.i
* toplev.c (compile_file): Call init_alias_once earlier.
* tree.c (lang_get_alias_set, get_alias_set, new_alias_set): Deleted
from here: now in alias.c.
* tree.h (struct tree_type): alias_set is HOST_WIDE_INT.
(struct tree_decl): Likewise.
(get_alias_set, new_alias_set, lang_get_alias_set): Deleted from here.
* varasm.c (make_function_rtl, make_decl_rtl): Call set_mem_attributes.
(output_constant_def, force_const_mem): Likewise.
* cp/Makefile.in (decl.o): Include ../expr.h.
* cp/decl.c (expr.h): Include.
(init_decl_processing): Call record_component_aliases for arrays.
(grokdeclarator): Likewise.
Set TREE_ADDRESSABLE for fields that aren't bitfields.
* cp/tree.c (build_cplus_array_type_1): Call record_component_aliases.
From-SVN: r34305
2000-05-31 20:37:31 +02:00
|
|
|
|
|
1999-07-20 12:41:10 +02:00
|
|
|
|
void
|
|
|
|
|
c_common_nodes_and_builtins (cplus_mode, no_builtins, no_nonansi_builtins)
|
|
|
|
|
int cplus_mode, no_builtins, no_nonansi_builtins;
|
|
|
|
|
{
|
|
|
|
|
tree temp;
|
|
|
|
|
tree memcpy_ftype, memset_ftype, strlen_ftype;
|
2000-09-19 20:19:44 +02:00
|
|
|
|
tree bzero_ftype, bcmp_ftype, puts_ftype, printf_ftype;
|
1999-07-20 12:41:10 +02:00
|
|
|
|
tree endlink, int_endlink, double_endlink, unsigned_endlink;
|
|
|
|
|
tree sizetype_endlink;
|
|
|
|
|
tree ptr_ftype, ptr_ftype_unsigned;
|
2000-09-21 03:59:07 +02:00
|
|
|
|
tree void_ftype_any, void_ftype_int, int_ftype_any, sizet_ftype_any;
|
1999-07-20 12:41:10 +02:00
|
|
|
|
tree double_ftype_double, double_ftype_double_double;
|
|
|
|
|
tree float_ftype_float, ldouble_ftype_ldouble;
|
|
|
|
|
tree int_ftype_cptr_cptr_sizet;
|
|
|
|
|
tree int_ftype_string_string, string_ftype_ptr_ptr;
|
|
|
|
|
tree long_ftype_long;
|
2000-09-24 11:50:30 +02:00
|
|
|
|
tree longlong_ftype_longlong;
|
1999-07-20 12:41:10 +02:00
|
|
|
|
/* Either char* or void*. */
|
|
|
|
|
tree traditional_ptr_type_node;
|
2000-03-23 22:32:10 +01:00
|
|
|
|
/* Either const char* or const void*. */
|
|
|
|
|
tree traditional_cptr_type_node;
|
|
|
|
|
tree traditional_len_type_node;
|
|
|
|
|
tree traditional_len_endlink;
|
2000-03-30 02:03:14 +02:00
|
|
|
|
tree va_list_ref_type_node;
|
1999-07-27 07:43:56 +02:00
|
|
|
|
tree va_list_arg_type_node;
|
builtins.c (expand_builtin_saveregs): Remove static, remove exp and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
* builtins.c (expand_builtin_saveregs): Remove static, remove exp
and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
(expand_builtin_next_arg): Accept ARGLIST not EXP.
(stabilize_va_list): New function.
(std_expand_builtin_va_start): New function.
(expand_builtin_va_start): New function.
(get_varargs_alias_set): New function.
(std_expand_builtin_va_arg): New function.
(expand_builtin_va_arg): New function.
(expand_builtin_va_end): New function.
(expand_builtin_va_copy): New function.
(expand_builtin): Call them.
* c-common.c (c_common_nodes_and_builtins): Build __builtin_va_list,
__builtin_{varargs_start,stdarg_start,end,copy}.
(build_va_arg): New function.
* c-common.h (CTI_PTR_TYPE, ptr_type_node): Delete.
(build_va_arg): Declare.
* c-decl.c (ptr_type_node, va_list_type_node): New.
* c-parse.gperf (__builtin_va_arg): New.
* c-parse.in (VA_ARG): New token.
(unary_expr): Recognize it.
* expr.c (expand_expr): Expand VA_ARG_EXPR.
* expr.h (std_expand_builtin_va_start): Declare.
(std_expand_builtin_va_arg): Declare.
(expand_builtin_va_arg): Declare.
(get_varargs_alias_set): Declare.
* tree.def (VA_ARG_EXPR): New.
* tree.h (BUILT_IN_VARARGS_START): New.
(BUILT_IN_STDARG_START, BUILT_IN_VA_END): New.
(ptr_type_node, va_list_type_node): Declare.
* tm.texi (EXPAND_BUILTIN_SAVEREGS): Kill unused ARGLIST argument.
* m32r.h (EXPAND_BUILTIN_SAVEREGS): Likewise.
* m88k.h, m88k.c: Likewise.
* mn10300.h, mn10300.c: Likewise.
* pa.h, pa.c: Likewise.
* rs6000.h, rs6000.c: Likewise.
* sh.h, sh.c: Likewise.
* sparc.h, sparc.c: Likewise.
* emit-rtl.c (operand_subword): Copy alias set.
(change_address): Likewise.
From-SVN: r28243
1999-07-26 03:21:03 +02:00
|
|
|
|
|
|
|
|
|
pushdecl (build_decl (TYPE_DECL, get_identifier ("__builtin_va_list"),
|
|
|
|
|
va_list_type_node));
|
1999-07-27 07:43:56 +02:00
|
|
|
|
|
1999-12-10 05:26:06 +01:00
|
|
|
|
pushdecl (build_decl (TYPE_DECL, get_identifier ("__builtin_ptrdiff_t"),
|
|
|
|
|
ptrdiff_type_node));
|
|
|
|
|
|
|
|
|
|
pushdecl (build_decl (TYPE_DECL, get_identifier ("__builtin_size_t"),
|
|
|
|
|
sizetype));
|
|
|
|
|
|
1999-07-27 07:43:56 +02:00
|
|
|
|
if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
|
2000-03-30 02:03:14 +02:00
|
|
|
|
{
|
|
|
|
|
va_list_arg_type_node = va_list_ref_type_node =
|
|
|
|
|
build_pointer_type (TREE_TYPE (va_list_type_node));
|
|
|
|
|
}
|
1999-07-27 07:43:56 +02:00
|
|
|
|
else
|
2000-03-30 02:03:14 +02:00
|
|
|
|
{
|
|
|
|
|
va_list_arg_type_node = va_list_type_node;
|
|
|
|
|
va_list_ref_type_node = build_reference_type (va_list_type_node);
|
|
|
|
|
}
|
|
|
|
|
|
1999-07-20 12:41:10 +02:00
|
|
|
|
endlink = void_list_node;
|
|
|
|
|
int_endlink = tree_cons (NULL_TREE, integer_type_node, endlink);
|
|
|
|
|
double_endlink = tree_cons (NULL_TREE, double_type_node, endlink);
|
|
|
|
|
unsigned_endlink = tree_cons (NULL_TREE, unsigned_type_node, endlink);
|
|
|
|
|
|
|
|
|
|
ptr_ftype = build_function_type (ptr_type_node, NULL_TREE);
|
|
|
|
|
ptr_ftype_unsigned = build_function_type (ptr_type_node, unsigned_endlink);
|
2000-03-02 19:29:56 +01:00
|
|
|
|
sizetype_endlink = tree_cons (NULL_TREE, TYPE_DOMAIN (sizetype), endlink);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
/* We realloc here because sizetype could be int or unsigned. S'ok. */
|
|
|
|
|
ptr_ftype_sizetype = build_function_type (ptr_type_node, sizetype_endlink);
|
|
|
|
|
|
2000-09-21 03:59:07 +02:00
|
|
|
|
sizet_ftype_any = build_function_type (sizetype, NULL_TREE);
|
2000-03-23 22:32:10 +01:00
|
|
|
|
int_ftype_any = build_function_type (integer_type_node, NULL_TREE);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
void_ftype_any = build_function_type (void_type_node, NULL_TREE);
|
|
|
|
|
void_ftype = build_function_type (void_type_node, endlink);
|
|
|
|
|
void_ftype_int = build_function_type (void_type_node, int_endlink);
|
|
|
|
|
void_ftype_ptr
|
|
|
|
|
= build_function_type (void_type_node,
|
|
|
|
|
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,
|
|
|
|
|
double_endlink));
|
|
|
|
|
|
|
|
|
|
int_ftype_int
|
|
|
|
|
= build_function_type (integer_type_node, int_endlink);
|
|
|
|
|
|
|
|
|
|
long_ftype_long
|
|
|
|
|
= build_function_type (long_integer_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, long_integer_type_node,
|
|
|
|
|
endlink));
|
|
|
|
|
|
2000-09-24 11:50:30 +02:00
|
|
|
|
longlong_ftype_longlong
|
|
|
|
|
= build_function_type (long_long_integer_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, long_long_integer_type_node,
|
|
|
|
|
endlink));
|
|
|
|
|
|
1999-07-20 12:41:10 +02:00
|
|
|
|
int_ftype_cptr_cptr_sizet
|
|
|
|
|
= build_function_type (integer_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, const_ptr_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, const_ptr_type_node,
|
|
|
|
|
tree_cons (NULL_TREE,
|
|
|
|
|
sizetype,
|
|
|
|
|
endlink))));
|
|
|
|
|
|
2000-09-07 03:36:11 +02:00
|
|
|
|
void_zero_node = build_int_2 (0, 0);
|
|
|
|
|
TREE_TYPE (void_zero_node) = void_type_node;
|
|
|
|
|
|
1999-07-20 12:41:10 +02:00
|
|
|
|
/* Prototype for strcpy. */
|
|
|
|
|
string_ftype_ptr_ptr
|
|
|
|
|
= build_function_type (string_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, string_type_node,
|
|
|
|
|
tree_cons (NULL_TREE,
|
|
|
|
|
const_string_type_node,
|
|
|
|
|
endlink)));
|
|
|
|
|
|
2000-03-23 22:32:10 +01:00
|
|
|
|
traditional_len_type_node = (flag_traditional && ! cplus_mode
|
|
|
|
|
? integer_type_node : sizetype);
|
|
|
|
|
traditional_len_endlink = tree_cons (NULL_TREE, traditional_len_type_node,
|
|
|
|
|
endlink);
|
|
|
|
|
|
1999-07-20 12:41:10 +02:00
|
|
|
|
/* Prototype for strcmp. */
|
|
|
|
|
int_ftype_string_string
|
|
|
|
|
= build_function_type (integer_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, const_string_type_node,
|
|
|
|
|
tree_cons (NULL_TREE,
|
|
|
|
|
const_string_type_node,
|
|
|
|
|
endlink)));
|
|
|
|
|
|
|
|
|
|
/* Prototype for strlen. */
|
|
|
|
|
strlen_ftype
|
2000-03-23 22:32:10 +01:00
|
|
|
|
= build_function_type (traditional_len_type_node,
|
1999-07-20 12:41:10 +02:00
|
|
|
|
tree_cons (NULL_TREE, const_string_type_node,
|
|
|
|
|
endlink));
|
|
|
|
|
|
|
|
|
|
traditional_ptr_type_node = (flag_traditional && ! cplus_mode
|
|
|
|
|
? string_type_node : ptr_type_node);
|
2000-03-23 22:32:10 +01:00
|
|
|
|
traditional_cptr_type_node = (flag_traditional && ! cplus_mode
|
|
|
|
|
? const_string_type_node : const_ptr_type_node);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
|
|
|
|
|
/* Prototype for memcpy. */
|
|
|
|
|
memcpy_ftype
|
|
|
|
|
= build_function_type (traditional_ptr_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, ptr_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, const_ptr_type_node,
|
|
|
|
|
sizetype_endlink)));
|
|
|
|
|
|
|
|
|
|
/* Prototype for memset. */
|
|
|
|
|
memset_ftype
|
|
|
|
|
= build_function_type (traditional_ptr_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, ptr_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, integer_type_node,
|
|
|
|
|
tree_cons (NULL_TREE,
|
|
|
|
|
sizetype,
|
|
|
|
|
endlink))));
|
|
|
|
|
|
2000-03-24 21:20:56 +01:00
|
|
|
|
/* Prototype for bzero. */
|
|
|
|
|
bzero_ftype
|
|
|
|
|
= build_function_type (void_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, traditional_ptr_type_node,
|
|
|
|
|
traditional_len_endlink));
|
|
|
|
|
|
2000-03-23 22:32:10 +01:00
|
|
|
|
/* Prototype for bcmp. */
|
|
|
|
|
bcmp_ftype
|
|
|
|
|
= build_function_type (integer_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, traditional_cptr_type_node,
|
|
|
|
|
tree_cons (NULL_TREE,
|
|
|
|
|
traditional_cptr_type_node,
|
|
|
|
|
traditional_len_endlink)));
|
|
|
|
|
|
2000-09-19 20:19:44 +02:00
|
|
|
|
/* Prototype for puts. */
|
|
|
|
|
puts_ftype
|
|
|
|
|
= build_function_type (integer_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, const_string_type_node,
|
|
|
|
|
endlink));
|
|
|
|
|
|
|
|
|
|
/* Prototype for printf. */
|
|
|
|
|
printf_ftype
|
|
|
|
|
= build_function_type (integer_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, const_string_type_node,
|
|
|
|
|
NULL_TREE));
|
|
|
|
|
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_constant_p", default_function_type,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_CONSTANT_P, BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
|
|
|
|
|
builtin_function ("__builtin_return_address", ptr_ftype_unsigned,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_RETURN_ADDRESS, BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
|
|
|
|
|
builtin_function ("__builtin_frame_address", ptr_ftype_unsigned,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_FRAME_ADDRESS, BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
|
|
|
|
|
builtin_function ("__builtin_alloca", ptr_ftype_sizetype,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_ALLOCA, BUILT_IN_NORMAL, "alloca");
|
|
|
|
|
builtin_function ("__builtin_ffs", int_ftype_int, BUILT_IN_FFS,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
/* Define alloca, ffs as builtins.
|
|
|
|
|
Declare _exit just to mark it as volatile. */
|
|
|
|
|
if (! no_builtins && ! no_nonansi_builtins)
|
|
|
|
|
{
|
configure.in (i?86-*-beos{pe,elf,}*): Recognize.
* configure.in (i?86-*-beos{pe,elf,}*): Recognize.
* i386/t-beos, i386/x-beos, i386/xm-beos.h: New files.
* i386/beos-elf.h, i386/beos-pe.h: New files.
* Makefile.in (CROSS_SYSTEM_HEADER_DIR): New.
* cross-make (SYSTEM_HEADER_DIR): Define using
CROSS_SYSTEM_HEADER_DIR.
* gcc.c (LIBRARY_PATH_ENV): Provide default.
(process_command): Use it.
(main): Likewise. Kill trailing = from env vars.
(build_search_list): Put it back.
* collect2.c (main): Use LIBRARY_PATH_ENV.
* configure.in (GCC_NEED_DECLARATIONS): Add environ.
* toplev.c: Use NEED_DECLARATION_ENVIRON.
* tm.texi (Frame Layout): Document SMALL_STACK.
* c-common.c (c_common_nodes_and_builtins): Check it.
* system.h: Undef alloca after including glibc's <stdlib.h>,
if USE_C_ALLOCA is defined.
* gcc.c (set_input): New fn.
(main): After all input files are compiled, reset the input file
info to the first.
* aclocal.m4 (rindex, index): If already defined, don't attempt
to redefine.
* ginclude/varargs.h: (__va_list__): Define ifndef.
* ginclude/stdarg.h: Likewise.
* ginclude/stddef.h (__WCHAR_TYPE__) [BEOS]: Use int
instead of unsigned char.
* hash.h (true, false, boolean): Undef before enum.
From-SVN: r31366
2000-01-13 01:37:06 +01:00
|
|
|
|
#ifndef SMALL_STACK
|
1999-07-20 12:41:10 +02:00
|
|
|
|
temp = builtin_function ("alloca", ptr_ftype_sizetype,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_ALLOCA, BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
/* Suppress error if redefined as a non-function. */
|
|
|
|
|
DECL_BUILT_IN_NONANSI (temp) = 1;
|
configure.in (i?86-*-beos{pe,elf,}*): Recognize.
* configure.in (i?86-*-beos{pe,elf,}*): Recognize.
* i386/t-beos, i386/x-beos, i386/xm-beos.h: New files.
* i386/beos-elf.h, i386/beos-pe.h: New files.
* Makefile.in (CROSS_SYSTEM_HEADER_DIR): New.
* cross-make (SYSTEM_HEADER_DIR): Define using
CROSS_SYSTEM_HEADER_DIR.
* gcc.c (LIBRARY_PATH_ENV): Provide default.
(process_command): Use it.
(main): Likewise. Kill trailing = from env vars.
(build_search_list): Put it back.
* collect2.c (main): Use LIBRARY_PATH_ENV.
* configure.in (GCC_NEED_DECLARATIONS): Add environ.
* toplev.c: Use NEED_DECLARATION_ENVIRON.
* tm.texi (Frame Layout): Document SMALL_STACK.
* c-common.c (c_common_nodes_and_builtins): Check it.
* system.h: Undef alloca after including glibc's <stdlib.h>,
if USE_C_ALLOCA is defined.
* gcc.c (set_input): New fn.
(main): After all input files are compiled, reset the input file
info to the first.
* aclocal.m4 (rindex, index): If already defined, don't attempt
to redefine.
* ginclude/varargs.h: (__va_list__): Define ifndef.
* ginclude/stdarg.h: Likewise.
* ginclude/stddef.h (__WCHAR_TYPE__) [BEOS]: Use int
instead of unsigned char.
* hash.h (true, false, boolean): Undef before enum.
From-SVN: r31366
2000-01-13 01:37:06 +01:00
|
|
|
|
#endif
|
1999-09-24 12:07:04 +02:00
|
|
|
|
temp = builtin_function ("ffs", int_ftype_int, BUILT_IN_FFS,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
/* Suppress error if redefined as a non-function. */
|
|
|
|
|
DECL_BUILT_IN_NONANSI (temp) = 1;
|
|
|
|
|
temp = builtin_function ("_exit", void_ftype_int,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
0, NOT_BUILT_IN, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
TREE_THIS_VOLATILE (temp) = 1;
|
|
|
|
|
TREE_SIDE_EFFECTS (temp) = 1;
|
|
|
|
|
/* Suppress error if redefined as a non-function. */
|
|
|
|
|
DECL_BUILT_IN_NONANSI (temp) = 1;
|
2000-03-23 22:32:10 +01:00
|
|
|
|
|
2000-03-29 18:24:07 +02:00
|
|
|
|
/* The system prototypes for these functions have many
|
|
|
|
|
variations, so don't specify parameters to avoid conflicts.
|
|
|
|
|
The expand_* functions check the argument types anyway. */
|
|
|
|
|
temp = builtin_function ("bzero", void_ftype_any,
|
2000-03-24 21:20:56 +01:00
|
|
|
|
BUILT_IN_BZERO, BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
DECL_BUILT_IN_NONANSI (temp) = 1;
|
2000-03-29 18:24:07 +02:00
|
|
|
|
temp = builtin_function ("bcmp", int_ftype_any,
|
2000-03-23 22:32:10 +01:00
|
|
|
|
BUILT_IN_BCMP, BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
DECL_BUILT_IN_NONANSI (temp) = 1;
|
1999-07-20 12:41:10 +02:00
|
|
|
|
}
|
|
|
|
|
|
1999-09-24 12:07:04 +02:00
|
|
|
|
builtin_function ("__builtin_abs", int_ftype_int, BUILT_IN_ABS,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_fabsf", float_ftype_float, BUILT_IN_FABS,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_fabs", double_ftype_double, BUILT_IN_FABS,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_fabsl", ldouble_ftype_ldouble, BUILT_IN_FABS,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_labs", long_ftype_long, BUILT_IN_LABS,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
2000-09-24 11:50:30 +02:00
|
|
|
|
builtin_function ("__builtin_llabs", longlong_ftype_longlong, BUILT_IN_LLABS,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_saveregs", ptr_ftype, BUILT_IN_SAVEREGS,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_classify_type", default_function_type,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_CLASSIFY_TYPE, BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_next_arg", ptr_ftype, BUILT_IN_NEXT_ARG,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_args_info", int_ftype_int, BUILT_IN_ARGS_INFO,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_setjmp",
|
|
|
|
|
build_function_type (integer_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, ptr_type_node,
|
|
|
|
|
endlink)),
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_SETJMP, BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_longjmp",
|
|
|
|
|
build_function_type (void_type_node,
|
|
|
|
|
tree_cons (NULL_TREE, ptr_type_node,
|
|
|
|
|
tree_cons (NULL_TREE,
|
|
|
|
|
integer_type_node,
|
|
|
|
|
endlink))),
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_LONGJMP, BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("__builtin_trap", void_ftype, BUILT_IN_TRAP,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
|
2000-01-24 21:10:04 +01:00
|
|
|
|
/* ISO C99 IEEE Unordered compares. */
|
|
|
|
|
builtin_function ("__builtin_isgreater", default_function_type,
|
|
|
|
|
BUILT_IN_ISGREATER, BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("__builtin_isgreaterequal", default_function_type,
|
|
|
|
|
BUILT_IN_ISGREATEREQUAL, BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("__builtin_isless", default_function_type,
|
|
|
|
|
BUILT_IN_ISLESS, BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("__builtin_islessequal", default_function_type,
|
|
|
|
|
BUILT_IN_ISLESSEQUAL, BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("__builtin_islessgreater", default_function_type,
|
|
|
|
|
BUILT_IN_ISLESSGREATER, BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("__builtin_isunordered", default_function_type,
|
|
|
|
|
BUILT_IN_ISUNORDERED, BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
|
1999-07-20 12:41:10 +02:00
|
|
|
|
/* Untyped call and return. */
|
|
|
|
|
builtin_function ("__builtin_apply_args", ptr_ftype,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_APPLY_ARGS, BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
|
|
|
|
|
temp = tree_cons (NULL_TREE,
|
|
|
|
|
build_pointer_type (build_function_type (void_type_node,
|
|
|
|
|
NULL_TREE)),
|
|
|
|
|
tree_cons (NULL_TREE,
|
|
|
|
|
ptr_type_node,
|
|
|
|
|
tree_cons (NULL_TREE,
|
|
|
|
|
sizetype,
|
|
|
|
|
endlink)));
|
|
|
|
|
builtin_function ("__builtin_apply",
|
|
|
|
|
build_function_type (ptr_type_node, temp),
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_APPLY, BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_return", void_ftype_ptr,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_RETURN, BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
|
builtins.c (expand_builtin_saveregs): Remove static, remove exp and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
* builtins.c (expand_builtin_saveregs): Remove static, remove exp
and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
(expand_builtin_next_arg): Accept ARGLIST not EXP.
(stabilize_va_list): New function.
(std_expand_builtin_va_start): New function.
(expand_builtin_va_start): New function.
(get_varargs_alias_set): New function.
(std_expand_builtin_va_arg): New function.
(expand_builtin_va_arg): New function.
(expand_builtin_va_end): New function.
(expand_builtin_va_copy): New function.
(expand_builtin): Call them.
* c-common.c (c_common_nodes_and_builtins): Build __builtin_va_list,
__builtin_{varargs_start,stdarg_start,end,copy}.
(build_va_arg): New function.
* c-common.h (CTI_PTR_TYPE, ptr_type_node): Delete.
(build_va_arg): Declare.
* c-decl.c (ptr_type_node, va_list_type_node): New.
* c-parse.gperf (__builtin_va_arg): New.
* c-parse.in (VA_ARG): New token.
(unary_expr): Recognize it.
* expr.c (expand_expr): Expand VA_ARG_EXPR.
* expr.h (std_expand_builtin_va_start): Declare.
(std_expand_builtin_va_arg): Declare.
(expand_builtin_va_arg): Declare.
(get_varargs_alias_set): Declare.
* tree.def (VA_ARG_EXPR): New.
* tree.h (BUILT_IN_VARARGS_START): New.
(BUILT_IN_STDARG_START, BUILT_IN_VA_END): New.
(ptr_type_node, va_list_type_node): Declare.
* tm.texi (EXPAND_BUILTIN_SAVEREGS): Kill unused ARGLIST argument.
* m32r.h (EXPAND_BUILTIN_SAVEREGS): Likewise.
* m88k.h, m88k.c: Likewise.
* mn10300.h, mn10300.c: Likewise.
* pa.h, pa.c: Likewise.
* rs6000.h, rs6000.c: Likewise.
* sh.h, sh.c: Likewise.
* sparc.h, sparc.c: Likewise.
* emit-rtl.c (operand_subword): Copy alias set.
(change_address): Likewise.
From-SVN: r28243
1999-07-26 03:21:03 +02:00
|
|
|
|
/* Support for varargs.h and stdarg.h. */
|
|
|
|
|
builtin_function ("__builtin_varargs_start",
|
|
|
|
|
build_function_type (void_type_node,
|
|
|
|
|
tree_cons (NULL_TREE,
|
2000-03-30 02:03:14 +02:00
|
|
|
|
va_list_ref_type_node,
|
builtins.c (expand_builtin_saveregs): Remove static, remove exp and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
* builtins.c (expand_builtin_saveregs): Remove static, remove exp
and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
(expand_builtin_next_arg): Accept ARGLIST not EXP.
(stabilize_va_list): New function.
(std_expand_builtin_va_start): New function.
(expand_builtin_va_start): New function.
(get_varargs_alias_set): New function.
(std_expand_builtin_va_arg): New function.
(expand_builtin_va_arg): New function.
(expand_builtin_va_end): New function.
(expand_builtin_va_copy): New function.
(expand_builtin): Call them.
* c-common.c (c_common_nodes_and_builtins): Build __builtin_va_list,
__builtin_{varargs_start,stdarg_start,end,copy}.
(build_va_arg): New function.
* c-common.h (CTI_PTR_TYPE, ptr_type_node): Delete.
(build_va_arg): Declare.
* c-decl.c (ptr_type_node, va_list_type_node): New.
* c-parse.gperf (__builtin_va_arg): New.
* c-parse.in (VA_ARG): New token.
(unary_expr): Recognize it.
* expr.c (expand_expr): Expand VA_ARG_EXPR.
* expr.h (std_expand_builtin_va_start): Declare.
(std_expand_builtin_va_arg): Declare.
(expand_builtin_va_arg): Declare.
(get_varargs_alias_set): Declare.
* tree.def (VA_ARG_EXPR): New.
* tree.h (BUILT_IN_VARARGS_START): New.
(BUILT_IN_STDARG_START, BUILT_IN_VA_END): New.
(ptr_type_node, va_list_type_node): Declare.
* tm.texi (EXPAND_BUILTIN_SAVEREGS): Kill unused ARGLIST argument.
* m32r.h (EXPAND_BUILTIN_SAVEREGS): Likewise.
* m88k.h, m88k.c: Likewise.
* mn10300.h, mn10300.c: Likewise.
* pa.h, pa.c: Likewise.
* rs6000.h, rs6000.c: Likewise.
* sh.h, sh.c: Likewise.
* sparc.h, sparc.c: Likewise.
* emit-rtl.c (operand_subword): Copy alias set.
(change_address): Likewise.
From-SVN: r28243
1999-07-26 03:21:03 +02:00
|
|
|
|
endlink)),
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_VARARGS_START, BUILT_IN_NORMAL, NULL_PTR);
|
builtins.c (expand_builtin_saveregs): Remove static, remove exp and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
* builtins.c (expand_builtin_saveregs): Remove static, remove exp
and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
(expand_builtin_next_arg): Accept ARGLIST not EXP.
(stabilize_va_list): New function.
(std_expand_builtin_va_start): New function.
(expand_builtin_va_start): New function.
(get_varargs_alias_set): New function.
(std_expand_builtin_va_arg): New function.
(expand_builtin_va_arg): New function.
(expand_builtin_va_end): New function.
(expand_builtin_va_copy): New function.
(expand_builtin): Call them.
* c-common.c (c_common_nodes_and_builtins): Build __builtin_va_list,
__builtin_{varargs_start,stdarg_start,end,copy}.
(build_va_arg): New function.
* c-common.h (CTI_PTR_TYPE, ptr_type_node): Delete.
(build_va_arg): Declare.
* c-decl.c (ptr_type_node, va_list_type_node): New.
* c-parse.gperf (__builtin_va_arg): New.
* c-parse.in (VA_ARG): New token.
(unary_expr): Recognize it.
* expr.c (expand_expr): Expand VA_ARG_EXPR.
* expr.h (std_expand_builtin_va_start): Declare.
(std_expand_builtin_va_arg): Declare.
(expand_builtin_va_arg): Declare.
(get_varargs_alias_set): Declare.
* tree.def (VA_ARG_EXPR): New.
* tree.h (BUILT_IN_VARARGS_START): New.
(BUILT_IN_STDARG_START, BUILT_IN_VA_END): New.
(ptr_type_node, va_list_type_node): Declare.
* tm.texi (EXPAND_BUILTIN_SAVEREGS): Kill unused ARGLIST argument.
* m32r.h (EXPAND_BUILTIN_SAVEREGS): Likewise.
* m88k.h, m88k.c: Likewise.
* mn10300.h, mn10300.c: Likewise.
* pa.h, pa.c: Likewise.
* rs6000.h, rs6000.c: Likewise.
* sh.h, sh.c: Likewise.
* sparc.h, sparc.c: Likewise.
* emit-rtl.c (operand_subword): Copy alias set.
(change_address): Likewise.
From-SVN: r28243
1999-07-26 03:21:03 +02:00
|
|
|
|
|
|
|
|
|
builtin_function ("__builtin_stdarg_start",
|
|
|
|
|
build_function_type (void_type_node,
|
|
|
|
|
tree_cons (NULL_TREE,
|
2000-03-30 02:03:14 +02:00
|
|
|
|
va_list_ref_type_node,
|
builtins.c (expand_builtin_saveregs): Remove static, remove exp and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
* builtins.c (expand_builtin_saveregs): Remove static, remove exp
and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
(expand_builtin_next_arg): Accept ARGLIST not EXP.
(stabilize_va_list): New function.
(std_expand_builtin_va_start): New function.
(expand_builtin_va_start): New function.
(get_varargs_alias_set): New function.
(std_expand_builtin_va_arg): New function.
(expand_builtin_va_arg): New function.
(expand_builtin_va_end): New function.
(expand_builtin_va_copy): New function.
(expand_builtin): Call them.
* c-common.c (c_common_nodes_and_builtins): Build __builtin_va_list,
__builtin_{varargs_start,stdarg_start,end,copy}.
(build_va_arg): New function.
* c-common.h (CTI_PTR_TYPE, ptr_type_node): Delete.
(build_va_arg): Declare.
* c-decl.c (ptr_type_node, va_list_type_node): New.
* c-parse.gperf (__builtin_va_arg): New.
* c-parse.in (VA_ARG): New token.
(unary_expr): Recognize it.
* expr.c (expand_expr): Expand VA_ARG_EXPR.
* expr.h (std_expand_builtin_va_start): Declare.
(std_expand_builtin_va_arg): Declare.
(expand_builtin_va_arg): Declare.
(get_varargs_alias_set): Declare.
* tree.def (VA_ARG_EXPR): New.
* tree.h (BUILT_IN_VARARGS_START): New.
(BUILT_IN_STDARG_START, BUILT_IN_VA_END): New.
(ptr_type_node, va_list_type_node): Declare.
* tm.texi (EXPAND_BUILTIN_SAVEREGS): Kill unused ARGLIST argument.
* m32r.h (EXPAND_BUILTIN_SAVEREGS): Likewise.
* m88k.h, m88k.c: Likewise.
* mn10300.h, mn10300.c: Likewise.
* pa.h, pa.c: Likewise.
* rs6000.h, rs6000.c: Likewise.
* sh.h, sh.c: Likewise.
* sparc.h, sparc.c: Likewise.
* emit-rtl.c (operand_subword): Copy alias set.
(change_address): Likewise.
From-SVN: r28243
1999-07-26 03:21:03 +02:00
|
|
|
|
NULL_TREE)),
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_STDARG_START, BUILT_IN_NORMAL, NULL_PTR);
|
builtins.c (expand_builtin_saveregs): Remove static, remove exp and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
* builtins.c (expand_builtin_saveregs): Remove static, remove exp
and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
(expand_builtin_next_arg): Accept ARGLIST not EXP.
(stabilize_va_list): New function.
(std_expand_builtin_va_start): New function.
(expand_builtin_va_start): New function.
(get_varargs_alias_set): New function.
(std_expand_builtin_va_arg): New function.
(expand_builtin_va_arg): New function.
(expand_builtin_va_end): New function.
(expand_builtin_va_copy): New function.
(expand_builtin): Call them.
* c-common.c (c_common_nodes_and_builtins): Build __builtin_va_list,
__builtin_{varargs_start,stdarg_start,end,copy}.
(build_va_arg): New function.
* c-common.h (CTI_PTR_TYPE, ptr_type_node): Delete.
(build_va_arg): Declare.
* c-decl.c (ptr_type_node, va_list_type_node): New.
* c-parse.gperf (__builtin_va_arg): New.
* c-parse.in (VA_ARG): New token.
(unary_expr): Recognize it.
* expr.c (expand_expr): Expand VA_ARG_EXPR.
* expr.h (std_expand_builtin_va_start): Declare.
(std_expand_builtin_va_arg): Declare.
(expand_builtin_va_arg): Declare.
(get_varargs_alias_set): Declare.
* tree.def (VA_ARG_EXPR): New.
* tree.h (BUILT_IN_VARARGS_START): New.
(BUILT_IN_STDARG_START, BUILT_IN_VA_END): New.
(ptr_type_node, va_list_type_node): Declare.
* tm.texi (EXPAND_BUILTIN_SAVEREGS): Kill unused ARGLIST argument.
* m32r.h (EXPAND_BUILTIN_SAVEREGS): Likewise.
* m88k.h, m88k.c: Likewise.
* mn10300.h, mn10300.c: Likewise.
* pa.h, pa.c: Likewise.
* rs6000.h, rs6000.c: Likewise.
* sh.h, sh.c: Likewise.
* sparc.h, sparc.c: Likewise.
* emit-rtl.c (operand_subword): Copy alias set.
(change_address): Likewise.
From-SVN: r28243
1999-07-26 03:21:03 +02:00
|
|
|
|
|
|
|
|
|
builtin_function ("__builtin_va_end",
|
|
|
|
|
build_function_type (void_type_node,
|
|
|
|
|
tree_cons (NULL_TREE,
|
2000-03-30 02:03:14 +02:00
|
|
|
|
va_list_ref_type_node,
|
builtins.c (expand_builtin_saveregs): Remove static, remove exp and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
* builtins.c (expand_builtin_saveregs): Remove static, remove exp
and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
(expand_builtin_next_arg): Accept ARGLIST not EXP.
(stabilize_va_list): New function.
(std_expand_builtin_va_start): New function.
(expand_builtin_va_start): New function.
(get_varargs_alias_set): New function.
(std_expand_builtin_va_arg): New function.
(expand_builtin_va_arg): New function.
(expand_builtin_va_end): New function.
(expand_builtin_va_copy): New function.
(expand_builtin): Call them.
* c-common.c (c_common_nodes_and_builtins): Build __builtin_va_list,
__builtin_{varargs_start,stdarg_start,end,copy}.
(build_va_arg): New function.
* c-common.h (CTI_PTR_TYPE, ptr_type_node): Delete.
(build_va_arg): Declare.
* c-decl.c (ptr_type_node, va_list_type_node): New.
* c-parse.gperf (__builtin_va_arg): New.
* c-parse.in (VA_ARG): New token.
(unary_expr): Recognize it.
* expr.c (expand_expr): Expand VA_ARG_EXPR.
* expr.h (std_expand_builtin_va_start): Declare.
(std_expand_builtin_va_arg): Declare.
(expand_builtin_va_arg): Declare.
(get_varargs_alias_set): Declare.
* tree.def (VA_ARG_EXPR): New.
* tree.h (BUILT_IN_VARARGS_START): New.
(BUILT_IN_STDARG_START, BUILT_IN_VA_END): New.
(ptr_type_node, va_list_type_node): Declare.
* tm.texi (EXPAND_BUILTIN_SAVEREGS): Kill unused ARGLIST argument.
* m32r.h (EXPAND_BUILTIN_SAVEREGS): Likewise.
* m88k.h, m88k.c: Likewise.
* mn10300.h, mn10300.c: Likewise.
* pa.h, pa.c: Likewise.
* rs6000.h, rs6000.c: Likewise.
* sh.h, sh.c: Likewise.
* sparc.h, sparc.c: Likewise.
* emit-rtl.c (operand_subword): Copy alias set.
(change_address): Likewise.
From-SVN: r28243
1999-07-26 03:21:03 +02:00
|
|
|
|
endlink)),
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL_PTR);
|
builtins.c (expand_builtin_saveregs): Remove static, remove exp and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
* builtins.c (expand_builtin_saveregs): Remove static, remove exp
and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
(expand_builtin_next_arg): Accept ARGLIST not EXP.
(stabilize_va_list): New function.
(std_expand_builtin_va_start): New function.
(expand_builtin_va_start): New function.
(get_varargs_alias_set): New function.
(std_expand_builtin_va_arg): New function.
(expand_builtin_va_arg): New function.
(expand_builtin_va_end): New function.
(expand_builtin_va_copy): New function.
(expand_builtin): Call them.
* c-common.c (c_common_nodes_and_builtins): Build __builtin_va_list,
__builtin_{varargs_start,stdarg_start,end,copy}.
(build_va_arg): New function.
* c-common.h (CTI_PTR_TYPE, ptr_type_node): Delete.
(build_va_arg): Declare.
* c-decl.c (ptr_type_node, va_list_type_node): New.
* c-parse.gperf (__builtin_va_arg): New.
* c-parse.in (VA_ARG): New token.
(unary_expr): Recognize it.
* expr.c (expand_expr): Expand VA_ARG_EXPR.
* expr.h (std_expand_builtin_va_start): Declare.
(std_expand_builtin_va_arg): Declare.
(expand_builtin_va_arg): Declare.
(get_varargs_alias_set): Declare.
* tree.def (VA_ARG_EXPR): New.
* tree.h (BUILT_IN_VARARGS_START): New.
(BUILT_IN_STDARG_START, BUILT_IN_VA_END): New.
(ptr_type_node, va_list_type_node): Declare.
* tm.texi (EXPAND_BUILTIN_SAVEREGS): Kill unused ARGLIST argument.
* m32r.h (EXPAND_BUILTIN_SAVEREGS): Likewise.
* m88k.h, m88k.c: Likewise.
* mn10300.h, mn10300.c: Likewise.
* pa.h, pa.c: Likewise.
* rs6000.h, rs6000.c: Likewise.
* sh.h, sh.c: Likewise.
* sparc.h, sparc.c: Likewise.
* emit-rtl.c (operand_subword): Copy alias set.
(change_address): Likewise.
From-SVN: r28243
1999-07-26 03:21:03 +02:00
|
|
|
|
|
|
|
|
|
builtin_function ("__builtin_va_copy",
|
|
|
|
|
build_function_type (void_type_node,
|
|
|
|
|
tree_cons (NULL_TREE,
|
2000-03-30 02:03:14 +02:00
|
|
|
|
va_list_ref_type_node,
|
builtins.c (expand_builtin_saveregs): Remove static, remove exp and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
* builtins.c (expand_builtin_saveregs): Remove static, remove exp
and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
(expand_builtin_next_arg): Accept ARGLIST not EXP.
(stabilize_va_list): New function.
(std_expand_builtin_va_start): New function.
(expand_builtin_va_start): New function.
(get_varargs_alias_set): New function.
(std_expand_builtin_va_arg): New function.
(expand_builtin_va_arg): New function.
(expand_builtin_va_end): New function.
(expand_builtin_va_copy): New function.
(expand_builtin): Call them.
* c-common.c (c_common_nodes_and_builtins): Build __builtin_va_list,
__builtin_{varargs_start,stdarg_start,end,copy}.
(build_va_arg): New function.
* c-common.h (CTI_PTR_TYPE, ptr_type_node): Delete.
(build_va_arg): Declare.
* c-decl.c (ptr_type_node, va_list_type_node): New.
* c-parse.gperf (__builtin_va_arg): New.
* c-parse.in (VA_ARG): New token.
(unary_expr): Recognize it.
* expr.c (expand_expr): Expand VA_ARG_EXPR.
* expr.h (std_expand_builtin_va_start): Declare.
(std_expand_builtin_va_arg): Declare.
(expand_builtin_va_arg): Declare.
(get_varargs_alias_set): Declare.
* tree.def (VA_ARG_EXPR): New.
* tree.h (BUILT_IN_VARARGS_START): New.
(BUILT_IN_STDARG_START, BUILT_IN_VA_END): New.
(ptr_type_node, va_list_type_node): Declare.
* tm.texi (EXPAND_BUILTIN_SAVEREGS): Kill unused ARGLIST argument.
* m32r.h (EXPAND_BUILTIN_SAVEREGS): Likewise.
* m88k.h, m88k.c: Likewise.
* mn10300.h, mn10300.c: Likewise.
* pa.h, pa.c: Likewise.
* rs6000.h, rs6000.c: Likewise.
* sh.h, sh.c: Likewise.
* sparc.h, sparc.c: Likewise.
* emit-rtl.c (operand_subword): Copy alias set.
(change_address): Likewise.
From-SVN: r28243
1999-07-26 03:21:03 +02:00
|
|
|
|
tree_cons (NULL_TREE,
|
1999-07-27 07:43:56 +02:00
|
|
|
|
va_list_arg_type_node,
|
builtins.c (expand_builtin_saveregs): Remove static, remove exp and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
* builtins.c (expand_builtin_saveregs): Remove static, remove exp
and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
(expand_builtin_next_arg): Accept ARGLIST not EXP.
(stabilize_va_list): New function.
(std_expand_builtin_va_start): New function.
(expand_builtin_va_start): New function.
(get_varargs_alias_set): New function.
(std_expand_builtin_va_arg): New function.
(expand_builtin_va_arg): New function.
(expand_builtin_va_end): New function.
(expand_builtin_va_copy): New function.
(expand_builtin): Call them.
* c-common.c (c_common_nodes_and_builtins): Build __builtin_va_list,
__builtin_{varargs_start,stdarg_start,end,copy}.
(build_va_arg): New function.
* c-common.h (CTI_PTR_TYPE, ptr_type_node): Delete.
(build_va_arg): Declare.
* c-decl.c (ptr_type_node, va_list_type_node): New.
* c-parse.gperf (__builtin_va_arg): New.
* c-parse.in (VA_ARG): New token.
(unary_expr): Recognize it.
* expr.c (expand_expr): Expand VA_ARG_EXPR.
* expr.h (std_expand_builtin_va_start): Declare.
(std_expand_builtin_va_arg): Declare.
(expand_builtin_va_arg): Declare.
(get_varargs_alias_set): Declare.
* tree.def (VA_ARG_EXPR): New.
* tree.h (BUILT_IN_VARARGS_START): New.
(BUILT_IN_STDARG_START, BUILT_IN_VA_END): New.
(ptr_type_node, va_list_type_node): Declare.
* tm.texi (EXPAND_BUILTIN_SAVEREGS): Kill unused ARGLIST argument.
* m32r.h (EXPAND_BUILTIN_SAVEREGS): Likewise.
* m88k.h, m88k.c: Likewise.
* mn10300.h, mn10300.c: Likewise.
* pa.h, pa.c: Likewise.
* rs6000.h, rs6000.c: Likewise.
* sh.h, sh.c: Likewise.
* sparc.h, sparc.c: Likewise.
* emit-rtl.c (operand_subword): Copy alias set.
(change_address): Likewise.
From-SVN: r28243
1999-07-26 03:21:03 +02:00
|
|
|
|
endlink))),
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL_PTR);
|
builtins.c (expand_builtin_saveregs): Remove static, remove exp and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
* builtins.c (expand_builtin_saveregs): Remove static, remove exp
and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
(expand_builtin_next_arg): Accept ARGLIST not EXP.
(stabilize_va_list): New function.
(std_expand_builtin_va_start): New function.
(expand_builtin_va_start): New function.
(get_varargs_alias_set): New function.
(std_expand_builtin_va_arg): New function.
(expand_builtin_va_arg): New function.
(expand_builtin_va_end): New function.
(expand_builtin_va_copy): New function.
(expand_builtin): Call them.
* c-common.c (c_common_nodes_and_builtins): Build __builtin_va_list,
__builtin_{varargs_start,stdarg_start,end,copy}.
(build_va_arg): New function.
* c-common.h (CTI_PTR_TYPE, ptr_type_node): Delete.
(build_va_arg): Declare.
* c-decl.c (ptr_type_node, va_list_type_node): New.
* c-parse.gperf (__builtin_va_arg): New.
* c-parse.in (VA_ARG): New token.
(unary_expr): Recognize it.
* expr.c (expand_expr): Expand VA_ARG_EXPR.
* expr.h (std_expand_builtin_va_start): Declare.
(std_expand_builtin_va_arg): Declare.
(expand_builtin_va_arg): Declare.
(get_varargs_alias_set): Declare.
* tree.def (VA_ARG_EXPR): New.
* tree.h (BUILT_IN_VARARGS_START): New.
(BUILT_IN_STDARG_START, BUILT_IN_VA_END): New.
(ptr_type_node, va_list_type_node): Declare.
* tm.texi (EXPAND_BUILTIN_SAVEREGS): Kill unused ARGLIST argument.
* m32r.h (EXPAND_BUILTIN_SAVEREGS): Likewise.
* m88k.h, m88k.c: Likewise.
* mn10300.h, mn10300.c: Likewise.
* pa.h, pa.c: Likewise.
* rs6000.h, rs6000.c: Likewise.
* sh.h, sh.c: Likewise.
* sparc.h, sparc.c: Likewise.
* emit-rtl.c (operand_subword): Copy alias set.
(change_address): Likewise.
From-SVN: r28243
1999-07-26 03:21:03 +02:00
|
|
|
|
|
2000-04-17 18:49:00 +02:00
|
|
|
|
/* ??? Ought to be `T __builtin_expect(T, T)' for any type T. */
|
|
|
|
|
builtin_function ("__builtin_expect",
|
|
|
|
|
build_function_type (long_integer_type_node,
|
|
|
|
|
tree_cons (NULL_TREE,
|
|
|
|
|
long_integer_type_node,
|
|
|
|
|
tree_cons (NULL_TREE,
|
|
|
|
|
long_integer_type_node,
|
|
|
|
|
endlink))),
|
|
|
|
|
BUILT_IN_EXPECT, BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
|
1999-07-20 12:41:10 +02:00
|
|
|
|
/* Currently under experimentation. */
|
|
|
|
|
builtin_function ("__builtin_memcpy", memcpy_ftype, BUILT_IN_MEMCPY,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, "memcpy");
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_memcmp", int_ftype_cptr_cptr_sizet,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_MEMCMP, BUILT_IN_NORMAL, "memcmp");
|
2000-03-24 21:20:56 +01:00
|
|
|
|
builtin_function ("__builtin_memset", memset_ftype,
|
|
|
|
|
BUILT_IN_MEMSET, BUILT_IN_NORMAL, "memset");
|
|
|
|
|
builtin_function ("__builtin_bzero", bzero_ftype,
|
|
|
|
|
BUILT_IN_BZERO, BUILT_IN_NORMAL, "bzero");
|
2000-03-23 22:32:10 +01:00
|
|
|
|
builtin_function ("__builtin_bcmp", bcmp_ftype,
|
|
|
|
|
BUILT_IN_BCMP, BUILT_IN_NORMAL, "bcmp");
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_strcmp", int_ftype_string_string,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_STRCMP, BUILT_IN_NORMAL, "strcmp");
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_strcpy", string_ftype_ptr_ptr,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_STRCPY, BUILT_IN_NORMAL, "strcpy");
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_strlen", strlen_ftype,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_STRLEN, BUILT_IN_NORMAL, "strlen");
|
2000-01-03 22:48:49 +01:00
|
|
|
|
builtin_function ("__builtin_sqrtf", float_ftype_float,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_FSQRT, BUILT_IN_NORMAL, "sqrtf");
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_fsqrt", double_ftype_double,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_FSQRT, BUILT_IN_NORMAL, "sqrt");
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_sqrtl", ldouble_ftype_ldouble,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_FSQRT, BUILT_IN_NORMAL, "sqrtl");
|
2000-01-03 22:48:49 +01:00
|
|
|
|
builtin_function ("__builtin_sinf", float_ftype_float,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_SIN, BUILT_IN_NORMAL, "sinf");
|
2000-01-03 22:48:49 +01:00
|
|
|
|
builtin_function ("__builtin_sin", double_ftype_double,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_SIN, BUILT_IN_NORMAL, "sin");
|
2000-01-03 22:48:49 +01:00
|
|
|
|
builtin_function ("__builtin_sinl", ldouble_ftype_ldouble,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_SIN, BUILT_IN_NORMAL, "sinl");
|
2000-01-03 22:48:49 +01:00
|
|
|
|
builtin_function ("__builtin_cosf", float_ftype_float,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_COS, BUILT_IN_NORMAL, "cosf");
|
2000-01-03 22:48:49 +01:00
|
|
|
|
builtin_function ("__builtin_cos", double_ftype_double,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_COS, BUILT_IN_NORMAL, "cos");
|
2000-01-03 22:48:49 +01:00
|
|
|
|
builtin_function ("__builtin_cosl", ldouble_ftype_ldouble,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_COS, BUILT_IN_NORMAL, "cosl");
|
2000-09-19 20:19:44 +02:00
|
|
|
|
built_in_decls[BUILT_IN_PUTCHAR] =
|
|
|
|
|
builtin_function ("__builtin_putchar", int_ftype_int,
|
|
|
|
|
BUILT_IN_PUTCHAR, BUILT_IN_NORMAL, "putchar");
|
|
|
|
|
built_in_decls[BUILT_IN_PUTS] =
|
|
|
|
|
builtin_function ("__builtin_puts", puts_ftype,
|
|
|
|
|
BUILT_IN_PUTS, BUILT_IN_NORMAL, "puts");
|
|
|
|
|
builtin_function ("__builtin_printf", printf_ftype,
|
2000-10-06 16:59:56 +02:00
|
|
|
|
BUILT_IN_PRINTF, BUILT_IN_FRONTEND, "printf");
|
2000-09-12 17:10:50 +02:00
|
|
|
|
/* We declare these without argument so that the initial declaration
|
|
|
|
|
for these identifiers is a builtin. That allows us to redeclare
|
|
|
|
|
them later with argument without worrying about the explicit
|
|
|
|
|
declarations in stdio.h being taken as the initial declaration.
|
|
|
|
|
Also, save the _DECL for these so we can use them later. */
|
2000-09-21 03:59:07 +02:00
|
|
|
|
built_in_decls[BUILT_IN_FWRITE] =
|
|
|
|
|
builtin_function ("__builtin_fwrite", sizet_ftype_any,
|
|
|
|
|
BUILT_IN_FWRITE, BUILT_IN_NORMAL, "fwrite");
|
2000-09-12 17:10:50 +02:00
|
|
|
|
built_in_decls[BUILT_IN_FPUTC] =
|
|
|
|
|
builtin_function ("__builtin_fputc", int_ftype_any,
|
|
|
|
|
BUILT_IN_FPUTC, BUILT_IN_NORMAL, "fputc");
|
|
|
|
|
built_in_decls[BUILT_IN_FPUTS] =
|
|
|
|
|
builtin_function ("__builtin_fputs", int_ftype_any,
|
|
|
|
|
BUILT_IN_FPUTS, BUILT_IN_NORMAL, "fputs");
|
1999-07-20 12:41:10 +02:00
|
|
|
|
|
|
|
|
|
if (! no_builtins)
|
|
|
|
|
{
|
1999-09-24 12:07:04 +02:00
|
|
|
|
builtin_function ("abs", int_ftype_int, BUILT_IN_ABS,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("fabsf", float_ftype_float, BUILT_IN_FABS,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("fabs", double_ftype_double, BUILT_IN_FABS,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("fabsl", ldouble_ftype_ldouble, BUILT_IN_FABS,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("labs", long_ftype_long, BUILT_IN_LABS,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
2000-09-24 11:50:30 +02:00
|
|
|
|
if (flag_isoc99 || ! no_nonansi_builtins)
|
|
|
|
|
builtin_function ("llabs", longlong_ftype_longlong, BUILT_IN_LLABS,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-09-24 12:07:04 +02:00
|
|
|
|
builtin_function ("memcpy", memcpy_ftype, BUILT_IN_MEMCPY,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("memcmp", int_ftype_cptr_cptr_sizet, BUILT_IN_MEMCMP,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("memset", memset_ftype, BUILT_IN_MEMSET,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("strcmp", int_ftype_string_string, BUILT_IN_STRCMP,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("strcpy", string_ftype_ptr_ptr, BUILT_IN_STRCPY,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("strlen", strlen_ftype, BUILT_IN_STRLEN,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("sqrtf", float_ftype_float, BUILT_IN_FSQRT,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("sqrt", double_ftype_double, BUILT_IN_FSQRT,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("sqrtl", ldouble_ftype_ldouble, BUILT_IN_FSQRT,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("sinf", float_ftype_float, BUILT_IN_SIN,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("sin", double_ftype_double, BUILT_IN_SIN,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("sinl", ldouble_ftype_ldouble, BUILT_IN_SIN,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("cosf", float_ftype_float, BUILT_IN_COS,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("cos", double_ftype_double, BUILT_IN_COS,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("cosl", ldouble_ftype_ldouble, BUILT_IN_COS,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
2000-09-19 20:19:44 +02:00
|
|
|
|
builtin_function ("printf", printf_ftype, BUILT_IN_PRINTF,
|
2000-10-06 16:59:56 +02:00
|
|
|
|
BUILT_IN_FRONTEND, NULL_PTR);
|
2000-09-12 17:10:50 +02:00
|
|
|
|
/* We declare these without argument so that the initial
|
|
|
|
|
declaration for these identifiers is a builtin. That allows
|
|
|
|
|
us to redeclare them later with argument without worrying
|
|
|
|
|
about the explicit declarations in stdio.h being taken as the
|
|
|
|
|
initial declaration. */
|
|
|
|
|
builtin_function ("fputc", int_ftype_any, BUILT_IN_FPUTC,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("fputs", int_ftype_any, BUILT_IN_FPUTS,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
|
|
|
|
|
/* Declare these functions volatile
|
|
|
|
|
to avoid spurious "control drops through" warnings. */
|
|
|
|
|
temp = builtin_function ("abort", cplus_mode ? void_ftype : void_ftype_any,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
0, NOT_BUILT_IN, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
TREE_THIS_VOLATILE (temp) = 1;
|
|
|
|
|
TREE_SIDE_EFFECTS (temp) = 1;
|
|
|
|
|
|
|
|
|
|
#if 0 /* ??? The C++ frontend used to do this. */
|
|
|
|
|
/* Well, these are actually ANSI, but we can't set DECL_BUILT_IN on
|
|
|
|
|
them... */
|
|
|
|
|
DECL_BUILT_IN_NONANSI (temp) = 1;
|
|
|
|
|
#endif
|
|
|
|
|
temp = builtin_function ("exit",
|
|
|
|
|
cplus_mode ? void_ftype_int : void_ftype_any,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
0, NOT_BUILT_IN, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
TREE_THIS_VOLATILE (temp) = 1;
|
|
|
|
|
TREE_SIDE_EFFECTS (temp) = 1;
|
|
|
|
|
|
|
|
|
|
#if 0 /* ??? The C++ frontend used to do this. */
|
|
|
|
|
/* Well, these are actually ANSI, but we can't set DECL_BUILT_IN on
|
|
|
|
|
them... */
|
|
|
|
|
DECL_BUILT_IN_NONANSI (temp) = 1;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
/* Support for these has not been written in either expand_builtin
|
|
|
|
|
or build_function_call. */
|
1999-09-24 12:07:04 +02:00
|
|
|
|
builtin_function ("__builtin_div", default_ftype, BUILT_IN_DIV,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
|
|
|
|
builtin_function ("__builtin_ldiv", default_ftype, BUILT_IN_LDIV,
|
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_ffloor", double_ftype_double, BUILT_IN_FFLOOR,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_fmod", double_ftype_double_double,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_FMOD, BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_frem", double_ftype_double_double,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_FREM, BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_getexp", double_ftype_double, BUILT_IN_GETEXP,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
builtin_function ("__builtin_getman", double_ftype_double, BUILT_IN_GETMAN,
|
1999-09-24 12:07:04 +02:00
|
|
|
|
BUILT_IN_NORMAL, NULL_PTR);
|
1999-07-20 12:41:10 +02:00
|
|
|
|
#endif
|
1999-09-08 06:51:16 +02:00
|
|
|
|
|
2000-08-24 22:09:27 +02:00
|
|
|
|
main_identifier_node = get_identifier ("main");
|
|
|
|
|
|
1999-09-08 06:51:16 +02:00
|
|
|
|
/* ??? Perhaps there's a better place to do this. But it is related
|
|
|
|
|
to __builtin_va_arg, so it isn't that off-the-wall. */
|
|
|
|
|
lang_type_promotes_to = simple_type_promotes_to;
|
1999-07-20 12:41:10 +02:00
|
|
|
|
}
|
builtins.c (expand_builtin_saveregs): Remove static, remove exp and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
* builtins.c (expand_builtin_saveregs): Remove static, remove exp
and ignore arguments, bail if no EXPAND_BUILTIN_SAVEREGS.
(expand_builtin_next_arg): Accept ARGLIST not EXP.
(stabilize_va_list): New function.
(std_expand_builtin_va_start): New function.
(expand_builtin_va_start): New function.
(get_varargs_alias_set): New function.
(std_expand_builtin_va_arg): New function.
(expand_builtin_va_arg): New function.
(expand_builtin_va_end): New function.
(expand_builtin_va_copy): New function.
(expand_builtin): Call them.
* c-common.c (c_common_nodes_and_builtins): Build __builtin_va_list,
__builtin_{varargs_start,stdarg_start,end,copy}.
(build_va_arg): New function.
* c-common.h (CTI_PTR_TYPE, ptr_type_node): Delete.
(build_va_arg): Declare.
* c-decl.c (ptr_type_node, va_list_type_node): New.
* c-parse.gperf (__builtin_va_arg): New.
* c-parse.in (VA_ARG): New token.
(unary_expr): Recognize it.
* expr.c (expand_expr): Expand VA_ARG_EXPR.
* expr.h (std_expand_builtin_va_start): Declare.
(std_expand_builtin_va_arg): Declare.
(expand_builtin_va_arg): Declare.
(get_varargs_alias_set): Declare.
* tree.def (VA_ARG_EXPR): New.
* tree.h (BUILT_IN_VARARGS_START): New.
(BUILT_IN_STDARG_START, BUILT_IN_VA_END): New.
(ptr_type_node, va_list_type_node): Declare.
* tm.texi (EXPAND_BUILTIN_SAVEREGS): Kill unused ARGLIST argument.
* m32r.h (EXPAND_BUILTIN_SAVEREGS): Likewise.
* m88k.h, m88k.c: Likewise.
* mn10300.h, mn10300.c: Likewise.
* pa.h, pa.c: Likewise.
* rs6000.h, rs6000.c: Likewise.
* sh.h, sh.c: Likewise.
* sparc.h, sparc.c: Likewise.
* emit-rtl.c (operand_subword): Copy alias set.
(change_address): Likewise.
From-SVN: r28243
1999-07-26 03:21:03 +02:00
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
build_va_arg (expr, type)
|
|
|
|
|
tree expr, type;
|
|
|
|
|
{
|
|
|
|
|
return build1 (VA_ARG_EXPR, type, expr);
|
|
|
|
|
}
|
1999-09-08 06:51:16 +02:00
|
|
|
|
|
|
|
|
|
/* Given a type, apply default promotions wrt unnamed function arguments
|
|
|
|
|
and return the new type. Return NULL_TREE if no change. */
|
2000-01-03 22:48:49 +01:00
|
|
|
|
/* ??? There is a function of the same name in the C++ front end that
|
1999-09-08 06:51:16 +02:00
|
|
|
|
does something similar, but is more thorough and does not return NULL
|
2000-01-03 22:48:49 +01:00
|
|
|
|
if no change. We could perhaps share code, but it would make the
|
1999-09-08 06:51:16 +02:00
|
|
|
|
self_promoting_type property harder to identify. */
|
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
simple_type_promotes_to (type)
|
|
|
|
|
tree type;
|
|
|
|
|
{
|
|
|
|
|
if (TYPE_MAIN_VARIANT (type) == float_type_node)
|
|
|
|
|
return double_type_node;
|
|
|
|
|
|
|
|
|
|
if (C_PROMOTING_INTEGER_TYPE_P (type))
|
|
|
|
|
{
|
|
|
|
|
/* Traditionally, unsignedness is preserved in default promotions.
|
|
|
|
|
Also preserve unsignedness if not really getting any wider. */
|
|
|
|
|
if (TREE_UNSIGNED (type)
|
|
|
|
|
&& (flag_traditional
|
|
|
|
|
|| TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)))
|
|
|
|
|
return unsigned_type_node;
|
|
|
|
|
return integer_type_node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Return 1 if PARMS specifies a fixed number of parameters
|
|
|
|
|
and none of their types is affected by default promotions. */
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
self_promoting_args_p (parms)
|
|
|
|
|
tree parms;
|
|
|
|
|
{
|
|
|
|
|
register tree t;
|
|
|
|
|
for (t = parms; t; t = TREE_CHAIN (t))
|
|
|
|
|
{
|
|
|
|
|
register tree type = TREE_VALUE (t);
|
1999-07-31 03:13:08 +02:00
|
|
|
|
|
1999-09-08 06:51:16 +02:00
|
|
|
|
if (TREE_CHAIN (t) == 0 && type != void_type_node)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
if (type == 0)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
if (TYPE_MAIN_VARIANT (type) == float_type_node)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
if (C_PROMOTING_INTEGER_TYPE_P (type))
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
2000-01-25 01:45:14 +01:00
|
|
|
|
|
|
|
|
|
/* Recognize certain built-in functions so we can make tree-codes
|
|
|
|
|
other than CALL_EXPR. We do this when it enables fold-const.c
|
|
|
|
|
to do something useful. */
|
|
|
|
|
/* ??? By rights this should go in builtins.c, but only C and C++
|
|
|
|
|
implement build_{binary,unary}_op. Not exactly sure what bits
|
|
|
|
|
of functionality are actually needed from those functions, or
|
|
|
|
|
where the similar functionality exists in the other front ends. */
|
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
expand_tree_builtin (function, params, coerced_params)
|
|
|
|
|
tree function, params, coerced_params;
|
|
|
|
|
{
|
|
|
|
|
enum tree_code code;
|
|
|
|
|
|
|
|
|
|
if (DECL_BUILT_IN_CLASS (function) != BUILT_IN_NORMAL)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
|
|
|
|
|
switch (DECL_FUNCTION_CODE (function))
|
|
|
|
|
{
|
|
|
|
|
case BUILT_IN_ABS:
|
|
|
|
|
case BUILT_IN_LABS:
|
2000-09-24 11:50:30 +02:00
|
|
|
|
case BUILT_IN_LLABS:
|
2000-01-25 01:45:14 +01:00
|
|
|
|
case BUILT_IN_FABS:
|
|
|
|
|
if (coerced_params == 0)
|
|
|
|
|
return integer_zero_node;
|
|
|
|
|
return build_unary_op (ABS_EXPR, TREE_VALUE (coerced_params), 0);
|
|
|
|
|
|
|
|
|
|
case BUILT_IN_ISGREATER:
|
|
|
|
|
if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
|
|
|
|
|
code = UNLE_EXPR;
|
|
|
|
|
else
|
|
|
|
|
code = LE_EXPR;
|
|
|
|
|
goto unordered_cmp;
|
|
|
|
|
|
|
|
|
|
case BUILT_IN_ISGREATEREQUAL:
|
|
|
|
|
if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
|
|
|
|
|
code = UNLT_EXPR;
|
|
|
|
|
else
|
|
|
|
|
code = LT_EXPR;
|
|
|
|
|
goto unordered_cmp;
|
|
|
|
|
|
|
|
|
|
case BUILT_IN_ISLESS:
|
|
|
|
|
if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
|
|
|
|
|
code = UNGE_EXPR;
|
|
|
|
|
else
|
|
|
|
|
code = GE_EXPR;
|
|
|
|
|
goto unordered_cmp;
|
|
|
|
|
|
|
|
|
|
case BUILT_IN_ISLESSEQUAL:
|
|
|
|
|
if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
|
|
|
|
|
code = UNGT_EXPR;
|
|
|
|
|
else
|
|
|
|
|
code = GT_EXPR;
|
|
|
|
|
goto unordered_cmp;
|
|
|
|
|
|
|
|
|
|
case BUILT_IN_ISLESSGREATER:
|
|
|
|
|
if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
|
|
|
|
|
code = UNEQ_EXPR;
|
|
|
|
|
else
|
|
|
|
|
code = EQ_EXPR;
|
|
|
|
|
goto unordered_cmp;
|
|
|
|
|
|
|
|
|
|
case BUILT_IN_ISUNORDERED:
|
|
|
|
|
if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT)
|
|
|
|
|
return integer_zero_node;
|
|
|
|
|
code = UNORDERED_EXPR;
|
|
|
|
|
goto unordered_cmp;
|
|
|
|
|
|
|
|
|
|
unordered_cmp:
|
|
|
|
|
{
|
|
|
|
|
tree arg0, arg1;
|
|
|
|
|
|
|
|
|
|
if (params == 0
|
|
|
|
|
|| TREE_CHAIN (params) == 0)
|
|
|
|
|
{
|
|
|
|
|
error ("too few arguments to function `%s'",
|
|
|
|
|
IDENTIFIER_POINTER (DECL_NAME (function)));
|
|
|
|
|
return error_mark_node;
|
|
|
|
|
}
|
|
|
|
|
else if (TREE_CHAIN (TREE_CHAIN (params)) != 0)
|
|
|
|
|
{
|
|
|
|
|
error ("too many arguments to function `%s'",
|
|
|
|
|
IDENTIFIER_POINTER (DECL_NAME (function)));
|
|
|
|
|
return error_mark_node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
arg0 = TREE_VALUE (params);
|
|
|
|
|
arg1 = TREE_VALUE (TREE_CHAIN (params));
|
|
|
|
|
arg0 = build_binary_op (code, arg0, arg1, 0);
|
|
|
|
|
if (code != UNORDERED_EXPR)
|
|
|
|
|
arg0 = build_unary_op (TRUTH_NOT_EXPR, arg0, 0);
|
|
|
|
|
return arg0;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
}
|
2000-06-17 04:37:23 +02:00
|
|
|
|
|
2000-09-07 03:36:11 +02:00
|
|
|
|
/* Returns non-zero if CODE is the code for a statement. */
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
statement_code_p (code)
|
|
|
|
|
enum tree_code code;
|
|
|
|
|
{
|
|
|
|
|
switch (code)
|
|
|
|
|
{
|
|
|
|
|
case EXPR_STMT:
|
|
|
|
|
case COMPOUND_STMT:
|
|
|
|
|
case DECL_STMT:
|
|
|
|
|
case IF_STMT:
|
|
|
|
|
case FOR_STMT:
|
|
|
|
|
case WHILE_STMT:
|
|
|
|
|
case DO_STMT:
|
|
|
|
|
case RETURN_STMT:
|
|
|
|
|
case BREAK_STMT:
|
|
|
|
|
case CONTINUE_STMT:
|
2000-09-17 09:38:23 +02:00
|
|
|
|
case SCOPE_STMT:
|
2000-09-07 03:36:11 +02:00
|
|
|
|
case SWITCH_STMT:
|
|
|
|
|
case GOTO_STMT:
|
|
|
|
|
case LABEL_STMT:
|
|
|
|
|
case ASM_STMT:
|
|
|
|
|
case CASE_LABEL:
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
if (lang_statement_code_p)
|
|
|
|
|
return (*lang_statement_code_p) (code);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Walk the statemen tree, rooted at *tp. Apply FUNC to all the
|
|
|
|
|
sub-trees of *TP in a pre-order traversal. FUNC is called with the
|
|
|
|
|
DATA and the address of each sub-tree. If FUNC returns a non-NULL
|
|
|
|
|
value, the traversal is aborted, and the value returned by FUNC is
|
|
|
|
|
returned. If FUNC sets WALK_SUBTREES to zero, then the subtrees of
|
|
|
|
|
the node being visited are not walked.
|
|
|
|
|
|
|
|
|
|
We don't need a without_duplicates variant of this one because the
|
|
|
|
|
statement tree is a tree, not a graph. */
|
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
walk_stmt_tree (tp, func, data)
|
|
|
|
|
tree *tp;
|
|
|
|
|
walk_tree_fn func;
|
|
|
|
|
void *data;
|
|
|
|
|
{
|
|
|
|
|
enum tree_code code;
|
|
|
|
|
int walk_subtrees;
|
|
|
|
|
tree result;
|
|
|
|
|
int i, len;
|
|
|
|
|
|
|
|
|
|
#define WALK_SUBTREE(NODE) \
|
|
|
|
|
do \
|
|
|
|
|
{ \
|
|
|
|
|
result = walk_stmt_tree (&(NODE), func, data); \
|
|
|
|
|
if (result) \
|
|
|
|
|
return result; \
|
|
|
|
|
} \
|
|
|
|
|
while (0)
|
|
|
|
|
|
|
|
|
|
/* Skip empty subtrees. */
|
|
|
|
|
if (!*tp)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
|
|
|
|
|
/* Skip subtrees below non-statement nodes. */
|
|
|
|
|
if (!statement_code_p (TREE_CODE (*tp)))
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
|
|
|
|
|
/* Call the function. */
|
|
|
|
|
walk_subtrees = 1;
|
|
|
|
|
result = (*func) (tp, &walk_subtrees, data);
|
|
|
|
|
|
|
|
|
|
/* If we found something, return it. */
|
|
|
|
|
if (result)
|
|
|
|
|
return result;
|
|
|
|
|
|
|
|
|
|
/* Even if we didn't, FUNC may have decided that there was nothing
|
|
|
|
|
interesting below this point in the tree. */
|
|
|
|
|
if (!walk_subtrees)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
|
|
|
|
|
/* FUNC may have modified the tree, recheck that we're looking at a
|
|
|
|
|
statement node. */
|
|
|
|
|
code = TREE_CODE (*tp);
|
|
|
|
|
if (!statement_code_p (code))
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
|
|
|
|
|
/* Walk over all the sub-trees of this operand. Statement nodes never
|
|
|
|
|
contain RTL, and we needn't worry about TARGET_EXPRs. */
|
|
|
|
|
len = TREE_CODE_LENGTH (code);
|
|
|
|
|
|
|
|
|
|
/* Go through the subtrees. We need to do this in forward order so
|
|
|
|
|
that the scope of a FOR_EXPR is handled properly. */
|
|
|
|
|
for (i = 0; i < len; ++i)
|
|
|
|
|
WALK_SUBTREE (TREE_OPERAND (*tp, i));
|
|
|
|
|
|
|
|
|
|
/* Finally visit the chain. This can be tail-recursion optimized if
|
|
|
|
|
we write it this way. */
|
|
|
|
|
return walk_stmt_tree (&TREE_CHAIN (*tp), func, data);
|
|
|
|
|
|
|
|
|
|
#undef WALK_SUBTREE
|
|
|
|
|
}
|
|
|
|
|
|
2000-09-17 09:38:23 +02:00
|
|
|
|
/* Used to compare case labels. K1 and K2 are actually tree nodes
|
|
|
|
|
representing case labels, or NULL_TREE for a `default' label.
|
|
|
|
|
Returns -1 if K1 is ordered before K2, -1 if K1 is ordered after
|
|
|
|
|
K2, and 0 if K1 and K2 are equal. */
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
case_compare (k1, k2)
|
|
|
|
|
splay_tree_key k1;
|
|
|
|
|
splay_tree_key k2;
|
|
|
|
|
{
|
|
|
|
|
/* Consider a NULL key (such as arises with a `default' label) to be
|
|
|
|
|
smaller than anything else. */
|
|
|
|
|
if (!k1)
|
|
|
|
|
return k2 ? -1 : 0;
|
|
|
|
|
else if (!k2)
|
|
|
|
|
return k1 ? 1 : 0;
|
|
|
|
|
|
|
|
|
|
return tree_int_cst_compare ((tree) k1, (tree) k2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Process a case label for the range LOW_VALUE ... HIGH_VALUE. If
|
|
|
|
|
LOW_VALUE and HIGH_VALUE are both NULL_TREE then this case label is
|
|
|
|
|
actually a `default' label. If only HIGH_VALUE is NULL_TREE, then
|
|
|
|
|
case label was declared using the usual C/C++ syntax, rather than
|
|
|
|
|
the GNU case range extension. CASES is a tree containing all the
|
|
|
|
|
case ranges processed so far; COND is the condition for the
|
|
|
|
|
switch-statement itself. Returns the CASE_LABEL created, or
|
|
|
|
|
ERROR_MARK_NODE if no CASE_LABEL is created. */
|
|
|
|
|
|
|
|
|
|
tree
|
|
|
|
|
c_add_case_label (cases, cond, low_value, high_value)
|
|
|
|
|
splay_tree cases;
|
|
|
|
|
tree cond;
|
|
|
|
|
tree low_value;
|
|
|
|
|
tree high_value;
|
|
|
|
|
{
|
|
|
|
|
tree type;
|
|
|
|
|
tree label;
|
|
|
|
|
tree case_label;
|
|
|
|
|
splay_tree_node node;
|
|
|
|
|
|
|
|
|
|
/* Create the LABEL_DECL itself. */
|
|
|
|
|
label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
|
|
|
|
|
DECL_CONTEXT (label) = current_function_decl;
|
|
|
|
|
|
|
|
|
|
/* If there was an error processing the switch condition, bail now
|
|
|
|
|
before we get more confused. */
|
|
|
|
|
if (!cond || cond == error_mark_node)
|
|
|
|
|
{
|
|
|
|
|
/* Add a label anyhow so that the back-end doesn't think that
|
|
|
|
|
the beginning of the switch is unreachable. */
|
|
|
|
|
if (!cases->root)
|
|
|
|
|
add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
|
|
|
|
|
return error_mark_node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((low_value && TREE_TYPE (low_value)
|
|
|
|
|
&& POINTER_TYPE_P (TREE_TYPE (low_value)))
|
|
|
|
|
|| (high_value && TREE_TYPE (high_value)
|
|
|
|
|
&& POINTER_TYPE_P (TREE_TYPE (high_value))))
|
|
|
|
|
error ("pointers are not permitted as case values");
|
|
|
|
|
|
|
|
|
|
/* Case ranges are a GNU extension. */
|
|
|
|
|
if (high_value && pedantic)
|
|
|
|
|
{
|
|
|
|
|
if (c_language == clk_cplusplus)
|
|
|
|
|
pedwarn ("ISO C++ forbids range expressions in switch statements");
|
|
|
|
|
else
|
|
|
|
|
pedwarn ("ISO C forbids range expressions in switch statements");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type = TREE_TYPE (cond);
|
|
|
|
|
if (low_value)
|
|
|
|
|
{
|
|
|
|
|
low_value = check_case_value (low_value);
|
|
|
|
|
low_value = convert_and_check (type, low_value);
|
|
|
|
|
}
|
|
|
|
|
if (high_value)
|
|
|
|
|
{
|
|
|
|
|
high_value = check_case_value (high_value);
|
|
|
|
|
high_value = convert_and_check (type, high_value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If an error has occurred, bail out now. */
|
|
|
|
|
if (low_value == error_mark_node || high_value == error_mark_node)
|
|
|
|
|
{
|
|
|
|
|
if (!cases->root)
|
|
|
|
|
add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
|
|
|
|
|
return error_mark_node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If the LOW_VALUE and HIGH_VALUE are the same, then this isn't
|
|
|
|
|
really a case range, even though it was written that way. Remove
|
|
|
|
|
the HIGH_VALUE to simplify later processing. */
|
|
|
|
|
if (tree_int_cst_equal (low_value, high_value))
|
|
|
|
|
high_value = NULL_TREE;
|
|
|
|
|
if (low_value && high_value
|
|
|
|
|
&& !tree_int_cst_lt (low_value, high_value))
|
|
|
|
|
warning ("empty range specified");
|
|
|
|
|
|
|
|
|
|
/* Look up the LOW_VALUE in the table of case labels we already
|
|
|
|
|
have. */
|
|
|
|
|
node = splay_tree_lookup (cases, (splay_tree_key) low_value);
|
|
|
|
|
/* If there was not an exact match, check for overlapping ranges.
|
|
|
|
|
There's no need to do this if there's no LOW_VALUE or HIGH_VALUE;
|
|
|
|
|
that's a `default' label and the only overlap is an exact match. */
|
|
|
|
|
if (!node && (low_value || high_value))
|
|
|
|
|
{
|
|
|
|
|
splay_tree_node low_bound;
|
|
|
|
|
splay_tree_node high_bound;
|
|
|
|
|
|
|
|
|
|
/* Even though there wasn't an exact match, there might be an
|
|
|
|
|
overlap between this case range and another case range.
|
|
|
|
|
Since we've (inductively) not allowed any overlapping case
|
|
|
|
|
ranges, we simply need to find the greatest low case label
|
|
|
|
|
that is smaller that LOW_VALUE, and the smallest low case
|
|
|
|
|
label that is greater than LOW_VALUE. If there is an overlap
|
|
|
|
|
it will occur in one of these two ranges. */
|
|
|
|
|
low_bound = splay_tree_predecessor (cases,
|
|
|
|
|
(splay_tree_key) low_value);
|
|
|
|
|
high_bound = splay_tree_successor (cases,
|
|
|
|
|
(splay_tree_key) low_value);
|
|
|
|
|
|
|
|
|
|
/* Check to see if the LOW_BOUND overlaps. It is smaller than
|
|
|
|
|
the LOW_VALUE, so there is no need to check unless the
|
|
|
|
|
LOW_BOUND is in fact itself a case range. */
|
|
|
|
|
if (low_bound
|
|
|
|
|
&& CASE_HIGH ((tree) low_bound->value)
|
|
|
|
|
&& tree_int_cst_compare (CASE_HIGH ((tree) low_bound->value),
|
|
|
|
|
low_value) >= 0)
|
|
|
|
|
node = low_bound;
|
|
|
|
|
/* Check to see if the HIGH_BOUND overlaps. The low end of that
|
|
|
|
|
range is bigger than the low end of the current range, so we
|
|
|
|
|
are only interested if the current range is a real range, and
|
|
|
|
|
not an ordinary case label. */
|
|
|
|
|
else if (high_bound
|
|
|
|
|
&& high_value
|
|
|
|
|
&& (tree_int_cst_compare ((tree) high_bound->key,
|
|
|
|
|
high_value)
|
|
|
|
|
<= 0))
|
|
|
|
|
node = high_bound;
|
|
|
|
|
}
|
|
|
|
|
/* If there was an overlap, issue an error. */
|
|
|
|
|
if (node)
|
|
|
|
|
{
|
|
|
|
|
tree duplicate = CASE_LABEL_DECL ((tree) node->value);
|
|
|
|
|
|
|
|
|
|
if (high_value)
|
|
|
|
|
{
|
|
|
|
|
error ("duplicate (or overlapping) case value");
|
|
|
|
|
error_with_decl (duplicate,
|
|
|
|
|
"this is the first entry overlapping that value");
|
|
|
|
|
}
|
|
|
|
|
else if (low_value)
|
|
|
|
|
{
|
|
|
|
|
error ("duplicate case value") ;
|
|
|
|
|
error_with_decl (duplicate, "previously used here");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
error ("multiple default labels in one switch");
|
|
|
|
|
error_with_decl (duplicate, "this is the first default label");
|
|
|
|
|
}
|
|
|
|
|
if (!cases->root)
|
|
|
|
|
add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Add a CASE_LABEL to the statement-tree. */
|
|
|
|
|
case_label = add_stmt (build_case_label (low_value, high_value, label));
|
|
|
|
|
/* Register this case label in the splay tree. */
|
|
|
|
|
splay_tree_insert (cases,
|
|
|
|
|
(splay_tree_key) low_value,
|
|
|
|
|
(splay_tree_value) case_label);
|
|
|
|
|
|
|
|
|
|
return case_label;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Mark P (a stmt_tree) for GC. The use of a `void *' for the
|
|
|
|
|
parameter allows this function to be used as a GC-marking
|
|
|
|
|
function. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
mark_stmt_tree (p)
|
|
|
|
|
void *p;
|
|
|
|
|
{
|
|
|
|
|
stmt_tree st = (stmt_tree) p;
|
|
|
|
|
|
|
|
|
|
ggc_mark_tree (st->x_last_stmt);
|
|
|
|
|
ggc_mark_tree (st->x_last_expr_type);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Mark LD for GC. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
c_mark_lang_decl (c)
|
|
|
|
|
struct c_lang_decl *c;
|
|
|
|
|
{
|
|
|
|
|
ggc_mark_tree (c->saved_tree);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Mark F for GC. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
mark_c_language_function (f)
|
|
|
|
|
struct language_function *f;
|
|
|
|
|
{
|
|
|
|
|
if (!f)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
mark_stmt_tree (&f->x_stmt_tree);
|
|
|
|
|
ggc_mark_tree (f->x_scope_stmt_stack);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Hook used by expand_expr to expand language-specific tree codes. */
|
|
|
|
|
|
|
|
|
|
rtx
|
|
|
|
|
c_expand_expr (exp, target, tmode, modifier)
|
|
|
|
|
tree exp;
|
|
|
|
|
rtx target;
|
|
|
|
|
enum machine_mode tmode;
|
|
|
|
|
enum expand_modifier modifier;
|
|
|
|
|
{
|
|
|
|
|
switch (TREE_CODE (exp))
|
|
|
|
|
{
|
|
|
|
|
case STMT_EXPR:
|
|
|
|
|
{
|
|
|
|
|
tree rtl_expr;
|
|
|
|
|
rtx result;
|
|
|
|
|
|
|
|
|
|
/* Since expand_expr_stmt calls free_temp_slots after every
|
|
|
|
|
expression statement, we must call push_temp_slots here.
|
|
|
|
|
Otherwise, any temporaries in use now would be considered
|
|
|
|
|
out-of-scope after the first EXPR_STMT from within the
|
|
|
|
|
STMT_EXPR. */
|
|
|
|
|
push_temp_slots ();
|
|
|
|
|
rtl_expr = expand_start_stmt_expr ();
|
|
|
|
|
expand_stmt (STMT_EXPR_STMT (exp));
|
|
|
|
|
expand_end_stmt_expr (rtl_expr);
|
|
|
|
|
result = expand_expr (rtl_expr, target, tmode, modifier);
|
|
|
|
|
pop_temp_slots ();
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2000-10-06 16:59:56 +02:00
|
|
|
|
case CALL_EXPR:
|
|
|
|
|
{
|
|
|
|
|
if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
|
|
|
|
|
&& (TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
|
|
|
|
|
== FUNCTION_DECL)
|
|
|
|
|
&& DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
|
|
|
|
|
&& (DECL_BUILT_IN_CLASS (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
|
|
|
|
|
== BUILT_IN_FRONTEND))
|
|
|
|
|
return c_expand_builtin (exp, target, tmode, modifier);
|
|
|
|
|
else
|
|
|
|
|
abort();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2000-09-17 09:38:23 +02:00
|
|
|
|
default:
|
|
|
|
|
abort ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
abort ();
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Hook used by safe_from_p to handle language-specific tree codes. */
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
c_safe_from_p (target, exp)
|
|
|
|
|
rtx target;
|
|
|
|
|
tree exp;
|
|
|
|
|
{
|
|
|
|
|
/* We can see statements here when processing the body of a
|
|
|
|
|
statement-expression. For a declaration statement declaring a
|
|
|
|
|
variable, look at the variable's initializer. */
|
|
|
|
|
if (TREE_CODE (exp) == DECL_STMT)
|
|
|
|
|
{
|
|
|
|
|
tree decl = DECL_STMT_DECL (exp);
|
|
|
|
|
|
|
|
|
|
if (TREE_CODE (decl) == VAR_DECL
|
|
|
|
|
&& DECL_INITIAL (decl)
|
|
|
|
|
&& !safe_from_p (target, DECL_INITIAL (decl), /*top_p=*/0))
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* For any statement, we must follow the statement-chain. */
|
|
|
|
|
if (statement_code_p (TREE_CODE (exp)) && TREE_CHAIN (exp))
|
|
|
|
|
return safe_from_p (target, TREE_CHAIN (exp), /*top_p=*/0);
|
|
|
|
|
|
|
|
|
|
/* Assume everything else is safe. */
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2000-06-17 04:37:23 +02:00
|
|
|
|
/* Tree code classes. */
|
|
|
|
|
|
|
|
|
|
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
|
|
|
|
|
|
|
|
|
|
static char c_tree_code_type[] = {
|
|
|
|
|
'x',
|
|
|
|
|
#include "c-common.def"
|
|
|
|
|
};
|
|
|
|
|
#undef DEFTREECODE
|
|
|
|
|
|
|
|
|
|
/* Table indexed by tree code giving number of expression
|
|
|
|
|
operands beyond the fixed part of the node structure.
|
|
|
|
|
Not used for types or decls. */
|
|
|
|
|
|
|
|
|
|
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
|
|
|
|
|
|
|
|
|
|
static int c_tree_code_length[] = {
|
|
|
|
|
0,
|
|
|
|
|
#include "c-common.def"
|
|
|
|
|
};
|
|
|
|
|
#undef DEFTREECODE
|
|
|
|
|
|
|
|
|
|
/* Names of tree components.
|
|
|
|
|
Used for printing out the tree and error messages. */
|
|
|
|
|
#define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
|
|
|
|
|
|
|
|
|
|
static const char *c_tree_code_name[] = {
|
|
|
|
|
"@@dummy",
|
|
|
|
|
#include "c-common.def"
|
|
|
|
|
};
|
|
|
|
|
#undef DEFTREECODE
|
|
|
|
|
|
|
|
|
|
/* Adds the tree codes specific to the C front end to the list of all
|
|
|
|
|
tree codes. */
|
|
|
|
|
|
|
|
|
|
void
|
2000-06-18 15:09:26 +02:00
|
|
|
|
add_c_tree_codes ()
|
2000-06-17 04:37:23 +02:00
|
|
|
|
{
|
|
|
|
|
memcpy (tree_code_type + (int) LAST_AND_UNUSED_TREE_CODE,
|
|
|
|
|
c_tree_code_type,
|
|
|
|
|
(int)LAST_C_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE);
|
|
|
|
|
memcpy (tree_code_length + (int) LAST_AND_UNUSED_TREE_CODE,
|
|
|
|
|
c_tree_code_length,
|
|
|
|
|
(LAST_C_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (int));
|
|
|
|
|
memcpy (tree_code_name + (int) LAST_AND_UNUSED_TREE_CODE,
|
|
|
|
|
c_tree_code_name,
|
|
|
|
|
(LAST_C_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (char *));
|
|
|
|
|
}
|
2000-10-06 16:59:56 +02:00
|
|
|
|
|
|
|
|
|
#define CALLED_AS_BUILT_IN(NODE) \
|
|
|
|
|
(!strncmp (IDENTIFIER_POINTER (DECL_NAME (NODE)), "__builtin_", 10))
|
|
|
|
|
|
|
|
|
|
static rtx
|
|
|
|
|
c_expand_builtin (exp, target, tmode, modifier)
|
|
|
|
|
tree exp;
|
|
|
|
|
rtx target;
|
|
|
|
|
enum machine_mode tmode;
|
|
|
|
|
enum expand_modifier modifier;
|
|
|
|
|
{
|
|
|
|
|
tree type = TREE_TYPE (exp);
|
|
|
|
|
tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
|
|
|
|
|
tree arglist = TREE_OPERAND (exp, 1);
|
|
|
|
|
enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
|
|
|
|
|
enum tree_code code = TREE_CODE (exp);
|
|
|
|
|
const int ignore = (target == const0_rtx
|
|
|
|
|
|| ((code == NON_LVALUE_EXPR || code == NOP_EXPR
|
|
|
|
|
|| code == CONVERT_EXPR || code == REFERENCE_EXPR
|
|
|
|
|
|| code == COND_EXPR)
|
|
|
|
|
&& TREE_CODE (type) == VOID_TYPE));
|
|
|
|
|
|
|
|
|
|
if (! optimize && ! CALLED_AS_BUILT_IN (fndecl))
|
|
|
|
|
return expand_call (exp, target, ignore);
|
|
|
|
|
|
|
|
|
|
switch (fcode)
|
|
|
|
|
{
|
|
|
|
|
case BUILT_IN_PRINTF:
|
|
|
|
|
target = c_expand_builtin_printf (arglist, target, tmode,
|
|
|
|
|
modifier, ignore);
|
|
|
|
|
if (target)
|
|
|
|
|
return target;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default: /* just do library call, if unknown builtin */
|
|
|
|
|
error ("built-in function `%s' not currently supported",
|
|
|
|
|
IDENTIFIER_POINTER (DECL_NAME (fndecl)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* The switch statement above can drop through to cause the function
|
|
|
|
|
to be called normally. */
|
|
|
|
|
return expand_call (exp, target, ignore);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Check an arglist to *printf for problems. The arglist should start
|
|
|
|
|
at the format specifier, with the remaining arguments immediately
|
|
|
|
|
following it. */
|
|
|
|
|
static int
|
|
|
|
|
is_valid_printf_arglist (arglist)
|
|
|
|
|
tree arglist;
|
|
|
|
|
{
|
|
|
|
|
/* Save this value so we can restore it later. */
|
|
|
|
|
const int SAVE_pedantic = pedantic;
|
|
|
|
|
int diagnostic_occurred = 0;
|
|
|
|
|
|
|
|
|
|
/* Set this to a known value so the user setting won't affect code
|
|
|
|
|
generation. */
|
|
|
|
|
pedantic = 1;
|
|
|
|
|
/* Check to make sure there are no format specifier errors. */
|
|
|
|
|
check_function_format (&diagnostic_occurred,
|
|
|
|
|
maybe_get_identifier("printf"),
|
|
|
|
|
NULL_TREE, arglist);
|
|
|
|
|
|
|
|
|
|
/* Restore the value of `pedantic'. */
|
|
|
|
|
pedantic = SAVE_pedantic;
|
|
|
|
|
|
|
|
|
|
/* If calling `check_function_format_ptr' produces a warning, we
|
|
|
|
|
return false, otherwise we return true. */
|
|
|
|
|
return ! diagnostic_occurred;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If the arguments passed to printf are suitable for optimizations,
|
|
|
|
|
we attempt to transform the call. */
|
|
|
|
|
static rtx
|
|
|
|
|
c_expand_builtin_printf (arglist, target, tmode, modifier, ignore)
|
|
|
|
|
tree arglist;
|
|
|
|
|
rtx target;
|
|
|
|
|
enum machine_mode tmode;
|
|
|
|
|
enum expand_modifier modifier;
|
|
|
|
|
int ignore;
|
|
|
|
|
{
|
|
|
|
|
tree fn_putchar = built_in_decls[BUILT_IN_PUTCHAR],
|
|
|
|
|
fn_puts = built_in_decls[BUILT_IN_PUTS];
|
|
|
|
|
tree fn, format_arg, stripped_string;
|
|
|
|
|
|
|
|
|
|
/* If the return value is used, or the replacement _DECL isn't
|
|
|
|
|
initialized, don't do the transformation. */
|
|
|
|
|
if (!ignore || !fn_putchar || !fn_puts)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
/* Verify the required arguments in the original call. */
|
|
|
|
|
if (arglist == 0
|
|
|
|
|
|| (TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE))
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
/* Check the specifier vs. the parameters. */
|
|
|
|
|
if (!is_valid_printf_arglist (arglist))
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
format_arg = TREE_VALUE (arglist);
|
|
|
|
|
stripped_string = format_arg;
|
|
|
|
|
STRIP_NOPS (stripped_string);
|
|
|
|
|
if (stripped_string && TREE_CODE (stripped_string) == ADDR_EXPR)
|
|
|
|
|
stripped_string = TREE_OPERAND (stripped_string, 0);
|
|
|
|
|
|
|
|
|
|
/* If the format specifier isn't a STRING_CST, punt. */
|
|
|
|
|
if (TREE_CODE (stripped_string) != STRING_CST)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
/* OK! We can attempt optimization. */
|
|
|
|
|
|
|
|
|
|
/* If the format specifier was "%s\n", call __builtin_puts(arg2). */
|
|
|
|
|
if (strcmp (TREE_STRING_POINTER (stripped_string), "%s\n") == 0)
|
|
|
|
|
{
|
|
|
|
|
arglist = TREE_CHAIN (arglist);
|
|
|
|
|
fn = fn_puts;
|
|
|
|
|
}
|
|
|
|
|
/* If the format specifier was "%c", call __builtin_putchar (arg2). */
|
|
|
|
|
else if (strcmp (TREE_STRING_POINTER (stripped_string), "%c") == 0)
|
|
|
|
|
{
|
|
|
|
|
arglist = TREE_CHAIN (arglist);
|
|
|
|
|
fn = fn_putchar;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* We can't handle anything else with % args or %% ... yet. */
|
|
|
|
|
if (strchr (TREE_STRING_POINTER (stripped_string), '%'))
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
/* If the resulting constant string has a length of 1, call
|
|
|
|
|
putchar. Note, TREE_STRING_LENGTH includes the terminating
|
|
|
|
|
NULL in its count. */
|
|
|
|
|
if (TREE_STRING_LENGTH (stripped_string) == 2)
|
|
|
|
|
{
|
|
|
|
|
/* Given printf("c"), (where c is any one character,)
|
|
|
|
|
convert "c"[0] to an int and pass that to the replacement
|
|
|
|
|
function. */
|
|
|
|
|
arglist = build_int_2 (TREE_STRING_POINTER (stripped_string)[0], 0);
|
|
|
|
|
arglist = build_tree_list (NULL_TREE, arglist);
|
|
|
|
|
|
|
|
|
|
fn = fn_putchar;
|
|
|
|
|
}
|
|
|
|
|
/* If the resulting constant was "string\n", call
|
|
|
|
|
__builtin_puts("string"). Ensure "string" has at least one
|
|
|
|
|
character besides the trailing \n. Note, TREE_STRING_LENGTH
|
|
|
|
|
includes the terminating NULL in its count. */
|
|
|
|
|
else if (TREE_STRING_LENGTH (stripped_string) > 2
|
|
|
|
|
&& TREE_STRING_POINTER (stripped_string)
|
|
|
|
|
[TREE_STRING_LENGTH (stripped_string) - 2] == '\n')
|
|
|
|
|
{
|
|
|
|
|
/* Create a NULL-terminated string that's one char shorter
|
|
|
|
|
than the original, stripping off the trailing '\n'. */
|
|
|
|
|
const int newlen = TREE_STRING_LENGTH (stripped_string) - 1;
|
|
|
|
|
char *newstr = (char *) alloca (newlen);
|
|
|
|
|
memcpy (newstr, TREE_STRING_POINTER (stripped_string), newlen - 1);
|
|
|
|
|
newstr[newlen - 1] = 0;
|
|
|
|
|
|
2000-10-09 18:30:43 +02:00
|
|
|
|
arglist = combine_strings (build_string (newlen, newstr));
|
2000-10-06 16:59:56 +02:00
|
|
|
|
arglist = build_tree_list (NULL_TREE, arglist);
|
|
|
|
|
fn = fn_puts;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
/* We'd like to arrange to call fputs(string) here, but we
|
|
|
|
|
need stdout and don't have a way to get it ... yet. */
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return expand_expr (build_function_call (fn, arglist),
|
|
|
|
|
(ignore ? const0_rtx : target),
|
|
|
|
|
tmode, modifier);
|
|
|
|
|
}
|